Fitbit SDK 5.0 マイグレーションしてみた

アプリ開発記事は [こちら](https://qiita.com/cozzbox/items/c6122667d45c788331a9)

[Fitbit SDK 5.0](https://dev.fitbit.com/blog/2020-09-24-announcing-fitbit-os-sdk-5.0/) がリリースされたので、2018年に作った自社サービス向けのFitbitアプリを5.0へマイグレーションすることになりました。久々すぎて殆ど覚えてないこともあり、記憶を辿りながらFitbit Studioへアクセス、SDKを5.0に変更してビルドしてみると。。。
![スクリーンショット 2020-12-03 18.41.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103992/4665411b-c1cd-7180-086e-14dba9eccb35.png)
まぁ、ですよね（苦笑

[SDK Migration Guide](https://dev.fitbit.com/build/guides/migration/) をみると、4.x -> 5.xはプロジェクト構造を変更しないと駄目っぽいです。
>・BREAKING: /resources/index.gui renamed to /resources/index.view.
・BREAKING: /resources/widgets.gui renamed to /resources/widget.defs.
・BREAKING: The import /mnt/sysassets/widgets_common.gui has been renamed to /mnt/sysassets/system_widget.defs.
・BREAKING: Imported UI components renamed from *.gui to *.defs. e.g. /mnt/sysassets/widgets/baseview_widget.gui becomes /mnt/sysassets/widgets/baseview_widget.defs.
・BREAKING: The following UI components have been removed: panoramaview_widget, combo_button_widget, square_button_widget, push_button_widget, and mixed_text_widget.
・BREAKING: document.replaceSync() has deprecated in favor of two asynchronous promise based methods: document.location.replace() and document.location.assign().

ファイル名リネームはナンテことないわけですが、panorama_viewとsquare_buttonを使ったアプリなだけに廃止は地味にイタい。。。が、従うしかないですね。あと気になるところでは、、、

>The new build targets for atlas (Fitbit Versa 3) and vulcan (Fitbit Sense) are SDK 5.0 only. Developers cannot mix SDK 4.x and SDK 5.x build targets in a single project, remember to remove incompatible build targets.

これって旧モデル(IonicやVersa)をサポートしないってことなのかな？？？
-> [SDK 5.0はVersa3とSense専用みたいです](https://community.fitbit.com/t5/SDK-Development/Announcing-SDK-5-0-for-Fitbit-Versa-3-and-Fitbit-Sense/m-p/4496721/highlight/true#M13170)
IonicやVersaなど4.x系はSDK4.2を引き続き使ってビルド、Versa3とSenseはSDK5.0でビルドしろってことみたいです。SDKだけならまだしもpanorama_viewやsquare_buttonの廃止もあるから、もう別アプリ扱いで管理しないとです。。。。メンドイ

と、いうわけで先ずはビルドできるところまで。
あと、SDK4とSDK5でリポジトリを分けたい(github管理)のでFitbit StudioからCLI環境(VScode)に移行してみることにしました。

## CLI環境構築
[Command Line Interface Guide](https://dev.fitbit.com/build/guides/command-line-interface/) にあるとおり。
VSCodeでの開発環境は久々です。```ctrl``` + ```shift``` + ```~``` でターミナルが使えるのも便利ですね
忘れずにbuildTargetsはVersa3とSenseだけにする。（SDK4.xのモデルが含まれてるとビルドエラーになる）

```json:package.json
"buildTargets": [
    "atlas",
    "vulcan"
]
```
依存関係を追加

```json:package.json
"devDependencies": {
  "@fitbit/sdk": "~5.0.1",
  "@fitbit/sdk-cli": "^1.7.3"
}
```
インストール

```
$ npm install
npm WARN deprecated rollup-plugin-babel@4.4.0: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-babel.
npm WARN deprecated core-js@2.6.12: core-js@<3 is no longer maintained and not recommended for usage due to the number of issues. Please, upgrade your dependencies to the actual version of core-js@3.
<<省略>>
```
deprecatedとかWARNが結構でる。。。が、とりあえず見なかったことに（苦笑
github管理に移行するので、リポジトリや.gitignoreを作成する

```text:.gitignore
/build
/node_modules
```
## ビルド
fitbitシェルに入る
```npx fitbit```を叩くとブラウザが立ち上がりfitbitログインが求められます。正常にログインしてターミナルに戻るとfitbitシェルに入れる。

```
$npx fitbit
No login information, starting login...
Logged in as Asken Inc <xxxx@xxxx.com>
fitbit$
```

ビルドする

```
fitbit$ build

[12:54:47][info][app] Building app for Fitbit Versa 3
[12:54:47][info][app] Building app for Fitbit Sense
[12:54:48][info][companion] Building companion
[12:54:48][info][settings] Building settings
[12:54:48][info][build] App UUID: xxxxxxxxxxxxxxxx, BuildID: yyyyyyyyyyyyy
```
fitbit OS Simuratorをローカル環境で起動してからシュミレーターにインストールする

```
fitbit$ install
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103992/221a237f-47ed-3a7a-85f8-27d697981d6a.png" width="300px" alt="fitbit_simulator.png" />

## あとがき
とりあえずビルドが通るところまでを目標にしているため一旦はスルーしてますが、npmで依存関係を一気にインストールした際に```deprecated```がでました。

```
npm WARN deprecated rollup-plugin-babel@4.4.0: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-babel.
npm WARN deprecated core-js@2.6.12: core-js@<3 is no longer maintained and not recommended for usage due to the number of issues. Please, upgrade your dependencies to the actual version of core-js@3.
```
このあたりは手動で入れ直すような対応が、どっかで必要になりそうです。
また、SDK4.xとSDK5.xで切り替えてビルドする際は、```npm install```を都度実行してあげないとエラーがでます。おそらくは依存関係なのだろうと予想。

、、、、と、それぐらいで、他につまづくケースはなく、容易にマイグレーションできました（笑
ただ、SDK5.0の下位互換がないあたりは、事情はあるにせよなんとかならなかったのかなぁと思ったりです。

## おまけ
リリース作業については、SDK4系とSDK5系とでpackage.jsonのUUIDを同じにして申請しないとfitbit中の人レビューでNG喰らいますのでご用心。