27

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

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

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

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

4

5 に答える 5

30

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

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

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

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

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

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

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

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

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

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

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

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

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

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

于 2012-06-05T20:07:41.947 に答える
2

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

UILocalNotificationクラスリファレンス

デリゲートメソッドが起動すると、コードを実行するのに数秒しかかかりません。長時間実行されるバックグラウンドタスクに登録し、必要なことをすべてダウンロードします。タスクの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の答えはこれまでのところ最も正しいです。しかし、これは疑問を投げかけます。ユーザーがアプリを開かない場合、表示されないデータをダウンロードする意味は何ですか?アプリを開いて更新するように通知する定期的なローカル通知が最善の方法かもしれませんが、アプリを最新の状態に保ちたい場合は、ユーザーがアプリを操作する必要があります。

于 2012-06-05T19:49:35.017 に答える
0

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

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

于 2012-06-05T19:31:50.037 に答える
0

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

于 2012-06-05T19:36:39.800 に答える
-2

次のことを試しましたか?

if ([[[UIDevice currentDevice] systemVersion] floatValue] >=7.0)
    [[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:600];


- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
    completionHandler(UIBackgroundFetchResultNewData);
}
于 2014-12-30T10:37:06.687 に答える