【问题标题】:track user choice for Push Notification [allow/don't]跟踪用户对推送通知的选择 [允许/不允许]
【发布时间】:2015-10-15 04:48:25
【问题描述】:

当应用程序需要注册推送通知(UIApplication registerForRemoteNotificationTypes)时,弹出窗口显示允许/不选择。

有没有办法跟踪用户何时做出此选择?

因为解决方案:

NSUInteger rntypes = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];

很好,但在用户触摸某些东西之前,默认情况下它是 NO。我应该只在用户做出选择之后检查这个配置。

结果是在我的 EasyAPNS 服务器中,大多数应用程序都处于“禁用”模式,直到用户重新启动它们(因为第二次正确的配置将被推送到我的服务器)。因此,第一次启动时,可能不会考虑用户的真正选择(如果您真的很快接受,那么在我的应用注册到 EasyAPNS 之前,您的选择会在第一次启动时反映在服务器上)

有什么想法吗?

【问题讨论】:

    标签: ios cocoa-touch push-notification


    【解决方案1】:

    似乎无法确定是否已显示允许弹出窗口。我依靠用户默认值来跟踪这一点:

    - (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

    【讨论】:

      【解决方案2】:

      在 iOS 8 及更高版本下,该过程略有不同。在 iOS 8 中,enabledRemoteNotificationTypes 方法被 isRegisteredForRemoteNotifications 取代。

      然而isRegisteredForRemoteNotifications如果应用程序尝试注册通知,则总是返回YES,无论用户是否真的允许它们。

      要确定用户是否真的允许通知,请使用@Lefteris here提供的函数:

      - (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);
          }
      }
      

      【讨论】:

      • isRegisteredForRemoteNotifications 并不总是返回 YES。返回:如果应用已注册远程通知并收到其设备令牌,则返回 YES;如果注册尚未发生、失败或被用户拒绝,则返回 NO。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多