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

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

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

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

Swift

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

AppleWatch

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

解決済

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

lahlah
lahlah

総合スコア16

バックグラウンド処理

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

Swift

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

AppleWatch

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

1回答

0グッド

0クリップ

4484閲覧

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

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答1

0

ベストアンサー

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

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

投稿2019/12/10 06:39

編集2019/12/10 06:41
aja

総合スコア3713

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

lahlah

2020/02/20 04:44

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

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

バックグラウンド処理

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

Swift

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

AppleWatch

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