- iOSで加速度センサーの値を取得するには、CoreMotionを使う
- XCodeでSingle View Applicationを作成
CoreMotionでaccelerationを取得
- ViewController.swift で CoreMotionをImportしてaccelerationを取得する
ViewController.swift
import UIKit
import CoreMotion
class ViewController: UIViewController {
// MotionManager
let motionManager = CMMotionManager()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
if motionManager.isAccelerometerAvailable {
// 加速度センサーの値取得間隔
motionManager.accelerometerUpdateInterval = 0.1
// motionの取得を開始
motionManager.startAccelerometerUpdates(to: OperationQueue.current!, withHandler: { (data, error) in
// 取得した値をコンソールに表示
print("x: \(data?.acceleration.x) y: \(data?.acceleration.y) z: \(data?.acceleration.z)")
})
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
XCode8で iOS10.0 が対象になったこともあり..
実機に入れようとして、deployment target を iOS9.3 にすると以下のようなエラーが出る
AppDelegate.swift:49:35: 'NSPersistentContainer' is only available on iOS 10.0 or newer
プロジェクトをXcode7 で作って Xcode8 へマイグレーションすればいける!ってかいてある。...が、ここは 今回 CoreData を使う予定はないので(Project作成時に入れなければ関係ないが, 入れてしまった.) 以下のように回避した。
全く本質を解決していない(iOS10.0以外ではCoreData使えなくしてる)ので...どうななんだろうか..
@available(iOS 10.0, *)
lazy var persistentContainer: NSPersistentContainer = {
let container = NSPersistentContainer(name: "MotionBLESample")
container.loadPersistentStores(completionHandler: { (storeDescription, error) in
if let error = error as NSError? {
fatalError("Unresolved error \(error), \(error.userInfo)")
}
})
return container
}()
// MARK: - Core Data Saving support
func saveContext () {
if #available(iOS 10.0, *) {
let context = persistentContainer.viewContext
if context.hasChanges {
do {
try context.save()
} catch {
let nserror = error as NSError
fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
}
}
} else {
// Fallback on earlier versions
}
}
動きました。