LoginSignup
12
22

More than 3 years have passed since last update.

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

Last updated at Posted at 2016-10-28

こんにちは。フリーランス 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など取り入れ、別のアプリ内課金を実装したいと思います。その際は、対応を共有できればと思います。
お読み下さいましてありがとうございました。😀

12
22
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
22