2

プッシュ通知を使用してアプリをトリガーし、一定の間隔でコードを実行する (特に、サーバーから新しいメッセージをプルする) 代わりに、Apple が承認した優れた代替手段はありますか?

シミュレーターではbeginBackgroundTaskWithExpirationHandlerwithdispatch_asyncを使用すると 10 分のバックグラウンド時間が得られ、バックグラウンドが「自動的に再起動」すると、backgroundTimeRemainingプロパティは常に 10 分にリセットされるように見えることがわかりました。これがコードです。

- (void) work
{
    UIApplication *application = [UIApplication sharedApplication];

    NSLog(@"bg %@ (T-%.1f seconds)",
          [NSDate date],
          [application backgroundTimeRemaining]);
    sleep(10);

    [application endBackgroundTask:_bgTask];
    _bgTask = UIBackgroundTaskInvalid;

    [self startTask];
}

- (void)startTask
{
    UIApplication *application = [UIApplication sharedApplication];
    _bgTask = [application beginBackgroundTaskWithExpirationHandler:^{
        NSLog(@"expired at %@", [NSDate date]);

        [application endBackgroundTask:_bgTask];
        _bgTask = UIBackgroundTaskInvalid;
    }];

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,
                                             0),
                   ^{ [self work]; });
}

- (BOOL) application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
{
    /* ... */

    [self startTask];

    /* ... */
}

バックグラウンドで何かを実行することは、受け入れられる慣行でしょうか? つまり、ほとんどの場合sleep(...)、ネットワーク リクエストを繰り返したり、何か役に立つことをしたりするまではそうしますが、アプリが実際に完全なバックグラウンド モードになることは決してありません。誰もこのアプローチの経験がありますか? ヒント: 他のアプリが実行されていないシミュレーターでのみテストされています。

4

3 に答える 3

4

Apple が承認した代替手段は、https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.htmlにリストされています。

「表 3-1 アプリのバックグラウンド モード」を見ると、サーバーから情報を繰り返し取得するための 2 つの関連する代替手段は、「バックグラウンド フェッチ」または「リモート通知」です。

"remote-notification" はプッシュ通知で、使いたくないと言っています。


したがって、「バックグラウンド フェッチ」が適切な選択です。たとえば、https://blog.newrelic.com/2016/01/13/ios9-background-execution「リモートコンテンツを日和見的にダウンロードする」を参照してください。

ただし、これはあなた (開発者) に Android での制御の程度を与えるものではありません。「setMinimumBackgroundFetchInterval」がありますが、これは MINIMUM であることに注意してください。iOS は、次のバックグラウンド フェッチのためにいつアプリを呼び出すかを決定します。(Apple は、全体的なバッテリー使用量とデバイスの応答性に重点を置いています。アプリがバックグラウンドになったら、ほとんど注意を払わなくても適切に動作するように設計します。)

注: ユーザーがアプリを強制終了すると、「バックグラウンド フェッチ」も一緒に強制終了されます。これは仕様によるものです。(そして、ユーザーの観点からは良いことです。ほとんどのアプリは、強制終了されても停止したままになるはずです。)


"プッシュ通知" (リモート通知) と "バックグラウンド フェッチ" の組み合わせを使用することを検討してください。たとえば、ユーザーがアプリで「プッシュ通知」を許可している場合は、ユーザーへのテキスト通知とともに、毎日 1 回のプッシュを行います。その通知を開くと、アプリが開きます。次に、データのフェッチを開始します。ホーム ボタンを押した場合は、「バックグラウンド フェッチ」を使用して、1 日を通して定期的にデータを取得し続けます。

バッテリーを非常に重視するユーザーは、定期的にすべてのアプリを終了する可能性があります。今日あなたのアプリに煩わされたくない場合、彼らはあなたのアプリのプッシュ通知を無視または削除します。これは良いことだと考えてください。ユーザーがアプリを積極的に使用していない日にバッテリーを消耗させてユーザーを困らせることはありません。

携帯電話で実行されているものを厳密に制御したいユーザーは、アプリのプッシュ通知を許可しません. (たとえば、私は毎日のテキスト通知を受け取るのが嫌いです。電話しないでください。電話します。) この場合、アプリが強制終了されると、できることは何もありません (プッシュ通知が唯一の方法であるため)。あなたの死んだアプリを復活させるために、そしてユーザーである私はそれに「いいえ」と言いました)。そのようなユーザーにどのようにサービスを提供するかを必ず検討してください。(最初にアプリを再度開いたときに、コンテンツが古くなっている可能性があります。)

于 2016-05-18T23:23:25.893 に答える
3

通常のiPhoneではできません。そして、それを行う方法を見つけた場合、Apple は最終的に抜け穴を修正し、アプリを拒否します。

ジェイルブレイクされたiPhoneについては知りませんが、どうにかして可能であると思います。

于 2012-11-25T19:00:22.440 に答える