【问题标题】:Invalidate iOS device push token on user logout用户注销时使 iOS 设备推送令牌无效
【发布时间】:2013-11-13 06:25:09
【问题描述】:

当我的服务用户退出我的应用程序时,我如何可靠地使设备的推送令牌无效(从我服务器上的用户配置文件中删除)?

我在我的用户配置文件中保留了一组包含 apns 令牌的字符串,每当用户在给定设备上启用推送通知时都会添加一个字符串。

后来我意识到推送令牌是设备独有的,但显然对我的内部用户帐户一无所知,因此如果一个用户注销并且另一个用户登录(同一设备),他们每个人都有相同的令牌。然后设备的当前用户会收到针对其中任何一个的推送通知。

基本的解决方案是在注销时从用户配置文件中删除设备的令牌,但我想出了一堆问题,因为我认为是这样的:

  1. 注销不应该需要网络访问 - 我可以尝试通知我的服务器,但即使用户没有网络访问权限(?)也需要异步注销才能成功(?)
  2. 实际的设备令牌可能是未知的——如果用户暂时关闭了推送权限,则不会给出当前令牌。并且存储设备密钥信息似乎充其量是微不足道的,因为每次安装的 identifierForVendor 更改和 UDID 方法已被弃用。
  3. 服务器端唯一性(在向帐户添加令牌时,确保未为任何其他帐户设置相同的令牌) - 这取决于第二个用户登录,这不能保证。

是否还有更多我遗漏的边缘情况以及我可以使用哪些策略来解决它们?

【问题讨论】:

    标签: ios rest push-notification apple-push-notifications


    【解决方案1】:

    你的问题确实提出了你可能面临的一些困难情况。我建议您转移或确保推送发送逻辑完全在服务器端:将推送令牌链接到您选择的用户标识符(这意味着一个推送令牌确实可以链接到多个用户)。您控制的这个标识符将成为您需要发送推送时所针对的帐户标识符。这样,您可以控制应该接收通知的用户并根据此标识符检索他的 pushtoken(与 Apple 提供的任何设备标识符相比,假设 1 个设备 = 1 个用户)。

    如果您的用户离线注销,您将不会知道。您可能会向该用户发送通知。如果用户选择对其进行操作,您的应用将打开,此时您可以从您的服务器取消订阅用户标识符(因为此时他显然在线)。

    【讨论】:

    • 不确定我是否遵循第一段。我基本上已经有了前半部分(一个令牌可以链接到多个用户),但我不确定如何区分它对哪个用户有效。可能是第一次保存到该用户配置文件时的时间戳,因此最新的将是有效的?
    • 感谢您对离线注销做出反应,然后是推送通知,这似乎是给定 API 的最佳案例解决方案,并减轻了我对警告一的疑虑。
    • 关于第一段,当你将pushtoken存储在你的服务器上时,你可以同时发送用户标识符。您的服务器此时将知道用户是否有效,不是吗?尽管我不确定我是否正确理解了您的问题... pushtoken 将是相同的,无论生成它的时间戳如何;不确定我是否遵循您的想法。
    • 是 - 推送用户 ID 显式 (json) & 固有 (auth) 附加到被推送的令牌;我认为我们倾向于唯一地存储令牌并将它们与要提交的最新用户相关联,那么唯一的差距就是“静默注销”,这种情况应该很少见,可以被警告或清除。
    • 我们基本上采用所描述的方法,并使用后台获取作为额外的清理机制。
    【解决方案2】:
    1. 当您的应用首次在设备上运行时,会生成一个 uuid(通用唯一 ID)并使用 NSUserDefaults 将其保存在设备上

      NSString *uuid = [[NSUserDefaults standardUserDefaults] objectForKey:@"app_uuid"];

      if(uuid == nil){
          uuid = [[NSUUID UUID] UUIDString];
          [[NSUserDefaults standardUserDefaults] setObject:uuid forKey:@"app_uuid"];
          [[NSUserDefaults standardUserDefaults] synchronize];
      
      }
      

      此 uuid 将用于识别用户正在使用和登录的唯一应用程序实例(如果您希望用户能够使用相同的用户 ID 登录到多个设备)。

    2. 然后每次您将令牌发送到您的服务器时,发送用户 id 和应用程序 uuid。并在服务器端检查应用程序 uuid 是否已存在,如果是,则使用新令牌和用户 ID 覆盖元组,如果不存在,则使用用户 ID、令牌和 uuid 创建并保存新元组。

    3. 当向特定用户发送通知时,获取所有具有用户 ID 的元组,从中获取令牌并使用这些令牌发送通知。

    【讨论】:

      猜你喜欢
      • 2019-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-10
      • 1970-01-01
      • 2017-01-15
      • 2020-03-29
      相关资源
      最近更新 更多