2016-11-06 3 views
5

私の学校用のアプリケーションを作成しています。ウェブサイトに新しいマークがある場合は、n分ごとにチェックする必要があります。 初めてユーザーがログインするときにこれを行うには、実際のマークの番号が「UserDefaults」に保存されます。アプリが終了すると、n分後にマークの数が再計算され、前のものと比較され、番号が変更された場合に通知が送信されます。アプリケーション終了時にバックグラウンドタスクを実行する

このタスクを実行する方法があるかどうかを知りたいと思います。私は-applicationWillTerminate-でタイマーを作成しようとしましたが、一度しか起動しません。 これは私が試みたものです:

func applicationWillTerminate(_ application: UIApplication) { 
    DispatchQueue.main.async { 
     self.timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(AppDelegate.findMark), userInfo: nil, repeats: true) 
     self.timer.fire() 
    } 
} 

セレクタfindMarkはタスクです。

ありがとうございます!

+0

アプリの終了時には実行できません。私の答えをチェックしてください。お気軽に疑問をお聞かせください:) – KrishnaCA

+0

アプリを無期限に、バックグラウンドで、またはアプリが終了した直後に実行しますか? –

+0

私が理解していることは、バックグラウンドで無期限に実行したいということです。カウンタがマークの数を更新するたびに、通知を送信したいのですか? –

答えて

9

は、次の2つのオプション

  1. アプリのバックグラウンド更新
  2. サイレントプッシュ通知
簡単な

1アプリのバックグラウンド更新されています。後で通知を送信するサーバーが必要なためです。使用方法については、APIの後にチェックすることができます。基本的にはを設定します。アプリの機能/背景モードの機能を取得します。その後、iOSがアプリを起動し、application(_:performFetchWithCompletionHandler:)代理人に電話します。あなたの関数と呼び出し完了ハンドラを呼び出すために約30-45秒かかります。時間をおいて終了しないと、iOSによってアプリが強制終了されます。ルールに従わないと、iOSは目を覚ます機会が減ります。バックグラウンドモードの詳細については、次をご確認ください。tutorial

+0

私はそのアプリケーション(_:performFetchWithCompletionHandler :)はn分ごとにタスクを実行しません。それは正しいですか? –

+0

はい。 iOSはこの呼び出しをスケジュールし、呼び出されるタイミングを知る方法がありません。しかし、より多くのアプリが使用されるほど、iOSはこのハンドラをより多く呼びます。プッシュ通知がなければ、n分後にアプリを起動する信頼できる方法はありません。 – Meanteacher

+0

質問に応じて、この回答は受け入れられません。 – RamGrg

3

アプリが終了した後、質問に記載されているようなタスクを実行することはできません。文書で説明したように:

アプリケーションの終了

アプリはいつでも発生する、終了のために準備しなければならないとユーザーデータを保存したり、他の重要なタスクを実行するのを待つべきではありません。システムによって開始される終了は、アプリのライフサイクルの通常の部分です。システムは通常、メモリを回収して他のアプリが起動するためのスペースを確保できるようにアプリを終了させますが、不正なアプリやタイムリーに応答しないアプリも終了することがあります。

中断されたアプリは終了時に通知を受けません。システムはプロセスを強制終了し、対応するメモリを再要求します。現在アプリがバックグラウンドで実行中で、中断されていない場合、システムは終了する前にアプリデリゲートのapplicationWillTerminate:を呼び出します。デバイスが再起動すると、システムはこのメソッドを呼び出しません。

アプリを終了するシステムに加えて、ユーザーはマルチタスクUIを使用して明示的にアプリケーションを終了することができます。ユーザーが開始した終了は、停止しているアプリケーションを終了するのと同じ効果があります。アプリのプロセスは強制終了され、通知はアプリに送信されません。

リンク:https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/TheAppLifeCycle/TheAppLifeCycle.html

編集:

アプリケーションが終了した後は、任意のタスクを実行することはできません。あなたができることは、サーバー側から計算を行い、Push Notificationをデバイスに送信することです。

+0

ありがとうございました。どうすればいいですか?オフラインのゲームがたくさんあるので、通知を送信します。建物は終了し、アプリがマルチタスキングマネージャーで手動で閉じられた場合でもこれが適用されます。 –

+0

これはPushNotificationまたはLocalNotificationです。それが必要なものなら、それを答えに加えます。待って.. – KrishnaCA

+0

はい、それは私が言及している..しかし、アプリケーションが閉じられたときにlocalNotificationを送信するタスクは一度だけ呼び出されます –