web-dev-qa-db-ja.com

Objective-C-ユーザーがアプリの通知設定を変更したことを検出します

私は常にユーザーがプッシュ通知設定でどのオプションを選択するかを知る必要があります。
(オプションは-アラート、サウンド、バッジです)

したがって、アプリの起動時に次のように呼び出します。

UIRemoteNotificationType types = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];

ユーザーが選択したものを検出します。

しかし、ユーザーがアプリの存続期間中に設定を変更したかどうかをどのように検出できますか?
この設定で変更が発生したときに呼び出されるデリゲートメソッドはありますか?

16
Eyal

代理人はいません。 UIApplicationプロパティenabledRemoteNotificationTypesを定期的に、たとえばapplicationDidBecomeActive:でクエリする必要があります。

詳細については、次の回答を確認してください。

ユーザーがプッシュ通知を有効にしているかどうかをiPhoneで確認します

ロック画面で表示およびenabledRemoteNotificationTypes-iOS5

編集:
プッシュ通知設定と許可アラートをリセットする必要がある場合は、 AppleテクニカルノートTN2265 を参照してください。セクション「iOSでのプッシュ通知権限アラートのリセット」では、iOSで設定をリセットする方法について説明しています。ただし、多くの開発者は、手順が機能しないと不満を言っています。 このリンク が機能するかどうかわからない場合は、Appleフォーラムにアクセスする必要がありますが、これはこの正確な問題に関するスレッドの1つです。 。

AppleがiOS5.1の権限ダイアログを削除したのではないかと思っていました。そうでなければ、なぜアプリケーションにアラートを表示する必要があるのでしょうか? AppStoreのレビューガイドラインによると6月まで2016

5.3最初にユーザーの同意を得ずにプッシュ通知を送信するアプリは拒否されます

たとえば、パス(アプリケーション)は、アプリケーションが初めて起動したときではなく、起動プロセスの途中でプッシュ通知をオプトインするようにユーザーに要求します。

アプリケーションは通知設定の状態を照会できないため、とにかくプロンプトの目的が何であるかわからない。特に、アプリケーションは(enabledRemoteNotificationTypesを使用して)どの通知タイプが有効になっているかを確認できますが、特定のアプリケーションのプッシュ通知が有効または無効になっている場合は確認できません(上部の通知センターのオン/オフスイッチ)。少なくとも、それはiOS5.1の動作です。ユーザーがそのアプリケーションの通知を無効にしても、アプリケーションはプッシュ通知に登録でき(registerForRemoteNotificationTypesを使用)、APNSトークンを受け取ります。

22
Greg

アプリの起動時だけでなく、アプリがアクティブになったときに確認してください。

7
Nick Bull

答え@ Nick Bull に加えて、ユーザーが設定ジョブを実行してアプリに戻ったときに、機密性の高いViewControllerをUIApplicationWillEnterForegroundNotificationリッスンにサブスクライブします。

[[NSNotificationCenter defaultCenter] addObserver: self
                                         selector: @selector(appEnterForeground:)
                                             name: UIApplicationWillEnterForegroundNotification object:nil];

Swiftの亜種はここにあります: ユーザーが設定から戻ったことを確認する方法

0
A. Petrov

これは、UrbanAirshipを介してプッシュが実装された場合の例です。ユーザーがデリゲートに続いてプッシュをオプトイン/オプトアウトするたびに、以下の方法で(YES/NO)を確認できます。

UrbanAirshipを使用しない場合は、UIApplicationデリゲートでも同じことができます。

- (void)registrationSucceededForChannelID:(NSString )channelID deviceToken:(NSString )deviceToken
    {
        NSLog(@"registrationSucceededForChannelID : %@",[self appRegisterForPushNotification]?@"YES":@"NO");
    }


    - (BOOL)appRegisterForPushNotification {
        if ([[UIApplication sharedApplication] respondsToSelector:@selector(currentUserNotificationSettings)]) {
            UIUserNotificationType types = [[[UIApplication sharedApplication] currentUserNotificationSettings] types];
            return ((types & UIUserNotificationTypeAlert) || (types & UIUserNotificationTypeSound));
        }
        return NO;
    }
0