前提・実現したいこと
CMMotionManagerを使用してデータを取得するプログラムを作成しています.
Apple Watchが sleep状態の時は、データの取得が停止します.
sleep状態でもデータを取得し続けるために、backgroundの処理を書きましたが、
上手く動作しません.
どのようにすれば、常にデータを取得し続けることができるのでしょうか?
ご回答よろしくお願いします.
現状
background処理のコードを書き、同じプログラムで2回実機テストを行ったところ、
1回目 なぜかAppleWatchがsleep状態にならず、常に画面がON (7分ほど試しました)
2回目 sleep状態になり、その間はデータの取得が停止
という結果になりました.
常にsleep状態にならない、もしくは、sleep状態でもデータを取得できるようにしたいのですが、どのようにすればよいでしょうか?
該当のソースコード
swift
1import WatchKit 2import Foundation 3import CoreMotion 4 5class InterfaceController: WKInterfaceController, WKExtensionDelegate { 6 let motionManager = CMMotionManager() //センサ 7 8 override func awake(withContext context: Any?) { 9 super.awake(withContext: context) 10 // Configure interface objects here. 11 12 } 13 14 //データの記録 15 @IBAction func start() { 16 //別スレッド 17 DispatchQueue.global().async { 18 self.motionManager.startAccelerometerUpdates() //センサupdate開始 19 self.getData() //データを取得する関数 20 } 21 22 //Backgroundタスクを追加 23 let fireDate = Date(timeIntervalSinceNow: 1.0) //1s後からタスクを実行 24 WKExtension.shared().scheduleBackgroundRefresh(withPreferredDate: fireDate, userInfo: nil, scheduledCompletion: { (error) in if (error == nil) { print("background success") } }) 25 } 26 27 28 //データを取得するための関数 29 func getData(){ 30 //処理 31 } 32 33 34 //ボタンを押したら計測終了 35 @IBAction func stop() { 36 //センサ止める 37 if (motionManager.isAccelerometerActive){ 38 motionManager.stopAccelerometerUpdates() 39 } 40 } 41 42 //Backgroundタスク 43 func handle(_ backgroundTasks: Set<WKRefreshBackgroundTask>) { 44 for task : WKRefreshBackgroundTask in backgroundTasks { 45 if task is WKApplicationRefreshBackgroundTask { 46 //Backgroundで実行する処理 47 self.getData() 48 49 //Background処理完了 50 task.setTaskCompletedWithSnapshot(false) 51 } 52 } 53 } 54 55 override func willActivate() { 56 // This method is called when watch view controller is about to be visible to user 57 super.willActivate() 58 59 } 60 61 override func didDeactivate() { 62 // This method is called when watch view controller is no longer visible 63 super.didDeactivate() 64 } 65 66}
試したこと
AppleWatchのBackground処理について書かれているサイトがあまり見当たらず、
Apple公式サイトやこちらのサイトを参考にしてコードを書きましたが、上手く動作しませんでした.
補足情報(FW/ツールのバージョンなど)
バージョン
Xcode 11.1, Swift 5.0.1
Apple Watch Series 4
2つめのサイトは書かれたのが少し前で、タスクの実行をハンドリングという章の
WKExtension.shared().delegate = self
という部分について、Xcode11.1環境では、delegate は get-onlyプロパティであるため、この書き方は出来ないというエラーが出たので、この部分は書きませんでした.
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/02/20 04:44