3 回答

TA貢獻1794條經(jīng)驗 獲得超8個贊
請參閱以下代碼:
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
if ( application.applicationState == UIApplicationStateInactive || application.applicationState == UIApplicationStateBackground )
{
//opened from a push notification when the app was on background
}
}
如同
-(void)application:(UIApplication *)application didReceiveLocalNotification (UILocalNotification *)notification

TA貢獻1811條經(jīng)驗 獲得超5個贊
晚了,但也許有用
當應用未運行時
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
叫做 ..
您需要檢查推送通知的地方
NSDictionary *notification = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if (notification) {
NSLog(@"app recieved notification from remote%@",notification);
[self application:application didReceiveRemoteNotification:notification];
} else {
NSLog(@"app did not recieve notification");
}

TA貢獻1860條經(jīng)驗 獲得超9個贊
應用啟動后,我們無法正確更新視圖。這里有復雜的生命周期方法序列,令人困惑。
生命周期方法
我們對iOS 10的測試揭示了針對各種情況的以下生命周期方法序列:
DELEGATE METHODS CALLED WHEN OPENING APP
Opening app when system killed or user killed
didFinishLaunchingWithOptions
applicationDidBecomeActive
Opening app when backgrounded
applicationWillEnterForeground
applicationDidBecomeActive
DELEGATE METHODS WHEN OPENING PUSH
Opening push when system killed
[receiving push causes didFinishLaunchingWithOptions (with options) and didReceiveRemoteNotification:background]
applicationWillEnterForeground
didReceiveRemoteNotification:inactive
applicationDidBecomeActive
Opening push when user killed
didFinishLaunchingWithOptions (with options)
didReceiveRemoteNotification:inactive [only completionHandler version]
applicationDidBecomeActive
Opening push when backgrounded
[receiving push causes didReceiveRemoteNotification:background]
applicationWillEnterForeground
didReceiveRemoteNotification:inactive
applicationDidBecomeActive
問題
好的,所以現(xiàn)在我們需要:
確定用戶是否通過推送打開應用
根據(jù)推送狀態(tài)更新視圖
清除狀態(tài),以免隨后的打開不會使用戶回到同一位置。
棘手的一點是,必須在應用程序實際處于活動狀態(tài)時更新視圖,這在所有情況下都是相同的生命周期方法。
我們的解決方案示意圖
以下是我們解決方案的主要組成部分:
將notificationUserInfo實例變量存儲在AppDelegate上。
設置notificationUserInfo = nil在這兩個applicationWillEnterForeground和didFinishLaunchingWithOptions。
設置notificationUserInfo = userInfo在didReceiveRemoteNotification:inactive
從applicationDidBecomeActive總是調用自定義方法openViewFromNotification并傳遞self.notificationUserInfo。如果self.notificationUserInfo為nil,則提早返回,否則根據(jù)中的通知狀態(tài)打開視圖self.notificationUserInfo。
說明
當通過推送打開didFinishLaunchingWithOptions或applicationWillEnterForeground總是在緊接之前調用時didReceiveRemoteNotification:inactive,因此我們首先在這些方法中重置notificationUserInfo,以確保沒有過時的狀態(tài)。然后,如果didReceiveRemoteNotification:inactive調用了,我們就知道我們要從推送中打開,因此我們將self.notificationUserInfo其設置為拾取,然后applicationDidBecomeActive將用戶轉發(fā)到正確的視圖。
最后一種情況是用戶是否在應用程序切換器中打開了該應用程序(即,在應用程序處于前臺時雙擊主屏幕按鈕),然后接收到推送通知。在這種情況下,僅會didReceiveRemoteNotification:inactive被調用,而WillEnterForeground和didFinishLaunching都不會被調用,因此您需要一些特殊的狀態(tài)來處理這種情況。
希望這可以幫助。
- 3 回答
- 0 關注
- 674 瀏覽
添加回答
舉報