224

content-availableプッシュ通知のフラグを使用して、バックグラウンド フェッチをトリガーしています。と が有効fetchになっています。remote-notification UIBackgroundModes

AppDelegate.m で使用している実装は次のとおりです。

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
    NSLog(@"Remote Notification Recieved");
    UILocalNotification *notification = [[UILocalNotification alloc] init];
    notification.alertBody =  @"Looks like i got a notification - fetch thingy";
    [application presentLocalNotificationNow:notification];
    completionHandler(UIBackgroundFetchResultNewData);

}

アプリがバックグラウンドで実行されている場合、問題なく動作します。(通知が受信され、アプリは上記のコードで行う必要があるように、「通知を受け取ったようです」というローカル通知をトリガーしました)。

ただし、アプリが実行されておらずcontent-available、フラグ付きのプッシュ通知が受信された場合、アプリは起動されず、didRecieveRemoteNotificationdelegate メソッドが呼び出されることはありません。

WWDC Video Whats New With Multitasking (WWDC 2013 の #204) は、次のことを示しています。ここに画像の説明を入力

content-availableフラグ付きのプッシュ通知を受信すると、アプリケーションは「バックグラウンドで起動」されます。

アプリがバックグラウンドで起動しないのはなぜですか?

したがって、本当の質問は次のとおりです。

ユーザーがアプリを強制終了した後、iOS はバックグラウンド タスクを実行しますか?

4

7 に答える 7

217

更新 2:

これは、iOS 8 で導入された新しい PushKit フレームワークを使用して実現できます。ただし、PushKit は VoIP に使用されます。そのため、VoIP 関連で使用する必要があります。そうしないと、アプリが拒否されるリスクがあります。(この回答を参照してください)。


UDPDATE1:

ドキュメンテーションはiOS8用に明確化されました。ドキュメントはここで読むことができます。関連する抜粋を次に示します。

このメソッドを使用して、アプリの着信リモート通知を処理します。アプリがフォアグラウンドで実行されている場合にのみ呼び出されるメソッドとは異なり、application:didReceiveRemoteNotification:アプリがフォアグラウンドまたはバックグラウンドで実行されている場合、システムはこのメソッドを呼び出します。さらに、リモート通知のバックグラウンド モードを有効にした場合、システムはアプリを起動 (またはサスペンド状態からウェイクアップ) し、プッシュ通知が到着するとバックグラウンド状態にします。ただし、ユーザーがアプリを強制終了した場合、システムはアプリを自動的に起動しません。その場合、システムがアプリを自動的に再起動しようとする前に、ユーザーはアプリを再起動するか、デバイスを再起動する必要があります。


これは WWDC ビデオでは明らかにされていませんでしたが、開発者フォーラムをすばやく検索すると、次のことがわかりました。

https://devforums.apple.com/message/873265#873265 (ログインが必要です)

また、アプリ スイッチャーからアプリを強制終了した場合 (つまり、上にスワイプしてアプリを強制終了した場合)、プッシュ通知やバックグラウンド フェッチに関係なく、OS がアプリを再起動することはありません。この場合、ユーザーは手動でアプリを 1 回再起動する必要があり、その時点からバックグラウンド アクティビティが呼び出されます。- pmarcos

その投稿は Apple の従業員によるものでしたので、この情報は正しいと信じています。

そのため、アプリ スイッチャーから (上にスワイプして) アプリを強制終了すると、スケジュールされたバックグラウンド フェッチであってもアプリが起動されないように見えます。

于 2013-10-05T20:38:58.730 に答える
38

答えはイエスですが、「バックグラウンド フェッチ」や「リモート通知」は使用しないでください。PushKit は、あなたが望む答えです。

要約すると、ios 8 の新しいフレームワークである PushKit は新しいプッシュ通知メカニズムであり、アプリ スイッチャーからスワイプアウトしてアプリを強制終了した場合でも、視覚的なアラート プロンプトを表示せずにアプリをバックグラウンドで静かに起動できます。アプリスイッチャーから。

Apple からの PushKit リファレンス:

PushKit フレームワークは、iOS アプリがリモート サーバーからプッシュを受信するためのクラスを提供します。プッシュは、標準と VoIP の 2 つのタイプのいずれかになります。標準プッシュは、以前のバージョンの iOS と同様に通知を配信できます。VoIP プッシュは、ユーザーに通知を表示する前にプッシュのオンデマンド処理を実行するために VoIP アプリに必要な標準のプッシュに加えて、追加機能を提供します。

この新機能を展開するには、次のチュートリアルを参照してください: https://zeropush.com/guide/guide-to-pushkit-and-voip - デバイスでテストしたところ、期待どおりに動作します。

于 2015-03-24T11:26:18.727 に答える
15

実際、バックグラウンド フェッチをテストする必要がある場合は、スキームで 1 つのオプションを有効にする必要があります。

bg フェッチを有効にする

テストする別の方法: bg フェッチをシミュレートする

この新機能に関する完全な情報は次のとおりです: http://www.objc.io/issue-5/multitasking.html

于 2014-04-01T16:42:53.627 に答える
4

私はこれのさまざまなバリエーションを何日も試してきましたが、ユーザーがスワイプして強制終了した場合でも、バックグラウンドでアプリを再起動する日があったと思いましたが、その動作を再現することはできません.

挙動が以前とかなり違うのが残念です。iOS 6 では、揺れるアイコンからアプリを強制終了した場合でも、SLC トリガーで再起動されます。今、スワイプで殺しても、それは起こりません。

これは別の動作であり、ユーザーは、iOS 6 でアプリを強制終了した場合に引き続きアプリから有益な情報を取得できますが、現在はそうではありません。

ユーザーがスワイプしてアプリを強制終了し、以前の通知動作の一部をまだ期待している場合は、アプリを再度開くようにユーザーに促す必要があります。ユーザーがアプリをスワイプしたときに、これがユーザーにわからないのではないかと心配しています。結局のところ、彼らは基本的にクリーンアップするか、最小化されて表示されているアプリを再配置したいのかもしれません.

于 2013-10-18T23:03:55.663 に答える
3

iOS13の場合

iOS13 でのバックグラウンド プッシュの場合、以下のパラメーターを設定する必要があります。

apns-priority = 5
apns-push-type = background
//Required for WatchOS
//Highly recommended for Other platforms 

バックグラウンドプッシュ ビデオリンク: https://developer.apple.com/videos/play/wwdc2019/707/

于 2019-08-20T04:41:34.517 に答える