質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.38%
バックグラウンド処理

バックグラウンド処理とは、マルチタスク環境において、ユーザーに対して前面に表示させている処理の裏側で実行させる処理のことを呼びます。バックグラウンド処理を行う事によって、ユーザーが他の作業に携わることが可能となります。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

AppleWatch

AppleWatchは、iPhoneと連動して動作する時計型のデバイスです。時間の確認だけでなく、通話や受信メールの確認などを行うことができます。

Q&A

解決済

1回答

6016閲覧

AppleWatchで常にデータを取得したい

lahlah

総合スコア16

バックグラウンド処理

バックグラウンド処理とは、マルチタスク環境において、ユーザーに対して前面に表示させている処理の裏側で実行させる処理のことを呼びます。バックグラウンド処理を行う事によって、ユーザーが他の作業に携わることが可能となります。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

AppleWatch

AppleWatchは、iPhoneと連動して動作する時計型のデバイスです。時間の確認だけでなく、通話や受信メールの確認などを行うことができます。

0グッド

0クリップ

投稿2019/11/28 10:00

前提・実現したいこと

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プロパティであるため、この書き方は出来ないというエラーが出たので、この部分は書きませんでした.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こちらを読んだのであればBackgroundが特別なケースで制限された中でのみ使われると分かると思います
Running watchOS Apps in the Background

常時点灯表示がSeries5でようやくできるようになったのですが
依然としてバッテリーの持ちは悪いのでユーザーには不満があります。
バックグラウンドでCMMotionManagerのデータを取得し続けるアプリは現実的ではありません
確かにaudioや位置情報ではある程度許されているのでテストで個人用にはできるかもしれませんが
アプリとしてはリジェクトされる可能性が高いと思います。

投稿2019/12/10 06:39

編集2019/12/10 06:41
aja

総合スコア3733

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lahlah

2020/02/20 04:44

大変遅くなり申し訳ございません. ご回答ありがとうございました. Series5の方も手に入れましたが、現時点において常時ON機能は一部のアプリにしか有効ではないようです. 個人で作成したアプリの場合は、画面が消えることはない(時刻表示だけされる)ですが、結局アプリは中断されるため、Series4以下同様、データの長時間取得は当分難しいですね. Androidの方では常時ONが出来るので、バッテリーの持ちを抑える機能はユーザが選ぶ形にしてほしいと個人的には思ってしまいます…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.38%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問