📝

FlutterでiOSネイティブからFlutterへ送信する

2024/03/29に公開

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