2015-12-15 75 views
8

我有一个问题,在卸载并重新安装我的应用程序后,用户开始接收双重通知,因为设备发送给我的服务器2个不同的APNS令牌 - 一个来自第一个安装,另一个来自重新安装应用程序。由于令牌不同,我不知道这是同一个设备。如何管理iOS apns令牌更改

在iOS 9出来之前,每次我卸载并重新安装应用程序,我总是得到相同的APNS,所以很容易知道这是用户使用的设备。从iOS 9开始,似乎每次安装都会更改APNS令牌。

我的问题是如何判断客户端是否卸载并重新安装应用程序,并更新他的APNS令牌而不是添加新的令牌?

我在问,这听起来像是大多数iOS开发人员必须处理的事情,但我无法从Apple找到任何有关如何解决此问题的最佳做法,所以我希望其他人可以分享他们在此问题上的经验。

+0

做用户需要登录或确定自己使用的应用程序,并得到通知? – Ares

+0

@ares是的,但每个用户可以连接多个设备,因此当用户连接时,我无法确定重新安装后是否有新设备或APNS更改。 – Kuf

+0

如何附加'[[UIDevice currentDevice]名称];'到令牌元数据? – Ares

回答

6

这就是我们最终解决它:

在每个应用程序启动:

  1. 创建推送通知令牌
  2. 有在localStorage的令牌?
    • 是 - 将令牌与localstorage进行比较。他们是一样的吗?
      • 是 - 返回
      • 没有 - 用新的令牌更新服务器,并用“OK”本地保存在本地存储和钥匙扣
    • 服务器响应后无 - 检查是否有在钥匙链令牌
      • 是 - 将令牌与钥匙串进行比较。他们是一样的吗?
        • 是 - 保存令牌的localStorage和返回
        • 没有 - 用新的令牌更新服务器,并用“OK”本地保存在本地
          存储和钥匙扣服务器响应后
    • 没有更新服务器与新的令牌,并在服务器响应与'确定'后本地保存在本地存储和钥匙链

如果任何人有一个更优雅的方式来解决它,我喜欢听到它

+0

我更喜欢使用'identifierForVendor'键在每次启动应用程序时,检查是否值'appnameVendor'键退出,如果没有从系统加载并记录下来,则发送给服务器新的令牌和'appnamVendor'的值,服务器将负责创建新的或者更新退出的一个基本值, e – sahara108

+0

@ sahara108我想过这样做(这就是我为Android所做的),但是因为我需要保存令牌以了解它是否已更改,所以我使用该令牌而不是在钥匙串中添加另一个存储的变量。 – Kuf

+0

您只能以两种方式存储一个变量。唯一不同的是,如果你有多个应用程序,你可以重复使用'identifierForVendor',因为它在你的应用程序中是相同的。 – sahara108