2015-12-15 82 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