![](/img/trans.png)
[英]How to share data with containing app using NSUserDefaults ? - Today Extension Widget
[英]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從擴展名。 就像這樣:
[NSExtensionContext openURL:completionHandler:]
打開URL。 這將啟動您的應用並傳遞提供的URL。 如果該URL方案類似於mygreatapp
,則應用擴展mygreatapp:
打開一個類似於mygreatapp:
的URL。 您可以根據需要在URL中添加詳細信息,或者應用程序可以僅使用用戶默認值來查找保存的值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.