38

私はAppleのドキュメントを読んでいます

ローカルおよびリモート通知の処理

そして、矛盾する声明があるように私には見えます。誰かがこれらの混乱点を解決できますか? ここでは、(ローカルではなく) リモート通知について厳密に話しましょう。

ドキュメントによると、通知のアクション ボタンが押されると、application:didFinishLaunchingWithOptions が呼び出され、通知ペイロードが渡されます。後で、アプリがフォアグラウンドで実行されている場合は、application:didReceiveRemoteNotification: を介して通知を配信すると述べています。これは、アプリがバックグラウンドで実行されているか実行されていないときに、 application:didFinishLaunchingWithOptions が呼び出されることを意味します。それ以外の場合は、application:didReceiveRemoteNotification: が呼び出されます。

その後、次のような iOS Note があります。

「iOS 注: iOS では、ユーザーがアクション ボタンをタップした結果としてアプリケーションが起動されたのか、アプリケーションの状態を調べることで既に実行中のアプリケーションに通知が配信されたのかを判断できます。アプリケーションのデリゲートの実装では、 :didReceiveRemoteNotification: または application:didReceiveLocalNotification: メソッド, get the value of the applicationState property and evaluate it. 値が UIApplicationStateInactive の場合、ユーザーはアクション ボタンをタップしました; 値が UIApplicationStateActive の場合、アプリケーションは通知を受信したときに最前面にありました。 "

これは、アプリケーションが既にフォアグラウンドにある場合と、ユーザーがアクション ボタンを押した場合 (または iOS 5 でアクション スライダーをスライドさせた場合) の両方で application:didReceiveRemoteNotification: が呼び出され、アプリをフォアグラウンド/起動することを意味します。

私の混乱の原因は、ドキュメントが通知ペイロードが application:didFinishLaunchingWithOptions: メソッドで送信されることを暗示している最初の部分、または「実行中」のアプリケーションが何であるかについての誤解にある可能性があります (バックグラウンドのアプリは「実行中」と見なされますか?) . application:didReceiveRemoteNotification: のドキュメントには、「実行中」のアプリケーションに対して呼び出されると記載されています。

要約すると、次の点について明確にすることができますか。

1) application:didReceiveRemoteNotification: は、アプリがフォアグラウンドになったとき、またはユーザーが通知に対して「アクション」を選択したときに常に呼び出されますか? そうでない場合、アプリケーションの状態がアクティブか非アクティブかを判断する際の iOS Note をどのように理解すればよいでしょうか?

2) バックグラウンド アプリは「実行中」ですか?

3) 完了するために、バックグラウンド アプリは UIApplicationStateInactive または Active ですか?

4

2 に答える 2

92

ここでの文言は紛らわしく、特に背景という言葉のあたりが分かりにくいです。

アプリケーションが本当にメモリにロードされていない場合 (たとえば、起動時にスプラッシュ画面が表示されるなど)、 application:didFinishLaunchingWithOptions が呼び出され、次のようにプッシュ通知を取得できます。

NSDictionary *remoteNotif = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];

if(remoteNotif)
{
    //Handle remote notification
}

アプリがメモリにロードされ、ACTIVE である場合 (たとえば、アプリが現在デバイス上で開いている場合) のみapplication:didReceiveRemoteNotification:が呼び出されます。

アプリがメモリに読み込まれているが、ACTIVE ではなく、バックグラウンド処理もされていない場合 (たとえば、アプリを起動してからホーム ボタンを押し、10 秒間待機した場合)、プッシュ通知のアクション ボタンをクリックすると、didReceiveRemoteNotification のみが呼び出されます。 .

このケースは次のようにキャプチャできます。

-(void)application:(UIApplication *)app didReceiveRemoteNotification:(NSDictionary *)userInfo
{
    if([app applicationState] == UIApplicationStateInactive)
    {
        //If the application state was inactive, this means the user pressed an action button
        // from a notification. 

    //Handle notification
    }
}
于 2012-04-24T21:28:24.607 に答える
2

iOS 9.1 シナリオに従って、システムが最初に呼び出すよりもプッシュ通知をタップすると、その時点でアプリケーションがどのモードでも実行されていない Kill モードでプッシュ通知をテストしました。

- (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary *)userInfo{

//your code execution will here.

}

そして2番目のメソッド呼び出しは、

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

//Your initial code execution.

}

このシナリオは、アプリケーションでテストしました。

于 2015-12-17T05:23:50.817 に答える