Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
SWWDC 34
Search
asmz
December 27, 2017
Technology
900
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
SWWDC 34
今年ハマったIn App Purchase
Talked at SWWDC #34
asmz
December 27, 2017
More Decks by asmz
See All by asmz
Firebase App Testing Agentで始めるAIベースの柔軟なE2Eテスト
asmz
0
1.5k
モバイルアプリ開発へE2Eテストを導入しよう
asmz
0
320
React Native+Expoで始めるWebフロント開発
asmz
0
820
UIデザインを考える全ての人たちに捧げる Apple Human Interface Guidelinesのススメ
asmz
1
2.9k
Overview of Swift and iOS App development
asmz
0
1.4k
How to get mobile app logs using Firebase Crashlytics
asmz
0
950
OK Google, Deploy the iOS app
asmz
1
1k
Cooperate with Adobe XD, Zeplin and Xcode
asmz
1
3.2k
phpconsen LT
asmz
0
850
Other Decks in Technology
See All in Technology
生成AIのテナント制御とシャドーMCP対策 | AIを"止めずに"、情報を守る
yukun
0
160
20260906 「AWS運用入門」著者が教える、運用業務への生成AI活用入門
masaruogura
0
260
コーディングエージェントでM5Stack系の開発を少し試した時の話 / M5 Japan Tour 2026 Autumn 東京
you
PRO
0
180
リージョンの壁を越える、 ちょっと変わったAWSサービスの話
falken
PRO
1
310
クロスボーダーM&AのValue Upを支えるプロダクト開発。日米チームのハブになったプロダクトエンジニアの実践 / Product Engineering Conference 2026
genda
0
120
プロダクト思考 × 基盤思考を AIで実現する Compound Engineering
tkc66buzz
1
330
Code4Lib JAPANカンファレンス2026 開会挨拶 / Code4Lib JAPAN Conference 2026: Opening Remarks
ykiyota
0
340
Redmine 7.0で私が開発した新機能の狙いと背景
vividtone
1
160
SQL文一行も書けない人事がCortexもろもろを使って人事業務を楽にしてみる
ponponmikankan
1
220
range over func 2年間の軌跡 Issue #56413 はGoのエコシステムをどう変えたか
ryujicre8ive
0
100
アプリログインとWeb認証基盤をつなぐ ASWebAuthenticationSession 作法
shimastripe
1
210
DEFCON34-Write-up_HYCu-MYCu
daikiokazaki
0
150
Featured
See All Featured
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
2.8k
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
4
630
Utilizing Notion as your number one productivity tool
mfonobong
4
590
For a Future-Friendly Web
brad_frost
183
10k
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
380
HDC tutorial
michielstock
2
860
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.8k
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
980
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
570
Context Engineering - Making Every Token Count
addyosmani
9
1.1k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
SEO for Brand Visibility & Recognition
aleyda
0
4.7k
Transcript
今年ハマったIn App Purchase 2017/12/26 SWWDC #34 asmz
Who are you? ▷ Akira Shimizu / asmz(@_asmz) ▷ 株式会社ビデオマーケット
iOSエンジニア ▷ 岩手県陸前高田市出身 ▷ 新卒から12年半東京に勤め、 2016/8より仙台にJターン
Who are you? ▷ 無類のビール好き ◦ 「麦芽系エンジニア」で検索すると前職エンジニアブログ の自分のエントリとか出ます ◦ 思わずドメイン取ってしまった
▪ https://asmz.beer
What are you doing? ▷ 株式会社ビデオマーケットとは? ◦ http://www.videomarket.co.jp/ ◦ 動画配信サービス(e.g.
Netflix, Hulu, etc...)を運営 ◦ 東京本社オフィス(赤坂) ▪ 今は100人くらい? ▪ うちエンジニアは40名くらい ◦ 仙台オフィス ▪ 13名 ▪ うちエンジニア4名
What are you doing? ▷ ビデオマーケット(https://www.videomarket.jp/) ◦ 配信本数は日本最大級(現在19万本) ▪ 自分はiOSアプリ開発担当
▪ 最近、tvOSアプリもリリースされました
“ 2017年の振り返り
Look back on 2017 ▷ 春 ◦ 会社の技術ブログ立ち上げ ◦ 社内勉強会立ち上げ
▷ 夏 ◦ 転職活動 ◦ React Nativeちょっと触る(バイト) ▷ 秋 ◦ In App Purchase実装 ▷ 冬 ◦ iPhoneX対応 ◦ CI導入検討
“ CASE1. iOS11でSandbox課金処理に失敗
Case1 ▷ 事象 ◦ iOS11.0でSandboxユーザで課金処理をしようとして も、AppleID入力画面が繰り返し表示 ◦ 3回くらい繰り返したあと、購入失敗(SKErrorDomain Code=0) ◦
iOS10系だと発生しない ◦ Productionリリース済の別アプリだと発生しない
Case1 ▷ 原因調査 ◦ どうやらこのForumの事象と同じ模様 ▪ https://forums.developer.apple.com/thread/80 560
Case1 ▷ 企画チームと相談 どうします?これ... TestFlightでノーイシューなエビデ ンスが取れればアグリーっす! この時、2017/10/10(JST)...
Case1 ▷ 2017/10/11(JST)、rich降臨 iOS 11.1 beta 2より問題解消!!
Knowledge ▷ 学び ◦ Apple Developer Forums頻繁にチェック ◦ iOSのマイナーバージョンアップでも油断せずに動作 確認
“ CASE2. tvOS実機で課金処理が動作しない
Case2 ▷ 事象 ◦ iOSアプリとtvOSアプリで共通化している課金処理 の、tvOSだけ購入・リストア処理が動作しない ◦ iOS/tvOSどちらも実機での確認
Case2 iOS/tvOS StoreKit Apple SKProductsRequest start() 有効なプロダクトか問い合わせ 回答 回答 (SKProductRequestDelegate経由)
SKPaymentQueueに 支払い要求キュー追加 回答 (SKPaymentTransactionObserver経由) 支払い要求 回答
Case2 iOS/tvOS StoreKit Apple SKProductsRequest start() 有効なプロダクトか問い合わせ 回答 回答 (SKProductRequestDelegate経由)
SKPaymentQueueに 支払い要求キュー追加 回答 (SKPaymentTransactionObserver経由) 支払い要求 回答 ここが受け取れていない!
Case2 ▷ 原因 ◦ In-App PurchaseプログラミングガイドのP15に以下の 記載あり App Storeに問い合わせるには、プロダクト要求オブジェクトを使用します。最初 に、SKProductsRequestのインスタンスを作成し、プロダクトIDのリストで初期
化します。要求オブジェクトへの強い参照を保持してください。そうしないと、要 求が完了しないうちに、システムが割り当て解除してしまうおそれがあります 2015/10/21にガイドに追記された模様
Case2 iOS/tvOS StoreKit Apple SKProductsRequest start() 有効なプロダクトか問い合わせ 回答 回答 (SKProductRequestDelegate経由)
SKPaymentQueueに 支払い要求キュー追加 回答 (SKPaymentTransactionObserver経由) 支払い要求 回答 tvOS実機では、このインスタ ンスが解放されてしまってい る模様
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]; } [注意] ガイドに明記はされていないが、リストアも同様の 処理が必要
Knowledge ▷ 学び ◦ 共通処理だからといって油断せず、実機デバイス毎の 動作確認 ◦ 公式ガイドの更新履歴チェック
“ CASE3.自動更新型アイテム再購読時の挙動
Case3 ▷ 事象 ◦ 自動更新型課金アイテムの購読期間中に再度購読し ようとした時の挙動が、SandboxとProductionで異な る ▪ Sandbox •
←の画面が出つつ、Purchase Successが返却 ▪ Production • ←の画面が出つつ、Purchase Failed(SSErrorDomain Code=16)が返却
Case3 ▷ エラーコード(SSErrorDomain Code=16)でググっても ◦ いまいちしっくりくる回答がない ◦ Forumで上がっているものも、なんか今回の事象と違う ▪ https://forums.developer.apple.com/thread/9050
4 ◦ SSErrorDomainはStoreServices.frameworkのドメイン で、Privateフレームワークなのでそもそも完全に文章化 されてない、とか ▪ http://www.openradar.me/25502597
Case3 ▷ 例によって... ◦ In-App Purchaseプログラミングガイド参照 ユーザーがアプリケーションの復元インタフェースを使用する代わりに購入済み のプロダクトを購入しようとすると、App Storeによって復元トランザクションでは なく正常なトランザクションが作成されます。そのプロダクトについて、ユーザが
二重請求されることはありません。これらのトランザクションは、元のトランザク ションとまったく同じように扱ってください。
Case3 ▷ うーむ、これは...? Appleのバグなの では...?
Case3 ▷ イマココ(未解決) 手探りでログ添付したら「見れな いんで、ちゃんとこの資料の手順 通りログ取れ」って言われたとこ ろ
Knowledge ▷ 学び ◦ Sandboxを過信しない ◦ 調べても解決せず、実装も間違ってなさそうなら、バグ 報告出そう(状況が進まないので)
“ まとめ
Knowledge ▷ テストで油断しない ◦ iOSのマイナーバージョンアップ動作確認 ◦ 実機デバイス毎の動作確認 ▷ 公式情報を頻繁にチェック ◦
公式ガイド類 ◦ Apple Developer Forums ▷ Appleを過信しない ◦ Sandbox環境の不安定さ ◦ 調べても解決せず、実装も間違ってなさそうなら、バグの可能性 つまり、当たり前のことをちゃんとやるのが大事 ...
“ - PR -
One more thing... ▷ エンジニア絶賛募集中!(仙台でも) ◦ 仙台では珍しい自社サービス ◦ サーバサイド/Android/iOS ◦
http://www.videomarket.co.jp/recruit/engineer/
ご清聴ありがとうございました 2017/12/26 SWWDC #34 asmz