Расширение iOS Today NSUserDefaults Совместное использование данных с содержащим приложением с использованием обратных вызовов

У меня следующая проблема:

Я создал расширение «Сегодня», которое содержит файл UISwitch. IBAction этого переключателя в Today Extension должен сохранять состояние включения, используя 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, который обновляет пользовательские значения по умолчанию, например, каждые 200 мс.

Есть ли какое-либо решение путем добавления наблюдателя к общим значениям по умолчанию?


person user3211971    schedule 07.11.2014    source источник


Ответы (2)


Я думаю, что это будет работать для вашего варианта использования:

Когда вы выходите из приложения и открываете Центр уведомлений,

- (void)applicationWillResignActive:(UIApplication *)application

вызывается в вашем AppDelegate. Когда вы вернетесь из виджета,

- (void)applicationDidBecomeActive:(UIApplication *)application

вызывается в вашем AppDelegate. Так что просто проверьте свое значение и отправьте внутреннее уведомление на ваш контроллер. У вас не должно быть необходимости в таймере.

person Henry T Kirk    schedule 10.11.2014
comment
спасибо за Ваш ответ. Но я ищу решение, которое напрямую уведомляет мое содержащее приложение об изменениях состояния переключения, чтобы выполнять некоторые задачи в фоновом режиме. - person user3211971; 11.11.2014
comment
Ах я вижу. Как насчет сохранения pref-файла в общем контейнере группы приложений и прослушивания его изменений. - person Henry T Kirk; 11.11.2014
comment
Спасибо за ответ. Я хочу реализовать это, но как отправить внутреннее уведомление на ваше сегодняшнее расширение? - person Prem; 04.05.2015

Наблюдение за изменением в вашем приложении не является хорошим решением, даже если вы можете заставить его работать, потому что вы не можете быть уверены, что ваше приложение вообще работает, когда значение переключателя изменяется. Это также не то, как сегодня должны работать расширения.

Если вашему приложению необходимо знать состояние этого переключателя при следующем запуске (понимая, что оно может не работать, когда переключатель нажат), вы уже поступаете правильно.

Если вам нужно немедленно уведомить свое приложение об изменении значения переключателя (опять же, признавая, что ваше приложение может не работать и это может запустить ваше приложение), вы должны создать пользовательскую схему URL-адреса для своего приложения, а затем открыть URL-адрес из расширения. Это будет что-то вроде:

  • В приложении объявите пользовательскую схему URL-адресов в разделе «Типы URL-адресов» в настройках «Информация» приложения.
  • Также в приложении добавьте код в делегат приложения для получения запросов на открытие URL-адресов.
  • В расширении приложения используйте [NSExtensionContext openURL:completionHandler:], чтобы открыть URL-адрес. Это запустит ваше приложение и передаст указанный URL-адрес.

Если схема URL-адреса похожа на mygreatapp, расширение приложения откроет URL-адрес вида mygreatapp:. Вы можете добавить детали к URL-адресу, если это необходимо, или приложение может просто использовать пользовательские значения по умолчанию для поиска сохраненного значения.

person Tom Harrington    schedule 12.11.2014