実機ビルドではプッシュが届くのにApp Distributionの開発環境からインストールしたアプリではプッシュが届かないという問題に直面しました。
App Distributionで確認出来ないとエンジニア以外の方がプッシュのテストを行えずデバッグ効率が非常に悪くなった為、原因の調査と解決を行いましたのでご紹介します。
プッシュ関連の設定状況まとめ
・プッシュ証明書
⇒同じ証明書を使用(Sandbox & Production)
・Amazon SNSのプラットフォームアプリケーション設定
開発環境用:Apple iOS (開発環境)
本番環境用:Apple iOS (本番環境)
・App Distribution
開発環境:プッシュ届く
本番環境:プッシュ届かない
まとめ
・プッシュ証明書は同じものを使ってるので問題なし。
・Amazon SNS・App Distributionどちらかに問題がある。
問題の原因調査
■Amazon SNSとApp Distributionどっちに問題があるのかを調べるための検証
Amazon SNS(本番環境)のプッシュならApp Distributionの開発環境に届くのか?
以下の状態でプッシュが届くか確認
・Amazon SNS:本番環境(プラットフォームアプリケーションをテスト用に新しく作成)
・App Distribution:開発環境のアプリ
⇒プッシュは届いた
まとめ
・プッシュ自体は届くのでApp Distributionは問題なし。
・Amazon SNSの開発環境に問題あり。
App Distributionにプッシュを送るには、Amazon SNSは本番環境ではならない。
→開発環境でも実機ビルド・App Distributionで環境を分ける必要がある。
対応方法
■Amazon SNSのプラットフォームアプリケーション設定
App Distributionの開発環境用にAmazon SNS(本番環境)のプラットフォームアプリケーションを新しく追加する。
開発環境用:Apple iOS (開発環境)
本番環境用:Apple iOS (本番環境)
↓↓
開発環境用(実機ビルド):Apple iOS (開発環境)
開発環境用(App Distributionの開発環境):Apple iOS (本番環境)
本番環境用:Apple iOS (本番環境)
開発環境用だけど、SNSの環境違いのものが出来る。(実機ビルドとApp Distribution)
なので、実機ビルドなのかApp Distributionを判別できるフラグ持たせる必要がある。
■開発側の設定
フラグを持たせる為にxcargsを使う。
https://docs.fastlane.tools/actions/build_app/
xcargsの導入方法
■Xcode(実機ビルド側の設定)
User-DefinedにXcargsで使う値を追加(今回は、IS_PUBLISH)
値は、0で指定(実機ビルドの時の値)
■fastfile(App Distribution側の設定)
build_appにxcargsのパラメータを追加。
値は、1で指定(App Distribution時の値)
build_app(
xcargs: "IS_PUBLISH=1", ##App Distributionでアプリを開いた場合、値を1にする。
)
これで実機ビルドとApp Distributionで値を分けることができました。
あとは分けられたxcargsの値を使って、#if DEBUG(開発)の中でさらに開発環境(実機ビルド)か本番環境(App Distribution)で分岐を作ります。
こうする事で万が一にも、テストなのに一般ユーザーにもプッシュが届いてしまう心配はなくなります。
private var environment: String {
#if DEBUG
guard let isPublish = Bundle.main.object(forInfoDictionaryKey: "IS_PUBLISH") as? String else {
return "product"
}
if isPublish == "1" {
return "product" //App Distribution開発環境
} else {
return "sandbox" //実機ビルド
}
#else
return "product" //本番環境
#endif
}
これで実機ビルドとApp Distributionでプッシュ通知を分けることにはなりますが
安全性もを考慮しつつ、App Distributionの開発環境でもプッシュが届くようになりました。