如何处理旧的 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 的情况不同。在这种情况下,我们的服务具有重复数据删除逻辑以防止重复通知。
我正在使用 Azure 通知中心发送远程通知,目前只发送给 iOS。
我最初意识到我的设备收到了同一通知事件的 5 条通知。我检查并调试了我的代码,它确实正确地检查了提供的要注册的令牌是否尚未注册。
然后我检查了我的数据库并意识到我没有重复项,但一个设备和用户帐户有 5 个不同的设备令牌。每次我在我的设备上卸载然后重新安装该应用程序时,它们都会生成。
这样一来,我会认为当一个应用程序被卸载时,之前生成的令牌被苹果系统作废了?我假设这是因为在重新安装时,会生成一个与之前不同的新令牌。为什么旧令牌仍然有效;这样的用例是什么。
好像也是other people are having this issue for iOS development, including Android
使用 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 的情况不同。在这种情况下,我们的服务具有重复数据删除逻辑以防止重复通知。