iOS調試通過UILocalNotification或RemoteNotification啟動的app,uilocalnotification
相信很多同學都為調試蘋果的通知煩惱過,特別是通過通知啟動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