相信很多同學都為調試蘋果的通知煩惱過,特別是通過通知啟動app這個功能,簡直讓人欲哭無淚!!! 然而我們都遇到的問題,蘋果怎麼可能沒有想到,原來早就有了官方的解決辦法,只是我們不知道而已。。。 這次又是從stackOverFlow上找到了答案,必須記錄一下!!! iOS10以後,通知框架被完全重構了 ...
相信很多同學都為調試蘋果的通知煩惱過,特別是通過通知啟動app這個功能,簡直讓人欲哭無淚!!! 然而我們都遇到的問題,蘋果怎麼可能沒有想到,原來早就有了官方的解決辦法,只是我們不知道而已。。。 這次又是從stackOverFlow上找到了答案,必須記錄一下!!! iOS10以後,通知框架被完全重構了,可以參考喵神的博客:https://onevcat.com/2016/08/notification/ 這裡因為要相容iOS8,所以先說說iOS10之前的處理方法 UILocalNotification和APNS怎麼發就不說了,首先先說一下蘋果的通知響應; 只要用戶開啟了通知許可權,那麼app就可以收到通知,收到的場景分兩種: 一種是app還沒有啟動,那這時候系統會根據通知的許可權設置有彈窗,聲音,標記等出現,這時候點擊彈窗,app就會啟動, 並且啟動的時候,在方法- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions里的launchOptions字典中,就會包含通知的內容,可以通過UIApplicationLaunchOptionsLocalNotificationKey或者UIApplicationLaunchOptionsRemoteNotificationKey來獲取其中的內容; 其中,通過UIApplicationLaunchOptionsLocalNotificationKey取到的是一個UILocalNotification, 而通過UIApplicationLaunchOptionsRemoteNotificationKey取到的是remoteNotification的userInfo; 需要在這裡進行處理 註意,這時候app還沒有啟動完成,所以跳轉頁面什麼的是做不了的,倒是可以根據這個來設置rootViewController;或者在這裡設置一個標記,在rootViewController didAppear之後執行 註意,這個場景iOS10也是一樣的,獲取到的數據類型也一樣! 另一種是app已經啟動,這時候又要區分app是否在前臺 如果在前臺,那系統會直接調用 - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification; 或者
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo;
兩個方法 如果不在前臺,那系統還是會根據許可權設置出現彈窗,聲音,標記等,這時候點擊標記,才會調用上面的這兩個方法 註意:這個場景iOS10以後又了新的方法,處理方法跟這兩個不一樣,請參考喵神博客! 好,切入正題 我們在調試的時候,肯定是連著手機斷點調試最方便,但是對於通過通知啟動的這種場景,怎麼調試??? 有問到過可以通過xcode的device查看手機log來看,但這種也沒有直接斷點來的方便吶! 問題就是:可以在啟動之前就直接斷點嗎??? 答案是:可以!!! 這個東西既然是蘋果設計的,蘋果當然就想到了這個問題,也給出瞭解決方案: 在xcode的工具條上選擇 product—Scheme—edit scheme 到編輯scheme界面 左側選擇選擇Run,右側選擇info,然後在下麵的launch選項上選擇:Wait for executable to be launched ;如圖 然後close,跟原來一樣run 就可以了 這時候你會發現,app並沒有啟動,而是“卡”在了那裡, 如果你在didLaunch方法里打個斷點,然後點擊通知啟動app,就能直接斷點到didLaunch方法里了~~然後想怎麼調試都隨你了~~ 大功告成~~ 可以參考:http://stackoverflow.com/questions/1239000/debugging-app-when-launched-by-push-notification