3 回答

TA貢獻(xiàn)1794條經(jīng)驗(yàn) 獲得超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貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超5個贊
晚了,但也許有用
當(dāng)應(yīng)用未運(yùn)行時
- (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貢獻(xiàn)1860條經(jīng)驗(yàn) 獲得超9個贊
應(yīng)用啟動后,我們無法正確更新視圖。這里有復(fù)雜的生命周期方法序列,令人困惑。
生命周期方法
我們對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)在我們需要:
確定用戶是否通過推送打開應(yīng)用
根據(jù)推送狀態(tài)更新視圖
清除狀態(tài),以免隨后的打開不會使用戶回到同一位置。
棘手的一點(diǎn)是,必須在應(yīng)用程序?qū)嶋H處于活動狀態(tài)時更新視圖,這在所有情況下都是相同的生命周期方法。
我們的解決方案示意圖
以下是我們解決方案的主要組成部分:
將notificationUserInfo實(shí)例變量存儲在AppDelegate上。
設(shè)置notificationUserInfo = nil在這兩個applicationWillEnterForeground和didFinishLaunchingWithOptions。
設(shè)置notificationUserInfo = userInfo在didReceiveRemoteNotification:inactive
從applicationDidBecomeActive總是調(diào)用自定義方法openViewFromNotification并傳遞self.notificationUserInfo。如果self.notificationUserInfo為nil,則提早返回,否則根據(jù)中的通知狀態(tài)打開視圖self.notificationUserInfo。
說明
當(dāng)通過推送打開didFinishLaunchingWithOptions或applicationWillEnterForeground總是在緊接之前調(diào)用時didReceiveRemoteNotification:inactive,因此我們首先在這些方法中重置notificationUserInfo,以確保沒有過時的狀態(tài)。然后,如果didReceiveRemoteNotification:inactive調(diào)用了,我們就知道我們要從推送中打開,因此我們將self.notificationUserInfo其設(shè)置為拾取,然后applicationDidBecomeActive將用戶轉(zhuǎn)發(fā)到正確的視圖。
最后一種情況是用戶是否在應(yīng)用程序切換器中打開了該應(yīng)用程序(即,在應(yīng)用程序處于前臺時雙擊主屏幕按鈕),然后接收到推送通知。在這種情況下,僅會didReceiveRemoteNotification:inactive被調(diào)用,而WillEnterForeground和didFinishLaunching都不會被調(diào)用,因此您需要一些特殊的狀態(tài)來處理這種情況。
希望這可以幫助。
- 3 回答
- 0 關(guān)注
- 678 瀏覽
添加回答
舉報