カルボナーラ街道

計測と観察

自作アプリでGraphQLを使うための準備をした

ややポエム寄り。

開発環境

> go version
go version go1.18.4 darwin/amd64

> xcodebuild -version
Xcode 14.0
Build version 14A5228

モチベーション

iOSのHealthKitで取得できるサイクリングやランニングのワークアウト情報をGraphQLで管理できるようにしたい。理由は以下4つ。特に一番最後が重要で、サイクリングのワークアウト情報の管理は1年以上続けられているのでこれからも継続できるだろうと判断した。

  • GraphQLを趣味で使いたい
  • SwiftUIを書きたい
  • 後々Jetpack Composeを書きたい
  • 長く付き合える題材でコードを書きたい

あと、普段GraphQLが整備された環境で開発をしていて、整備する側に回ることが無くGraphQL導入の苦しみポイントや知見を知らない状態なので自分で作って身につけていきたい。

準備したもの

とりあえずクライアントからサーバーにクエリできるようにした。

クライアントはiOSでSwiftUI。GraphQLのクライアントライブラリはapollographql/apollo-iosを利用。

github.com

サーバーはGoでGraphQLライブラリは99designs/gqlgenを利用。以前、graphql-go/graphqlを利用してコードファーストなGraphQLサーバーを書いたことがあった*1ので、今回は指向を変えてスキーマファーストで書けるライブラリを採用。

github.com

準備中に考えていたことやメモ

一旦Dockerは使わない

Goで何かしらを書く時はDockerを使っているが、今回に関しては最初は使わずに進める。というのも、過去を振り返ると非本質パートで時間を取られることが多く、それが一因で飽きてやめてしまうことが多かった。例えばDockerのコンテナ内で利用するライブラリの補完を手元の開発機で効かせることにハマったりなど。もちろんそういうことは大事だが、時間はほぼ無限にあれど趣味開発はある程度の優先順位を決めて進めないと続かない。今回の走り出しは開発環境周りの優先順位を下げる。よほど破壊的でなければ後で必要になった時に対応で良いのではないか感がある。

既存のiOSアプリにapollo-iosを追加できなかった

失敗談。プランとして、既存の趣味開発のアプリ*2に追加で開発しようと考えていたのだが、apollo-iosをセットアップした状態でアプリが実行できなかった。原因は特定できていないのだが、XcodeGenで使用するproject.ymlのschemaの記述がされていないことが分かったりと、project.ymlが全体的に不完全なことが実行できない一因になっていそうだった。まっさらなUIKitベース、SwiftUIベースのプロジェクトでapollo-iosのセットアップ、実行まで上手く行ったのでSwiftUIと相性が悪いということでない。Xcodeのエラーメッセージも Package resolution errors must be fixed before building とだけで詳細が分からずで解決がすぐにできなさそうだったので一から作ることにした。適当にproject.ymlを書いたことが悪かった。

実機からMaclocalhostに接続する

GraphQLサーバーをlocalhostで立てているときに実機からどう接続しようかと考えていたが、シンプルにローカルのIPアドレス指定で接続できた。

import Apollo

final class Network {
    static let shared = Network()

    private init() {}
    
    private(set) lazy var apollo = ApolloClient(
        url: URL(string: "http://xxx.xxx.xxx.xxx:8080/query")!)
}

これからの展望

  • サーバーのデプロイどうするか
    • サービス何使うか
  • DBどうするか
    • サービス何使うか
  • スキーマのサーバー・クライアント間の同期の自動化
  • Swift Chartsを使ったブログを書きまくりたい
    • iOS 16リリースを待とう、待てない、いや待とう

参考