Your SlideShare is downloading. ×
0
20120219i phonedeveloperworkshoppublished
20120219i phonedeveloperworkshoppublished
20120219i phonedeveloperworkshoppublished
20120219i phonedeveloperworkshoppublished
20120219i phonedeveloperworkshoppublished
20120219i phonedeveloperworkshoppublished
20120219i phonedeveloperworkshoppublished
20120219i phonedeveloperworkshoppublished
20120219i phonedeveloperworkshoppublished
20120219i phonedeveloperworkshoppublished
20120219i phonedeveloperworkshoppublished
20120219i phonedeveloperworkshoppublished
20120219i phonedeveloperworkshoppublished
20120219i phonedeveloperworkshoppublished
20120219i phonedeveloperworkshoppublished
20120219i phonedeveloperworkshoppublished
20120219i phonedeveloperworkshoppublished
20120219i phonedeveloperworkshoppublished
20120219i phonedeveloperworkshoppublished
20120219i phonedeveloperworkshoppublished
20120219i phonedeveloperworkshoppublished
20120219i phonedeveloperworkshoppublished
20120219i phonedeveloperworkshoppublished
20120219i phonedeveloperworkshoppublished
20120219i phonedeveloperworkshoppublished
20120219i phonedeveloperworkshoppublished
20120219i phonedeveloperworkshoppublished
20120219i phonedeveloperworkshoppublished
20120219i phonedeveloperworkshoppublished
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

20120219i phonedeveloperworkshoppublished

4,521

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
4,521
On Slideshare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
11
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. StoreKitを使ってマネタイズ計画【再演】 @saku2saku saku2saku at gmail.com
  • 2. なぜStoreKitを使うか?有料アプリの販売じゃダメ? アプリダウンロード数的に厳しい市場 有料と無料を比較した場合その差【約100倍】 ランキングに載らないと認知すらされないのが現実 残り続けるには? デファクトアプリになる プロモーション活動個人開発における有料アプリは難易度が上がり続ける 挑むのであれば無料アプリ内で 課金モデルを確立すること
  • 3. 課金の種類(現実世界)買い切りモデル 制限解除型 コンテンツダウンロード型 一回買ったらコンテンツはユーザのものになる消費アイテムモデル 消費を前提としたアイテム(RPGの強い装備等)定期購読型モデル 月額課金のような定期的にコンテンツを買うモデル
  • 4. 課金の種類 (iTunes Connect上)Non-Consumable 買い切りアイテムモデルConsumable 消費アイテムモデルAuto-Renewable Subscription 定期購読モデル(自動更新)Non-Renewable Subscription 定期購読モデル(非自動更新)Free Subscription iOS5 からのNewsstand用、まだ未知数です(知らないw)
  • 5. 購入履歴の管理についてAppleのサーバに保管される/されないものがあるAppleのサーバに履歴が保管されるもの Non-Consumable Auto-Renewable Subscription自前のサーバに保管する必要のあるもの Consumable Non-Renewable Subscription
  • 6. サンプルアプリ
  • 7. サンプルアプリの概要課金アイテムの一覧取得課金アイテムの購入履歴の表示課金アイテムの購入購入履歴情報の復元扱うアイテムの種別はFree Subscriptionを除く4つ
  • 8. テスト用のアプリの作成iTunes Connect にログイン Developer登録が必須となります 適当にアプリを登録します 別に既にバイナリがある必要はない アプリができたらManage In-App Purchasesを クリック 左上のCreate Newをクリック
  • 9. テスト用のアプリの作成アイテムの課金タイプの選択画面になります 試しに全ての種類の課金アイテムを登録してみると いいと思います課金アイテムの情報を入力します 全ての情報を入力 Add Language ボタンを押すと多言語化対応した アイテムの表示名を登録できます 右下のSaveボタンを押すとアイテムが登録されます
  • 10. テスト用のユーザの作成iTunes Connect にログイン Developer登録が必須となります Manage Usersを選択します Test Userをさらに選択します 左上のAdd New Userをクリック 必要な情報を入力するとAppleからメールがくるので アカウントをアクティベーションします
  • 11. 操作プロジェクトファイルをダウンロード http://workshop.iphonework.biz/files/ 2012/03/20120219iPhoneDevWS_StoreKit.zip zip ファイルを解凍プロジェクトを開きます GlobalSetting.h の ITEM_IDENTIFIER の1∼5を変更します ビルドして実行します StoreKitは「設定」->「一般設定」->「機能制限」->「App内で の購入」がオンになっている状態でないと動作しません 古いiOSシミュレータではシミュレータ内でアプリ課金のテスト は行えないので注意してください
  • 12. 操作Item list を選択 ネットワークアクセスが起こりアイテムの一覧が 表示されるのを確認します トップに戻るBought item list を選択 購入済みアイテムのリストが表示されます この段階ではまだ全て not yet になっています
  • 13. 操作Item list を選択 今度は実際に課金アイテムの購入を行ってみます Consumable と Non-Consumable と Auto-Renewable Subscriptionのアイテムを購入 してみましょうBought item list を選択 購入済みアイテムのリストが表示されます 先程購入したアイテムが bought に変わります
  • 14. 操作購入履歴が復元できるかの確認 先程説明をしましたが、Non-Consumable と Auto-Renewable Subscriptionは購入履歴が Appleによって管理され、情報を取得できます 一旦インストールされたアプリをシミュレータま たは実機から削除し、再度ビルド&実行します再度起動して Bought item list を見ると、全てnot yet となり購入履歴が消えているのがわかります
  • 15. 操作Restore bought item を選択 Apple IDが求められるので以下を入力 先程作成したテストユーザのアカウントで認証します 購入履歴の復元成功のアラートが出る再びトップに戻って Bought item list を選択 一部 bought に変化しているのを確認します bought に変化したのは以下の2つのアイテム Non-Consumable Auto-Renewable Subscription
  • 16. 操作Consumable Item が not yet のままであることを確認します 消費型のアイテムについてはAppleのサーバに残ら ないことがわかります
  • 17. サンプルコードの説明
  • 18. 課金アイテム情報の取得ItemTableViewController - (void)viewDidLoad { ! if ([SKPaymentQueue canMakePayments]) { ・・・・ ! ! ! ! NSSet *itemIdentifiersSet = [NSSet setWithObjects: ! ! ! ! ! ! ! ! ! ITEM_IDENTIFIER_1,ITEM_IDENTIFIER_2, ! ! ! ! ! ! ! ! ! ITEM_IDENTIFIER_3,ITEM_IDENTIFIER_4, ! ! ! ! ! ! ! ! ! ITEM_IDENTIFIER_5, ! ! ! ! ! ! ! ! ! nil]; ! ! SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:itemIdentifiersSet]; ! ! request.delegate = self; ! ! [request start]; ! } else { ! ! UIAlertView *alertView = [[[UIAlertView alloc] init] autorelease]; ・・・ ! ! [alertView show]; ! } }
  • 19. 課金アイテム情報の取得ItemTableViewController リクエスト完了後に呼ばれるデリゲートを実装#pragma mark -#pragma mark SKProductsRequestDelegate- (void) productsRequest:(SKProductsRequest *)request! didReceiveResponse:(SKProductsResponse *)response {! for (SKProduct *product in response.products) {! ! [itemIdentifiers addObject:product];! }! [request autorelease];! [loadingView removeFromSuperview];! [self.tableView reloadData];}
  • 20. 課金アイテムの購入iPhoneDevWS_StoreKitAppDelegateProductBuyingObserver メソッドの実装 observer = [[ProductBuyingObserver alloc] init]; ! [[SKPaymentQueue defaultQueue] addTransactionObserver:observer]; or ! [[SKPaymentQueue defaultQueue] addTransactionObserver: self];
  • 21. 課金アイテムの購入 ItemTableViewCell アイテムの購入処理- (void) pushBuyButton {! LOG_DEBUG(@"buy :%@", itemIdentifier);! SKPayment *payment = [SKPayment paymentWithProductIdentifier:itemIdentifier];! [[SKPaymentQueue defaultQueue] addPayment:payment];}
  • 22. 課金アイテムの購入- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions {! for (SKPaymentTransaction *transaction in transactions) {! ! switch (transaction.transactionState) {! ! ! case SKPaymentTransactionStatePurchasing: !//購入中! ! ! ! break;! ! ! !! ! ! case SKPaymentTransactionStatePurchased: ! //購入完了! ! ! ! break;! ! ! case SKPaymentTransactionStateFailed: ! //購入失敗! ! ! ! break;! ! ! case SKPaymentTransactionStateRestored: ! //リストア完了! ! ! ! break;! ! ! default:! ! ! ! break;! ! }! }}
  • 23. 課金アイテムの復元 RootViewController ProductBuyingObserver デリゲートの設定とメソッドの実装! ! case 2:! ! {! ! ! if ([SKPaymentQueue canMakePayments]) {! ! ! ! [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;! ! ! ! [[SKPaymentQueue defaultQueue] restoreCompletedTransactions];! ! ! } else {! ! ! ! UIAlertView *alertView = [[[UIAlertView alloc] init] autorelease]; ・・・! ! ! ! [alertView show];! ! ! }! ! ! break;! ! }
  • 24. 課金アイテムの復元- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions {! for (SKPaymentTransaction *transaction in transactions) {! ! switch (transaction.transactionState) {! ! ! case SKPaymentTransactionStatePurchasing: !//購入中! ! ! ! break;! ! ! !! ! ! case SKPaymentTransactionStatePurchased: ! //購入完了! ! ! ! break;! ! ! case SKPaymentTransactionStateFailed: ! //購入失敗! ! ! ! break;! ! ! case SKPaymentTransactionStateRestored: ! //リストア完了! ! ! ! break;! ! ! default:! ! ! ! break;! ! }! }}
  • 25. 課金アイテムの復元 復元成功のデリゲート- (void) paymentQueueRestoreCompletedTransactionsFinished: (SKPaymentQueue *) queue {! [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; ・・・! [alertView show];! LOG_DEBUG(@"method called!");} 復元失敗のデリゲート- (void) paymentQueue:(SKPaymentQueue *)queuerestoreCompletedTransactionsFailedWithError:(NSError *) error {! [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; ・・・! [alertView show];! LOG_DEBUG(@"method called!");}
  • 26. その他TIPS
  • 27. レシートデータトランザクションにはレシートデータが含まれており、その「purchase-info」をさらにデコードすることで様々なデータを取得できます { ! "signature" = "AkWUo・・・"; ! "purchase-info" = "ewoJI・・・"; ! "environment" = "Sandbox"; ! "pod" = "100"; ! "signing-status" = "0"; }
  • 28. レシートデータAppleのサーバに保管されないような購入アイテムの記録を取りたい場合にはこのレシートの情報を自分のサーバに保管する必要があります{! "item-id" = "471702051";! "original-transaction-id" = "1000000010942512";! "purchase-date" = "2011-10-23 07:15:02 Etc/GMT";! "product-id" = "com.comitter.sampleapp.sample3";! "transaction-id" = "1000000010942512";! "quantity" = "1";! "original-purchase-date" = "2011-10-23 07:15:02 Etc/GMT";! "bid" = "com.comitter.sample2";! "bvrs" = "1.0";}
  • 29. ご清聴ありがとうございました

×