こんにちは。フリーランス iosエンジニアの永田大祐と申します。よろしくお願いします。
この記事は2016/10/28の記事です。 第18回Swiftビギナーズ倶楽部勉強会に参加される方には、2016/10にアプリ申請が通ったアプリ内課金Swift3.0のソースコードをプレゼントしたいと思います。
出席しない方でもソースコード欲しい方はこちらにあります。よろしくお願いします。 https://www.piece.cool/products/view/209
こちらは、Swiftビギナーズ倶楽部の運営されている方々がアプリの本を出版しました。おめでとうございます。
https://www.amazon.co.jp/これからつくる-iPhoneアプリ開発入門-~Swiftではじめるプログラミングの第一歩~-Swift3-Xcode8対応/dp/4797387149
さて本題に入ります。
#Swift3.0 アプリ内課金 非消耗型を実装する。
アプリ内課金は4つ種類があります。
消耗型(Consumable)プロダクト。
非消耗型(Non-consumable)プロダクト。
自動更新購読(Auto-renewable subscriptions)。
非更新購読(Non-renewable subscriptions)。
今回は、非消耗型を実際に対応しました。
こちらのアプリを購入していただくと、音声チャットをご利用できます。
[SoundChat Bluetoothアプリになります。] (https://itunes.apple.com/jp/app/soundchat/id1159413780?mt=8)
#アプリ内課金の手順
https://developer.apple.com/jp/documentation/StoreKitGuide.pdf 日本語版
こちらを熟読できれば、対応はできると思いますが、審査の際にポイントとなる点をお伝えしたいと思います。(FaceBookでお友達の方は、私の投稿を見ていただける方はご存知の内容です。)
*以前にstackoverflowマスターの方にAppleリファレンスを見るようにご教授いただき、助かりました。
###重要ポイントは、リストア機能 復元機能 Apple審査でリジェクトをいただきました。
こちらを先にご説明した後に、手順を順番にご説明したいと思います。
リストア機能とは!?
ユーザーが購入したタイミングで、アプリがバックグラウンドや、非通信になった場合に支払いだけ行われ、コンテンツが取得できない不具合を回避します。
復元機能とは?
ユーザーが、アプリをアンインストールや違う端末でインストールした際に、購入履歴があれば再度有料コンテンツを再インストールできる機能です。
こちらの機能を実装していないと、リジェクトされます。端末上でどこかに表示する義務もあります。<=実際にこの理由でリジェクトされました。
#アプリ内課金の手順
###1利用規約の確認
こちらの記事に利用規約に関する情報がございます。最新版は追加項目があるかもしれませんので、よく確認することをお勧めします。
http://qiita.com/sora/items/9f81cf90b25c2a7d3101#3復元リストア機能が実装されているか
###2iTunesConnectでプロダクト設定を実施する。
Appleリファレンスから 写真を抜粋
ユーザーはApp Storeのサイトに移動します。 ユーザーが購入するプロダクト(アプリ)を選択して、選択されたアプリがApp Storeに支払いを要求します。
このサイクルを実現するために、開発者はiTunesConnectでプロダクト設定をする必要があります。
アプリの申請手順は割愛させていただきます。
TestFlightにて実施する項目がございますので、登録します。
Sandboxテスターにてアプリ内課金を確認するメールアドレスを登録します。
TestFlightのダウンロードしたアプリで、登録したメールアドレスとパスワードを入力して支払い処理を行うと、アプリ内課金のサーバーで内部的にトランザクションが生成され、処理が完了になります。これは無料の処理です。
####TestFlightSandboxテスター
####アプリ内課金の設定 仮のIDです。 ?ボタンで解説があります。
製品IDをプログラムコードで書くIDになります。
この番号が違うと、正常にアプリ課金ができません。
登録後Appleからメールが届きます。
#3コードを書く 今回はStoreKitを使用。
1.インポート処理
import StoreKit
2.デリゲート設定 トランザクションのプロトコル設定
class PayViewController: UIViewController,SKProductsRequestDelegate, SKPaymentTransactionObserver {
3.情報を受け取って購入処理を開始する
func productsRequest(_ request: SKProductsRequest,
didReceive response: SKProductsResponse) {
if response.invalidProductIdentifiers.count > 0 {
}
}
4.購入履歴が確認できた場合 *復元処理 Appleの審査項目です。
func paymentQueueRestoreCompletedTransactionsFinished(_ queue: SKPaymentQueue){
}
5.アイテム購入処理 *リストア機能 Appleの審査項目です
func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
case .restored:
SKPaymentQueue.default().finishTransaction(transaction)
}
}
6.購入処理の終了
func paymentQueue(_ queue: SKPaymentQueue, removedTransactions transactions: [SKPaymentTransaction]) {
}
各メソッド内でも仕様により,オリジナルな処理になる部分もあります。各メソッドで調べると詳細な例が多数あると思います。
***アプリ内課金対応による問題や不具合、トラブルに関しては一切責任を負いかねますので、よろしくお願いします***
全体のプログラムソースコードが欲しい方はこちらにあります。よろしくお願いします。
https://www.piece.cool/products/view/209
2016年/10月にアプリ申請通りまして、現在販売中です。
[SoundChat Bluetoothアプリになります。] (https://itunes.apple.com/jp/app/soundchat/id1159413780?mt=8)
#まとめ
非消耗型(Non-consumable)プロダクトを紹介させていただきました。次回にアップデートする際は、openCVやOCRなど取り入れ、別のアプリ内課金を実装したいと思います。その際は、対応を共有できればと思います。
お読み下さいましてありがとうございました。😀