Upgrade to Pro — share decks privately, control downloads, hide ads and more …

SWWDC 34

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.
Avatar for asmz asmz
December 27, 2017

SWWDC 34

今年ハマったIn App Purchase

Talked at SWWDC #34

Avatar for asmz

asmz

December 27, 2017
Tweet

More Decks by asmz

Other Decks in Technology

Transcript

  1. Who are you? ▷ Akira Shimizu / asmz(@_asmz) ▷ 株式会社ビデオマーケット

    iOSエンジニア ▷ 岩手県陸前高田市出身 ▷ 新卒から12年半東京に勤め、 2016/8より仙台にJターン
  2. What are you doing? ▷ 株式会社ビデオマーケットとは? ◦ http://www.videomarket.co.jp/ ◦ 動画配信サービス(e.g.

    Netflix, Hulu, etc...)を運営 ◦ 東京本社オフィス(赤坂) ▪ 今は100人くらい? ▪ うちエンジニアは40名くらい ◦ 仙台オフィス ▪ 13名 ▪ うちエンジニア4名
  3. Look back on 2017 ▷ 春 ◦ 会社の技術ブログ立ち上げ ◦ 社内勉強会立ち上げ

    ▷ 夏 ◦ 転職活動 ◦ React Nativeちょっと触る(バイト) ▷ 秋 ◦ In App Purchase実装 ▷ 冬 ◦ iPhoneX対応 ◦ CI導入検討
  4. Case2 iOS/tvOS StoreKit Apple SKProductsRequest start() 有効なプロダクトか問い合わせ 回答 回答 (SKProductRequestDelegate経由)

    SKPaymentQueueに 支払い要求キュー追加 回答 (SKPaymentTransactionObserver経由) 支払い要求 回答
  5. Case2 iOS/tvOS StoreKit Apple SKProductsRequest start() 有効なプロダクトか問い合わせ 回答 回答 (SKProductRequestDelegate経由)

    SKPaymentQueueに 支払い要求キュー追加 回答 (SKPaymentTransactionObserver経由) 支払い要求 回答 ここが受け取れていない!
  6. Case2 ▷ 原因 ◦ In-App PurchaseプログラミングガイドのP15に以下の 記載あり App Storeに問い合わせるには、プロダクト要求オブジェクトを使用します。最初 に、SKProductsRequestのインスタンスを作成し、プロダクトIDのリストで初期

    化します。要求オブジェクトへの強い参照を保持してください。そうしないと、要 求が完了しないうちに、システムが割り当て解除してしまうおそれがあります 2015/10/21にガイドに追記された模様
  7. Case2 iOS/tvOS StoreKit Apple SKProductsRequest start() 有効なプロダクトか問い合わせ 回答 回答 (SKProductRequestDelegate経由)

    SKPaymentQueueに 支払い要求キュー追加 回答 (SKPaymentTransactionObserver経由) 支払い要求 回答 tvOS実機では、このインスタ ンスが解放されてしまってい る模様
  8. Case2 ▷ 対応(ガイドにサンプルコードあり) // Custom method - (void)validateProductIdentifiers:(NSArray *)productIdentifiers {

    SKProductsRequest *productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithArray:productIdentifiers]]; // Keep a strong reference to the request. self.request = productsRequest; productsRequest.delegate = self; [productsRequest start]; } [注意] ガイドに明記はされていないが、リストアも同様の 処理が必要
  9. Case3 ▷ 事象 ◦ 自動更新型課金アイテムの購読期間中に再度購読し ようとした時の挙動が、SandboxとProductionで異な る ▪ Sandbox •

    ←の画面が出つつ、Purchase Successが返却 ▪ Production • ←の画面が出つつ、Purchase Failed(SSErrorDomain Code=16)が返却
  10. Case3 ▷ エラーコード(SSErrorDomain Code=16)でググっても ◦ いまいちしっくりくる回答がない ◦ Forumで上がっているものも、なんか今回の事象と違う ▪ https://forums.developer.apple.com/thread/9050

    4 ◦ SSErrorDomainはStoreServices.frameworkのドメイン で、Privateフレームワークなのでそもそも完全に文章化 されてない、とか ▪ http://www.openradar.me/25502597
  11. Knowledge ▷ テストで油断しない ◦ iOSのマイナーバージョンアップ動作確認 ◦ 実機デバイス毎の動作確認 ▷ 公式情報を頻繁にチェック ◦

    公式ガイド類 ◦ Apple Developer Forums ▷ Appleを過信しない ◦ Sandbox環境の不安定さ ◦ 調べても解決せず、実装も間違ってなさそうなら、バグの可能性 つまり、当たり前のことをちゃんとやるのが大事 ...