2

アプリケーションがプッシュ通知 (UIApplication registerForRemoteNotificationTypes) に登録する必要がある場合、ポップアップに許可/禁止の選択が表示されます。

ユーザーがいつこの選択をしたかを追跡する方法はありますか?

解決策:

NSUInteger rntypes = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];

問題はありませんが、ユーザーが何かに触れるまで、デフォルトでは NO です。ユーザーが選択したにのみ、この構成を確認する必要があります。

その結果、EasyAPNS サーバーでは、ユーザーがアプリケーションを再起動するまでほとんどのアプリケーションが「無効」モードになります (2 回目に正しい構成がサーバーにプッシュされるため)。したがって、最初の起動では、ユーザーの実際の選択はおそらく考慮されません (私のアプリが EasyAPNS に登録される前に、非常に迅速に受け入れた場合、最初の起動時に選択がサーバーに反映されます)。

何か案が ?

4

2 に答える 2

3

許可ポップアップが表示されたかどうかを判断する方法はないようです。これを追跡するために、ユーザーのデフォルトに依存しています。

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
    BOOL didRegisterForPush = [[NSUserDefaults standardUserDefaults] boolForKey:@"didRegisterForPush"];
    if (!didRegisterForPush) {
        [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"didRegisterForPush"];
        [[NSUserDefaults standardUserDefaults] synchronize];
    }
    // .. send deviceToken to server
}

これで、次を使用して承認状態を判断できます。

- (PushAuthorizationStatus)pushAuthorizationStatus
{
    UIRemoteNotificationType types = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
    if (types) {
        return kPushAuthorizationStatusAuthorized;
    }
    BOOL didRegisterForPush = [[NSUserDefaults standardUserDefaults] boolForKey:@"didRegisterForPush"];
    if (didRegisterForPush) {
        return kPushAuthorizationStatusDenied;
    }
    return kPushAuthorizationStatusNotDetermined;
}

NotDeterminedこれを使用すると、状態を の代わりにサーバーに送信できますDenied

于 2012-09-26T10:03:13.987 に答える
2

iOS 8 以降では、手順が少し異なります。iOS 8 では、このenabledRemoteNotificationTypesメソッドは に置き換えられましたisRegisteredForRemoteNotifications

ただし 、ユーザーが実際に通知を許可したかどうかに関係なく、アプリが通知の登録を試みた場合はisRegisteredForRemoteNotifications 常に返されます。YES

ユーザーが実際に通知を許可したかどうかを判断するには、ここで@Lefteris が提供する関数を使用します。

- (BOOL)pushNotificationsEnabled {
    if ([[UIApplication sharedApplication] respondsToSelector:@selector(currentUserNotificationSettings)]) {
        UIUserNotificationType types = [[[UIApplication sharedApplication] currentUserNotificationSettings] types];
        return (types & UIUserNotificationTypeAlert);
    }
    else {
        UIRemoteNotificationType types = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
        return (types & UIRemoteNotificationTypeAlert);
    }
}
于 2015-10-14T20:48:25.387 に答える