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