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

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

この記事は2016/10/28の記事です。　第１８回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](https://qiita-image-store.s3.amazonaws.com/0/131469/d194f53e-8786-b8de-24e8-15f849a054fe.png)




さて本題に入ります。

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

アプリ内課金は４つ種類があります。
消耗型(Consumable)プロダクト。
非消耗型(Non-consumable)プロダクト。
自動更新購読(Auto-renewable subscriptions)。
非更新購読(Non-renewable subscriptions)。

今回は、非消耗型を実際に対応しました。
こちらのアプリを購入していただくと、音声チャットをご利用できます。

[SoundChat Bluetoothアプリになります。] (https://itunes.apple.com/jp/app/soundchat/id1159413780?mt=8)


![スクリーンショット 2016-10-28 16.39.50.png](https://qiita-image-store.s3.amazonaws.com/0/131469/fcd6903d-5a86-30a3-f0b5-dfc011712c9e.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](https://qiita-image-store.s3.amazonaws.com/0/131469/cc1f9d69-05af-f2b2-623c-9214fa605552.png)




このサイクルを実現するために、開発者はiTunesConnectでプロダクト設定をする必要があります。
アプリの申請手順は割愛させていただきます。
TestFlightにて実施する項目がございますので、登録します。
Sandboxテスターにてアプリ内課金を確認するメールアドレスを登録します。
TestFlightのダウンロードしたアプリで、登録したメールアドレスとパスワードを入力して支払い処理を行うと、アプリ内課金のサーバーで内部的にトランザクションが生成され、処理が完了になります。これは無料の処理です。
####TestFlightSandboxテスター
<img width="961" alt="スクリーンショット 2016-10-28 23.04.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/131469/aa3c2044-580b-70c8-69ee-24e4079f63b1.png">





####アプリ内課金の設定　仮のIDです。　?ボタンで解説があります。
製品IDをプログラムコードで書くIDになります。
この番号が違うと、正常にアプリ課金ができません。
登録後Appleからメールが届きます。
<img width="863" alt="スクリーンショット 2016-10-28 23.05.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/131469/d33ad484-b87d-2acb-e26e-3012aa429317.png">
<img width="606" alt="スクリーンショット 2016-10-28 23.06.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/131469/c1ca6a2a-cc6f-37cc-8df9-3fd8694e243b.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アプリになります。] (https://itunes.apple.com/jp/app/soundchat/id1159413780?mt=8)


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