アプリがユーザーによって強制終了された場合、iOSはアプリをバックグラウンドで起動しますか?


219

content-availableプッシュ通知のフラグを使用してバックグラウンドフェッチをトリガーしています。私が持っているfetchremote-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フラグ付きのプッシュ通知が受信された場合、アプリは起動されず、didRecieveRemoteNotificationデリゲートメソッドが呼び出されることはありません。

WWDCビデオWhat's New With Multitasking(WWDC 2013の#204)はこれを示しています。ここに画像の説明を入力してください

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

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

だから本当の質問は:

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


アプリがバックグラウンドで起動するかどうかをどのように確認していますか?
runmad 2013

1
@runmad私はがらくたの束をログインします- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
サンタクロース

NSLogだけをどのように記録していますか?アプリスキーム設定でLaunchを手動に設定する必要があります(回答を参照)
runmad

@runmad回答のコメントを参照
サンタクロース

@HaimBenchimol Djdあなたはあなたのバグレポートへの応答を受け取りますか?私は自分のバグレポートを提出することに慣れていません。
サンタクロース

回答:


215

UPDATE2:

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


UDPDATE1:

ドキュメントはiOS8向けに明確化されました。ドキュメントはここで読むことができます。関連する抜粋を以下に示します。

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


これはWWDCビデオでは明らかにされていませんでしたが、開発者フォーラムでのクイック検索はこれを明らかにしました:

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

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

その投稿はアップルの従業員によるものだったので、この情報が正しいと私は信じられます。

したがって、アプリがアプリスイッチャーから(上にスワイプして)強制終了されると、スケジュールされたバックグラウンドフェッチであっても、アプリは起動されません。


2
私にとって、起動オプションがnilでないときに「didFinishLaunchingWithOptions」にアクションを追加すると、うまくいきました。ここには「didreceiveRemoteNotification」と同じメソッドがあります
harsh.prasad

興味深い@ harsh.prasad。問題は、アプリがアプリスイッチャーから強制終了されたときにアプリが起動しないことでした。
サンタクロース

3
サイレントプッシュを受信した場合、アプリをアプリスイッチャーに表示する必要はありません。アプリスイッチャーに追加せずにバックグラウンドで起動し、実行して「実行」して終了することができます。アクティブな状態が長すぎるアプリは、すでにある場合と同じ方法で強制終了されます。
MindJuice 2014年

1
@chrizstone解決策は、これが意図された動作であり、それに対して何も実行できないことです。
サンタクロース

1
@JPKええと、プッシュ通知自体は影響を受けません。強制終了すると機能しないバックグラウンドタスクを実行しているだけです。
サンタクロース

70

「スキームの管理」でターゲットの起動設定をに変更Wait for <app>.app to be launched manuallyできます。これにより、ブレークポイントを設定してデバッグできます。application: didReceiveRemoteNotification: fetchCompletionHandler:、プッシュ通知を送信してバックグラウンド起動をトリガー。

問題が解決するかどうかはわかりませんが、今のところデバッグに役立つ場合があります。

スクリーンショット


これは役に立ちましたが、問題はまだ存在しています
サンタクロース

奇妙な。すべてのフラッシュがplistなどに設定されていることをダブルチェックした以上だと思いますか?
runmad 2013

また、アプリがバックグラウンドにあるとき、すべてが完全に機能するため、すべてが正しく設定されていることを知っています。アプリがまったく実行されていないときだけです。
サンタクロース

プッシュ通知の起動トリガーはシステムによって決定されるのでしょうか。たとえば、iOSがアプリを今すぐ起動するのが良い時期ではないと判断した場合、それを後で延期する可能性があります。おそらく、すべての実行中/バックグラウンドアプリを試して閉じ、何が起こるか確認してください。私はこの時点で推測しています:-/
runmad

ちょうどそれを試してみました。いつものように、何も起こりませんでした。開発者フォーラムで質問するかもしれません。
サンタクロース

37

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

要約すると、iOS 8の新しいフレームワークであるPushKitは、アプリスイッチャーからスワイプアウトしてアプリが強制終了された場合でも、ビジュアルアラートプロンプトなしでアプリをバックグラウンドで静かに起動できる新しいプッシュ通知メカニズムです。アプリスイッチャーから。

AppleのPushKitリファレンス:

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

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


9
VoIPを使用するようにアプリを設定する必要があるようです。アプリが実際にVoIPアプリではない場合、レビュー中に拒否されるだけではありませんか?
duncanc4 2015

6
残念ながら、アップルによる検証プロセスを知っているので、アプリケーションが拒否されたのは当然です。
Kepa Santos、2015

3
VoIPに使用されます。ユーザーにVoIPを使用していない場合、レビューが拒否されるリスクが大幅に増加します。
Chris

大手プロバイダーがこの機能をバックグラウンドで実行するための言い訳として使用しているようで、Appleは目をつぶっています。同時にAndroidの1つの機能になります。
TCB13 2017

PushKitは、VoIP、ファイルプロバイダー、およびウォッチコンプリケーション向けに予約されています。この回答が説明するユースケースでは利用できません。
2018

15

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

bg fetchを有効にする

テストする別の方法: bg fetchをシミュレートする

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


4

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

残念なことに、以前とは動作がかなり異なります。iOS 6では、揺れ動くアイコンからアプリを強制終了した場合でも、SLCトリガーで再び呼び出されます。今、あなたがスワイプで殺した場合、それは起こりません。

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

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


2
それはまさに私たちがしたこと(applicationWillTerminate)ですが、少なくともiOS 7ではメモリパージ中に通知があったとは思いません。OSアップグレードの再起動の直前に通知が表示されたことに気付きましたが、それはそうです。めったに悪くないように見えた。
snarshad 14

「iOS 6では、揺れ動くアイコンからアプリを強制終了した場合でも、SLCトリガーで再び起動されます。スワイプして強制終了した場合、それは起こりません。」これは、今、それはiOSの7の初期バージョンでは、一時的な回帰だっ起こるん
funkybro

3

これはあなたを助けるかもしれません

ほとんどの場合、ユーザーがアプリを強制終了した後、システムはアプリを再起動しません。1つの例外は位置情報アプリです。iOS8以降では、ユーザーによって強制終了された後に再起動されます。ただし、他の場合では、ユーザーがアプリを明示的に起動するか、アプリがシステムによってバックグラウンドで自動的に起動される前にデバイスを再起動する必要があります。デバイスでパスワード保護が有効になっている場合、ユーザーが最初にデバイスのロックを解除する前に、システムはバックグラウンドでアプリを起動しません。

ソース:https : //developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.