簡體   English   中英

iOS Today擴展NSUserDefaults使用回調與包含應用程序共享數據

[英]iOS Today Extension NSUserDefaults Sharing Data with Containing App using Callbacks

我遇到以下問題:

我創建了Today Extension,它包含一個UISwitch Today Extension中此開關的IBAction應該使用NSUserDefaults和initWithSuite來存儲打開狀態,如下所示:

- (IBAction)switchStateChanged:(id)sender {

     BOOL isOn = self.preferenceSwitch.isOn;

     NSUserDefaults *sharedDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.x.TodayExtensionSharingDefaults"];

    [sharedDefaults setBool: isOn forKey: @"SwitchState"];
    [sharedDefaults synchronize];
}

現在,在我的“包含應用程序”中,我知道可以使用以下命令訪問開關狀態:

NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.x.TodayExtensionSharingDefaults"];
BOOL value = [defaults boolForKey:@"SwitchState"];

我正在尋找一種解決方案,當開關的值更改時,該解決方案可在主包含應用程序中提供回調。

在此解決方案中,我必須設置一個NSTimer ,例如每200ms刷新一次用戶默認設置。

通過將Observer添加到sharedDefaults,有什么解決方案嗎?

我認為這將適合您的用例:

當您離開應用並打開通知中心時,

- (void)applicationWillResignActive:(UIApplication *)application

在您的AppDelegate中被調用。 當您從小部件回來時,

- (void)applicationDidBecomeActive:(UIApplication *)application

在您的AppDelegate中被調用。 因此,只需檢查您的值,然后向控制器發送內部通知。 您不需要計時器。

即使您可以使應用程序正常工作,但觀察它的更改也不是一個好的解決方案,因為當開關值更改時,您不確定應用程序是否正在運行。 今天的擴展也不打算如此工作。

如果您的應用需要在下次運行時知道此開關的狀態(確認在輕按該開關時它可能未運行),那么您已經在做正確的事情。

如果您需要立即通知您的應用程序切換值已更改(再次,請確認您的應用程序可能未運行,並且這樣做可能會啟動您的應用程序),則應為您的應用程序創建自定義URL方案,然后打開URL從擴展名。 就像這樣:

  • 在應用程序中,在應用程序的“信息”設置的“ URL類型”部分中聲明自定義URL方案。
  • 同樣在應用程序中,向應用程序代理添加代碼以接收打開URL的請求。
  • 在應用擴展中,使用[NSExtensionContext openURL:completionHandler:]打開URL。 這將啟動您的應用並傳遞提供的URL。

如果該URL方案類似於mygreatapp ,則應用擴展mygreatapp:打開一個類似於mygreatapp:的URL。 您可以根據需要在URL中添加詳細信息,或者應用程序可以僅使用用戶默認值來查找保存的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM