1)バックグラウンドモードを提供するためのplistの構成:
<key>UIBackgroundModes</key>
<array>
<string>fetch</string>
</array>
2)didFinishLaunchingWithOptions
には以下があります:
[[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:1.0];
3)デリゲートでプロトコルUIApplicationDelegate
を宣言しました。
4)次のメソッドを実装しましたが、実行されません。 (「XCode-> Debug-> Simulate Background Fetch」でフェッチをシミュレートする場合にのみ機能します。)
-(void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
どうして?これはDP5ベータエラーですか?これをレーダーする必要がありますか?
指定した時間内に呼び出されることが保証されていないため、デバイスでデバッグするのは難しいと思います。
setMinimumBackgroundFetchInterval
は、指定した値より小さい間隔で呼び出されないことを意味します。しかし、setMaximumBackgroundFetchInterval
はありません。そのため、iOSが1日1回または週に1回だけアプリを呼び出す場合、minimumBackgroundFetchInterval
に関係なく頻繁に呼び出されることはありません。 AFAIK iOSは、パターンで測定されるperformFetchWithCompletionHandler
をいつ、どのくらいの頻度でユーザーがアプリを起動するかを決定します。
Xcode 5デバッグモードでは、[デバッグ]> [バックグラウンドフェッチのシミュレート]メニューからバックグラウンドフェッチを強制できます。
多くの考慮事項があります。
バックグラウンドフェッチ機能がplistで設定されていることを確認してください。
この特定のアプリ、または一般的にはデバイスの設定アプリでバックグラウンドフェッチ機能が無効になっていないことを確認してください。
最小フェッチ間隔を設定してください。
アプリを正常に終了するようにしてください(たとえば、ホームボタンを押して別のアプリを起動するか、デバイスをロックするだけです)。ただし、アプリを強制終了すると(ホームボタンをダブルタップして上にスワイプするか、何を持っているか)、OSがアプリに後続のバックグラウンドフェッチリクエストを起動する機会を提供できなくなります(少なくともユーザーがアプリを再度実行するまで) )。
これを物理デバイスでテストし、Xcodeデバッガーを介してアプリを実行していないことを確認してください。デバッガに接続されると、バックグラウンド操作の動作が変更されます。
アプリが実際にいくつかのネットワーク要求を行っていることを確認してください。ネットワーク要求をまったく実行しないアプリがある場合、バックグラウンドフェッチには参加しません。たとえば、「バックグラウンドフェッチ」を使用する小さなテストアプリを実行し、ネットワーク要求を発行しない場合、バックグラウンドフェッチに参加しません。
同様に、OSがバックグラウンドフェッチを実行できるようにバックグラウンドモードでアプリを起動した場合、実際にネットワークリクエストを実行しないと、OSは今後アプリにバックグラウンドフェッチを実行する機能の提供を停止する可能性があります。
必ず完了ハンドラを呼び出して、割り当てられた時間内に呼び出してください。そうしないと、アプリが将来バックグラウンドフェッチに参加しない可能性があります。
OSがバックグラウンドフェッチを実行するタイミングは、将来変更される可能性のある不十分に文書化されたルールによって決定されます。ただし、関連する要因には次のものがあります。
デバイスが電源に接続されているか、および/または十分に充電されているかどうか。
WiFiに接続されているかどうか。
ユーザーが実際にアプリを起動する頻度。
デバイスが他のネットワーク関連タスクを実行しているかどうか(たとえば、バックグラウンドフェッチを他のネットワーク操作と結合できるかどうか);
過去のバックグラウンドフェッチリクエストにより、データが利用可能になる頻度。
私の経験では、アプリを初めて実行した後、wifiと電源に接続している場合、約5分後にデバイスをスリープ解除すると、アプリはバックグラウンドフェッチを実行します。これは厳格なルールではありませんが、過去に経験したことです。
しかし、多くの新しい開発者は、「アプリリクエストデータをこれまでにどのように取得できるかx分(または時間)」、「毎日午前2時にデータをリクエストする方法」などの質問をStack Overflowに投稿しています。 。簡単な答えは、できないということです。 OSは、独自の裁量でバックグラウンドのタイミングを決定します。これを制御することはできません(最小要求間隔以外。ただし、OSが制御するため、最大間隔は制御できません)。
これは多くの人にとって明らかなように思えるかもしれませんが、バックグラウンドフェッチプロセスが正しく実行されているかどうかを確実に知る方法があることを確認してください。ユーザー通知フレームワークを使用してアラートを表示することで、バックグラウンドリクエストが何らかの原因となったかどうかを確認できます。または、os_log
「統合通知」は、macOS Console
アプリで監視できるデバイスにメッセージを投稿するために使用できます。しかし、Xcodeでメッセージが表示されるのを待つ、またはUIAlertController
を待つなどの操作をユーザーが何度も行っています。 Xcodeに接続していないとき、およびアプリがフォアグラウンドに入らないときに機能するメカニズムが必要です。
(「XCode-> Debug-> Simulate Background Fetch」でフェッチをシミュレートする場合にのみ機能します。)
デバッグモードになっているからです。 XCodeなしでアプリを起動してみてください。
デバイスを使用すると、application:performFetchWithCompletionHandler
次の手順で:
もう1つ確認するのは、plist
ファイルです。 UIApplicationExitsOnSuspend
キーが存在しないことを確認してください。
Stack Overflowの多くの人々は、起動するたびにアプリを強制的に新たに起動する方法として、この設定を使用することを推奨しています。それは機能しますが、副作用は、新しいiOS 7バックグラウンドフェッチ機能がトリガーされないことです。
application: performFetchWithCompletionHandler:
は起動されません(Xcodeを使用してシミュレートしない限り)。アプリの[バックグラウンドアプリの更新]設定が[オン]になっているかどうかも確認してください。 (設定アプリ->一般->バックグラウンドアプリの更新)
また、iPhoneが低電力モードの場合、バックグラウンドフェッチは無効になります。
Appleは、アプリの使用状況に基づいて、バックグラウンドフェッチがトリガーされる頻度を定義するアルゴリズムを提供しています。頻繁に使用すると、できるだけ頻繁にフェッチされますが、毎日午後4時にlikeを使用すると、バックグラウンドフェッチが直前にトリガーされるため、起動時にデータが更新されます。これを参照してください link