2012-01-30 74 views
2

在我的應用程序中,首次推送通知註冊時,我撥打didRegisterForRemoteNotificationsWithDeviceToken並將設備標記保存爲持久性,並更新設備標記的服務器列表。現在,如果有人將推送通知設置從iPhone設置關閉,我怎麼能從我的應用程序中確定它,以便我可以從服務器中刪除設備令牌。我知道APNS提供了一個反饋列表,但除此之外,有沒有一種方法可以在應用程序中以編程方式確定?謝謝你的幫助!如何通過編程方式確定推送通知狀態?

回答

7

我相信你不想這樣管理令牌。

您的應用程序應該始終詢問Apple是否有APN令牌。您應該始終將該令牌發送到您自己的服務器,可能會將該令牌與您的用戶(如果有的話)相關聯。您這樣做是因爲令牌可能會更改,所以您要確保始終擁有最新的令牌。

反饋服務會告訴你哪些令牌失效(實際上,你在你所選擇的一些間隔輪詢的話)。此時,您將從服務器端數據庫中刪除令牌。清楚的是,您需要一個服務器端進程來輪詢Apple的反饋服務,然後更新您的服務器端數據庫。

,直到您嘗試使用令牌發送通知您將不會收到有關無效令牌的反饋。當我們發送通知時(我相信)它會被Apple接受,但當Apple發現它是針對無效令牌的時候,該消息會被丟棄,並且令牌會被添加到您的反饋中。

現在,如果你的應用程序的用戶接受推送通知時,你的應用程序首先詢問這件事,但後來通過爲您的應用程序設置應用程序關閉通知,你不會得到任何關於它的反饋。接近我所知道的是,發送給該設備的任何通知都會發送到設備,但操作系統會將其刪除,並在設置應用程序中爲您的應用程序和通知履行用戶的最終選擇。

最後,還有你可以在你的應用程序調用來獲取其中的通知類型是在設備上的應用程序啓用了位掩碼的API。這是我爲此寫的一個方法;根據需要進行調整:

+(BOOL)acceptsPushNotifications 
{ 
    UIRemoteNotificationType mask = [[UIApplication sharedApplication] enabledRemoteNotificationTypes]; 

    return (mask & UIRemoteNotificationTypeAlert) == UIRemoteNotificationTypeAlert; 
} 

但我不會建議使用此來決定,如果你的應用程序應該告訴你的服務器從數據庫中刪除令牌。這不是整個APN系統打算工作的方式......我相信。