web-dev-qa-db-ja.com

iOSは1日1回コードを実行します

このアプリの背後にある考え方は非常に単純です:ファイルをダウンロードします。ただし、このアプリは常にインターネットアクセスの範囲内にいるとは限らないユーザー向けであるため、たとえば午前9時にファイルをハードドライブにダウンロードすることを知っておく必要があります。アプリ内にも手動で行うためのボタンがありますが、私はすでにそれを機能させています。

私が理解しているように、それが可能であるとしても、これは難しいでしょう。 iOSがマルチタスクを好まないことは知っていますが、バックグラウンドタイマー機能を使用できることも知っています。別のアプリを作成することを意味する場合でも、これを達成するために誰かがしなければならない可能性のあるあらゆる種類の提案を受け入れます。ありがとう。

編集:通知、あるいはカレンダーを操作する可能性があるようです。そのカテゴリーのアイデアも歓迎します。

編集2:アプリを起動する外部サーバーについても読んだのですが、説明がありませんでした。

24
Marcel Marino

これは、定期的に発生するアクティビティをスケジュールするアプリに関連するバックグラウンド実行と通知およびタイマーなどに関する状況です。

  1. 次の場合を除いて、アプリをバックグラウンドで実行することはできません。

    1. それはそうするためにOSに余分な時間を要求します。これはbeginBackgroundTaskWithExpirationHandlerを使用して行われます。 Appleこの余分な時間の長さは(意図的に)指定されていませんが、実際には約10分です。

    2. アプリにはバックグラウンドモードがあり、モードはvoip、audio、location、newstandです。これらのタイプのいずれかがある場合でも、アプリはいくつかの制限なしに実行することはできません。この説明の残りの部分では、アプリにバックグラウンドモードがないことを前提としています。

  2. アプリが一時停止されると、それ自体を直接起動することはできません。以前にNSTimerをスケジュールすることはできず、performSelector:afterDelayのようなものを利用することはできません。等.

    アプリを再びアクティブにする唯一の方法は、ユーザーがアプリをアクティブにするために何かをした場合です。ユーザーは、次の方法でこれを行うことができます。

    1. アイコンから直接アプリを起動します

    2. アプリがアクティブなときにアプリによって以前にスケジュールされたローカル通知に応答してアプリを起動します。

    3. サーバーから送信されたリモート通知に応答してアプリを起動します。

    4. その他のいくつか:アプリがURL経由の起動を処理するように登録されている場合のURL起動など。または、特定の種類のコンテンツを処理できるように登録されている場合。

ローカル/リモート通知が発生したときにアプリがフォアグラウンドにある場合、アプリはそれを直接受信します。

ローカル/リモート通知が発生したときにアプリが現在フォアグラウンドにない場合、アプリはそれを受信しません。通知が発生したときに実行されるコードはありません。

ユーザーが通知を選択した場合にのみ、アプリがアクティブになり、実行できます。

ユーザーは、デバイス全体または特定のアプリケーションに対して通知を無効にできることに注意してください。その場合、ユーザーには通知が表示されません。通知が火災によるものであるときにデバイスの電源がオフになると、デバイスは失われます。

28
Gruntcakes

ローカル通知を使用できます。ユーザーが提示された通知を開くと、コードが実行されます。指定した間隔(毎日、毎時、毎週など)で繰り返されるようにローカル通知を設定できます。これでも、ユーザーはプロセスを開始するためにアプリを開く必要があります。

ILocalNotificationクラスリファレンス

デリゲートメソッドが起動すると、コードを実行するのに数秒しかかかりません。長時間実行されるバックグラウンドタスクに登録し、必要なことをすべてダウンロードします。タスクを取得した10分以内にダウンロードを完了できない場合は、ダウンロード戦略を再考する必要があります。

Appleマルチタスクとバックグラウンド

私が働いているiOSアプリでもこれと同じ概念を使用しているので、正しく設定すればこれは機能します。

[〜#〜]更新[〜#〜]

これがどのように機能するのか知りたい場合は、UILocalNotificationデリゲートメソッドを実装する必要があります。それらは、すでに配置されているはずのUIApplicationDelegateから継承します。

-(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {
// start your long running bg task here and update your file

}

**アップデート2 **

マーティンHの答えはこれまでで最も正しいです。しかし、これは疑問を投げかけます。ユーザーがアプリを開かない場合、表示されないデータをダウンロードする意味は何ですか?アプリを開いて更新するように通知する定期的なローカル通知が最善の方法かもしれませんが、アプリを最新の状態に保ちたい場合は、ユーザーがアプリを操作する必要があります。

2
Bill Burgess

これは不可能だと確信しています。せいぜい、プッシュ通知をユーザーに送信して、必要に応じて手動で更新できるようにすることです。

1
Oscar Gomez

バックグラウンドアプリケーションには、作業中の作業を完了するための制限時間が設定されています(10分と思いますが、それについては引用しないでください。それより短い場合もあります)。バックグラウンドタスクを使用して、必要なことを実行することはできません。

あなたができることは、最後のダウンロードの日付でNSUserDefaultを設定することです。起動時に保存された日付を確認します。日付が現在の日付ではなく、午前9時以降の場合は、プログラムでダウンロードを開始します。

0
Jeremy1026