# 下载地址
# Android 接入和配置
SDK Zip 文件里 Android 相关的目录
- android 目录下是 Android 的 machbird.gradle 和 gradle.properties 文件,需要加到 Android 项目根目录里
- android/cpp 下是 C++代码,加到 Android 项目的 JNI 代码编译链里
在导出的 android 工程的 build.gradle 文件的最后一行添加以下内容
exit: ⌘↩
apply from: 'machbird.gradle'在导出的 android 工程的 app 目录下 build.gradle 的最后添加以下内容
exit: ⌘↩
android{ packagingOptions { doNotStrip "*/arm64-v8a/libdu.so" doNotStrip "*/armeabi/libdu.so" doNotStrip "*/armeabi-v7a/libdu.so" doNotStrip "*/x86/libdu.so" doNotStrip "*/x86_64/libdu.so" } }在 AndroidManifest.xml 里增加配置参数
exit: ⌘↩
<application> ... <meta-data android:name="com.adjustX.sdk.appToken" android:value="xxxxxxxxxxx" /> <meta-data android:name="io.MachBird.sdk.x.AppKey" android:value="xxxxxxxxxxx" /> <meta-data android:name="FLURRY_API_KEY" android:value="xxxxxxxxxxxxxx" /> . .. </application>解决安卓 9 及以上无法访问 http 的问题,在 AndroidManifest.xml 文件里,appliction 添加 android:usesCleartextTraffic="true"属性
exit: ⌘↩
```<application ... ... android:usesCleartextTraffic="true" >在 JNI_OnLoad 方法里调用 SDK 的初始化 API
exit: ⌘↩
MachbirdSDK::init(env);在进入游戏主界面时调用下面的 API
exit: ⌘↩
MachbirdSDK::logMainPageShow();
# iOS 接入和配置
SDK Zip 文件里 iOS 平台相关的文件均在 iOS 目录下
- script 目录下是 js 代码,加到 Cocos-creator 的 Script 目录里
- 将 ios 目录下的所有.h/.m 文件 Add File To 到 Xcode 项目的 ios 目录下
运营方申请游戏、游戏 push 的证书和描述文件,push 证书对应的 Bundle Identifier 为 xxx.xxx.xxx.notificationservice,此处的 xxx.xxx.xxx 表示游戏的 Bundle Identifier
拷贝以下内容并替换 Xcode 项目的 ios 目录下的 main.m 文件内容
#import <UIKit/UIKit.h>
const char* AppControllerClassName = "AppController";
int main(int argc, char *argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
int retVal = UIApplicationMain(argc, argv, nil, [NSString stringWithUTF8String: AppControllerClassName]);
[pool release];
return retVal;
}
打开 xcode 工程,在 TARGETS 的左下角点击+号选择 Notification Service Extension,点击 next,在 Product Name:栏里添加 notificationservice,然后点击 Finish,如图:

在 TARGETS 栏里选择第一个 target,点击 Signing & Capabilities,点击+Capability 按钮,分别添加 Backgroud Modes、Keychain Sharing、Push Notifications,然后勾选 Backgroud Modes 目标框里的 Backgroud fetch、Remote notifications 选项,点击 Keychain Groups 下面的+号,添加$(AppIdentifierPrefix)group.xxx.xxx.xxx,此处的 xxx.xxx.xxx 表示 Bundle Identifier。如图:
在 TARGETS 栏里选择 notificationservice,点击 Signing & Capabilities,点击+Capability 按钮,添加 Keychain Sharing,点击 Keychain Groups 下面的+号,添加$(AppIdentifierPrefix)group.xxx.xxx.xxx,此处的 xxx.xxx.xxx 表示 Bundle Identifier,设置 push 对应的 Bundle Identifier 和描述文件。
点击 notificationservice Target 的 Build Settings,设置 Enable Bitcode 为 No
安装 Cocoapod,已安装过的请忽略。
更新 Ruby
- (已翻墙命令:)sudo gem update --system
- (未翻墙命令:)gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/ sudo gem update --system
安装:sudo gem install -n /usr/local/bin cocoapods
在导出的 xcode 工程根目录下新建 Podfile 文件,添加以下内容,把 hello_world-mobile 替换成游戏的 target 名称
source 'https://cdn.cocoapods.org/'
source 'https://de5c5537444e6fe278ea3525c5d111e9ba90e4a3@github.com/machbirdx/spec.git'
platform :ios, '10.0'
target 'hello_world-mobile' do
use_frameworks!
pod 'XALFrameworks/APSFcmPush', '~> 0.1.0', :configurations => ['Release']
pod 'XALFrameworks-Debug/APSFcmPush', '~> 0.1.0', :configurations => ['Debug']
pod 'XALFrameworks','~> 0.1.0', :configurations => ['Release']
pod 'XALFrameworks-Debug','~> 0.1.0', :configurations => ['Debug']
end
target 'notificationservice' do
use_frameworks!
pod 'XALFrameworks/APSFcmPush', '~> 0.1.0', :configurations => ['Release']
pod 'XALFrameworks-Debug/APSFcmPush', '~> 0.1.0', :configurations => ['Debug']
pod 'XALFrameworks','~> 0.1.0', :configurations => ['Release']
pod 'XALFrameworks-Debug','~> 0.1.0', :configurations => ['Debug']
end
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['ENABLE_BITCODE'] = 'NO'
config.build_settings['ARCHS'] = '$(ARCHS_STANDARD)'
if target.name == "Adjust" || target.name == "GCDWebServer"
config.build_settings['APPLICATION_EXTENSION_API_ONLY'] = 'NO'
end
end
end
end
- 在项目的 Info.plist 文件里添加配置参数,具体参数值由运营提供
io.MachBird.sdk.x.AppKey=xxxxxxxxxxx
FLURRY_API_KEY_IOS=xxxxxxxxxxx
adjust_token=xxxxxxxxx
push_appid=xxxxxxx
把运营人员提供的 GoogleService-Info.plist 文件 Add File To 到 xcode 工程的 ios 目录下
打开终端,cd 到 xcode 工程根目录下,执行 pod update && pod install 命令,注意第一次运行该命令时间比较长,请耐心等待
执行完成后会报这么一个错误:
diff: /../Podfile.lock: No such file or directory diff: /Manifest.lock: No such file or directory error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.在项目里把下面的 Configuration 都改为 None,然后在 pod install。这样就解决了,如图:
然后 cocoaPod 又出现了下面的错误
[!] The PuHuaHospital [Release] target overrides the LIBRARY_SEARCH_PATHS build setting defined in `Pods/Target Support Files/Pods-PuHuaHospital/Pods-PuHuaHospital.release.xcconfig'. This can lead to problems with the CocoaPods installation
Use the $(inherited) flag, orRemove the build settings from the target.
[!] The PuHuaHospitalDoctor [Release] target overrides the HEADER_SEARCH_PATHS build setting defined in `Pods/Target Support Files/Pods-PuHuaHospitalDoctor/Pods-PuHuaHospitalDoctor.release.xcconfig'. This can lead to problems with the CocoaPods installation
Use the $(inherited) flag, orRemove the build settings from the target.
解决方案:在 Build Settings 对应的 target 上的 Header Search Paths、Library Search Paths 双击添加新行,都加上$(inherited),然后重新 pod install 就可以了,如图:

调用 API:
- 调用 SDK 的初始化 API
var machbirdCCSdk = require("MachbirdCCSdk").machbirdCCSdk; machbirdCCSdk.init();- 进入游戏主界面时调用下面的 API
machbirdCCSdk.logMainPageShow();
# 数据统计
# 1. 激活和 DAU 计算
LogMainPageShow
【调用时机】进入游戏的主界面时,主动调用。
【方法】
/**
* 记录游戏进入主界面
*/
MachbirdSDK::logMainPageShow();
# 2. 任务和进度
【特定参数说明】
传固定值的参数名称
参数的枚举值
枚举值的说明
questType
MachbirdQuestType::MachbirdQuestType_MAIN
主线任务,默认值。
MachbirdQuestType::MachbirdQuestType_NEW
新手任务。
MachbirdQuestType::MachbirdQuestType_SUB
支线任务。
logQuestBegin
【调用时机】关卡类游戏,在进入关卡时,由接入方手动调用。
【方法 1】
/**
* 记录游戏任务的开始
*
* @param questIndex 任务/关卡/副本的索引号。
*/
MachbirdSDK::logQuestBegin(int questIndex)
【方法 2】
/**
* 记录游戏任务的开始(全部参数)
*
* @param questIndex 任务/关卡/副本的索引号。
* @param questType 当前的任务/关卡/副本的类型;例如主线任务、新手任务、支线任务。
* @param questId 任务/关卡/副本的名称或编号。
* @param questName 游戏任务名称。
* @param progress 关卡内的进度。
* @param times 次数。
*/
MachbirdSDK::logQuestBegin(int questIndex, MachbirdQuestType questType, std::string questId, std::string questName, int progress, int times)
logQuestCompleted
【调用时机】关卡类游戏,在关卡成功完成时,由接入方手动调用。
【方法 1】
/**
* 记录游戏任务的完成
*
* @param questIndex 任务/关卡/副本的索引号。
*/
MachbirdSDK::logQuestCompleted(int questIndex)
【方法 2】
/**
* 记录游戏任务的完成(全部参数)
*
* @param questIndex 任务/关卡/副本的索引号。
* @param questType 当前的任务/关卡/副本的类型;例如主线任务、新手任务、支线任务。
* @param questId 任务/关卡/副本的名称或编号。
* @param questName 游戏任务名称。
* @param progress 关卡内的进度。
* @param times 次数。
*/
MachbirdSDK::logQuestCompleted(int questIndex, QuestType questType, std::string questId, std::string questName, int progress, int times)
logQuestFailed
【调用时机】关卡类游戏,在关卡闯关失败时,由接入方手动调用。
【方法 1】
/**
* 记录游戏任务的失败
*
* @param questIndex 任务/关卡/副本的索引号。
*/
MachbirdSDK::LogQuestFailed(int questIndex)
【方法 2】
/**
* 记录游戏任务的失败(全部参数)
*
* @param questIndex 任务/关卡/副本的索引号。
* @param questType 当前的任务/关卡/副本的类型;例如主线任务、新手任务、支线任务。
* @param questId 任务/关卡/副本的名称或编号。
* @param questName 游戏任务名称。
* @param progress 关卡内的进度。
* @param times 次数。
*/
MachbirdSDK::LogQuestFailed(int questIndex, QuestType questType, std::string questId, std::string questName, int progress, int times)
# 3. 虚拟交易
logBuy
【调用时机】当用虚拟货币成功购买某游戏物品时,由接入方手动调用。
【方法 1】
/**
* 记录游戏购买
*
* @param itemName 游戏内购买的虚拟物品的名称。
*/
MachbirdSDK::logBuy(std::string itemName)
【方法 2】
/**
* 记录游戏购买
*
* @param itemName 游戏内购买的虚拟物品的名称。
* @param itemNum 购买的数量。
* @param itemTotalPrice 购买的总价。
*/
MachbirdSDK::logBuy(string itemName, long itemNum, double itemTotalPrice)
logSell
【调用时机】当用成功出售某游戏物品,获取到虚拟货币时,由接入方手动调用。
【方法】
/**
* 记录游戏出售
*
* @param itemName 游戏内出售的虚拟物品的名称。
* @param itemNum 出售的数量。
* @param itemTotalPrice 出售的总价。
*/
MachbirdSDK::LogSell(std::string itemName, long itemNum, double itemTotalPrice)
# 4. IAP
logPaySuccess
【调用时机】用户使用真实货币充值成功后,由接入方手动调用。
【方法】
/**
* 记录游戏充值成功
*
* @param transactionId 交易的流水号。
* @param paymentType 支付类型;例如支付宝、银联、微信等,若为系统赠送,则传free。
* @param currencyType 货币类型;例如CNY人民币,USD美金等。
* @param realCoinNum 支付的真实货币的金额。
* @param virtualCoinNum 充值获得的游戏货币的数量。
* @param iapName 游戏内购买道具的名称。
* @param iapNum 游戏内购买道具的数量。
*/
MachbirdSDK::LogPaySuccess(std::string transactionId, std::string paymentType, std::string currencyType, double realCoinNum, long virtualCoinNum, std::string iapName, long iapNum)
logSubscribe
【调用时机】用户订阅成功后,由接入方手动调用。
【方法】
/**
* 记录游戏订阅
*
* @param subscriptionId 订阅的流水号。
* @param paymentType 支付类型;例如支付宝、银联、微信等,若为系统赠送,则传free。
* @param currencyType 货币类型;例如CNY人民币,USD美金等。
* @param realCoinNum 支付的真实货币的金额。
*/
MachbirdSDK::logSubscribe(std::string subscriptionId, std::string paymentType, std::string currencyType, double realCoinNum)
# 5. 广告统计
【重要参数的说明】
trigger:代表广告的触发场景,主属性,不允许为空。
用于描述广告触发时的页面信息,不管广告的产生来源于哪个页面,比如首页请求的广告,trigger 值就可以传 main_page。
插屏广告统计
onInterstitialRequest
【调用时机】当发生插屏广告的请求时,由接入方手动调用。
【方法】
/**
* 记录插屏广告请求。
*
* @param trigger 插屏广告的触发场景,主属性。
* @param isReady 是否有缓存。
*/
MachbirdSDK.onInterstitialRequest(std::string trigger, bool isReady)
onInterstitialShow
【调用时机】当插屏广告展示时,由接入方手动调用。
【方法】
/**
* 记录插屏广告展示。
*
* @param trigger 插屏广告的触发场景,主属性。
*/
MachbirdSDK::onInterstitialShow(std::string trigger)
onInterstitialClick
【调用时机】当点击了插屏广告的内容时,由接入方手动调用。
【方法】
/**
* 记录插屏广告内容的点击。
*
* @param trigger 插屏广告的触发场景,主属性。
*/
MachbirdSDK::onInterstitialClick(std::string trigger)
onInterstitialClose
【调用时机】当插屏广告关闭时,由接入方手动调用。
【方法】
/**
* 记录插屏广告的关闭。
*
* @param trigger 插屏广告的触发场景,主属性。
*/
MachbirdSDK::onInterstitialClose(std::string trigger)
激励视频广告统计
激励视频广告的接入说明:
目前我们的游戏是依靠商业化广告做变现,因此游戏中的广告表现对我们来说十分重要。而且广告中,激励视频的广告价值最高,需要重点关注。
为了弄清激励视频广告的表现,需要针对广告做清楚的打点统计。
1、标记激励视频广告的来源
首先我们需要使用 Trigger,来标记是从什么位置来的激励视频广告。这样我们可以观察哪些位置的广告表现差,可以有目标的去优化。
2、标记广告的状态
在我们明确了激励视频广告的位置后,需要观察为什么有些位置的视频广告表现较差。 因此我们要使用 status 来记录激励视频广告的不同状态,查找为什么表现差的原因,这样可以针对激励视频的具体环节去优化。
首先激励视频广告的产生的流程顺序如下:
1、激励视频场景触发后调用广告(ready)
2、调用请求发出后广告下载缓存完成/无下载缓存(ready=1/0)
步骤 1、2 请调用 OnRewardRequest()
3、有缓存时用户点击看视频的按钮(open)
步骤 3 请调用 OnRewardOpen()
4、激励视频广告开始播放展示(content_show)
步骤 4 请调用 OnRewardShow()
5、点击激励视频广告的展示出内容 (content_click)
步骤 5 请调用 OnRewardClick
6、视频广告播放完成(rewarded)
步骤 6 请调用 OnRewardFinish()
此时我们可以根据以上 6 个步骤的数据表现,去顺势优化比较大的环节。
因此为保证的接入质量,我们务必需要根据以上的逻辑去区分标记我们的广告行为。
onRewardRequest
【调用时机】当发生激励视频广告的请求时,由接入方手动调用。
【方法】
/**
* 记录激励视频广告的请求。
*
* @param trigger 激励视频广告的触发场景,主属性。
* @param isReady 是否有缓存。
*/
MachbirdSDK::onRewardRequest(std::string trigger, bool isReady)
onRewardOpen
【调用时机】触发激励视频广告的打开按钮时,由接入方手动调用。
【方法】
/**
* 记录激励视频广告的打开。
*
* @param trigger 激励视频广告的触发场景,主属性。
*/
MachbirdSDK::onRewardOpen(std::string trigger)
onRewardShow
【调用时机】当激励视频广告展示时,由接入方手动调用。
【方法】
/**
* 记录激励视频广告的展示。
*
* @param trigger 激励视频广告的触发场景,主属性。
*/
MachbirdSDK::onRewardShow(std::string trigger)
onRewardClick
【调用时机】当激励视频广告的内容被点击时,由接入方手动调用。
【方法】
/**
* 记录激励视频广告的点击。
*
* @param trigger 激励视频广告的触发场景,主属性。
*/
MachbirdSDK::onRewardClick(std::string trigger)
onRewardFinish
【调用时机】当激励视频播放完成时,由接入方手动调用。
【方法】
/**
* 记录激励视频广告的播放完成。
*
* @param trigger 激励视频广告的触发场景,主属性。
*/
MachbirdSDK::onRewardFinish(std::string trigger)
onRewardClose
【调用时机】当激励视频广告被关闭时,由接入方手动调用。
【方法】
/**
* 记录激励视频广告的关闭。
*
* @param trigger 激励视频广告的触发场景,主属性。
*/
MachbirdSDK::onRewardClose(std::string trigger)
横幅广告统计
onBannerRequest
【调用时机】当发生横幅广告的请求时,由接入方手动调用。
【方法】
/**
* 记录横幅广告请求。
*
* @param trigger 横幅广告的触发场景,主属性。
* @param isReady 是否有缓存。
*/
MachbirdSDK::onBannerRequest(std::string trigger, bool isReady)
onBannerShow
【调用时机】当横幅广告展示时,由接入方手动调用。
【方法】
/**
* 记录横幅广告的展示。
*
* @param trigger 横幅广告的触发场景,主属性。
*/
MachbirdSDK::onBannerShow(std::string trigger)
onBannerClick
【调用时机】当发生横幅广告内容的点击时,由接入方手动调用。
【方法】
/**
* 记录横幅广告的点击。
*
* @param trigger 横幅广告的触发场景,主属性。
*/
MachbirdSDK::onBannerClick(std::string trigger)
原生广告统计
onNativeRequest
【调用时机】当发生原生广告的请求时,由接入方手动调用。
【方法】
/**
* 记录原生广告请求。
*
* @param trigger 原生广告的触发场景,主属性。
* @param isReady 是否有缓存。
*/
MachbirdSDK::onNativeRequest(std::string trigger, bool isReady)
onNativeShow
【调用时机】当发生原生广告的展示时,由接入方手动调用。
【方法】
/**
* 记录原生广告的展示。
*
* @param trigger 原生广告的触发场景,主属性。
*/
MachbirdSDK::onNativeShow(std::string trigger)
onNativeClick
【调用时机】当发生原生广告内容的点击时,由接入方手动调用。
【方法】
/**
* 记录原生广告内容的点击。
*
* @param trigger 原生广告的触发场景,主属性。
*/
MachbirdSDK::onNativeClick(std::string trigger)
# 6. 账号行为
logRegister
【调用时机】当用户注册成功后,由接入方手动调用。
【方法】
/**
* 记录账户注册
*
* @param accountId 账户id,唯一标识一个账户。
* @param accountType 账户类型,例如自有账户、第三方登录账户等。
* @param age 注册时获取到的用户年龄。
* @param gender 注册时获取到的用户性别。
*/
MachbirdSDK::logRegister(std::string accountId, std::string accountType, int age, MachbirdGender gender)
logLogin
【调用时机】当用户登录成功后,由接入方手动调用。
【方法】
/**
* 记录账户登录
*
* @param accountId 账户id,唯一标识一个账户。
* @param accountLevel 账户等级。
*/
MachbirdSDK::logLogin(std::string accountId, std::string accountLevel)
# 7. 自定义事件
logCustomEvent
【调用时机】记录自定义事件,用于游戏 BI 平台的打点分析功能,由接入方手动调用。
【方法】
/**
* 记录自定义事件
*
* @param name 自定义事件的名称。
* @param customParamsJson 自定义的参数Key和Value,传Json格式的字符串,根节点必须是JSON对象不能是JSON数组,不支持嵌套JSON,总长度超过10240字节进行预警。
*/
MachbirdSDK::logCustomEvent(std::string name, std::string customParamsJson)
# GDPR
# 1. GDPR 相关 API
判断是否欧盟用户
MachbirdSDK::isEurope();设置个性化广告是否开启
MachbirdSDK::setPersonalizedAdAgree(bool agree);判断当前用户是否同意个性化广告
MachbirdSDK::isPersonalizedAdAgree();打点-授权界面展示时
MachbirdSDK::logGdprPageShow();打点-授权界面用户点击同意时
MachbirdSDK::logGdprAgree();
# 2. 产品里的 GDPR 处理流程
- 启动时判断是否欧盟用户
- 如果是欧盟用户并且没有同意过授权弹窗,则弹窗提示授权,用户必须点击弹窗里的"Start"按钮后,才能进入游戏。弹窗内容示例见下面。
- 如果是欧盟用户并且之前同意过授权弹窗(即使后来在设置里关闭了个性化广告),则直接进入游戏
- 如果不是欧盟用户,则不用弹窗,直接调用 API 设置个性化广告开启,进入游戏
- 在游戏设置界面,增加以下入口:
- 隐私协议查看按钮
- 用户协议查看按钮
- 个性化广告开关
- 删除数据按钮
上面提到的弹窗内容和设置界面需由 SDK 对接方进行 UI 设计
# 3. 授权弹窗

Enter a caption for this image (optional)
可互动元素:
- Start 按钮:点击即同意授权弹窗内的内容,游戏需要自己记录用户已经同意过授权弹窗(以后就再也不显示授权弹窗,除非清数据),同时调用
MachbirdSDK::setPersonalizedAdAgree(true) - User Agreement: 点击后用网页打开用户协议: http://gc-static.machbird.com/machbird/machbird/GameUserAgreement.txt
- Privacy Policy: 点击后用网页打开隐私协议: http://gc-static.machbird.com/machbird/machbird/GamePrivacyPolicy.txt
- 关闭按钮:点击即不同意此界面的内容,退出应用
弹窗文字参考:
Welcome to Amazing Fish
Machbird takes your privacy and data security seriously. Before you get started though, our team wanted to let you know that upon getting your consent we will use some of your usage information to improve the game quality and will share certain of your data with our ads partners, so that you can be presented with ads that are relevant for you. You may check out our privacy policy to know more detail. If you're ever not interested in sharing your data, you can always re-adjust your settings.
START
By clicking on‘START’, you certify that you’re over fifteen, have read and accepted our User Agreement and Privacy Policy.
# 4. 设置界面

Enter a caption for this image (optional)
可互动元素:
- 查看隐私协议按钮:点击后用网页打开隐私协议地址
- 查看用户协议按钮:点击后用网页打开用户协议地址
- 个性化广告开关:通过
MachBirdSDK::isPersonalizedAdAgree()来判断当前开关状态,通过MachBirdSDK::setPersonalizedAdAgree(true/false)来设置新的状态
- 个性化广告开关:通过
- 清除本地数据按钮:点击后清空应用本地数据
# 5. 如何验证
我们是基于手机 SIM 卡归属国来判断是否欧盟的,如果想验证在欧盟用户手机上,产品是否会弹窗提示,但是手上又没有欧盟国家的 SIM 卡,可按以下步骤来模拟欧盟用户:
由于 Unity 默认设置“读取存储空间”权限只在 Android4.4 下声明,所以测试只能使用 Android4.4 以下的手机测试,或者导出 Android 工程后修改 AndroidManifest.xml 去掉该限制
打一个 Debug 包,安装,先不启动。Debug 包指的是在 Unity 里打包要勾选"Development Build"。

放置一个配置文件到手机 SD 卡根目录下,machbird_test.prop
去应用设置里开启“读取存储卡权限”
运行应用,看看是否弹窗出来
# 文件云控
我们有时候想把游戏里的一些控制参数做成可以动态调整,比如第 N 关出广告/新手第一次奖励 N 金币等等,在游戏上线后,可以快速调整这些参数来观察数据变化,而不需要修改代码发版这么麻烦而耗时。所以,Machbird SDK 支持随时在后台下发一个配置文件到用户手机,配置文件里可以包含上面说的这种控制参数,然后游戏通过 Machbird SDK 提供的 API 实时获取到最新的配置,即可做到快速调整游戏线上版本的行为,提高测试验证效率。
# 云控文件有什么限制?
Machbird SDK 只是一个文件下发通道,对文件格式不做要求,但是考虑到用户流量和历史经验,有以下说明:
- 文件名:文件名没有限制
- 文件内容:内容格式不限,文件大小不超过 10K(一般内容格式推荐用 JSON)
# 如何获取云控文件内容
std::string fileContent = MachbirdSDK::getCloudFileContent(std::string fileName);
# 默认云控文件内容
- 当服务器没有下发云控文件时,上面的 API 返回一个空字符串,可以以此来判断是否有云控下发文件
- 可以在 Android 的 assets 目录下放一个同名的文件,内容是默认配置,这样 Machbird SDK 在获取该文件名队员的内容时,会优先使用云控下发的内容,如果没有则使用 assets 目录下的同名文件内容,均没有,才返回空字符串
← Cocos-Creator Unity →