【個人開発】FirebaseとSwiftUIを使った健康・メンタル管理アプリをリリースしました！

#はじめに
この度、App Storeで個人開発の健康管理アプリ「TOKIWA」を公開しました。
公開に至るまで、Qiitaの記事には何度もお世話になったので、同じように開発に取り組む方のために私も技術や苦労した点についての情報を共有したいと思います。

私の開発環境はMacBook Air (M1, 2020)、Xcode12.5です。

#どんなアプリケーションなのか
![Azusa 3_master のコピー-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/713689/2f1d02a6-ef6a-4a2b-0234-5db688a44975.jpeg)

[ダウンロードはこちらから](https://apps.apple.com/jp/app/tokiwa-%E3%83%A1%E3%83%B3%E3%82%BF%E3%83%AB%E8%A6%8B%E5%AE%88%E3%82%8A%E3%82%A2%E3%83%97%E3%83%AA/id1568964732?itsct=apps_box_link&itscg=30200)

TOKIWAは心身の健康を保つことを目的に作られています。主に「記録」と「共有」と言う2つの機能を持っています。

##記録機能
TOKIWAでは体調の変化と、食事やサプリメントなどの摂取を記録しておくことができます。これらはひとつの場所にグラフになって表示されるので、普段の生活が症状にどんな影響を与えているのか考えることができます。薬の効果の検証にも使えます。

##共有機能
自分の今の気分、精神面の状態を他の人に共有することができます。最後に記録された日時と、相手が自分で設定した歩数の目標を達成したかどうかも教えてくれるようになっています。

遠くに離れて暮らす家族が元気に暮らしているかどうか、という見守り機能として使っていただけます。また、職場でのメンタルマネジメントでの使用も想定しています。

Qiita内にもマネジメントやコミニケーションについての記事が増えているので、少しでもその助けになればと思い開発しました。広告も入れていないので、その点は快適に使っていただけると思います、

#ほとんどをSwiftUIで
今回の開発では、アプリケーション内の大部分をSwiftUIで作成しています。2019年の発表からさまざまな改良が行われていますが、まだUIKitも使われ続けていますし、SwiftUIだけではできないことがあるのも確かです。

さらにiOSのバージョンの問題もあるのですが、それでも思い切ってSwiftUIを使うことにしました。WWDCの発表から今後の拡張性を考えると、やはり新技術に触れておく必要があると思ったからです。

個人的に便利だと思うのは`Preview`の機能です。ダークモードやローカライズなどといった条件をコードで指定できます。以下は`Localizable.strings`がある時の、多言語表示のサンプルです。

```swift:SymbolTest.swift
import SwiftUI

struct SymbolTest: View {
    var body: some View {
        VStack{
            Text("ABOUT CONDITION")　
        }
    }
}

struct SymbolTest_Previews: PreviewProvider {
    static var previews: some View {
        ForEach(["en_US",　//英語
                 "ja_JP",　//日本語
                 "pt-BR", //ポルトガル語（ブラジル）
                 "ru", //ロシア語
                 "ms", //マレー語
        ], id: \.self) { id in
            SymbolTest()
                .previewLayout(.sizeThatFits)
                .environment(\.locale, .init(identifier: id))
        }
    }
}

```

![スクリーンショット 2021-07-14 10.07.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/713689/7dc8423e-8d73-6b12-8af8-848118083a03.png)


#ライブラリの選定
M1 Macを使っているのでCocoaPodsの使い勝手が少し変わってしまいました。対処法はたくさんの方が記事にしてくださっているのですが、やはり手間がかかりますし、元々`WorkSpace`の扱いも苦手だったのでCocoaPodsは使わないことにしました。

Swift Package Manager（SPM）のみで導入できるライブラリのみを使用しています。調べてみると意外と対応しているものも多いというのは新しい発見でした。後述のFirebaseやMessageKitとSPMに対応しているので、簡単なSNSのような機能なら実装できると思います。


#Firebaseの導入
個人開発で高度な機能を加えたいなら、やはりFirebaseに頼るのが便利です。思い描くような大抵の機能は実現してくれますし、公式の説明も丁寧です。

日本語の記事を書いてくれている方もたくさんいらっしゃるので、使い方がわからなくなることはありませんでした。ただし、FireStoreのデータベース構造については注意しておいたほうがよいと思います。

私はこの点を疎かにしていたので、アプリケーション側の事情も相まって、読み取りの数が膨大になってしまいました。リリース前には一応修正しましたが、ここは料金にも関わってくるところなので気をつけておくべきだと思います。

##FirebaseApp.configure()の位置について

本アプリには`AppDelegate.swift`がないのですが、以下のようにすることで解決しています。

```swift:TOKIWAApp.swift
import SwiftUI
import Firebase

@main
struct TOKIWAApp: App {
   
    init() {
        FirebaseApp.configure()
    }
    
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}
```


#HealthKitとの連携
健康管理が目的なのでもちろんHealthKit連携が可能なように開発しました。使う側としてはもう一般的になりつつあるこの機能ですが、意外と情報が少ないように感じます。公式のドキュメントと試行錯誤でなんとかした、という形になりました。

Apple社の発表から見るに、HealthKitはより発展していくと思います。取得できるデータの種類も増えていますし、AppleWatchが普及すれば心拍数なども可視化できます。

自分で使ってみて、情報が少ないとはいえ個人開発でも十分扱えるものだと感じたので、興味のある方はぜひ導入してみてください。

#多言語対応
TOKIWAは英語、スペイン語やアラビア語など10カ国語以上に対応しています。いくら英語が堪能な人であっても、やはり日本語で使えるほうが楽であることは言うまでもありません。言語を使う人でもこれは同じだと思ったので多言語対応に取り組みました。

アプリケーション内だけでなく、ログイン時の確認メールも各言語に自動で変更できるようしました。例えば、アラビア語を使っている人にはアラビア語のメールが自動で送信されるようになっています。

#さいごに
いつも記事を書いてくださっているみなさんのおかげで完成させることができました。本当にありがとうございます。修正や改善がすぐ行えることも個人開発の強みだと思うので、これからもよりよいもの目指していこうと思います。