swift+LLMで爆速アプリ開発


ReactNative,嘘です

こんにちはみずあめです。 現在 https://whisper.mizuame.app でSpeech To TextモデルのWhisperを無料提供しているのですが、全く知名度が無いので、勿体無いのでネイティブアプリを作ろうと思いました。

完成したアプリはこれです、よければ使ってください。

https://apps.apple.com/app/swift文字起こし/id6743728982

技術選定

書いてある通り、最初はAndroidとiosどっちも対応しようと思ったので ReactNativeで開発をしていたのですが、こいつが渋すぎた。 ライブラリを使いまくって開発するのが基本ぽいですが、ライブラリとプロジェクトのバージョンの組み合わせによってよく動かなくなり、ググっても環境依存なことが大きく、かなり不快な思いをしました。

又当然スマートフォンの機能にアクセスする場合はネイティブAPIをラッパーしたライブラリを使用するわけですが、こいつも渋い。動かない。

感想としてSNSアプリ見たいなそのままWebから移植できそうなやつ以外使わないほうがいいと思いました。(特にスマホの機能を触りに行く時は)

claudeで爆速開発

そんなわけでswiftで開発し始めたのですが、Reactのコードをclaudeを使ってトランスパイルしました。筆者はswiftを書いた事が今までありませんでした。

今巷ではclineとかcursorとか流行っているらしいですが、かなり言語モデルを触った感想としては、LLMは自然言語からのトランスパイラーとしてはかなり使える印象ですが、 設計と思考力が全然まだ足りていないように思います。

脱線:然言語コーディング

Twitterを見ていると、プロ驚き屋の方々が失職と騒いでいますが、完全にstand aloneでアプリ開発ができるレベルにはまだ達していないと思っています。

これに関してのお気持ち表明はまた別の記事で。

開発

まず元々Reactコンポーネントに分かれている訳ですが、これをswiftに合わせる形でトランスパイルさせ、一部再設計を行いました。

エラーが出た際は自分がググって問題を抽象化し、LLMにそれを投げswiftのドメイン知識を元に直させ、自分でドキュメントを読み、チェックを行う感じです。

これで基礎となる部分ができました。 5時間位かかりました。

Admobを導入

バナー広告を入れたいと思っていたので、Admobを導入しました。 設定や最新の使用を自分がまとめ、設計し、それをclaudeに関数等にさせました。

問題になった点

エミュレーターで起動した際、カーネルが死亡し直ぐに落ちるという現象が発生していました。

この時点で最初に疑ったのはAdmobのエラーです。 公式のswiftSDKを使用しているので考えられるのは実装だと思ったので、デバッグログを流すようにclaudeに書かせ直しました。が、コネクション普通に貼れてました。

次に疑ったのが、権限問題です。エラーの内容でググると権限系のエラーで死んだ時同様のエラーコードが出ていたので、これじゃねとなりました。 appleのドキュメントを読みに行き、infoに権限を求めるKVを書いた所、死ななくなりました。やったー

申請

Apple developer(12980円/y)になり、申請を行いました。 UIが一部分かりにくく、発狂していましたが私はAWSコンソールのおかげで抽象化されたGUIに関する知識があったので対応できました。

iPhone16ProMaxエミュレーターの画像を貼り付け、Xcodeでビルドし申請を出しました。

却下

これはApple App Storeのアプリ審査結果の詳細通知です。あなたの「swift文字起こし」アプリに関して、いくつかの問題点が指摘されています。主な問題点は以下の通りです:

ガイドライン2.3.7 - パフォーマンス - 正確なメタデータ

アプリのサブタイトルに価格の参照が含まれており、これはメタデータとして適切ではありません。
解決策:メタデータから価格に関する言及を削除し、必要ならアプリの説明文に含めてください。


ガイドライン2.3.8 - パフォーマンス - 正確なメタデータ

マーケットプレイスでのアプリ名(swift文字起こし)と端末に表示されるアプリ名(WhisperClient)が十分に一致していません。
解決策:ユーザーが混乱しないよう、どちらか一方または両方の名前を変更して類似させてください。


ガイドライン3.1.1 - ビジネス - 支払い - アプリ内課金

アプリに含まれる有料のデジタルコンテンツやサービスがアプリ内課金以外の方法で提供されています。具体的には、開発者への寄付やサポートがアプリ内課金以外の支払い方法で購入できるようになっています。
解決策:アプリ内のすべての有料デジタルコンテンツ、サービス、サブスクリプションはアプリ内課金のみを使用するよう変更してください。


ガイドライン5.1.1 - 法的事項 - プライバシー - データ収集と保存

マイク使用の目的文字列が保護されたリソースの使用を十分に説明していません。
解決策:マイクの目的文字列を更新し、アプリがどのようにマイクを使用するのか、具体的な例を含めて明確に説明してください。

直していきます。

ガイドライン2.3.7 - パフォーマンス - 正確なメタデータ

これに関してはサブタイトルに無料というワードを入れたのがダメだったぽいです。

ガイドライン2.3.8 - パフォーマンス - 正確なメタデータ

これは最初に設定した名前がアプリ名と違ったからです。プロジェクト名を直さなくてもビルド設定で直せました。

ガイドライン3.1.1 - ビジネス - 支払い - アプリ内課金

アプリ内にBuyMeaCoffeeのリンクを貼ったのがだめだったみたいです。

ガイドライン5.1.1 - 法的事項 - プライバシー - データ収集と保存

マイクを使用するには許可が必要ですと言う文章だけでは不十分だったらしいです。

ご丁寧に画像まで添付されてきました。

アプリ内課金を導入

アプリ内で他の決済サービスへ誘導するのがダメっぽいので、大人しくアプリ内課金(サブスク)を導入しました。

購入すると広告が非表示になります。

store kit 2を使い、サクッと実装しました。

実装しました。

リジェクト

Guideline 3.1.2 - Business - Payments - Subscriptions
Issue Description


The submission did not include all the required information for apps offering auto-renewable subscriptions.


The app's metadata is missing the following required information:


- A functional link to the Terms of Use (EULA). If you are using the standard Apple Terms of Use (EULA), include a link to the Terms of Use in the App Description. If you are using a custom EULA, add it in App Store Connect.


Next Steps


Update the metadata to include the information specified above.


Resources


Apps offering auto-renewable subscriptions must include all of the following required information in the binary:


- Title of auto-renewing subscription (this may be the same as the in-app purchase product name)

- Length of subscription

- Price of subscription, and price per unit if appropriate

- Functional links to the privacy policy and Terms of Use (EULA)


The app metadata must also include functional links to the privacy policy in the Privacy Policy field in App Store Connect and the Terms of Use (EULA) in the App Description or EULA field in App Store Connect.


Review Schedule 2 of the Apple Developer Program License Agreement to learn more.

起動時にサブスク購入済みだったら広告を自動で消すようにしていたのですが、明示的に戻すボタンが必要らしいです。

リリース

その後も様々なリジェクトと修正を繰り返し、何とかリリースできました。 開発開始から6日位何やかんやかかりました。

バトル履歴

一覧へ戻る