iOS 8以前Local Notification的坑

這兩天借著排查“添加的Local Notification到點沒有提醒”的機會,對Local Notification, Remote Notification以及相關API做了一個梳理,發現“別有洞天”。

在iOS 8以前,蘋果只提供了一個API來獲取關于通知相關的東東,[[UIApplication sharedApplication] enabledRemoteNotificationTypes],

The values in the returned bit mask indicate the types of notifications currently enabled for the app. These types are first set when the app calls the registerForRemoteNotificationTypes: method to register itself with Apple Push Notification service. Thereafter, the user may modify these accepted notification types in the Notifications preference of the Settings app. This method returns those initial or modified values.

官方文檔中說,它的值取決于之前用registerForRemoteNotificationTypes注冊Remote Notification時所設定的types,同時也會根據用戶通知中心中的設定而變更,也就是說,enabledRemoteNotificationTypes同時會反映這兩種情況。但在實際測試中,發現只要registerForRemoteNotificationTypes注冊成功并生成用于發送PUSH的token,不論通知中心中app的設置如何變化(開啟通知、關閉通知、單獨開啟聲音、單獨關閉提醒等),enabledRemoteNotificationTypes的值都不會改變,嚴格等同于之前調用registerForRemoteNotificationTypes時設定的入參。這就意味著,只要注冊成功過Remote Notification一次,后續無論用戶如何調整app的通知設定,enabledRemoteNotificationTypes的返回值都是一樣的。

這個“特性”,對于Remote Notification可能還好,因為畢竟觸發PUSH是在服務端,在發送的時候,也無法得知本地客戶端的用戶設置,但對于Local Notification來說,這就是“致命”的,因為根據它開發者無法判斷用戶是否允許Local Notification,這也就是文章開頭“添加的Local Notification到點沒有提醒”的原因,因為現有的判斷是根據enabledRemoteNotificationTypes,而它又返回了全部3個type,但其實這時用戶已經關閉了app的通知。

幸好蘋果在iOS 8上解決了這個問題,引入了新的機制,把用戶授權App使用本地/遠程通知與Remote Notification成功注冊并生成token分離開來,前者用[[UIApplication sharedApplication] registerUserNotificationSettings:]來實現,后者通過[[UIApplication sharedApplication] registerForRemoteNotifications]與AppDelegate的[application:didRegisterUserNotificationSettings:]回調來達到,并引入了[[UIApplication sharedApplication] currentUserNotificationSettings],來同步返回用戶在通知中心中的設定狀態。

最后,很有意思的是,在兩個版本中,當App在后臺時,通知中心中此App的設定值都會影響到Local Notification是否以及如何被顯示,而當在App在前臺時,無論通知中心中的設置如何,Local Notification總是同樣地進行顯示。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,002評論 6 542
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,400評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,136評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,714評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,452評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,818評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,812評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,997評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,552評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,292評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,510評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,035評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,721評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,121評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,429評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,235評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,480評論 2 379

推薦閱讀更多精彩內容

  • 許多集成的步驟個推官網都有了,這里只寫關于推送的遠程推送和本地通知的步驟和代碼。APP在后臺時:走蘋果的APNS通...
    AllureJM閱讀 2,739評論 1 9
  • 極光推送: 1.JPush當前版本是1.8.2,其SDK的開發除了正常的功能完善和擴展外也緊隨蘋果官方的步伐,SD...
    Isspace閱讀 6,759評論 10 16
  • 推送通知注意:這里說的推送通知跟NSNotification有所區別NSNotification是抽象的,不可見的...
    醉葉惜秋閱讀 1,535評論 0 3
  • 推送通知 注意:這里說的推送通知跟NSNotification有所區別 NSNotification是抽象的,不可...
    iOS開發攻城獅閱讀 4,278評論 1 13
  • 平日里,我是個頑皮的孩子,時不時在家里蹦噠,讓家里亂七八糟的,大人們都說我淘氣。 可沒事做的時候,我就是個安靜的美...
    黃軒勵閱讀 467評論 0 7