2

次の問題があります。

を含む 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たとえば 200 ミリ秒ごとにユーザーのデフォルトを更新するように設定する必要があります。

オブザーバーを sharedDefaults に追加することによる解決策はありますか?

4

2 に答える 2

0

これはあなたのユースケースでうまくいくと思います:

アプリを終了して通知センターを開くと、

- (void)applicationWillResignActive:(UIApplication *)application

AppDelegate で呼び出されます。ウィジェットから戻ってきたら、

- (void)applicationDidBecomeActive:(UIApplication *)application

AppDelegate で呼び出されます。したがって、値を確認して、コントローラーへの内部通知を送信してください。タイマーは必要ありません。

于 2014-11-10T17:14:25.177 に答える
0

スイッチの値が変更されたときにアプリが実行されていることさえ確認できないため、アプリの変更を監視することは、たとえそれを機能させることができたとしても、良い解決策ではありません。また、今日の拡張機能が意図されている方法でもありません。

アプリが次に実行するときにこのスイッチの状態を知る必要がある場合 (スイッチがタップされたときにアプリが実行されていない可能性があることを認識している場合)、既に正しいことを行っています。

スイッチの値が変更されたことをすぐにアプリに通知する必要がある場合 (アプリが実行されていない可能性があり、これを行うとアプリが起動する可能性があることを再度認識してください)、アプリのカスタム URL スキームを作成してから、URL を開く必要があります。拡張子から。これは次のようになります。

  • アプリで、アプリの「情報」設定の「URL タイプ」セクションでカスタム URL スキームを宣言します。
  • また、アプリで、アプリ デリゲートにコードを追加して、URL を開くリクエストを受け取ります。
  • アプリの拡張機能で、 を使用[NSExtensionContext openURL:completionHandler:]して URL を開きます。これにより、アプリが起動し、提供された URL が渡されます。

URL スキームが のようなものである場合mygreatapp、アプリ拡張機能は のような URL を開きますmygreatapp:。必要に応じて URL に詳細を追加することも、アプリがユーザーの既定値を使用して保存された値を検索することもできます。

于 2014-11-12T21:21:43.693 に答える