2016-01-20 192 views
1

即时得到了相同的应用程序的多个通知所述设备标识的变化..是,如果卸载/重新安装应用程序的同一设备

如果它改变如何删除旧的形成我们的服务器..

这里是我的观察在IOS 9设备

1.有在DB APPID和设备令牌两个字段如果我解除停止该应用,然后在同一设备中再次安装它的设备令牌变化..

2.I测试其他应用在同一个设备中设备令牌不同即使是相同的设备

我得到3通知到同一设备即使如果我删除了第一个设备令牌之一从我的数据库...。我还不明白多次通知的原因..

可能的原因是什么?

+0

@Krishna你能告诉我在简短你的问题的信息?所以我为你提供确切的解决方案。 –

+0

@PavanGandhi比方说第一次安装应用程序(设备令牌插入我们的数据库)。如果用户卸载了应用程序,并再次安装。设备令牌是否更改?如果它的变化如何从我的数据库中删除旧的? –

+0

只需按照我提供给您的解决方案,如果遇到任何问题,请通知我 –

回答

0

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

+0

我们可以关闭应用程序内部的自我推送(在注销时),而不是从服务器中删除设备令牌。 – Hemang

+0

@Akshay Patel登录/退出时没问题。我需要在卸载的情况下,并再次重新安装应用程序? –

+0

在登录时覆盖您的设备令牌.... –

0

@Krishna:设备令牌保持与第一次安装应用程序并卸载并再次在同一设备上安装此应用程序相同。

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

注:只需告知后端开发者做以下的事情:

  1. 您使用在数据库中插入设备的原因,因为他需要检查,如果设备令牌是diff和更新新的API。否则只需使用任何通过Web服务。

它的工作很好。

+0

v如何知道它的不同或相同... –

+0

首先需要检查用户设备的设备令牌是否存在。 如果不存在,则添加该用户的设备令牌。 如果存在,则获取详细信息并更新其设备标记 –

+0

我们没有使用UserId进行检查(即使用户未登录,我们需要设备的设备标识)。我只是在我的数据库检查 数据库APPId和设备令牌有两个字段如果我取消了应用程序的安装,并且如果再次安装在同一设备中,设备令牌更改.. –

0

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

0

Device token是在以下条件的变更。

  • 如果用户将备份数据恢复到新设备。
  • 重新安装应用程序

所以我的建议是更新与新的令牌服务器。

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

在您的数据库中创建另外两个字段device tokenAPPId所以更新device token相对于APPId

获取从设备钥匙扣APPId或唯一的设备ID,并将其与device token对于发送到您的服务器,以便在服务器更新device tokenAPPId

keychain在上述以下条件下,价值永远不会改变。

为了得到钥匙扣值遵循 Keychain

// 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! 
    } 
相关问题