Edited at

Swift3.0 アプリ内課金 非消耗型の対応を実施する。

More than 1 year has passed since last update.

こんにちは。フリーランス iosエンジニアの永田大祐と申します。よろしくお願いします。:smile:

この記事は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

スクリーンショット 2016-10-28 17.26.34.png

さて本題に入ります。


Swift3.0 アプリ内課金 非消耗型を実装する。

アプリ内課金は4つ種類があります。

消耗型(Consumable)プロダクト。

非消耗型(Non-consumable)プロダクト。

自動更新購読(Auto-renewable subscriptions)。

非更新購読(Non-renewable subscriptions)。

今回は、非消耗型を実際に対応しました。

こちらのアプリを購入していただくと、音声チャットをご利用できます。

SoundChat Bluetoothアプリになります。

スクリーンショット 2016-10-28 16.39.50.png


アプリ内課金の手順

https://developer.apple.com/jp/documentation/StoreKitGuide.pdf 日本語版

こちらを熟読できれば、対応はできると思いますが、審査の際にポイントとなる点をお伝えしたいと思います。(FaceBookでお友達の方は、私の投稿を見ていただける方はご存知の内容です。:sweat:

*以前にstackoverflowマスターの方にAppleリファレンスを見るようにご教授いただき、助かりました。


重要ポイントは、リストア機能 復元機能 Apple審査でリジェクトをいただきました。

こちらを先にご説明した後に、手順を順番にご説明したいと思います。

リストア機能とは!?

ユーザーが購入したタイミングで、アプリがバックグラウンドや、非通信になった場合に支払いだけ行われ、コンテンツが取得できない不具合を回避します。

復元機能とは?

ユーザーが、アプリをアンインストールや違う端末でインストールした際に、購入履歴があれば再度有料コンテンツを再インストールできる機能です。

こちらの機能を実装していないと、リジェクトされます。端末上でどこかに表示する義務もあります。<=実際にこの理由でリジェクトされました。


アプリ内課金の手順


1利用規約の確認

こちらの記事に利用規約に関する情報がございます。最新版は追加項目があるかもしれませんので、よく確認することをお勧めします。

http://qiita.com/sora/items/9f81cf90b25c2a7d3101#3復元リストア機能が実装されているか


2iTunesConnectでプロダクト設定を実施する。

Appleリファレンスから 写真を抜粋

ユーザーはApp Storeのサイトに移動します。 ユーザーが購入するプロダクト(アプリ)を選択して、選択されたアプリがApp Storeに支払いを要求します。

スクリーンショット 2016-10-28 17.02.54.png

このサイクルを実現するために、開発者はiTunesConnectでプロダクト設定をする必要があります。

アプリの申請手順は割愛させていただきます。

TestFlightにて実施する項目がございますので、登録します。

Sandboxテスターにてアプリ内課金を確認するメールアドレスを登録します。

TestFlightのダウンロードしたアプリで、登録したメールアドレスとパスワードを入力して支払い処理を行うと、アプリ内課金のサーバーで内部的にトランザクションが生成され、処理が完了になります。これは無料の処理です。


TestFlightSandboxテスター

スクリーンショット 2016-10-28 23.04.35.png


アプリ内課金の設定 仮のIDです。 ?ボタンで解説があります。

製品IDをプログラムコードで書くIDになります。

この番号が違うと、正常にアプリ課金ができません。

登録後Appleからメールが届きます。

スクリーンショット 2016-10-28 23.05.21.png

スクリーンショット 2016-10-28 23.06.06.png


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アプリになります。


まとめ

非消耗型(Non-consumable)プロダクトを紹介させていただきました。次回にアップデートする際は、openCVやOCRなど取り入れ、別のアプリ内課金を実装したいと思います。その際は、対応を共有できればと思います。

貴重な時間を割き、お読み下さいましてありがとうございました。😀