ÿÿ 高度ãªãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ç®¡ç† | iOS SDK | Adapty ドキュメント

iOS SDKã«ãŠã‘る高度ãªãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ç®¡ç†

高度ãªãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ç®¡ç†ã¯ã€Adapty iOS SDK ãƒãƒ¼ã‚¸ãƒ§ãƒ³3.12以é™ã§ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã™ã€‚

Adaptyã®é«˜åº¦ãªãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ç®¡ç†ã‚’使用ã™ã‚‹ã¨ã€ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã®å‡¦ç†ã€æ¤œè¨¼ã€å®Œäº†ã‚’より細ã‹ã制御ã§ãã¾ã™ã€‚

高度ãªãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ç®¡ç†ã«ã¯ã€é€£æºã—ã¦å‹•作ã™ã‚‹3ã¤ã®ã‚ªãƒ—ション機能ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚

機能目的
appAccountTokenAppleã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã‚’内部ユーザーIDã«ç´ä»˜ã‘ã‚‹
jwsTransactionãƒãƒªãƒ‡ãƒ¼ã‚·ãƒ§ãƒ³ç”¨ã«Appleã®ç½²å済ã¿ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ãƒšã‚¤ãƒ­ãƒ¼ãƒ‰ã‚’æä¾›ã™ã‚‹
手動完了ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰ãŒæˆåŠŸã‚’ç¢ºèªã—ãŸå¾Œã«ã®ã¿ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã‚’完了ã§ãã‚‹

ã“れらã®ãƒ„ールを組ã¿åˆã‚ã›ã‚‹ã“ã¨ã§ã€AdaptyãŒãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰ã¨ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³Sync機能を維æŒã—ãªãŒã‚‰ã€å …牢ãªã‚«ã‚¹ã‚¿ãƒ ãƒãƒªãƒ‡ãƒ¼ã‚·ãƒ§ãƒ³ãƒ•ローを構築ã§ãã¾ã™ã€‚

ã»ã¨ã‚“ã©ã®ã‚¢ãƒ—リã«ã¯ã“ã®æ©Ÿèƒ½ã¯ä¸è¦ã§ã™ã€‚ デフォルトã§ã¯ã€Adaptyã¯StoreKitãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã‚’è‡ªå‹•çš„ã«æ¤œè¨¼ãƒ»å®Œäº†ã—ã¾ã™ã€‚ ã“ã®ã‚¬ã‚¤ãƒ‰ã¯ã€ç‹¬è‡ªã®ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰ãƒãƒªãƒ‡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’実行ã™ã‚‹å ´åˆã‚„ã€è³¼å…¥ãƒ©ã‚¤ãƒ•サイクルを完全ã«åˆ¶å¾¡ã—ãŸã„å ´åˆã«ã®ã¿ä½¿ç”¨ã—ã¦ãã ã•ã„。

appAccountTokenを設定ã™ã‚‹

appAccountTokenã¯ã€App Storeã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã‚’内部ユーザーIDã«ç´ä»˜ã‘ã‚‹ãŸã‚ã®UUIDã§ã™ã€‚ StoreKitã¯ã“ã®ãƒˆãƒ¼ã‚¯ãƒ³ã‚’ã™ã¹ã¦ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã«é–¢é€£ä»˜ã‘ã‚‹ãŸã‚ã€ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰ã§App Storeã®ãƒ‡ãƒ¼ã‚¿ã¨ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’ç…§åˆã§ãã¾ã™ã€‚

ユーザーã”ã¨ã«ç”Ÿæˆã—ãŸå®‰å®šã—ãŸUUIDを使用ã—ã€ãƒ‡ãƒã‚¤ã‚¹ã‚’ã¾ãŸã„ã§åŒã˜ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã«å¯¾ã—ã¦å†åˆ©ç”¨ã—ã¦ãã ã•ã„。 ã“れã«ã‚ˆã‚Šã€è³¼å…¥ã¨App Storeã®é€šçŸ¥ãŒæ­£ã—ãç´ä»˜ã‘られã¾ã™ã€‚

トークンã¯2ã¤ã®æ–¹æ³•ã§è¨­å®šã§ãã¾ã™ã€‚SDKåˆæœŸåŒ–時ã¾ãŸã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’識別ã™ã‚‹ã¨ãã§ã™ã€‚

appAccountTokenã¯å¿…ãšcustomerUserIdã¨ä¸€ç·’ã«æ¸¡ã™å¿…è¦ãŒã‚りã¾ã™ã€‚ トークンã®ã¿ã‚’渡ã—ãŸå ´åˆã€ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã«å«ã¾ã‚Œã¾ã›ã‚“。

JWS表ç¾ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹

購入を行ã†ã¨ã€çµæžœã«ã¯Appleã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ãŒJWSコンパクトシリアライゼーション形å¼ã§å«ã¾ã‚Œã¾ã™ã€‚ ã“ã®å€¤ã‚’ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰ã«è»¢é€ã—ã¦ã€ç‹¬è‡ªã®ãƒãƒªãƒ‡ãƒ¼ã‚·ãƒ§ãƒ³ã‚„ãƒ­ã‚°è¨˜éŒ²ã«æ´»ç”¨ã§ãã¾ã™ã€‚

let result = try await Adapty.makePurchase(product: paywallProduct)
let jwsRepresentation = result.jwsTransaction

トランザクション完了ã®å‹•作を制御ã™ã‚‹

transaction-management.png

デフォルトã§ã¯ã€Adaptyã¯ãƒãƒªãƒ‡ãƒ¼ã‚·ãƒ§ãƒ³Afterã«StoreKitトランザクションを自動的ã«å®Œäº†ã—ã¾ã™ã€‚ ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰ãŒæˆåŠŸã‚’ç¢ºèªã™ã‚‹ã¾ã§å®Œäº†ã‚’é…らã›ãŸã„å ´åˆã¯ã€å®Œäº†å‹•作を手動ã«è¨­å®šã—ã¦ãã ã•ã„。

ã“ã®ãƒ¢ãƒ¼ãƒ‰ã§ã¯ï¼š

  • Adaptyã¯å¼•ãç¶šã購入を検証ã—ã€ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰ã¨Syncã—ã¾ã™ã€‚
  • finish()を明示的ã«å‘¼ã³å‡ºã™ã¾ã§ã€ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã¯æœªå®Œäº†ã®ã¾ã¾ã§ã™ã€‚
var configBuilder = AdaptyConfiguration
    .builder(withAPIKey: "YOUR_API_KEY")
    .with(transactionFinishBehavior: .manual)

try await Adapty.activate(with: configBuilder.build())   

手動トランザクション完了を使用ã™ã‚‹å ´åˆã€æœªå®Œäº†ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã‚’処ç†ã™ã‚‹ãŸã‚ã«onUnfinishedTransactionデリゲートメソッドを実装ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚

extension YourApp: AdaptyDelegate {
    func onUnfinishedTransaction(_ transaction: AdaptyUnfinishedTransaction) async {
        // Perform your custom validation logic here
        
        // When ready, finish the transaction
        await transaction.finish()
    }
}

ç¾åœ¨ã®æœªå®Œäº†ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã‚’ã™ã¹ã¦å–å¾—ã™ã‚‹ã«ã¯ã€getUnfinishedTransactions()メソッドを使用ã—ã¦ãã ã•ã„。

let unfinishedTransactions = try await Adapty.getUnfinishedTransactions()
ÿÿÿÿ