XCode8 Swift3 で iOS 9.3 用加速度センサー値取得のサンプルアプリ


  • iOSで加速度センサーの値を取得するには、CoreMotionを使う
  1. XCodeでSingle View Applicationを作成

CoreMotionでaccelerationを取得

  1. 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
        }
    }

こうやった上で、実機で動かす。

動きました。