如何处理旧的 iOS notification token 在生成新的 token 和 vendorId 后仍然有效?

How to deal with old iOS notification tokens remaining valid after new token and vendorId are generated?

我正在使用 Azure 通知中心发送远程通知,目前只发送给 iOS。

我最初意识到我的设备收到了同一通知事件的 5 条通知。我检查并调试了我的代码,它确实正确地检查了提供的要注册的令牌是否尚未注册。

然后我检查了我的数据库并意识到我没有重复项,但一个设备和用户帐户有 5 个不同的设备令牌。每次我在我的设备上卸载然后重新安装该应用程序时,它们都会生成。

这样一来,我会认为当一个应用程序被卸载时,之前生成的令牌被苹果系统作废了?我假设这是因为在重新安装时,会生成一个与之前不同的新令牌。为什么旧令牌仍然有效;这样的用例是什么。

好像也是other people are having this issue for iOS development, including Android

使用 VendorId 来识别设备被证明是毫无意义的,,它也会在全新安装时发生变化。当我卸载应用程序并重新安装时,我得到了一个新的 vendorId 和一个新的通知令牌,而之前的令牌仍然有效,开放了接收一个通知实例的多个实例的能力(因为后端无法将新的两个值匹配到数据库中存在的任何内容)。

请问有什么建议吗?我对此完全迷失了?

更新:我当然需要一个用户一次拥有多个设备令牌,以防他们在多个设备上登录。

您基本上必须自己识别设备,方法是使用 UUID 将 ID 保存到钥匙串中。钥匙串,因为数据在多次安装后仍然存在。

下面是使用 Locksmith 的快速实现:

import UIKit
import Locksmith


class Keychain
{
    private static let AccountName = "MyAppName";
    private static let CustomDeviceIdKey = "CustomDeviceIdKey";
    
    private static func AccountData() -> Dictionary<String, Any>?
    {
        return Locksmith.loadDataForUserAccount(userAccount: AccountName)
    }
    
    private static func GenerateCustomDeviceId() -> Bool
    {
        do{
            try Locksmith.saveData(data: [CustomDeviceIdKey: UUID().uuidString], forUserAccount: AccountName)
            return true
        }catch{
            print("Failed to save custom device id: \(error.localizedDescription)")
            return false
        }
    }
    
    static func CustomDeviceId() -> String
    {
        let data = AccountData()
        if let result = data?[CustomDeviceIdKey] as? String{
            return result
        }else{
            if GenerateCustomDeviceId(){
                return CustomDeviceId()
            }
            return ""
        }
    }
}

然后你就去:

func SomeMethodThatNeedsDeviceId(){
    var customDeviceIdThatPersistsOverInstalls = Keychain.CustomDeviceId()
}

这就是您用来代替 VendorId 的内容

从 Azure 通知中心的角度回答,我们将每个设备 ID 视为有效的设备 ID,并且只会在我们尝试推送到该设备并且 Apple 向我们提供设备响应时阻止未来发送针对该设备expired/invalid。因此,我们无法了解不同的设备 ID 是否可能由于重新安装而属于同一设备。

这与单个通知可能多次获取相同 设备 ID 的情况不同。在这种情况下,我们的服务具有重复数据删除逻辑以防止重复通知。