web-dev-qa-db-ja.com

performFetchWithCompletionHandlerが発生することはありません

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ベータエラーですか?これをレーダーする必要がありますか?

56
user2110287

指定した時間内に呼び出されることが保証されていないため、デバイスでデバッグするのは難しいと思います。

setMinimumBackgroundFetchIntervalは、指定した値より小さい間隔で呼び出されないことを意味します。しかし、setMaximumBackgroundFetchIntervalはありません。そのため、iOSが1日1回または週に1回だけアプリを呼び出す場合、minimumBackgroundFetchIntervalに関係なく頻繁に呼び出されることはありません。 AFAIK iOSは、パターンで測定されるperformFetchWithCompletionHandlerをいつ、どのくらいの頻度でユーザーがアプリを起動するかを決定します。

39
One Man Crew

Xcode 5デバッグモードでは、[デバッグ]> [バックグラウンドフェッチのシミュレート]メニューからバックグラウンドフェッチを強制できます。

Ruff!

95
Clay Bridges

多くの考慮事項があります。

  1. バックグラウンドフェッチ機能がplistで設定されていることを確認してください。

  2. この特定のアプリ、または一般的にはデバイスの設定アプリでバックグラウンドフェッチ機能が無効になっていないことを確認してください。

  3. 最小フェッチ間隔を設定してください。

  4. アプリを正常に終了するようにしてください(たとえば、ホームボタンを押して別のアプリを起動するか、デバイスをロックするだけです)。ただし、アプリを強制終了すると(ホームボタンをダブルタップして上にスワイプするか、何を持っているか)、OSがアプリに後続のバックグラウンドフェッチリクエストを起動する機会を提供できなくなります(少なくともユーザーがアプリを再度実行するまで) )。

  5. これを物理デバイスでテストし、Xcodeデバッガーを介してアプリを実行していないことを確認してください。デバッガに接続されると、バックグラウンド操作の動作が変更されます。

  6. アプリが実際にいくつかのネットワーク要求を行っていることを確認してください。ネットワーク要求をまったく実行しないアプリがある場合、バックグラウンドフェッチには参加しません。たとえば、「バックグラウンドフェッチ」を使用する小さなテストアプリを実行し、ネットワーク要求を発行しない場合、バックグラウンドフェッチに参加しません。

    同様に、OSがバックグラウンドフェッチを実行できるようにバックグラウンドモードでアプリを起動した場合、実際にネットワークリクエストを実行しないと、OSは今後アプリにバックグラウンドフェッチを実行する機能の提供を停止する可能性があります。

  7. 必ず完了ハンドラを呼び出して、割り当てられた時間内に呼び出してください。そうしないと、アプリが将来バックグラウンドフェッチに参加しない可能性があります。

  8. OSがバックグラウンドフェッチを実行するタイミングは、将来変更される可能性のある不十分に文書化されたルールによって決定されます。ただし、関連する要因には次のものがあります。

    • デバイスが電源に接続されているか、および/または十分に充電されているかどうか。

    • WiFiに接続されているかどうか。

    • ユーザーが実際にアプリを起動する頻度。

    • デバイスが他のネットワーク関連タスクを実行しているかどうか(たとえば、バックグラウンドフェッチを他のネットワーク操作と結合できるかどうか);

    • 過去のバックグラウンドフェッチリクエストにより、データが利用可能になる頻度。


    私の経験では、アプリを初めて実行した後、wifiと電源に接続している場合、約5分後にデバイスをスリープ解除すると、アプリはバックグラウンドフェッチを実行します。これは厳格なルールではありませんが、過去に経験したことです。

    しかし、多くの新しい開発者は、「アプリリクエストデータをこれまでにどのように取得できるかx分(または時間)」、「毎日午前2時にデータをリクエストする方法」などの質問をStack Overflowに投稿しています。 。簡単な答えは、できないということです。 OSは、独自の裁量でバックグラウンドのタイミングを決定します。これを制御することはできません(最小要求間隔以外。ただし、OSが制御するため、最大間隔は制御できません)。

  9. これは多くの人にとって明らかなように思えるかもしれませんが、バックグラウンドフェッチプロセスが正しく実行されているかどうかを確実に知る方法があることを確認してください。ユーザー通知フレームワークを使用してアラートを表示することで、バックグラウンドリクエストが何らかの原因となったかどうかを確認できます。または、os_log「統合通知」は、macOS Consoleアプリで監視できるデバイスにメッセージを投稿するために使用できます。しかし、Xcodeでメッセージが表示されるのを待つ、またはUIAlertControllerを待つなどの操作をユーザーが何度も行っています。 Xcodeに接続していないとき、およびアプリがフォアグラウンドに入らないときに機能するメカニズムが必要です。

23
Rob

(「XCode-> Debug-> Simulate Background Fetch」でフェッチをシミュレートする場合にのみ機能します。)

デバッグモードになっているからです。 XCodeなしでアプリを起動してみてください。

21
user1700099

デバイスを使用すると、application:performFetchWithCompletionHandler次の手順で:

  • アプリをバックグラウンド状態にする
  • デバイスをロックして、5分間待ちます。
  • デバイスのロックを解除すると、メソッドが起動します
21
user2936585

もう1つ確認するのは、plistファイルです。 UIApplicationExitsOnSuspendキーが存在しないことを確認してください。

Stack Overflowの多くの人々は、起動するたびにアプリを強制的に新たに起動する方法として、この設定を使用することを推奨しています。それは機能しますが、副作用は、新しいiOS 7バックグラウンドフェッチ機能がトリガーされないことです。

5
Axeva

application: performFetchWithCompletionHandler:は起動されません(Xcodeを使用してシミュレートしない限り)。アプリの[バックグラウンドアプリの更新]設定が[オン]になっているかどうかも確認してください。 (設定アプリ->一般->バックグラウンドアプリの更新)

2
Anastasia

また、iPhoneが低電力モードの場合、バックグラウンドフェッチは無効になります。

2
adrian1kat

Appleは、アプリの使用状況に基づいて、バックグラウンドフェッチがトリガーされる頻度を定義するアルゴリズムを提供しています。頻繁に使用すると、できるだけ頻繁にフェッチされますが、毎日午後4時にlikeを使用すると、バックグラウンドフェッチが直前にトリガーされるため、起動時にデータが更新されます。これを参照してください link

1
CrazyDeveloper