Unity
アプリ内課金
IAP
itemstore

itemstoreを使ってアプリ内課金を簡単に実装する方法<実装:Unity編>

More than 1 year has passed since last update.

itemstore(アイテムストア)は、Android、iOSアプリにアプリ内課金を簡単に実装できるサービスです。
面倒なアプリ内課金処理をシンプルなソースコードで実現でき、販売アイテムの表示・非表示等の管理をitemstoreの画面上から簡単に行うことができます。

利用にあたってのおおまかな流れは次のとおりです。

【STEP1】 デベロッパーサイトでの設定
【STEP2】 ストアの設定
【STEP3】 実装

今回は、「【STEP3】 実装:Unity編」についてまとめたいと思います。

概要

動作環境

Android

・Android4.0以降(APIレベル14)

iOS

・iOS7.0以降(iOS Version 6.0以降でも動作する可能性はありますが、サポート対象外となっております。)
・iPhone4以降の端末
・64bit対応
・Xcode7以降

注意:Unity Pluginの機能は、Unity内のGameウィンドウでは確認できません。Android/iOSともに実機での確認をお願いします。

開発環境

Unity v4.6.2で動作確認をおこなっております。

Pluginのインポート

メニューの [Assets[ -> [Imort Package[ -> [Custom Package…] を選択

ダウンロードしたUnity Pluginを選択し、[開く]をクリック

全て選択した状態で[Import]をクリック

Pluginがインポートされます。

ビルド設定

Android

Plugins/Android/AndroidManifest.xml内のパッケージ名を適宜設定し、ビルドしてください。

iOS

UnityからXcodeプロジェクトを出力したあとに、
General -> Linked Frameworks and Librariesの[+]を押下して、
  ・CoreTelephony.framework
  ・StoreKit.framework
の2つのフレームワークを追加してください。

appCUnity.mmにて、「#import "iPhone_target_Prefix.pch"」にエラーが表示された場合、『#import "Prefix.pch"』に置き換えてください。(Unity Plugin v1.1.3以降は対応済み)

Unity v5.0.0以降に必要な対応

Unity v5.0.0以降で出力したXcodeプロジェクトでは、以下の箇所の修正を行ってください。

Build Phases -> Compile Sources -> appCUnity.mm をダブルクリックし、
-fno-objc-arc を追加。

itemstoreオブジェクトの配置

itemstore機能を利用したいシーンに[AppC]プレハブを配置、または[AppC.cs]を任意のGameObjectにアタッチします。AppCオブジェクトを配置したシーンでプラグインの初期化が行われます。

※アプリ起動直後に実行されるシーンに配置することを推奨します。
※AppCオブジェクトを配置するシーンは1つのみとしてください。

Inspectorの設定

AppCオブジェクトのInspectorに必要な情報を設定します。

Media Key(必須)

itemstore上で作成したAndroidストアまたはiOSストアのメディアキーを設定します。

On API(必須)

Item Sotre API
 itemstoreのアプリ課金機能を利用する場合はチェックします。
Push API
 プッシュ通知機能を利用する場合はチェックします。

Send CallBack Target(任意)

Pluginの初期化が完了したタイミングを検知したい場合は、初期化完了のコールバックを受け取りたいオブジェクトをここに設定します。コールバックを受け取るには、設定したオブジェクトにアタッチするスクリプト内で次のメソッドを実装してください。

public void FinishedSetupAppC (bool b)
パラメーター
 b  初期化完了の成功/失敗

プッシュが配信された際の機能を実装するには、AppCオブジェクトのSend CallBack Targetに設定したオブジェクトにアタッチされるスクリプト内で次のメソッドを実装してください。

public void PushParameter (string str)
パラメーター
 str プッシュ配信で設定した配信テキスト(カスタムパラメータ)

itemstore課金機能

サンプルコード

itemstore課金機能
// appC SDK初期化完了のコールバックを受け取る
/*
 * Callback Target Objectを設定している場合は、
 * 設定したGameObjectにアタッチしているスクリプトファイルに以下を記述することで
 * 初期化完了のコールバックを受け取ることができます
 */
public void FinishedSetupAppC (bool b)
{
    Debug.Log ("AppC Initialize " + (b ? "Succeed!" : "Failure..."));
}

// Androidでアプリ終了の機能を実装している場合はPluginDestroyを呼び出してください。(Androidのみ)
AppC.PluginDestroy ();

// お問合せキーを取得する
string inquiryKey = AppC.GetInquiryKey ();

// itemstoreビューを開く
AppC.ItemStore.OpenItemStoreView ();

// 課金アイテムのグループ名を取得
// 第一引数に、[itemstore管理画面] -> [アプリ管理] -> [アイテム管理] で設定したグループIDを設定してください
string groupName = AppC.ItemStore.GetGroupName ("グループID");

// 課金アイテムの所持数を10個に設定
// 第一引数に、[itemstore管理画面] -> [アプリ管理] -> [アイテム管理] で設定したグループIDを設定してください
// 第二引数に、セットしたい所持数を設定してください
AppC.ItemStore.SetItemCount ("グループID", 10);

// 課金アイテムの所持数を5個増やす
// 第一引数に、[itemstore管理画面] -> [アプリ管理] -> [アイテム管理] で設定したグループIDを設定してください
// 第二引数に、増やしたいアイテム数を設定してください
AppC.ItemStore.AddItemCount ("グループID", 5);

// 課金アイテムの所持数を1個減らす
// 第一引数に、[itemstore管理画面] -> [アプリ管理] -> [アイテム管理] で設定したグループIDを設定してください
// 第二引数に、負の値を設定しますとアイテム所持数を減らすことができます
AppC.ItemStore.AddItemCount ("グループID", -1);

// 課金アイテムの所持数を取得
// 第一引数に、[itemstore管理画面] -> [アプリ管理] -> [アイテム管理] で設定したグループIDを設定してください
int itemCount = AppC.ItemStore.GetItemCount ("グループID");

AndroidManifest.xmlの設定

Androidアプリを生成する場合は、Plugins/Android/AndroidManifest.xml内の[パッケージ名]を適宜設定してください。
以下AndroidManifest.xmlの雛形です。必要に応じてご使用ください。

AndroidManifest.xmlの設定
<?xml version="1.0" encoding="utf-8"?>
<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    package="[パッケージ名]"
    android:installLocation="preferExternal"
    android:versionCode="1"
    android:versionName="1.0">

    <supports-screens
        android:smallScreens="true"
        android:normalScreens="true"
        android:largeScreens="true"
        android:xlargeScreens="true"
        android:anyDensity="true"/>

    <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="21" />

    <!-- require AppC -->
    <uses-permission android:name="android.permission.INTERNET" />

    <!-- require itemstore(アイテムストア) -->
    <uses-permission android:name="com.android.vending.BILLING" /> 

    <application
        android:allowBackup="true"
        android:icon="@drawable/app_icon"
        android:label="@string/app_name">
        <activity
            android:label="@string/app_name" 
            android:screenOrientation="portrait" 
            android:launchMode="singleTask" 
            android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale" 
            android:name="com.unity3d.player.UnityPlayerNativeActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <!-- require itemstore Start -->
        <activity
            android:name="net.app_c.sdk.AppCItemStoreActivity"
            android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|uiMode|touchscreen"
            android:theme="@android:style/Theme.Translucent.NoTitleBar" >
        </activity>
        <!-- require itemstore End -->

    </application>
</manifest>

プッシュ通知機能

サンプルコード

プッシュ通知機能
// appC SDK初期化完了のコールバックを受け取る
/*
 * Callback Target Objectを設定している場合は、
 * 設定したGameObjectにアタッチしているスクリプトファイルに以下を記述することで
 * 初期化完了のコールバックを受け取ることができます
 */
public void FinishedSetupAppC (bool b)
{
    Debug.Log ("AppC Initialize " + (b ? "Succeed!" : "Failure..."));
}

// プッシュ通知の配信テキスト(カスタムパラメータ)を受け取る
/*
 * Callback Target Objectを設定している場合は、
 * 設定したGameObjectにアタッチしているスクリプトファイルに以下を記述することで
 * プッシュ配信で設定した配信テキスト(カスタムパラメータ)を取得することができます
 */
public void PushParameter (string str)
{
    Debug.Log ("PushParameter:" + str);
}

// Androidでアプリ終了の機能を実装している場合はPluginDestroyを呼び出してください(Androidのみ)
AppC.PluginDestroy ();

// お問合せキーを取得する
string inquiryKey = AppC.GetInquiryKey ();

AndroidManifest.xmlの設定

Androidアプリを生成する場合は、Plugins/Android/AndroidManifest.xml内の[パッケージ名]を適宜設定してください。
以下AndroidManifest.xmlの雛形です。必要に応じてご使用ください。

AndroidManifest.xmlの設定
<?xml version="1.0" encoding="utf-8"?>
<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    package="[パッケージ名]"
    android:installLocation="preferExternal"
    android:versionCode="1"
    android:versionName="1.0">

    <supports-screens
        android:smallScreens="true"
        android:normalScreens="true"
        android:largeScreens="true"
        android:xlargeScreens="true"
        android:anyDensity="true"/>

    <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="21" />

    <!-- require AppC -->
    <uses-permission android:name="android.permission.INTERNET" />

    <!-- require Push Start -->
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.VIBRATE" >
    </uses-permission>
    <uses-permission android:name="[パッケージ名].permission.C2D_MESSAGE" />
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />

    <permission
        android:name="[パッケージ名].permission.C2D_MESSAGE"
        android:protectionLevel="signature" />
    <!-- require Push End -->

    <application
        android:allowBackup="true"
        android:icon="@drawable/app_icon"
        android:label="@string/app_name">
        <activity
            android:label="@string/app_name" 
            android:screenOrientation="portrait" 
            android:launchMode="singleTask" 
            android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale" 
            android:name="com.unity3d.player.UnityPlayerNativeActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <!-- require Push Start -->
        <receiver
            android:name="com.google.android.gcm.GCMBroadcastReceiver"
            android:permission="com.google.android.c2dm.permission.SEND" >
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                <action android:name="com.google.android.c2dm.intent.REGISTRATION" />

                <category android:name="[パッケージ名]" />
            </intent-filter>
        </receiver>

        <service android:name="net.app_c.sdk.AppCPushService" />
        <!-- require Push End -->

    </application>
</manifest>