アプリ開発¶
このガイドでは、Hive SDKを使用してアプリを開発する手順を説明します。 Hive SDKは、認証、支払い、プッシュ通知、広告バナー、顧客データ分析などのさまざまな機能を提供します。このガイドでは、最も基本的な機能である認証と支払いの実装に焦点を当てます。
Note
Hive SDKは、さまざまな開発エンジン(Android Native、iOS Native、Unity、Unreal Engineなど)をサポートしています。このガイドでは、各開発エンジンを使用してアプリを開発、ビルド、リリースすることにすでに慣れていることを前提としており、Hive SDKの使用方法に焦点を当てます。各開発エンジンのアプリを開発、ビルド、リリースする詳細については、それぞれの開発者センターとドキュメントを参照してください。
アプリ開発におけるHive SDKの使用全体のプロセスは、以下のように要約できます:
- Hive SDKの初期化を実装する
- 認証を実装する
- 支払いを実装する
認証の実装には以下が含まれます:
- ログインの実装
- ログイントークンの検証の実装
支払いの実装には以下が含まれます:
- 支払い初期化の実装
- 商品リスト取得の実装
- 商品購入の実装
- 購入領収書検証の実装
Hive SDK 実装フロー¶
Hive SDKを使用してアプリ機能を開発する一般的な実装フローの概要は次のとおりです。
Hive SDKの初期化を実装する¶
Hive SDKを操作するには、まず初期化する必要があります。Hive SDKの初期化には、事前に入力されたHive SDK設定を割り当て、さまざまな準備作業を行うことが含まれます。Hive SDKを初期化するには、AuthV4.setup
を呼び出します。呼び出しが成功すると、次の情報が受信され、アプリ内の適切なタイミングで保存して使用することができます。
Hive 初期化結果情報
フィールド名 | 説明 | 例 |
---|---|---|
isAutoSignIn | 自動サインインが可能かどうか | true |
did | アプリがインストールされたときに生成される識別子 | 123456789 |
providerTypeList | 現在のアプリで利用可能なIdP認証のリスト | ProviderType.HIVEProviderType.GOOGLE |
以下はsetup
メソッドの実装例です。
APIリファレンス: hive.AuthV4.setup
APIリファレンス: AuthV4::setup
// Hive SDKを初期化するリクエスト
AuthV4::setup([=](ResultAPI const & result, bool isAutoSignIn, std::string did, std::vector<ProviderType> const & providerTypeList) {
if (result.isSuccess()) {
// 初期化に成功しました。自動ログインの可用性に基づいてログインを処理します。
} else if (result.needExit()) {
// TODO: アプリ終了機能を実装する
// Cocos2d-xエンジンユーザー
// 例: exit(0);
// Unrealエンジンユーザー
// 例: UKismetSystemLibrary::QuitGame(GetWorld(), nullptr, EQuitPreference::Quit, false);
} else {
// 初期化に失敗しました
}
});
APIリファレンス: com.hive.AuthV4.setup
// Hive SDKを初期化するリクエスト
AuthV4.setup(object: AuthV4.AuthV4SetupListener{
override fun onAuthV4Setup(result: ResultAPI, isAutoSignIn: Boolean, did: String?, providerTypeList: ArrayList<AuthV4.ProviderType>?) {
if (result.isSuccess) {
// 初期化に成功しました。自動ログインの可用性に基づいてログインを処理します。
} else if (result.needExit()) {
// TODO: アプリ終了機能を実装する
// 例: exitProcess(0)
} else {
// 初期化に失敗しました
}
}
})
APIリファレンス: com.hive.AuthV4.setup
// Hive SDKを初期化するリクエスト
AuthV4.setup(new AuthV4.AuthV4SetupListener() {
@Override
public void onAuthV4Setup(ResultAPI result, boolean isAutoSignIn, String did, ArrayList<AuthV4.ProviderType> providerTypeList) {
if (result.isSuccess()) {
// 初期化に成功しました。自動ログインの可用性に基づいてログインを処理します。
} else if (result.needExit()) {
// TODO: アプリ終了機能を実装します。
// 例: System.exit(0);
} else {
// 初期化に失敗しました。
}
}
});
APIリファレンス: HIVEAuthV4:setup
APIリファレンス: HIVEAuthV4:setup
// Hive SDKを初期化するリクエスト
[HIVEAuthV4 setup:^(HIVEResultAPI *result, BOOL isAutoSignIn, NSString *did, NSArray<NSNumber *> *providerTypeList) {
if (result.isSuccess) {
// 初期化に成功しました。自動ログインの可用性に基づいてログインを処理します。
} else if (result.needExit) {
// TODO: アプリ終了機能を実装する
// 例: exit(0);
} else {
// 初期化に失敗しました
}
}];
Info
詳細については、Hive 初期化ガイドを参照してください。
認証の実装¶
アプリのユーザーは、Hive メンバーシップアカウントだけでなく、GoogleやFacebookなどのさまざまなIDプロバイダー(IdP)アカウントを使用してアプリにログインできます。ログインを実装する際、ユーザーはアプリにログインするための好みのIdPアカウントを選択し、アプリアカウントをIdPアカウントにリンクできます。提供されるIdPの種類はアプリによって異なるように構成でき、Hive プラットフォームは、ユーザーの国情報に基づいて適切なIdPをユーザーに公開します。
まず、Hive コンソールで IdP 設定を構成します。
- IdPによって提供されたキー値を保存します
- アプリセンター > AppIDを管理 > アプリを検索してクリック > AppIDタブをクリック > アプリのAppIDをクリック > ログインでIdPの使用を有効にします
Info
詳細については、Hive コンソール認証ガイドを参照してください。
ログイン実装¶
コンソール設定が完了したら、Hive SDKを使用してログインUIを実装します。以下は、SDKが提供するUIを使用した例です。
APIリファレンス: hive.AuthV4.showSignIn
// Hive SDK AuthV4 認証 UI リクエスト
AuthV4.showSignIn((ResultAPI result, AuthV4.PlayerInfo playerInfo)=>{
if (result.isSuccess()) {
// 認証成功
// playerInfo: 認証されたユーザー情報
// メール情報を取得する例
foreach (KeyValuePair<AuthV4.ProviderType, AuthV4.ProviderInfo> entry in playerInfo.providerInfoData) {
AuthV4.ProviderInfo providerInfo = entry.Value;
if(providerInfo.providerEmail != null && providerInfo.providerEmail != "") {
string email = providerInfo.providerEmail;
break;
}
}
}
else if (result.needExit()) {
// TODO: Implement the app exit function
// e.g., Application.Quit();
}
});
APIリファレンス: AuthV4::showSignIn
// Hive SDK AuthV4 authentication UI request
AuthV4::showSignIn([=](ResultAPI const & result, PlayerInfo const & playerInfo) {
if (result.isSuccess()) {
// 認証成功
// playerInfo: 認証されたユーザー情報
// メール情報を取得する例
for(auto it = playerInfo.providerInfoData.begin(); it != playerInfo.providerInfoData.end(); ++it) {
hive::ProviderInfo providerInfo = it->second;
if(!providerInfo.providerEmail.empty()) {
std::string email = providerInfo.providerEmail;
break;
}
}
}
else if (result.needExit()) {
// TODO: アプリの終了機能を実装する
// Cocos2d-xエンジンユーザー
// 例: exit(0);
// Unrealエンジンユーザー
// 例: UKismetSystemLibrary::QuitGame(GetWorld(), nullptr, EQuitPreference::Quit, false);
}
});
APIリファレンス: com.hive.AuthV4.showSignIn
// Hive SDK AuthV4 認証 UI リクエスト
AuthV4.showSignIn(object : AuthV4.AuthV4SignInListener {
override fun onAuthV4SignIn(result: ResultAPI, playerInfo: AuthV4.PlayerInfo?) {
if (result.isSuccess) {
// 認証成功
// playerInfo: 認証されたユーザー情報
// メール情報を取得する例
playerInfo?.let {
for ((key, value) in it.providerInfoData) {
var providerInfo: AuthV4.ProviderInfo = value
if(providerInfo.providerEmail.isNotEmpty()) {
val email = providerInfo.providerEmail
break
}
}
}
} else if (result.needExit()) {
// TODO: アプリ終了機能を実装する
// 例: exitProcess(0)
}
}
})
APIリファレンス: com.hive.AuthV4.showSignIn
// Hive SDK AuthV4 認証 UI リクエスト
AuthV4.showSignIn(new AuthV4.AuthV4SignInListener() {
@Override
public void onAuthV4SignIn(ResultAPI result, AuthV4.PlayerInfo playerInfo) {
if (result.isSuccess()) {
// 認証成功
// playerInfo: 認証されたユーザー情報
// メール情報を取得する例
if(playerInfo != null) {
for (Map.Entry<AuthV4.ProviderType, AuthV4.ProviderInfo> entry : playerInfo.getProviderInfoData().entrySet()) {
AuthV4.ProviderInfo providerInfo = entry.getValue();
if (providerInfo.getProviderEmail() != "") {
String email = providerInfo.getProviderEmail();
break;
}
}
}
}
else if (result.needExit()) {
// TODO: アプリ終了機能を実装する
// 例: System.exit(0);
}
}
});
APIリファレンス: HIVEAuthV4:showSignIn
var email = String()
// Request Hive SDK AuthV4 authentication UI
AuthV4Interface.showSignIn { (result, playerInfo) in
if result.isSuccess() {
// 認証成功
// playerInfo: 認証されたユーザー情報
// メール情報を取得する例
if let playerInfo = playerInfo {
// providerEmail(現在ログイン中のプロバイダー)でproviderInfoを検索
for key in playerInfo.providerInfoData.keys {
if let providerInfo = playerInfo.providerInfoData[key],
providerInfo.providerEmail.count > 0 {
// providerEmail != ""
email = providerInfo.providerEmail
break
}
}
}
} else if result.needExit() {
// TODO: アプリ終了機能を実装する
// 例: exit(0)
}
}
APIリファレンス: HIVEAuthV4:showSignIn
__block NSString* email = @"";
// Request Hive SDK AuthV4 authentication UI
[HIVEAuthV4 showSignIn:^(HIVEResultAPI *result, HIVEPlayerInfo *playerInfo) {
if([result isSuccess]){
// Authentication successful
// playerInfo: authenticated user information
// Example of retrieving email information
if(playerInfo != nil) {
// Search for providerInfo with providerEmail (currently logged-in provider)
for (NSString* key in playerInfo.providerInfoData.allKeys) {
HIVEProviderInfo* providerInfo = playerInfo.providerInfoData[key];
if (providerInfo != nil && providerInfo.providerEmail.length > 0) {
// providerEmail != ""
email = providerInfo.providerEmail;
break;
}
}
}
} else if ([result needExit]) {
// TODO: Implement app exit functionality
// e.g., exit(0);
}
}];
<
既存の認証トークンキーがある場合、ユーザーはアプリに自動的にログインできます。Hive SDK初期化レスポンスから受け取ったisAutoSignIn
がtrue
の場合、上記のようにログインUIを使用せずに自動的にログインできます。以下は、自動ログインを呼び出す例です。
APIリファレンス: hive.AuthV4.Helper.signIn
// Hive SDK サインインを試みています
AuthV4.Helper.signIn (delegate (ResultAPI result, AuthV4.PlayerInfo playerInfo) {
if (result.isSuccess()) {
// ログイン成功
} else if (result.needExit()) {
// TODO: アプリ終了機能を実装する
// 例: Application.Quit();
} else {
switch (result.code) {
case ResultAPI.Code.AuthV4ConflictPlayer:
// アカウントの競合
break;
case ResultAPI.Code.AuthV4HelperImplifiedLoginFail:
// 暗黙のログイン失敗
// 例) AuthV4.showSignIn(...);
break;
default:
// その他の例外的な状況
break;
}
}
});
APIリファレンス: Auth4::signIn
// Attempting Hive SDK signIn
AuthV4::Helper::signIn([=](ResultAPI const & result, std::shared_ptr playerInfo) {
if (result.isSuccess()) {
// ログイン成功
} else if (result.needExit()) {
// TODO: アプリ終了機能を実装する
// Cocos2d-xエンジンユーザー
// 例: exit(0);
// Unrealエンジンユーザー
// 例: UKismetSystemLibrary::QuitGame(GetWorld(), nullptr, EQuitPreference::Quit, false);
} else {
switch (result.code) {
case ResultAPI::AuthV4ConflictPlayer:
// アカウントの競合
break;
case ResultAPI::AuthV4HelperImplifiedLoginFail:
// 暗黙のログインに失敗しました
// 例) AuthV4.showSignIn(...);
break;
default:
break;
}
}
});
APIリファレンス: com.hive.Auth4.Helper.signIn
// Hive SDK サインインを試みています
AuthV4.Helper.signIn(object : AuthV4.Helper.AuthV4HelperListener {
override fun onAuthV4Helper(result: ResultAPI, playerInfo: AuthV4.PlayerInfo?) {
if (result.isSuccess) {
// ログイン成功
} else if (result.needExit()) {
// TODO: アプリ終了機能を実装する
// 例: exitProcess(0)
} else {
when (result.code) {
ResultAPI.Code.AuthV4ConflictPlayer -> {
// アカウントの競合
}
ResultAPI.Code.AuthV4HelperImplifiedLoginFail -> {
// 暗黙のログインに失敗しました
// 例) AuthV4.showSignIn(...);
}
else -> {
// その他の例外的な状況
}
}
}
}
})
APIリファレンス: Auth4::signIn
// Hive SDKを使用してサインインを試みる
AuthV4.Helper.signIn(new AuthV4.Helper.AuthV4HelperListener() {
@Override
public void onAuthV4Helper(ResultAPI result, AuthV4.PlayerInfo playerInfo) {
if (result.isSuccess()) {
// 成功したログイン
} else if (result.needExit()) {
// TODO: アプリ終了機能を実装する
// 例: System.exit(0);
} else {
switch (result.code) {
case AuthV4ConflictPlayer:
// アカウントの競合
break;
case AuthV4HelperImplifiedLoginFail:
// 暗黙のログインに失敗しました
// 例: AuthV4.showSignIn(...);
break;
default:
// その他の例外的な状況
break;
}
}
}
APIリファレンス: HIVEAuth4:signIn
// Hive SDKを使用してサインインを試みる
AuthV4Interface.helper().signIn() { (result, playerInfo) in
if result.isSuccess() {
// 成功したログイン
}
else if result.needExit() {
// TODO: アプリ終了機能を実装する
// 例: exit(0)
}
else {
switch result.getCode() {
case .authV4ConflictPlayer:
// アカウントの競合
case .authV4HelperImplifiedLoginFail:
// 暗黙のログイン失敗
// 例: AuthV4Interface.showSignIn() { (result, playerInfo)
// // 何かをする...
// }
default:
// その他の例外的な状況
break
}
}
}
APIリファレンス: HIVEAuth4:signIn
// Hive SDKを使用してサインインを試みる
[[HIVEAuthV4 helper] signIn:^(HIVEResultAPI *result, HIVEPlayerInfo *playerInfo) {
if (result.isSuccess) {
// ログイン成功
}
else if (result.needExit) {
// TODO: アプリ終了機能を実装する
// 例: exit(0);
}
else {
switch (result.code) {
case kAuthV4ConflictPlayer:
// アカウントの競合
break;
case kAuthV4HelperImplifiedLoginFail:
// 暗黙のログインに失敗しました
// 例: [HIVEAuthV4 showSignIn:^(HIVEResultAPI *result, HIVEPlayerInfo *playerInfo) {
// // 何かをする...
// }];
break;
default:
// その他の例外的な状況
break;
}
}
}];
さらに、私たちは、ユーザーがHive UIを使用せずにアプリ内で独自のログインUIを実装できるカスタマイズ機能や、ユーザーがIdPを選択せずにゲストとしてアプリを使用できるゲストログイン機能をサポートしています。
Info
詳細については、Login/Logoutを参照してください。
ログイントークンの検証¶
アカウントの盗難やハッキングなどのセキュリティインシデントを防ぐために、ユーザーがログインした後にログイントークンの検証を行う必要があります。トークン、PlayerID、および成功したログイン後に返されるDIDを使用して、アプリサーバーはログインしているユーザーのトークンキーが有効かどうかを検証できます。ログイントークンの検証は、Hive サーバーAPI > Auth v4 Verify Token APIを呼び出すことによって実行されます。
Hive SDKはデフォルトでアプリアカウントの重複ログインを許可します。したがって、複数のデバイスで1つのアカウントにログインすると、ログイン時に生成されたセッションキーはすべてのデバイスで維持されます。アプリで重複ログインを許可したくない場合は、1つのPlayerIdに対して1つのセッションキーのみが一致するように実装する必要があります(つまり、1つのデバイスのみがアプリサーバーに接続されている状態です)。
Info
詳細については、サインイントークンキーの確認を参照してください。
支払いの実装¶
Hive SDKのアプリ内アイテム販売および支払い機能は、Hive SDKの請求モジュール、Hive IAP v4を使用して実装されています。Hive IAP v4は、アイテム購入の領収書確認、重複アイテムの支払いチェック、支払いログの送信など、開発時間を短縮し、市場の変化に迅速に対応する支払い機能を提供します。
Info
詳細については、こちらを参照してください。
Hive SDKの支払い機能を使用するには、まずアプリ市場(Google Play)コンソールおよびHiveコンソールで販売するアイテムの製品情報を登録する必要があります。
Info
詳細情報については、それぞれのアプリ市場のドキュメントおよびHiveコンソールガイドの請求を参照してください。
課金の初期化¶
アプリマーケットコンソールとHiveコンソールに商品情報を登録した後、アプリが起動したときにHive IAP v4を使用するためにHive IAP v4初期化コードを実行する必要があります。Hive IAP v4初期化をリクエストすると、アプリクライアントから利用可能なマーケット情報が結果として返されます。以下はHive IAP v4を初期化するためのサンプルコードです。
APIリファレンス: hive.IAPV4.marketConnect
APIリファレンス: IAPV4::marketConnect
APIリファレンス: IAPV4.marketConnect
APIリファレンス: com.hive.IAPV4.marketConnect
API リファレンス: IAPV4Interface.marketConnect
APIリファレンス: HIVEIAPV4::marketConnect
Info
詳細については、IAP初期化を参照してください。
商品リスト取得の実装¶
ユーザーがアプリ内アイテムストアに入ると、販売中のアイテムのリストを表示する必要があります。これを行うために、製品リストクエリを実装してください。以下は、製品リストをリクエストするための例コードです。
APIリファレンス: hive.IAPV4.getProductInfo
APIリファレンス: IAPV4::getProductInfo
APIリファレンス: IAPV4.getProductInfo
APIリファレンス: com.hive.IAPV4.getProductInfo
APIリファレンス: IAPV4Interface.getProductInfo
APIリファレンス: HIVEIAPV4::getProductInfo
<
製品リストクエリを実行すると、結果はIAPV4Product
クラスの製品リスト情報を返します。製品情報には、アイテム購入リクエストに使用されるmarketPid
と、通貨記号と価格の組み合わせであるdisplayPrice
(例:$0.99)が含まれます。
Info
詳細については、製品リストの取得を参照してください。
商品購入を実装する¶
ユーザーがアプリストアに入って販売中のアイテムのリストを確認すると、特定のアイテムを選択して購入できます。これを行うには、IAPV4クラスのpurchase
メソッドを呼び出し、製品IDに対応するmarketPid
をパラメータとして渡し、アプリマーケットにアイテム購入を完了するよう要求する必要があります。以下は、製品購入をリクエストするための例コードです。
APIリファレンス: hive.IAPV4.purchase
API リファレンス: IAPV4::purchase
#include <HIVE_SDK_Plugin/HIVE_CPP.h>
using namespace std;
using namespace hive;
string marketPid = "{YOUR_PRODUCT_MARKET_PID}";
string iapPayload = "{YOUR_CUSTOM_PAYLOAD}";
IAPV4::purchase(marketPid, iapPayload, [=](ResultAPI const & result, IAPV4Receipt const & receipt) {
if (result.isSuccess()) {
// TODO: 受け取ったレシートでレシートの検証をリクエストする
}
});
APIリファレンス: com.hive.IAPV4.purchase
import com.hive.IAPV4
import com.hive.ResultAPI
val marketPid = "{YOUR_PRODUCT_MARKET_PID}"
val iapPayload = "{YOUR_CUSTOM_PAYLOAD}"
IAPV4.purchase(marketPid, iapPayload, object : IAPV4.IAPV4PurchaseListener {
override fun onIAPV4Purchase(result: ResultAPI, iapV4Receipt: IAPV4.IAPV4Receipt?) {
if (result.isSuccess) {
// 成功を呼び出す
}
}
})
API リファレンス: com.hive.IAPV4.purchase
APIリファレンス: HIVEIAPV4::purchase:additionalInfo:handler:
API リファレンス: HIVEIAPV4::purchase:additionalInfo:handler:
#import <HIVEService/HIVEService-Swift.h>
NSString *marketPid = @"{YOUR_PRODUCT_MARKET_PID}";
NSString *iapPayload = @"{YOUR_CUSTOM_PAYLOAD}";
[HIVEIAPV4 購入: marketPid iapPayload: iapPayload handler: ^(HIVEResultAPI *result, HIVEIAPV4Receipt *receipt) {
if ([result isSuccess]) {
// TODO: 受け取ったレシートでレシートの検証を要求する
}
}];
<
製品購入機能を実装する前に、購入メタデータ(iapPayload)を事前に定義できます。 iapPayload
は、アプリ開発者が望む形式で定義された情報です。これを使用して、支払いシステムを悪用するユーザー情報を分析したり、支払いが行われたが購入中のエラーによりアイテムが配信されなかった状況を解決できます。
受領書の実装を確認する¶
製品購入をリクエストするコードを実行した後、ユーザーがアプリマーケットで支払いを完了すると、Hive SDKは購入レシートをアプリクライアントに送信します。あなたのアプリサーバーは、このレシートをアプリクライアントから受け取り、Hive サーバーAPIを使用してレシートの有効性を確認する必要があります。レシートを確認した後、アプリサーバーはユーザーにアイテムを直接提供する必要があります。
レシート検証APIは、アプリ内で購入した商品のレシートを検証し、レシートの有効性の結果を返します。レスポンス内のhiveiap_transaction_id
は各レシートに対して発行されるユニークIDであるため、この値をアプリサーバーに保存し、アイテムを提供する前に重複レシートを確認する必要があります。
Info
詳細については、領収書の確認を参照してください。