いつもお世話になっております。
今回させていただく質問は、以前質問させていただいた内容の続きになります。
###はじめに
前回の質問にも記載されていますが、iOSアプリでCoreMotion.frameworkを利用して歩数計を作りました。
参考にしたサイトはこちらです。
歩数計実装当初からXcode上のシミュレータで歩数計の計測停止(歩数・時間のカウントを止める)ボタンを押すとアプリがクラッシュするという謎の現象が発生していたのですが、
実機iPhoneでは再現されない現象だったため、開発を続けていました。
ここまでが前回の質問での出来事です。
###問題点
この度アプリが完成し、Appleへ申請しようとしたところ、恐ろしい事態が発覚してしまいました。
なんと実機iPadでも上記と同様の現象が発生するのです。
このままではAppleに申請したところで、アプリがクラッシュするということでリジェクトされるのはほぼ確実だと思います。
早速修正しようと思い調べてみたのですが、有用な情報が特に得られずこちらに質問させていただいた次第です。
iPadの機種が、第4世代のものなので最初はM7が搭載されておらず使えないのかと思いましたが、
そもそもM7は歩数を計測する(モーションアクティビティ)ために使っているはずなので歩数計測ができないなら、計測開始した時点で落ちるんじゃないでしょうか?(これは前回の質問にも書いてますが…)
試しにiPhoneのモーションアクティビティ設定を無効にして試したところ、歩数計測機能だけが停止し、時間の計測は問題なく行われました。
計測を停止してもアプリがクラッシュするということは起こらず、迷宮入りの状態です。
###ソースコード
前回の質問にも記載してありますが、念のためソースコードを記載します。
前回投稿時から少々加筆した部分もありますが大元の歩数計測・時間計測についてはほぼ変わっていません。
lang
1import UIKit 2import CoreMotion 3 4class FourViewController: UIViewController { 5 6 //今回の歩数 7 @IBOutlet weak var Count: UILabel! 8 //計測開始ボタン 9 @IBOutlet weak var Start: UIButton! 10 //計測終了ボタン 11 @IBOutlet weak var Stop: UIButton! 12 //計測時間 13 @IBOutlet weak var CountTime: UILabel! 14 15 // class wide constant !! 16 let pedometer = CMPedometer() 17 18 var timer = Timer() // Timerクラス 19 var startTime: TimeInterval = 0 // Startボタンを押した時刻 20 var time : Double = 0.0 // ラベルに表示する時間 21 22 override func viewDidLoad() { 23 super.viewDidLoad() 24 25 //終了ボタン無効化 26 Stop.isEnabled = false //初期状態、または計測を開始していない時に終了ボタンを押せないようにしています 27 } 28 29 //ステータスバー非表示 30 override var prefersStatusBarHidden: Bool { 31 return true 32 } 33 34 @IBAction func CountStart(_ sender: Any) { 35 36 self.Count.text = "0歩" 37 //開始ボタン無効化 38 Start.isEnabled = false 39 //終了ボタン有効化 40 Stop.isEnabled = true 41 // Startボタンを押した時刻を保存 42 startTime = Date().timeIntervalSince1970 43 // 0.01秒おきに関数「update」を呼び出す 44 timer = Timer.scheduledTimer(timeInterval: 0.01, target: self, selector: #selector(self.update), userInfo: nil, repeats: true) 45 46 // CMPedometerの確認 47 if CMPedometer.isStepCountingAvailable() { 48 self.pedometer.startUpdates(from: NSDate() as Date) { 49 (data: CMPedometerData?, error) -> Void in 50 DispatchQueue.main.async(execute: { () -> Void in 51 if error == nil { 52 // 歩数 53 let steps = data!.numberOfSteps 54 self.Count.text = "\(steps)歩" 55 } 56 }) 57 } 58 } 59 } 60 61 @IBAction func CountStop(_ sender: Any) { 62 self.pedometer.stopUpdates() 63 //開始ボタン有効化 64 Start.isEnabled = true 65 //終了ボタン無効化 66 Stop.isEnabled = false 67 //タイマー処理を停止 68 timer.invalidate() 69 } 70 71 override func didReceiveMemoryWarning() { 72 super.didReceiveMemoryWarning() 73 // Dispose of any resources that can be recreated. 74 } 75 76 func update() { 77 //経過時間は以下の式で計算する 78 //(現在の時刻 - Startボタンを押した時刻) 79 time = Date().timeIntervalSince1970 - startTime 80 //時間を小数点前後で分割(小数点以下は2桁だけ取得) 81 let sec = Int(time) 82 let msec = Int((time - Double(sec)) * 100) 83 //「XX:XX.XX」形式でラベルに表示する 84 let displayStr = NSString(format: "%02d:%02d.%02d", sec/60, sec%60, msec) as String 85 CountTime.text = displayStr 86 } 87}
###開発環境
Xcode8.3.3
Swift3
にて開発しています。
このような現象について何かご存知の方がいらっしゃいましたら、お知恵をお貸しいただけると助かります。
宜しくお願い致します。
![guest](/img/icon/icnUserSample.jpg)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/06/16 01:15
2017/06/16 01:41
2017/06/16 06:36
2017/06/19 01:31