こんにちは。エキサイトでアプリエンジニアをしている岡島です。
最近、FlutterアプリでDeepLinkをカスタムURLスキームで実装する機会がありました。そのとき、動作確認のデバッグ用コマンドではカスタムURLスキームからアプリが起動するのですが、TestFlightで配布したアプリではカスタムURLスキームが無効な状態になっていました。その原因について共有します。
結論
アプリ側でカスタムURLスキームを指定する時に、大文字を含んだスキームで定義してたことが原因でアプリが起動しませんでした。 スキーム名をすべて小文字にすると解決しました。
起こった事象
- iOSシミュレータでは
xcrun simctl openurl booted 'MyApp://path'コマンドでアプリが起動 - Androidエミュレータでは
adb -e shell 'am start -W -a android.intent.action.VIEW -c android.intent.category.BROWSABLE -d "MyApp://path"'コマンドでアプリが起動
TestFlight経由でアプリを配布した後、カスタムURLスキームのリンクを開いてもアプリが起動しないという状況でした。
原因の調査
デバッグのコマンドでアプリが起動するので実装には問題なさそうなので、 スキームについて調査しました。
するとこのような文を見つけました。 RFC 3986
Although schemes are case-insensitive, the canonical form is lowercase and documents that specify schemes must do so with lowercase letters.
(DeepLでの和訳: スキームは大文字と小文字を区別しないが、正規形は小文字であり、スキームを指定するドキュメントは小文字で指定しなければならない。 )
私の実装では、カスタムURLスキームに「myApp://path」のように大文字を含みスキームを定義していました。 これが原因のようです。
解決策
アプリ側で指定するスキーム名を小文字に統一すると解決しました。
例:
❌ MyApp://path ⭕ myapp://path
この修正後、実機環境やTestFlight配布版でも問題なくカスタムURLスキームが動作するようになりました。
まとめ
URLスキームのプロトコルやブラウザの仕様など、基礎的な周辺知識も重要だと感じました。 この記事が誰かのお役に立てれば幸いです。