import Flutter import UIKit import CoreMotion @main @objc class AppDelegate: FlutterAppDelegate { private let motionManager = CMMotionManager() override func application( _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? ) -> Bool { //GeneratedPluginRegistrant.register(with: self) //return super.application(application, didFinishLaunchingWithOptions: launchOptions) let controller : FlutterViewController = window?.rootViewController as! FlutterViewController let motionChannel = FlutterMethodChannel(name: "net.sumasen.gifunavi/motion", binaryMessenger: controller.binaryMessenger) motionChannel.setMethodCallHandler({ [weak self] (call: FlutterMethodCall, result: @escaping FlutterResult) -> Void in guard let self = self else { return } switch call.method { case "startMotionUpdates": self.startMotionUpdates(result: result) case "stopMotionUpdates": self.stopMotionUpdates(result: result) default: result(FlutterMethodNotImplemented) } }) GeneratedPluginRegistrant.register(with: self) return super.application(application, didFinishLaunchingWithOptions: launchOptions) } // この実装では以下のことを行っています: // デバイスのモーションデータ(姿勢、重力、ユーザー加速度)を取得します。 // 取得したデータを辞書形式にまとめます。 // sendMotionDataメソッドを使って、Flutterアプリにデータを送信します。 private func startMotionUpdates(result: @escaping FlutterResult) { if motionManager.isDeviceMotionAvailable { motionManager.deviceMotionUpdateInterval = 0.1 motionManager.startDeviceMotionUpdates(to: .main) { [weak self] (motion, error) in guard let self = self else { return } if let error = error { DispatchQueue.main.async { result(FlutterError(code: "MOTION_ERROR", message: error.localizedDescription, details: nil)) } return } guard let motion = motion else { DispatchQueue.main.async { result(FlutterError(code: "NO_MOTION_DATA", message: "No motion data available", details: nil)) } return } DispatchQueue.main.async { let motionData: [String: Any] = [ "attitude": [ "roll": motion.attitude.roll, "pitch": motion.attitude.pitch, "yaw": motion.attitude.yaw ], "gravity": [ "x": motion.gravity.x, "y": motion.gravity.y, "z": motion.gravity.z ], "userAcceleration": [ "x": motion.userAcceleration.x, "y": motion.userAcceleration.y, "z": motion.userAcceleration.z ] ] self.sendMotionData(motionData) } } result(nil) // 初期化成功を示す } else { result(FlutterError(code: "UNAVAILABLE", message: "Device motion is not available.", details: nil)) } } private func sendMotionData(_ data: [String: Any]) { let motionChannel = FlutterMethodChannel(name: "net.sumasen.gifunavi/motion", binaryMessenger: (window?.rootViewController as! FlutterViewController).binaryMessenger) motionChannel.invokeMethod("onMotionData", arguments: data) } private func stopMotionUpdates(result: @escaping FlutterResult) { motionManager.stopDeviceMotionUpdates() result(nil) } }