12

ドキュメント ディレクトリに文字列データが入力された JSON ファイルがあります。アプリケーションのユーザー インターフェイスには、UIButton があります。ボタンを押すと、新しい文字列が JSON ファイルに追加されます。

現在、これらの文字列を(JSON ファイルから)swift を使用してサーバーに送信するのに役立つ iOS サービスを探しています。そして、このサービスは私のコードから完全に独立している必要があります。ポイントは、UIButton を押すときです。最初のステップでは、文字列が JSON ファイルに保存されます。インターネットが利用可能な場合、サービスはこの文字列を取得してサーバーに送信する必要があります。

文字列が正常に送信されたら、JSON ファイルから削除する必要があります。このサービスは、JSON ファイルに保存された文字列があるかどうかを 30 秒ごとに追跡し、それをサーバーに送信する必要があります。

Googleで検索してバックグラウンドフェッチを見つけましたが、機能が自動的にトリガーされperformFetchWithCompletionHandler、iOSがいつトリガーするかわかりません。30秒ごとにこの種のサービスを自分でトリガーしたい.

4

5 に答える 5

13

Apple の App Programming Guide for iOS のBackground Execution部分を確認してください。

UIApplicationでバックグラウンド タスクを開始および終了するためのインターフェイスを提供しますUIBackgroundTaskIdentifier

のトップ レベルでAppDelegate、クラス レベルのタスク識別子を作成します。

var backgroundTask = UIBackgroundTaskInvalid

次に、完了したい操作でタスクを作成し、期限切れになる前にタスクが完了しなかったエラー ケースを実装します。

backgroundTask = application.beginBackgroundTaskWithName("MyBackgroundTask") {
    // This expirationHandler is called when your task expired
    // Cleanup the task here, remove objects from memory, etc

    application.endBackgroundTask(self.backgroundTask)
    self.backgroundTask = UIBackgroundTaskInvalid
}

// Implement the operation of your task as background task
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
    // Begin your upload and clean up JSON
    // NSURLSession, AlamoFire, etc

    // On completion, end your task
    application.endBackgroundTask(self.backgroundTask)
    self.backgroundTask = UIBackgroundTaskInvalid
}
于 2016-09-15T14:18:35.770 に答える
4

私が行ったことは、上記の JAL によって説明されたアプローチを使用することです。

これらは私が使用した3つの方法でした

    func reinstateBackgroundTask() {
        if updateTimer != nil && (backgroundTask == UIBackgroundTaskInvalid) {
            registerBackgroundTask()
           }
    }
    func registerBackgroundTask() {
        backgroundTask = UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler {
            [unowned self] in
            self.endBackgroundTask()
        }
        assert(backgroundTask != UIBackgroundTaskInvalid)
    }

    func endBackgroundTask() {
        NSLog("Background task ended.")
        UIApplication.sharedApplication().endBackgroundTask(backgroundTask)
        backgroundTask = UIBackgroundTaskInvalid
    }

updateTimer上記の関数はNSTIMER、「syncService」という名前の独自に作成したクラスにあります。このクラスには、次の初期化子があります。

init(){
  NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(self.reinstateBackgroundTask), name: UIApplicationDidBecomeActiveNotification, object: nil)

        updateTimer = NSTimer.scheduledTimerWithTimeInterval(30.0, target: self, selector: #selector(self.syncAudit), userInfo: nil, repeats: true)
        registerBackgroundTask()

 }

次に、このクラスを呼び出しただけで、問題全体が解決されました。

于 2016-09-20T11:20:11.580 に答える
1

NSURLSessionUploadTask を参照してください。

于 2016-09-20T07:04:44.370 に答える
0

これがJALによる回答のswift 4バージョンです

  extension UIApplication {
  /// Run a block in background after app resigns activity
   public func runInBackground(_ closure: @escaping () -> Void, expirationHandler: (() -> Void)? = nil) {
       DispatchQueue.main.async {
        let taskID: UIBackgroundTaskIdentifier
        if let expirationHandler = expirationHandler {
            taskID = self.beginBackgroundTask(expirationHandler: expirationHandler)
        } else {
            taskID = self.beginBackgroundTask(expirationHandler: { })
        }
        closure()
        self.endBackgroundTask(taskID)
    }
  }

  }

使用例

UIApplication.shared.runInBackground({
        //do task here
    }) {
       // task after expiration.
    }
于 2018-06-22T06:34:52.293 に答える