Open7

XCUITest: StoreKit Configの覚え書き

kabeyakabeya

XCUITest/XCTestで、StoreKit Configという仕組みを使うことができますが、その設定について覚え書き。


Configだけだと言うほどネタがないので、XCTest/XCUITest+StoreKit、の覚え書きにします…

kabeyakabeya

Xcode 15.2です。

APP→Configuration Settings→Purchase Options→Subscription Renewal Rateで「Monthly Renewal Every 30 Seconds」にすると、1ヶ月のサブスクはテスト/デバッグ実行時には30秒でexpireされます。

1年のサブスクは×12で6分。3ヶ月なら1分30秒です。
ただ、2週間のサブスク(というかIntroductory Offer)は、15秒?14秒?でexpire?と思いきや、20秒でexpireされてる気がします。

同様に?1週間は10秒でexpireされているように見えます。

kabeyakabeya

https://zenn.dev/kabeya/scraps/25380ee8259b74

上記でXCUITest中にsession.disableDialogs = trueをやる場合とやらない場合とで、トランザクションの発生の仕方が違うことがある、というメモを書きました。
解決策は、上記をやらずにシステムが出す確認ボタンを自動で押す、です。

    func tapConfimationButtons() {
        let springBoard =  XCUIApplication(bundleIdentifier: "com.apple.springboard")
        springBoard.buttons["サブスクリプションに登録"].tap()
        //app.buttons["サブスクリプションに登録"].tap()
        springBoard.alerts["You’re all set."].scrollViews.otherElements.buttons["OK"].tap()
    }

この関数を、購入ボタンをタップしたあとに呼べばテストが自動で進みます。

kabeyakabeya

StoreKit ConfigのPriceの件。

Configでは、Priceを1個しか設定できません。
テストケース側でストアフロントを切り替えることもできますが、その場合でもストアフロントこそ切り替わりますが、価格は切り替わりません。
(デフォルトのストアフロントは、APP→Configuration Settings→Storefront and Localizationで設定したところになります)

Priceの件は以下にも書いています。
https://zenn.dev/kabeya/scraps/e46779e68734cf

kabeyakabeya

SKTestSession.clearTransactions()ががSimulatorのトランザクションをクリアしてくれないように見える場合があります。

テスト開始時ではなくて、テスト終了時に.clearTransactions()を呼ぶとうまくクリアされるように見えます。

詳しいことは以下にも書いています。
https://zenn.dev/kabeya/scraps/cd23dd4c589115

ちなみに、テスト実行で使われるSimulatorの「Clone 1 of …」ですが、app.launch()あたりにブレークポイントを置いてテストの先頭で止めてやれば、Xcodeでもトランザクションを編集できるということに気付きました。

kabeyakabeya

SwiftUIで.manageSubscriptionsSheet(isPresented:)もデイファイアを使うと「サブスクリプションの管理」シートを開くことができます。
現在購入しているサブスクの一覧が(他のアプリとかApple CareとかApple MusicとかiTunes MatchとかApple Developer Programとかも含めて)表示されて、キャンセルだとかプランの切り替えとかできる画面です。

このシートは、購入時が別Appから確認シートを表示したのとは異なり、自App内にシートが表示されるようなんですね。

キャンセルのシミュレーションは以下のようにして行うことができます。
(以下の例は「サブスクリプションの管理」というボタンを押すと、$isPresented = trueのような動きをしてシートが表示される、という前提です)

        //app.collectionViews.buttons["サブスクリプションの管理"].tap()
        app.webViews.webViews.webViews.staticTexts["Cancel Subscription"].tap()
        app.buttons["Confirm"].tap()
        app.buttons["right_bar_button_item"].tap()
kabeyakabeya

Grace PeriodはApp Store Connectだとベンダー側で期間を設定できますが、StoreKit Configだと期間の設定がありません。

どのぐらいがGrace Periodになるのかと見てみましたが、「Monthly Renewal Every 30 Seconds」の設定だとGrace Periodは15秒のようです。

Billing Retryは毎回ちょっと違って50〜60秒ぐらいでExpireされるような気がします。
Retry Periodは「Up to 60 days」ということなので、最大60秒、その範囲内で適当に来るんでしょうか。