Appleのドキュメントを読んでいます
そして、私には矛盾する声明があるように見えます。誰かがこれらの混乱点を解消できますか?ここでは、厳密にリモート通知(ローカル対)について話しましょう。
ドキュメントでは、通知のアクションボタンが押された場合、application:didFinishLaunchingWithOptionsを呼び出して通知ペイロードを渡すと述べています。その後、アプリがフォアグラウンドで実行されている場合、application:didReceiveRemoteNotification:を介して通知を配信します。これは、アプリがバックグラウンドまたは実行されていないときにapplication:didFinishLaunchingWithOptionsが呼び出されることを意味します。それ以外の場合、application:didReceiveRemoteNotification:が呼び出されます。
後で、次のことを言っているiOSノートがあります。
「iOSの注意:iOSでは、ユーザーがアクションボタンをタップした結果としてアプリケーションが起動するかどうか、または実行中のアプリケーションに通知が配信されたかどうかを、アプリケーションの状態を調べることで判断できます。 :didReceiveRemoteNotification:またはapplication:didReceiveLocalNotification:メソッド、applicationStateプロパティの値を取得して評価します。値がUIApplicationStateInactiveの場合、ユーザーはアクションボタンをタップしました;値がUIApplicationStateActiveの場合、アプリケーションは通知を受信したときに最前面にありました。 」
これは、アプリがすでにフォアグラウンドになっているときと、ユーザーがアクションボタンを押した(またはiOS 5でアクションスライダーをスライドした)ときにアプリをフォアグラウンド/起動するときに、application:didReceiveRemoteNotification:が呼び出されることを意味します。
私の混乱の原因は、アプリケーションが通知ペイロードがapplication:didFinishLaunchingWithOptions:メソッドで送信されることを暗示している最初の部分、または「実行中」アプリケーションとは何かを誤解していることです。 。 application:didReceiveRemoteNotification:のドキュメントには、「実行中の」アプリケーションのために呼び出されることが記載されています。
要約すると、次の点について明確にできますか?
1)application:didReceiveRemoteNotification:は、アプリがフォアグラウンドになったとき、またはユーザーが通知を「実行」することを選択したときに常に呼び出されますか?そうでない場合、アプリケーションの状態がアクティブまたは非アクティブであると判断する際のiOSノートの意味をどのように理解しますか?
2)少なくとも、アプリケーションを要求するドキュメントの意味で、バックグラウンドのアプリは「実行中」ですか?didReceiveRemoteNotificationはアプリの実行のために呼び出されますか?
3)完了のために、バックグラウンドアプリはUIApplicationStateInactiveまたはActiveですか?
ここでの言葉遣いは、特にWordの背景に関する混乱を招きます。
アプリケーションが本当にメモリにロードされていない場合(たとえば、起動時にスプラッシュ画面が表示されるなど)、application:didFinishLaunchingWithOptionsが呼び出され、次のようにプッシュ通知を取得できます。
NSDictionary *remoteNotif = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if(remoteNotif)
{
//Handle remote notification
}
アプリがメモリにロードされており、ACTIVEである場合(たとえば、アプリが現在デバイス上で開いている場合)、application:didReceiveRemoteNotification:
が呼び出されます。
アプリがメモリに読み込まれているが、アクティブではなくバックグラウンドではない場合(たとえば、アプリを起動してからホームボタンを押して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
}
}
IOS 9.1シナリオに従って、私はシステムが最初に呼び出すよりもプッシュ通知をタップすると、その時点でアプリケーションがどのモードでも実行されていないキルモードでプッシュ通知をテストしました。
- (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary *)userInfo{
//your code execution will here.
}
そして、2番目のメソッド呼び出しは、
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//Your initial code execution.
}
このシナリオは、アプリケーションでテストしました。