はじめに
こちらは個人開発アプリができるまで by am10 Advent Calendar 2024の 19 日目の記事です。
19 日目は StoreKit を使ってユーザーにリクエストを求めるやつについてです。
こういうやつ。
基本的にはこれをいれないといいレビューはもらえないと思ってもいいでしょう。
(ストアのページを開いてレビュー書いてくれる人は残念ながら何かしら不満を持った人の可能性の方が高いです)
表示タイミング
ガイドラインを見ると下記のように書いてあります。
Ask for a rating only after people have demonstrated engagement with your app or game.
Avoid interrupting people while they’re performing a task or playing a game.
Avoid pestering people.
ちゃんと使ってから出せ。タスクを邪魔するな。しつこく出すな。という感じでしょうか。
またこちらを見ると下記のように書いてあります。
If the person hasn’t rated or reviewed your app on this device, StoreKit displays the ratings and review request a maximum of three times within a 365-day period.
Because this API may not present an alert, don’t call it in response to a button tap or other user action.
未レビューのユーザーの場合年に 3 回まで表示ができる。常に表示できるわけではないのでボタン押下で表示などはやめろと書いています。
これらを考慮して家計簿アプリで出すならデータ登録を 10 回以上したユーザーのデータ登録完了後がいいでしょう。
表示処理
まずは登録処理を 10 回以上したかというのを計測できるようにします。
RegisterView に下記の処理を追加します。
1 2 3 4 5 6 7 8 9 |
enum UserDefaultsKey: String { case registeredCount = "USER_DEFAULTS_REGISTERED_COUNT" } @AppStorage(UserDefaultsKey.registeredCount.rawValue) private var registeredCount = 0 // 登録処理 try await register() registeredCount += 1 // これ追加 |
これで AppStorage に登録回数を保持できるようになりました。
あとは ContentView で登録完了時に処理すればいいだけなのですがこのままでは ContentView で登録完了の通知を受け取れません。onAppear でいけるかと思ったのですが sheet の dismiss 時には呼ばれないようです。下記のように isRegistered フラグを ContentView と RegisterView に追加して通知を受け取れるようにします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
// RegisterView // これ追加 @Binding var isRegistered: Bool // 登録完了のアラート showAlert(.init(title: "", message: .init(localized: "alert_registered_message"), okAction: { dismiss() // これ追加 isRegistered = true })) // ContentView // これ追加 @State private var isRegistered = false RegisterView(isRegistered: $isRegistered) // ここで渡す |
これで登録完了の通知を ContentView で受け取れるようになりました。あとは下記のように ContentView で StoreKit のレビューリクエストをすれば完成です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import StoreKit @AppStorage(UserDefaultsKey.registeredCount.rawValue) private var registeredCount = 0 @State private var isRegistered = false @Environment(\.requestReview) private var requestReview }.onChange(of: isRegistered) { oldValue, newValue in if newValue { isRegistered = false if registeredCount >= 10 { requestReview() } } } |
requestReview() は開発モードでコールすると常にアラートを表示するのでシミュレータでアラートの表示確認ができます。
おわりに
これで気軽にユーザーにレビューしてもらえるようになりました!
明日はもしものための強制アップデート機能を実装します。
コメント