應用程式開發¶
本指南概述了使用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
// Request to initialize Hive SDK
AuthV4.setup ((ResultAPI result, Boolean isAutoSignIn, String did, List providerTypeList) => {
if (result.isSuccess()) {
// Initialization succeeded. Handle login based on the auto-login availability.
} else if (result.needExit()) {
// TODO: Implement app exit functionality
// e.g., Application.Quit();
} else {
// Initialization failed
}
});
API 參考: AuthV4::setup
// Request to initialize 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
AuthV4Interface.setup { (result, isAutoSignIn, did, providerTypeList) in
if result.isSuccess() {
// Initialization succeeded. Handle login based on the auto-login availability.
} else if result.needExit() {
// TODO: Implement app exit functionality
// e.g., exit(0)
} else {
// Initialization failed
}
}
API 參考: HIVEAuthV4:setup
// Request to initialize Hive SDK
[HIVEAuthV4 setup:^(HIVEResultAPI *result, BOOL isAutoSignIn, NSString *did, NSArray<NSNumber *> *providerTypeList) {
if (result.isSuccess) {
// Initialization succeeded. Handle login based on the auto-login availability.
} else if (result.needExit) {
// TODO: Implement app exit functionality
// e.g., exit(0);
} else {
// Initialization failed
}
}];
Info
有關更多詳細資訊,請參閱Hive 初始化指南。
認證實作¶
應用程式用戶不僅可以使用他們的 Hive 會員帳戶登錄應用程式,還可以使用各種身份提供者 (IdP) 帳戶,例如 Google 和 Facebook。在實施登錄時,用戶可以選擇他們首選的 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 認證 UI 請求
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 authentication UI request
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 -> {
// 隱式登入失敗
// ex) 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: 實作應用程式退出功能
// e.g., System.exit(0);
} else {
switch (result.code) {
case AuthV4ConflictPlayer:
// 帳號衝突
break;
case AuthV4HelperImplifiedLoginFail:
// 隱式登入失敗
// e.g., 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: 實現應用程式退出功能
// e.g., exit(0);
}
else {
switch (result.code) {
case kAuthV4ConflictPlayer:
// 帳戶衝突
break;
case kAuthV4HelperImplifiedLoginFail:
// 隱式登入失敗
// e.g., [HIVEAuthV4 showSignIn:^(HIVEResultAPI *result, HIVEPlayerInfo *playerInfo) {
// // 做一些事情...
// }];
break;
default:
// 其他異常情況
break;
}
}
}];
此外,我們支持自定義功能,允許用戶在他們的應用中實現自己的登錄 UI,而不使用 Hive UI,以及允許用戶作為訪客使用應用而不選擇 IdP 的訪客登錄功能。
Info
有關更多詳細信息,請參閱 Login/Logout。
驗證登錄令牌¶
為了防止帳戶盜竊或駭客攻擊等安全事件,您必須在用戶登錄後執行登錄令牌驗證。使用成功登錄後返回的令牌、PlayerID 和 DID,您的應用伺服器可以驗證登錄用戶的令牌密鑰是否有效。驗證登錄令牌 是通過調用Hive 伺服器 API > Auth v4 驗證令牌 API來執行的。
<
Hive SDK 默认允许应用账户的重复登录。因此,如果您在多个设备上使用一个账户登录,则在登录时生成的会话密钥会在所有设备上保持。如果您不希望在应用中允许重复登录,您必须实现使得只有一个会话密钥与一个 PlayerId 匹配(即,只有一个设备连接到应用服务器)。
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
```kotlin import com.hive.IAPV4
import com.hive.ResultAPI
IAPV4.getProductInfo(object : IAPV4.IAPV4ProductInfoListener {
override fun onIAPV4ProductInfo(result: ResultAPI, iapV4ProductList: ArrayList
if (result.isSuccess) {
// 呼叫成功
}
}
})
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: Request receipt verification with the received receipt
}
});
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) {
// Call successful
}
}
})
API 參考: com.hive.IAPV4.purchase
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
有關更多詳細信息,請參閱 驗證收據。