플러터로 android 용 앱을 개발하다가 앱이 좀 괜찮으면 iOS로 확장하고 싶은 욕구가 생기겠죠?
그런데 처음부터 iOS를 염두해두고 프로젝트를 만들지 않았다면, 확장을 어떻게 해야 하나 할겁니다.
간단하게 확장하는 방법 정리 해봤습니다.
먼저 빌드할 플랫폼을 선택합니다.
terminal에서 다음과 같이 입력하면 되는데요.
$ flutter config --enable-<platform>
ios 의 경우에는 flutter config --enable-ios 라고 입력 합니다.
그리고 나서 프로젝트를 재 생성 합니다.
$ flutter create .
을 입력하면 다시 프로젝트가 재 생성됩니다.
사용 예 )
~/$ flutter config --enable-ios
Setting "enable-ios" value to "true".
You may need to restart any open editors for them to read new settings.
~/github/arbot_care (karzia)$ flutter create .
⣟
Recreating project ....
windows/runner/flutter_window.cpp (created)
windows/runner/utils.h (created)
windows/runner/utils.cpp (created)
windows/runner/runner.exe.manifest (created)
windows/runner/CMakeLists.txt (created)
windows/runner/win32_window.h (created)
windows/runner/Runner.rc (created)
windows/runner/win32_window.cpp (created)
windows/runner/resources/app_icon.ico (created)
windows/runner/main.cpp (created)
windows/runner/resource.h (created)
windows/runner/flutter_window.h (created)
windows/flutter/CMakeLists.txt (created)
windows/.gitignore (created)
windows/CMakeLists.txt (created)
arbot_care.iml (created)
web/favicon.png (created)
web/index.html (created)
web/manifest.json (created)
web/icons/Icon-maskable-512.png (created)
web/icons/Icon-192.png (created)
web/icons/Icon-maskable-192.png (created)
web/icons/Icon-512.png (created)
android/app/src/main/res/mipmap-mdpi/ic_launcher.png (created)
android/app/src/main/res/mipmap-hdpi/ic_launcher.png (created)
android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png (created)
android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png (created)
android/app/src/main/res/mipmap-xhdpi/ic_launcher.png (created)
android/app/src/main/kotlin/io/netplant/arbot_care/MainActivity.kt (created)
android/arbot_care_android.iml (created)
ios/RunnerTests/RunnerTests.swift (created)
.idea/runConfigurations/main_dart.xml (created)
.idea/libraries/KotlinJavaRuntime.xml (created)
linux/main.cc (created)
linux/my_application.h (created)
linux/my_application.cc (created)
linux/flutter/CMakeLists.txt (created)
linux/.gitignore (created)
linux/CMakeLists.txt (created)
Resolving dependencies...
Got dependencies.
Wrote 42 files.
All done!
You can find general documentation for Flutter at: https://docs.flutter.dev/
Detailed API documentation is available at: https://api.flutter.dev/
If you prefer video documentation, consider: https://www.youtube.com/c/flutterdev
참고로 지원 되는 플랫폼 목록은 다음과 같습니다.
--enable-web
Enable Flutter for web. This setting will take effect on the master, dev, beta, and stable channels
--no-enable-web
Disable Flutter for web. This setting will take effect on the master, dev, beta, and stable channels
--enable-linux-desktop
Enable beta-quality support for desktop on Linux. This setting will take effect on the master, dev, beta, and stable channels. Newer beta versions are available on the beta channel
--no-enable-linux-desktop
Disable beta-quality support for desktop on Linux. This setting will take effect on the master, dev, beta, and stable channels. Newer beta versions are available on the beta channel
--enable-macos-desktop
Enable beta-quality support for desktop on macOS. This setting will take effect on the master, dev, beta, and stable channels. Newer beta versions are available on the beta channel
--no-enable-macos-desktop
Disable beta-quality support for desktop on macOS. This setting will take effect on the master, dev, beta, and stable channels. Newer beta versions are available on the beta channel
--enable-windows-desktop
Enable beta-quality support for desktop on Windows. This setting will take effect on the master, dev, beta, and stable channels. Newer beta versions are available on the beta channel
--no-enable-windows-desktop
Disable beta-quality support for desktop on Windows. This setting will take effect on the master, dev, beta, and stable channels. Newer beta versions are available on the beta channel
--enable-android
Enable Flutter for Android. This setting will take effect on the master, dev, beta, and stable channels
--no-enable-android
Disable Flutter for Android. This setting will take effect on the master, dev, beta, and stable channels
--enable-ios
Enable Flutter for iOS. This setting will take effect on the master, dev, beta, and stable channels
--no-enable-ios
Disable Flutter for iOS. This setting will take effect on the master, dev, beta, and stable channels
--enable-fuchsia
Enable Flutter for Fuchsia. This setting will take effect on the master channel
--no-enable-fuchsia
Disable Flutter for Fuchsia. This setting will take effect on the master channel
enable 시킬때는 --enable-<platform> 을 사용하고 disable 시킬때는 --no-enable-<platform> 을 이용합니다.
아시다 시피 BLE 장치들은 기존 BT classic과 다르게 broadcasting 기능을 제공하고 있어서 S/W로직을 기존 BT classic과 동일하게 가져가기에는 무리가 있습니다.
BLE 장치를 어떤 목적으로 어떻게 사용할것인가를 잘 구상 해야합니다.
구성 하고자 하는 장치를 미미(mimi)라고 합시다.
1. 미미에 탑재한 센서에서 읽은 값을 broadcasting 만 목적으로 한다.
=> BLE advertizement
2. 미미에 탑재한 센서에서 읽은 값을 연결되었을때만 데이타를 읽어갈 수 있도록 한다.
=> BLE service characteristics
3. 미미에 탑제된 여러 장치들을 제어하려고 한다.
=> connect /read /write
보통 목적은 3가지 형태가 될것 같습니다.
1번의 경우는 BLE advertizement를 이용하는 방법을 사용합니다.
- connection 없이 모단말(ble에선 central이라 부름)에서 scanning을 할때 scanning 한 데이타를 활용합니다.
- 이를 위헤서 미미(ble장치)에서도 당연히 advertizement 에 데이타를 설정 해줘야합니다.
- spec이나 가이드 상으로는 advertizementdata에 service data 항목이 있어서 service id와 data를 설정할 수 있습니다.
- 그러나 이렇게 사용할 수 없다면, manufacturer data를 활용하는 방법으로 할 수 도 있습니다.
- 여러 단말에서 동시에 읽어갈 수 있습니다.
2번의 경우는 BLE service의 characteristic의 값을 읽는 방식을 취합니다.
- scan후에 scan된 기기에 connect하고 나서 data를 읽어가는 방식입니다.
- 1번의 경우에는 scan만으로 정보를 읽어갈 수 있지만, 보안상 취약합니다. 모든 기기가 값을 다 볼 수 있기 때문이죠.
- 이런 connection 방식은 1:1통신이기 때문에, 연결되고 나면 다른 기기에서는 scan이 안됩니다.
- 때문에 connect후에 data를 읽고 바로 연결을 끊어야 합니다.
3번의 경우는 2번과 유사한데 다만 scanning 과 분리해서 connect후 characteristic에 read/write를 하는 방식으로 처리합니다.
- serial 방식( classic 방식) 과 유사한 요청사항이죠.
- 하지만 serical에서는 연결후 data를 보내고 response를 받는 것만 고려 했다면, BLE에서는 특정 characteristic정하고 해당 characteristic 값에 data를 wrtie하고 notifiy 를 설정하고 read를 하는 방식이라, 단순한 기능 구현에는 번거로움이 있지만,
미미(mini, ble 장치)가 복잡하다면 각 기능 제어를 분리해서 사용할 수 있기 때문에 좋습니다.
만들고자 하는 native lib을 static으로 만들면 build는 해결할 수 있지만, java에서 c++ native symbol link 과정은 컴파일(compile)시에 결정되는 것이 아니라 런타임(runtime linking 또는 dynamic linking )을 하기 때문에 so file을 사용해야 합니다.
즉 해결 방법은, libc++.so, libbase.so, libcutils.so 파일들을 모두 application library로 포함 시켜야 합니다.