【问题标题】:IOS - How to disable push notification at logout?IOS - 如何在注销时禁用推送通知?
【发布时间】:2020-04-07 15:30:49
【问题描述】:

我的应用程序在登录时在我的服务器中注册帐户以启用聊天推送通知。但是我还没有实现注销时注销帐户,所以此时如果我在 same 设备上使用 2 个帐户登录,它可以收到通知两个帐户。同时,我的通知中心有一个 POST 服务,它从接收通知中心取消注册“登录名+设备令牌”。我应该在哪里称呼它?我必须使用unregisterForRemoteNotifications 吗?我只想从推送通知中注销帐户+设备令牌,而不是永久禁用整个应用通知。

我可以将我的设备令牌保存在didRegisterForRemoteNotificationsWithDeviceToken 函数上吗

 $ [[NSUserDefaults standardUserDefaults] setObject:hexToken forKey:DEVICE_KEY];

然后,在注销时,像

一样调用我的 POST 函数“removeDeviceToken”
  NSString *deviceToken = [userDefaults objectForKey:DEVICE_KEY];
    if(deviceToken != NULL){
       [self.engine removeDeviceToken:deviceToken];
     }

【问题讨论】:

    标签: ios apple-push-notifications


    【解决方案1】:

    您可以通过调用在应用程序中轻松启用和禁用推送通知

    要注册,请致电:registerForRemoteNotificationTypes:

    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:
         (UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];
    

    要取消注册,请致电:unregisterForRemoteNotificationTypes:

    [[UIApplication sharedApplication] unregisterForRemoteNotifications];
    

    检查用

    启用或禁用 iPhone 推送通知试试这个代码

    UIRemoteNotificationType types = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
    if (types == UIRemoteNotificationTypeNone) 
     // Yes it is..
    

    【讨论】:

      【解决方案2】:

      我不确定我是否正确,但如果您不想禁用应用程序的推送通知,那么您不应该调用 unregisterForRemoteNotifications。您可以做的是,当用户点击注销按钮时,您可以向您的服务器发出注销请求,然后从该帐户中删除 notificationID,注销请求完成后,您只需在本地执行注销(更新 UI等)。

      关于评论的更多信息:

      是的,首先,您应该在每次启动时调用 registerForRemoteNotificationTypes 方法,因为设备令牌可以更改。委托方法之后

      - (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)devToken
      

      被调用,你可以获取设备令牌并将其保存到 NSUserDefault。这样,当用户登录时,您可以获得最新的设备令牌(如果已更改),并将其发送到您的服务器以添加到该帐户。

      所以代码可能看起来像这样

      - (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)devToken {
          NSString *newToken = [devToken description];
          newToken = [newToken stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]];
          newToken = [newToken stringByReplacingOccurrencesOfString:@" " withString:@""];
          NSString *notificationID = [newToken description];
      
          NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
          [prefs setObject:notificationID forKey:@"notification_id"];
          [prefs synchronize];
      }
      

      所以,现在当用户登录时,只需获取通知 ID 并将其发送到您的服务器

      - (IBAction)userTappedLoginButton {
          // Make your login request
          // You can add the notification id as a parameter
          // depending on your web service, or maybe make
          // another request just to update notificationID
          // for a member
      
          NSString *notificationID = [[NSUserDefaults standardUserDefaults] objectForKey:@"notification_id"];
          ...
          ...
      }
      

      【讨论】:

      • 是的,然后在下一次登录时,他就像往常一样调用 registerForRemoteNotification。谢谢。现在只有一个问题:我怎样才能拥有设备令牌?我必须从 registerForRemoteNotification 调用中将其保存在本地,它在每个 applicationBecomeActive 中完成吗?
      • Apple 文档说,“此外,永远不要缓存设备令牌并将其提供给您的提供商;始终在需要时从系统获取令牌。如果您的应用程序之前已注册,请调用 registerForRemoteNotificationTypes: results在操作系统中立即将设备令牌传递给委托,而不会产生额外的开销。另请注意,只要设备令牌更改,就可以调用委托方法,而不仅仅是响应您的应用注册或重新注册。”
      • @AlfieHanssen 链接已更新为此link
      • "从不缓存设备令牌;始终在需要时从系统中获取它们。虽然设备令牌对于应用和设备来说是唯一的,但它们会随着时间而改变。设备令牌可以随时更改但是当用户从备份恢复他们的设备时,当用户在新设备上安装您的应用程序时,以及当用户重新安装操作系统时,保证会有所不同。从系统中获取令牌可确保您始终拥有当前令牌需要与 APNS 通信。”
      【解决方案3】:

      使用 Swift:

      注册,

      UIApplication.shared.registerForRemoteNotifications()
      

      要注销,

      UIApplication.shared.unregisterForRemoteNotifications()
      

      【讨论】:

        【解决方案4】:

        一般来说,注销后注销并在登录后重新注册是一个坏主意。原因很简单:如果用户使用其他帐户登录,而您没有专门检查服务器中的令牌重叠,则用户将开始收到双重通知。

        【讨论】:

        • 我想发表评论,但是是的,我没有足够的声誉......
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多