FlutterでiOSネイティブからFlutterへ送信する
FlutterでiOSネイティブからFlutterへ送信する
書いておくこと
今回の記事はまだできていない段階で書いたものです、一緒に事を成し遂げましょう。
目的
最近センサー系に触ることが多くてこないだもこのような記事を書いてましたし、何か社会貢献しようと思ってios_native_sensors
というライブラリーを作ってオープンソースにしようと思っています。
fork と ライセンスの確認
前回にsensors_plus
というライブラリーを使っていました、このライブラリはBSD-3-Clause
ライセンスです。
BSD-3-Clause ライセンス
このライセンスは以下のことが要求されます:
- 著作権表示
- 付属品や免責事項の表示
- 作者の名前を使用した広告の禁止
よし、きちんとリールを守ってフォークしよう
まずここのファイルごとを他のところにコピーして、ios_native_sensors
という名前に変更します。
その後sensors_plus_platform_interface
の中身を全部sensors_plus
に移動していろいろ修正します。(めんどなので書かない、主にimportの修正)
途中で起こった問題
iOSネイティブからFlutterに送信する時にsendTriplet
と言うメソッドを使って送信している、しかしこのメソッドは三つの引数を取る必要がある、iOSネイティブのMagnetic
ではaccuracy
というフィールドが存在して四つの引数が必要になる。
どうしようかな。。。
...できたら続きを書きます。
この記事を見ました、わかりやすい!ありがとうございます。
どれどれ〜 今は
FlutterStandardTypedData typedDataWithFloat64:
を使っている見たい、なので一層のことNSDictionary
を使ってみようかな。
Mapは一番自由なタイプだと思いますので、これにします。(Dartはとても使いやすいTypeチェックがあるので安心してDartに渡せる、Dart大好き!!!)
Dartではこんな感じ:print('data type: ${event.runtimeType}');
でその変数の最終的な型を確認できます。(Dart大好き!!)
一日経って、やっとできました:
Switft 側のコードを見ていきましょう:
func sendMotionTriplet(data: [String: Any], sink: @escaping FlutterEventSink) {
if _isCleanUp {
return
}
DispatchQueue.main.async {
sink(data)
}
}
そしてイベント源はこんな感じです:
func onListen(
withArguments arguments: Any?,
eventSink sink: @escaping FlutterEventSink
) -> FlutterError? {
_initMotionManager()
_motionManager.startDeviceMotionUpdates(to: OperationQueue()) { data, error in
if _isCleanUp {
return
}
if (error != nil) {
sink(FlutterError.init(
code: "UNAVAILABLE",
message: error!.localizedDescription,
details: nil
))
return
}
let motionData = [
"rotationRate": [
"x": data!.rotationRate.x,
"y": data!.rotationRate.y,
"z": data!.rotationRate.z,
],
"attitude": [
"roll": data!.attitude.roll,
"pitch": data!.attitude.pitch,
"yaw": data!.attitude.yaw,
],
"gravity": [
"x": data!.gravity.x,
"y": data!.gravity.y,
"z": data!.gravity.z,
],
"magnetic": [
"x": data!.magneticField.field.x,
"y": data!.magneticField.field.y,
"z": data!.magneticField.field.z,
"accuracy": data!.magneticField.accuracy.rawValue,
],
"userAcceleration": [
"x": data!.userAcceleration.x,
"y": data!.userAcceleration.y,
"z": data!.userAcceleration.z,
],
]
sendMotionTriplet(
data: motionData,
sink: sink
)
}
return nil
}
さ〜、コードを見れば分かると思いますので詳しい説明は省略します。(これでも分からない場合はTwitterで聞いて、返事できない時もあると思うが。。。)
後日にpubに公開する予定です、楽しみにしてください。
Discussion