Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如果卸载/重新安装同一设备的应用程序,设备令牌是否会更改_Ios_Apple Push Notifications_Devicetoken - Fatal编程技术网

Ios 如果卸载/重新安装同一设备的应用程序,设备令牌是否会更改

Ios 如果卸载/重新安装同一设备的应用程序,设备令牌是否会更改,ios,apple-push-notifications,devicetoken,Ios,Apple Push Notifications,Devicetoken,我收到同一应用程序的多个通知 如果它改变了如何从我们的服务器中删除旧的 以下是我在iOS9设备上的观察结果 1.DB APPId和Device token中有两个字段,如果我取消安装应用程序并将其重新安装在同一设备中,则设备令牌会发生变化 2.我在同一台设备上测试了另一个应用程序。即使在同一台设备上,设备令牌也不同 即使我从数据库中删除了第一个设备令牌,我也会收到3个相同设备的通知…。我还不明白为什么会有多个通知 可能的原因是什么?为注销会话创建新的web服务,并在您注销时调用此服务,此服务告诉

我收到同一应用程序的多个通知

如果它改变了如何从我们的服务器中删除旧的

以下是我在iOS9设备上的观察结果

1.DB APPId和Device token中有两个字段,如果我取消安装应用程序并将其重新安装在同一设备中,则设备令牌会发生变化

2.我在同一台设备上测试了另一个应用程序。即使在同一台设备上,设备令牌也不同


即使我从数据库中删除了第一个设备令牌,我也会收到3个相同设备的通知…。我还不明白为什么会有多个通知


可能的原因是什么?

为注销会话创建新的web服务,并在您注销时调用此服务,此服务告诉您的后端开发人员从数据库中删除您的设备令牌。

@Krishna:device token与您第一次安装应用程序时保持一致,并卸载后再次安装此应用程序在同一台设备上

如果您再次使用新设备,则设备令牌将不同

注意:只需通知后端开发人员执行以下操作:

  • 您用于在数据库中插入设备令牌的ApI,因为他需要检查设备令牌是否存在差异并将其更新为新的。否则,只需使用web服务的任何通行证即可

  • 其工作正常。

    ,每次重新安装应用程序时,设备令牌可能会更改。因此,最好的方法是在每次启动时存储(更新或插入数据库)设备令牌。

    设备令牌在以下条件下发生更改

    • 如果用户将备份数据恢复到新设备
    • 重新安装应用程序
    因此,我的建议是使用新令牌更新服务器

    当每次应用程序在
    didRegisterForRemoteNotificationsWithDeviceToken
    中启动时,您必须调用api,如果发生更改,该api将更新设备令牌

    在数据库中再创建两个字段,分别为
    设备令牌
    APPId
    ,因此,请更新
    设备令牌
    ,以了解
    APPId

    从设备密钥链获取
    APPId
    或唯一的设备id,并使用
    device token
    将其发送到您的服务器,因此,在服务器更新
    device token
    时,有关
    APPId

    钥匙链
    值在上述以下情况下永远不会更改

    要获得钥匙链价值,请遵循

    //标记:-推送通知委托方法。
    func应用程序(application:UIApplication,DidRegisterForRemotionTificationswithDeviceToken deviceToken:Data){
    //将此设备令牌发送到服务器
    让令牌=字符串(数据:deviceToken.base64EncodedData(),编码:.utf8)?.trimmingCharacters(在:CharacterSet.whitespaces中)。trimmingCharacters(在:CharacterSet(charactersIn:))
    //将设备保存为用户默认值
    让defaults=UserDefaults.standard
    默认设置(令牌,forKey:“DeviceToken”)
    defaults.synchronize()
    打印(“令牌是--\(令牌)”)
    打印(“AppId---\(getUniqueDeviceIdentifierAsString)”)
    //将令牌值和AppId发送到服务器
    }
    var getUniqueDeviceIdentifierAsString:字符串{
    让appname=Bundle.main.infoDictionary![kCFBundleNameKey作为字符串]作为!字符串
    var StrapApplicationUUID:String?=KeychainWrapper.standard.String(forKey:appname)
    如果StrapApplicationUUID==nil{
    StrapApplicationUUID=UIDevice.current.identifierForVendor?.UUIString
    _=KeychainWrapper.standard.set(StrapApplicationUUID!,forKey:appname)
    }
    返回应用程序UUID!
    }
    
    我们可以关闭应用程序内部的推送功能,而不是从服务器上删除设备令牌(在注销时)。@Akshay Patel登录/注销时一切正常。如果再次卸载并重新安装应用程序,我需要?当用户安装应用程序并在安装后登录时,用户在卸载应用程序后再次转到安装应用程序。在这种情况下,设备令牌保持不变或更改。@Krishna你能简单地告诉我你的问题信息吗?因此,我为您提供了确切的解决方案。@PavanGandhi,让我们说,第一次安装了应用程序(设备令牌插入到我们的数据库中)。如果用户卸载了应用程序,并再次安装。。设备令牌是否已更改?如果它改变了如何从我的数据库中删除旧的帐户?如果遇到任何问题,请遵循我提供的解决方案,然后通知meAre您从同一设备登录多个帐户?@technerd否,我询问有关卸载/重新安装的问题。首先,您需要检查用户设备的设备令牌是否存在。如果不存在,则添加该用户的设备令牌。如果存在,则获取详细信息并更新其设备令牌。我们不使用UserId进行检查(即使用户未登录,我们也需要该设备的devicetoken)。我刚刚在我的数据库中被检查,如果我取消了应用程序,DB APPId和Device token中有两个字段,如果我再次在同一设备中安装,则设备标记将更改..即使我从我的数据库中删除了第一个设备标记,我也会收到同一设备的3个通知…。我还不明白为什么会有多个通知。。
    // MARK: - Push Notification Delegate Methods.
        func application(_ application: UIApplication,didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    
            //send this device token to server
    
            let token = String(data: deviceToken.base64EncodedData(), encoding: .utf8)?.trimmingCharacters(in: CharacterSet.whitespaces).trimmingCharacters(in: CharacterSet(charactersIn: "<>"))
    
            //Save device to UserDefaults
            let defaults = UserDefaults.standard
            defaults.set(token, forKey: "DeviceToken")
            defaults.synchronize()
    
            print("token is ---\(token)")
    
            print("AppId ----\(getUniqueDeviceIdentifierAsString)")
    
            //Send token value and AppId to server
    
        }
    
         var getUniqueDeviceIdentifierAsString : String {
    
            let appname =  Bundle.main.infoDictionary![kCFBundleNameKey as String] as! String
    
            var strApplicationUUID: String? = KeychainWrapper.standard.string(forKey: appname)
            if strApplicationUUID == nil {
                strApplicationUUID = UIDevice.current.identifierForVendor?.uuidString
                _ = KeychainWrapper.standard.set(strApplicationUUID!, forKey: appname)
            }
    
            return strApplicationUUID!
        }