2016-05-02 25 views
0

私は、アプリケーションの実行時にHTTP POSTリクエストを使用して診断データをリモートサーバーに送信するアプリケーションで作業します。現在、私たちはアプリ内の別のスレッドから送信されるメッセージをキューに入れます(キューには独自のプラットフォームに依存しないコードを使用し、送信するにはcurlを使用します)。アプリが終了してもiOSで非同期HTTP POSTリクエストを送信する

私が解決しようとしている問題は、診断ポストがキューに入れられているときと実際に他のアプリケーションで送信されているときの間でアプリがクラッシュする(またはクラッシュは主な懸念事項ですが他の方法で終了します)スレッドは情報が実際に送信されることはありません。クラッシュレポートの作成にクラッシュ・リキチャを使用していることに注意してください。この診断情報はその上にあります(主に、アプリケーションの状態、回復可能なエラーの検出などに関する情報)。

私は、この処理するための方法についてのカップルのアイデアを持っていた:

1 - 他のプラットフォームでは、私はこれらの要求を送信して処理する新しいプロセスを起動しますが、どのような情報私はあなたがしているように見える見つけたかもしれませんiOSでこれを行うことは許可されていません。

2 - これらのリクエストをディスクにキューイングして、私たちがすぐに送信できない場合に私たちのアプリが起動したときにそれらを送信することもできます。しかし、これは、ユーザーが私たちのアプリをもう一度起動するまで待つ必要があります(私たちがこの診断情報を使用している部分は、新しいユーザーが持っているデバッグの問題の一部です)。新しいユーザーがクラッシュした場合、もう一度開きます)。

これを可能にするメカニズムはありますか?

現在、私たちはcurlを使用してこれらのリクエストを送信していますが、これを提供する場合はiOS固有のAPIに切り替えることができます。私はNSURLConnection::sendAsynchronousRequestを見つけましたが、これはまだすべてが私のアプリケーション内で起こるようです(同じ問題があると思います)。

+1

アプリが終了した場合は、通常、ユーザーがアプリを再起動するまで終了します。終了したアプリを再起動できるVoIPプッシュなどの特定のバックグラウンドケースがあります。あなたの最善の策はオプション2で、ユーザーがあなたのアプリを再起動したときにデータを送信します。アプリがクラッシュすると、アプリで何かをしようとするとすぐに再起動する可能性があります。 – Paulw11

答えて

1

アプリが「実行していない」、つまりユーザーによって殺された、または起動されていないことを意味する場合は、開発者としてバックグラウンドで何もできません。

アプリが「停止」または「バックグラウンド」の状態にある場合は、バックグラウンドのスケジューリング時間をリクエストして送信することができます。私は肯定的ではありませんが、クラッシュがあなたをこれらの州から引き離すことはないと思います。

あなたのバックグラウンド機能はAppDelegateで実行されます。

は、これをサポートするには、次の

  1. チェックボックスの背景には、アプリケーションの機能の背景モードで取得します。
  2. setMinimumBackgroundFetchInterval(_:)を使用して、アプリに適した時間間隔を設定します。
  3. アプリデリゲートにapplication(_:performFetchWithCompletionHandler:)を実装すると、バックグラウンドフェッチを処理できます。

可能であれば、バックグラウンドで発射することができます。

サンプルコードこれは、スタックオーバーフローがあるため:間隔をフェッチすることを念頭に置いて

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 

    UIApplication.sharedApplication().setMinimumBackgroundFetchInterval(UIApplicationBackgroundFetchIntervalMinimum) 

    return true 
} 

func application(application: UIApplication, performFetchWithCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) { 
    print ("Backgrounding happened") 
    completionHandler(.NewData) 
} 

ベアあなたは必ず得るものではなく、何をしたいです。

+0

'私は肯定的ではありませんが、クラッシュによってあなたがこれらの状態からあなたを削除することはないと思います。'これが当てはまる場合、 'application(_:performFetchWithCompletionHandler:)'があなたのアプリケーションクラッシュした?私は、クラッシュが殺害と同じであると想定していました - アプリケーション(およびそれが実行したすべてのコード)はもはや存在しなくなります。 –

+1

ここには、興味深いかもしれない信頼性の高いクラッシュレポートに関する記事があります。http://landonf.bikemonkey.org/code/objc/Reliable_Crash_Reporting.20110912.html古いですが、前提が適用されます。 –

関連する問題