web-dev-qa-db-ja.com

application:didReceiveRemoteNotification:fetchCompletionHandlerが呼び出されない

関数application:didReceiveRemoteNotification:fetchCompletionHandlerは、アプリが強制終了されたときに呼び出されません。この関数は、アプリの状態に関係なく呼び出されるという印象でしたが、アプリが既にバックグラウンドで実行されている場合にのみ呼び出されるようです。新しいiOS 7リモート通知バックグラウンドモードを使用して実行されていないアプリをバックグラウンドで起動する方法はありますか?

23
Wes Cossick

application:didReceiveRemoteNotification:fetchCompletionHandler:は、アプリが中断されていても、まったく実行されていない、バックグラウンドになっている、またはアクティブである場合でも呼び出されます。メソッドがiOS 7のみであることにも注意してください。 Appleドキュメント です。

ただし、アプリが強制的に閉じられた場合(つまり、アプリスイッチャーで強制終了した場合)、アプリはnot起動されます。SO answer )を参照してくださいEDIT: iOS 7.1でこれをもう一度確認して、修正されたかどうかを確認しましたが、アプリが手動で強制終了された場合、アプリは起こされていないapplication:didReceiveRemoteNotification:fetchCompletionHandler:は呼び出されません

プッシュを受信すると、アプリは「必要な場合」のみ起動されてapplication:didReceiveRemoteNotification:fetchCompletionHandler:メソッド(つまり、プッシュ通知ペイロード内で「content-available」フラグを設定する必要があります。 SO answer を参照してください)。ユーザーが通知をタップしてアプリを開くと、メソッドはagainになります。

編集:iOS 8ではこれをチェックしていません。他に誰かいますか?

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

    //Remote Notification Info
    NSDictionary * remoteNotifiInfo = [launchOptions objectForKey: UIApplicationLaunchOptionsRemoteNotificationKey];

    //Accept Push notification when app is not open
    if (remoteNotifiInfo) {
       [self application:application didReceiveRemoteNotification: remoteNotifiInfo];
    }

    return YES;
}
23
kid

アプリが強制終了された場合、そのメソッドは呼び出されません。代わりに、通常どおり、(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptionsが呼び出されます。

通知ポップアップで[開く]をタップしてアプリを開いた場合、通知はlaunchOptions内にあります。

次のようなプッシュ通知辞書を取得します。

NSDictionary * pushNotificationUserInfo = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];

if (pushNotificationUserInfo)
{
  // call your handler here
}
3
scrrr

アプリは実行されていなくても起動する必要があります。 Appleドキュメンテーションは言う:

この値が存在し、プッシュ通知がデバイスに到着すると、システムは通知をアプリに送信し(必要に応じて起動)、処理するのに少し時間がかかります>ユーザー。 (iOSアプリプログラミングガイド)

プッシュ通知が到着すると、システムはユーザーに通知を表示し、必要に応じてアプリをバックグラウンドで起動しますこのメソッドを呼び出すことができます。 (UIApplicationDelegateプロトコルリファレンス)

アプリの実行中にのみ呼び出されるapplication:didReceiveRemoteNotification:メソッドとは異なり、システムはアプリの状態に関係なくこのメソッドを呼び出します。アプリがサスペンドまたは実行されていないの場合、システムアプリを起動または起動し、メソッドを呼び出す前にバックグラウンド実行状態にします。 (UIApplicationDelegateプロトコルリファレンス)

ただし、「content-available」:1プッシュでテストする場合、アプリが実行されていないときにアプリが起動されることはありません。アプリが中断されると機能します。

あなた自身に解決策を見つけましたか?

3
Emiel

Swift 2.0の懸念に私はこのような私の問題を解決した背景に

if let remoteNotification = launchOptions?[UIApplicationLaunchOptionsRemoteNotificationKey] as? NSDictionary {

    pushNotificationAction(remoteNotification as [NSObject : AnyObject])
}
1
Luai Kalkatawi

Appleによって文書化されているように、新しいマルチタスクAPI(フェッチおよびリモート通知)は、アプリがsuspended/background/foreground状態にある場合にのみ機能します。

  • background/foreground状態では、_application:didReceiveRemoteNotification:fetchCompletionHandler_がトリガーされます。

  • Suspended状態では、-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptionsがトリガーされます。

  • Not Running状態(あなたのケース)では、_application:didReceiveRemoteNotification:fetchCompletionHandler_はトリガーされません。

アプリの状態の詳細については、 Appleドキュメント を参照してください。

1
Nandha

アプリケーションをアプリケーションスイッチャーから強制的に終了した場合、次回起動するまで(何らかの方法で)バックグラウンドで起動されません。アプリを強制終了すると、通常はバックグラウンドイベントによって起動されたとしても、このアプリをまったく実行したくないとOSに効果的に言っています。

アプリが実行されていないときにプッシュ通知を介してアプリが起動されることを確認するためにアプリを強制終了する場合があるため、これはテスト中に注意する価値があります。実際、強制終了の使用が理由になりますwhy起動しません。

1
Dave Addey

私は最近同じ問題に遭遇し、Appleがドキュメントを更新し、次のように述べています:

ただし、ユーザーが強制終了した場合、システムはアプリを自動的に起動しません。その場合、ユーザーがアプリを再起動するか、デバイスを再起動してから、システムがアプリを自動的に起動します。

application(_:didReceiveRemoteNotification:fetchCompletionHandler:)

だから私はアプリが強制終了によって殺されたときに何もする方法がないと思いますか?

0
HunTer DRF