×
Copy
Open
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
今年ハマったIn App Purchase 2017/12/26 SWWDC #34 asmz
Slide 2
Slide 2 text
Who are you? ▷ Akira Shimizu / asmz(@_asmz) ▷ 株式会社ビデオマーケット iOSエンジニア ▷ 岩手県陸前高田市出身 ▷ 新卒から12年半東京に勤め、 2016/8より仙台にJターン
Slide 3
Slide 3 text
Who are you? ▷ 無類のビール好き ○ 「麦芽系エンジニア」で検索すると前職エンジニアブログ の自分のエントリとか出ます ○ 思わずドメイン取ってしまった ■ https://asmz.beer
Slide 4
Slide 4 text
What are you doing? ▷ 株式会社ビデオマーケットとは? ○ http://www.videomarket.co.jp/ ○ 動画配信サービス(e.g. Netflix, Hulu, etc...)を運営 ○ 東京本社オフィス(赤坂) ■ 今は100人くらい? ■ うちエンジニアは40名くらい ○ 仙台オフィス ■ 13名 ■ うちエンジニア4名
Slide 5
Slide 5 text
What are you doing? ▷ ビデオマーケット(https://www.videomarket.jp/) ○ 配信本数は日本最大級(現在19万本) ■ 自分はiOSアプリ開発担当 ■ 最近、tvOSアプリもリリースされました
Slide 6
Slide 6 text
“ 2017年の振り返り
Slide 7
Slide 7 text
Look back on 2017 ▷ 春 ○ 会社の技術ブログ立ち上げ ○ 社内勉強会立ち上げ ▷ 夏 ○ 転職活動 ○ React Nativeちょっと触る(バイト) ▷ 秋 ○ In App Purchase実装 ▷ 冬 ○ iPhoneX対応 ○ CI導入検討
Slide 8
Slide 8 text
“ CASE1. iOS11でSandbox課金処理に失敗
Slide 9
Slide 9 text
Case1 ▷ 事象 ○ iOS11.0でSandboxユーザで課金処理をしようとして も、AppleID入力画面が繰り返し表示 ○ 3回くらい繰り返したあと、購入失敗(SKErrorDomain Code=0) ○ iOS10系だと発生しない ○ Productionリリース済の別アプリだと発生しない
Slide 10
Slide 10 text
Case1 ▷ 原因調査 ○ どうやらこのForumの事象と同じ模様 ■ https://forums.developer.apple.com/thread/80 560
Slide 11
Slide 11 text
Case1 ▷ 企画チームと相談 どうします?これ... TestFlightでノーイシューなエビデ ンスが取れればアグリーっす! この時、2017/10/10(JST)...
Slide 12
Slide 12 text
Case1 ▷ 2017/10/11(JST)、rich降臨 iOS 11.1 beta 2より問題解消!!
Slide 13
Slide 13 text
Knowledge ▷ 学び ○ Apple Developer Forums頻繁にチェック ○ iOSのマイナーバージョンアップでも油断せずに動作 確認
Slide 14
Slide 14 text
“ CASE2. tvOS実機で課金処理が動作しない
Slide 15
Slide 15 text
Case2 ▷ 事象 ○ iOSアプリとtvOSアプリで共通化している課金処理 の、tvOSだけ購入・リストア処理が動作しない ○ iOS/tvOSどちらも実機での確認
Slide 16
Slide 16 text
Case2 iOS/tvOS StoreKit Apple SKProductsRequest start() 有効なプロダクトか問い合わせ 回答 回答 (SKProductRequestDelegate経由) SKPaymentQueueに 支払い要求キュー追加 回答 (SKPaymentTransactionObserver経由) 支払い要求 回答
Slide 17
Slide 17 text
Case2 iOS/tvOS StoreKit Apple SKProductsRequest start() 有効なプロダクトか問い合わせ 回答 回答 (SKProductRequestDelegate経由) SKPaymentQueueに 支払い要求キュー追加 回答 (SKPaymentTransactionObserver経由) 支払い要求 回答 ここが受け取れていない!
Slide 18
Slide 18 text
Case2 ▷ 原因 ○ In-App PurchaseプログラミングガイドのP15に以下の 記載あり App Storeに問い合わせるには、プロダクト要求オブジェクトを使用します。最初 に、SKProductsRequestのインスタンスを作成し、プロダクトIDのリストで初期 化します。要求オブジェクトへの強い参照を保持してください。そうしないと、要 求が完了しないうちに、システムが割り当て解除してしまうおそれがあります 2015/10/21にガイドに追記された模様
Slide 19
Slide 19 text
Case2 iOS/tvOS StoreKit Apple SKProductsRequest start() 有効なプロダクトか問い合わせ 回答 回答 (SKProductRequestDelegate経由) SKPaymentQueueに 支払い要求キュー追加 回答 (SKPaymentTransactionObserver経由) 支払い要求 回答 tvOS実機では、このインスタ ンスが解放されてしまってい る模様
Slide 20
Slide 20 text
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]; } [注意] ガイドに明記はされていないが、リストアも同様の 処理が必要
Slide 21
Slide 21 text
Knowledge ▷ 学び ○ 共通処理だからといって油断せず、実機デバイス毎の 動作確認 ○ 公式ガイドの更新履歴チェック
Slide 22
Slide 22 text
“ CASE3.自動更新型アイテム再購読時の挙動
Slide 23
Slide 23 text
Case3 ▷ 事象 ○ 自動更新型課金アイテムの購読期間中に再度購読し ようとした時の挙動が、SandboxとProductionで異な る ■ Sandbox ● ←の画面が出つつ、Purchase Successが返却 ■ Production ● ←の画面が出つつ、Purchase Failed(SSErrorDomain Code=16)が返却
Slide 24
Slide 24 text
Case3 ▷ エラーコード(SSErrorDomain Code=16)でググっても ○ いまいちしっくりくる回答がない ○ Forumで上がっているものも、なんか今回の事象と違う ■ https://forums.developer.apple.com/thread/9050 4 ○ SSErrorDomainはStoreServices.frameworkのドメイン で、Privateフレームワークなのでそもそも完全に文章化 されてない、とか ■ http://www.openradar.me/25502597
Slide 25
Slide 25 text
Case3 ▷ 例によって... ○ In-App Purchaseプログラミングガイド参照 ユーザーがアプリケーションの復元インタフェースを使用する代わりに購入済み のプロダクトを購入しようとすると、App Storeによって復元トランザクションでは なく正常なトランザクションが作成されます。そのプロダクトについて、ユーザが 二重請求されることはありません。これらのトランザクションは、元のトランザク ションとまったく同じように扱ってください。
Slide 26
Slide 26 text
Case3 ▷ うーむ、これは...? Appleのバグなの では...?
Slide 27
Slide 27 text
Case3 ▷ イマココ(未解決) 手探りでログ添付したら「見れな いんで、ちゃんとこの資料の手順 通りログ取れ」って言われたとこ ろ
Slide 28
Slide 28 text
Knowledge ▷ 学び ○ Sandboxを過信しない ○ 調べても解決せず、実装も間違ってなさそうなら、バグ 報告出そう(状況が進まないので)
Slide 29
Slide 29 text
“ まとめ
Slide 30
Slide 30 text
Knowledge ▷ テストで油断しない ○ iOSのマイナーバージョンアップ動作確認 ○ 実機デバイス毎の動作確認 ▷ 公式情報を頻繁にチェック ○ 公式ガイド類 ○ Apple Developer Forums ▷ Appleを過信しない ○ Sandbox環境の不安定さ ○ 調べても解決せず、実装も間違ってなさそうなら、バグの可能性 つまり、当たり前のことをちゃんとやるのが大事 ...
Slide 31
Slide 31 text
“ - PR -
Slide 32
Slide 32 text
One more thing... ▷ エンジニア絶賛募集中!(仙台でも) ○ 仙台では珍しい自社サービス ○ サーバサイド/Android/iOS ○ http://www.videomarket.co.jp/recruit/engineer/
Slide 33
Slide 33 text
ご清聴ありがとうございました 2017/12/26 SWWDC #34 asmz