外观
iOS SDK (旧)
Zeus SDK iOS 接入指南
SDK信息
- SDK 版本:1.0.0
环境要求
| 项目 | 要求 |
|---|---|
| Xcode | 15.x 或更高 |
| iOS Deployment Target | ≥ 15.0 |
| Swift | 5.9+(宿主为 Swift 时) |
集成
添加SDK UI 资源
- 将库中的
compose-resource拷贝到项目根目录和 .xcodeproj 项目同级。

- 选中
Targets下的 Build Phases

- 找到 Copy Bundle Resources 的添加,随后在弹框中选择 Add Other 选项

选中根目录下的 compose-resources 文件夹,弹出 Options 后选中 Create folder references

添加SDK库文件
添加基础SDK
本地加载
添加Adjust SDK
链接地址:https://github.com/adjust/ios_sdk
选择版本:5.7.0
配置SDK清单文件
文件名称必须是 **Sdk.plist,**内容如下:
xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>api_base_url</key>
<string>https://sdkapi.zeusai.dev</string>
<key>adjust_token</key>
<string>adjust_token_xxx</string>
<key>applovin_max_sdk_key</key>
<string>3l6R_Q43fsI2wKZPqUJnUB87OzQyKc72d12...</string>
<key>applovin_max_app_open_ad</key>
<string>28f26e7956...</string>
<key>applovin_max_banner_ad</key>
<string>0fab08da3f...</string>
<key>applovin_max_inter_ad</key>
<string>9735d9484b...</string>
<key>applovin_max_reward_ad</key>
<string>624b4f697...</string>
<key>applovin_max_native_ad</key>
<string>5e78f1b25...</string>
<key>firebase_app_id</key>
<string>1:8630719...r</string>
<key>google_client_id</key>
<string>863071910...</string>
<key>facebook_app_id</key>
<string>610127403...</string>
<key>admob_app_id</key>
<string>ca-app-pub...</string>
<key>privacy_policy_url</key>
<string>https://www.example.com/privacy</string>
<key>terms_of_service_url</key>
<string>https://www.example.com/terms</string>
</dict>
</plist>Sdk.plist文件中的第三方按实际需求选择填入,例如接入adjust,那么只需要adjust相关的key-value 即可
API 调用总览
| 方法 | 说明 |
|---|---|
init(ctx, config, callback) | 初始化 SDK(iOS 上 ctx 可传任意占位值) |
login(ctx, callback) | 登录 |
bindThird(ctx, callback) | 绑定第三方账号 |
switchAccount(ctx, callback) | 切换账号 |
logout(ctx, callback) | 登出 |
purchase(ctx, skuId, productType, cpOrderId, callback) | 发起支付 |
processPendingPurchases(ctx, callback) | 处理未完成订单 |
finishPurchase(ctx, req, callback) | 客户端消费/确认(发奖模式) |
trackEvent(name, parameters) | 自定义事件 |
getUserId() | 当前用户 ID |
sdkInfo() | 设备标识 API |
sdkAd() | 广告 API(需 plugin_applovin) |
ctx 参数 为 当前UIViewController 对象
**回调结果 SdkResult **
| 字段 | 说明 |
|---|---|
status | HTTP 语义状态码(成功 200) |
code | 业务码(成功 0) |
message | 描述信息 |
data | 业务数据 |
判断成功条件:status == 200 && code == 0
初始化
- 注意所有接口必须等初始化成功后方能调用
swift
import zeusSdkKit
let config = SdkOption(
dev: true,
appId: 10000,
lang: "en",
gdpr: false,
loginBrand: "MyGame"
)
SDK.shared.doInit(ctx: self, config: config) { result in
if result.status == 200 && result.code == 0 {
// 初始化成功
}
}objc
#import <zeusSdkKit/zeusSdkKit.h>
ZSKSdkOption *config = [[ZSKSdkOption alloc] initWithDev:YES
appId:10000
lang:@"en"
gdpr:NO
loginBrand:@"MyGame"
debug:YES];
[[ZSKSDK shared] doInitCtx:self
config:config
callback:^(ZSKSdkResult<ZSKKotlinUnit *> *result) {
if (result.status == 200 && result.code == 0) {
// 初始化成功
}
}];SdkOption 参数说明
| 字段 | 类型 | 说明 |
|---|---|---|
dev | Boolean | true = 沙盒/调试环境 |
appId | Int | Zeus 后台分配的 App ID |
lang | String | 语言代码,默认 "en",后续应为用户设置的语言 |
gdpr | Boolean | 是否启用 GDPR/UMP 同意流程 |
loginBrand | String | 登录页品牌文案,默认为 ZEUSAI |
登录
- 初始化成功后应立即调用登录接口完成用户注册。此接口内部自行管理登录续期的逻辑,调用方无需特殊处理。
swift
SDK.shared.login(ctx: self) { result in
guard result.status == 200, result.code == 0, let resp = result.data else { return }
let token = resp.token
let userId = resp.userId
let loginType = resp.loginType // guest / google / facebook / apple
}objc
[[ZSKSDK shared] loginCtx:self callback:^(ZSKSdkResult<ZSKSdkLoginResp *> *result) {
if (result.status != 200 || result.code != 0 || result.data == nil) { return; }
ZSKSdkLoginResp *resp = result.data;
NSString *token = resp.token;
int64_t userId = resp.userId;
NSString *loginType = resp.loginType; // guest / google / facebook / apple
}];绑定账号
swift
SDK.shared.bindThird(ctx: self) { result in
guard result.status == 200, result.code == 0 else { return }
// 绑定成功
}objc
[[ZSKSDK shared] bindThirdCtx:self callback:^(ZSKSdkResult<ZSKSdkBindThirdResp *> *result) {
if (result.status != 200 || result.code != 0) { return; }
// 绑定成功
}];切换账号
swift
SDK.shared.switchAccount(ctx: self) { result in
guard result.status == 200, result.code == 0 else { return }
// 切号成功
}objc
[[ZSKSDK shared] switchAccountCtx:self callback:^(ZSKSdkResult<ZSKKotlinUnit *> *result) {
if (result.status != 200 || result.code != 0) { return; }
// 切号成功
}];登出
- 登出成功后,应用或游戏应该回到初始页面或状态
swift
SDK.shared.logout(ctx: self) { result in
guard result.status == 200, result.code == 0 else { return }
// 登出成功
}objc
[[ZSKSDK shared] logoutCtx:self callback:^(ZSKSdkResult<ZSKKotlinUnit *> *result) {
if (result.status != 200 || result.code != 0) { return; }
// 登出成功
}];发起购买
skuId 须与 AppStore 配置一致
swift
SDK.shared.purchase(
ctx: self,
skuId: "consumable",
productType: .inApp,
cpOrderId: nil
) { result in
guard result.status == 200, result.code == 0, let pay = result.data else { return }
if pay.clientSendReward {
// 客户端发奖:发奖后调用 finishPurchase
let req = pay.toFinishPurchase(productType: .inApp)
SDK.shared.finishPurchase(ctx: KotlinUnit(), req: req) { _ in }
}
}objc
[[ZSKSDK shared] purchaseCtx:self
skuId:@"consumable"
productType:ZSKPayProductType.inApp
cpOrderId:nil
callback:^(ZSKSdkResult<ZSKSdkPayResult *> *result) {
if (result.status != 200 || result.code != 0 || result.data == nil) { return; }
ZSKSdkPayResult *pay = result.data;
if (pay.clientSendReward) {
// 客户端发奖:发奖后调用 finishPurchase
ZSKSdkFinishPurchase *req = [pay toFinishPurchaseProductType:ZSKPayProductType.inApp];
[[ZSKSDK shared] finishPurchaseCtx:self
req:req
callback:^(ZSKSdkResult<ZSKKotlinUnit *> *finishResult) {}];
}
}];PayProductType 枚举类型说明
| 枚举值 | 说明 |
|---|---|
IN_APP | 消耗型 / 非消耗型内购 |
SUBSCRIPTION | 自动续期订阅 |
NON_RENEWING_SUBSCRIPTION | 非续期订阅 |
SdkPayResult 主要字段说明
| 字段 | 说明 |
|---|---|
orderId | Zeus 订单号 |
skuId | 商品 ID |
clientSendReward | true 时须调用 finishPurchase |
jwsRepresentation | Apple JWS 凭证 |
storeTransactionId | StoreKit transaction id |
- 注意支付成功后,需要判断 clientSendReward 字段,确定是否为客户端发奖模式,如果是则需要调用**
消费购买**接口结束购买,否则无法拉起下一笔支付。
恢复购买
- 针对用户掉单的情况,可以在产品页面独立放置按钮,让用户自行触发。
- 产品方自行判断是否有重复发奖的情况。
swift
SDK.shared.processPendingPurchases(ctx: self) { result in
result.data?.forEach { /* 补发奖励 */ }
}objc
[[ZSKSDK shared] processPendingPurchasesCtx:self
callback:^(ZSKSdkResult<NSArray<ZSKSdkPayResult *> *> *result) {
for (ZSKSdkPayResult *pay in result.data) {
// 补发奖励
}
}];消费购买
- 仅当客户端消费时需要,在支付完成发奖之后调用
swift
let req = pay.toFinishPurchase(productType: .inApp)
SDK.shared.finishPurchase(ctx: self, req: req) { result in
guard result.status == 200, result.code == 0 else { return }
// 消费/确认完成
}objc
ZSKSdkFinishPurchase *req = [pay toFinishPurchaseProductType:ZSKPayProductType.inApp];
[[ZSKSDK shared] finishPurchaseCtx:self
req:req
callback:^(ZSKSdkResult<ZSKKotlinUnit *> *result) {
if (result.status != 200 || result.code != 0) { return; }
// 消费/确认完成
}];上报事件
- parameters 为自定义额外信息,不需要可以传 nil或空
swift
SDK.shared.trackEvent(name: "level_complete", parameters: ["level": "3"])objc
[[ZSKSDK shared] trackEventName:@"level_complete" parameters:@{ @"level": @"3" }];获取用户ID
swift
let userId = SDK.shared.getUserId()objc
int64_t userId = [[ZSKSDK shared] getUserId];基础信息
swift
let info = SDK.shared.sdkInfo()
info?.getIdfa()
info?.getIdfv()
info?.getDeviceId()
info?.getAdjustId() // 需 plugin_adjustobjc
id<ZSKSdkInfoApi> info = [[ZSKSDK shared] sdkInfo];
[info getIdfa];
[info getIdfv];
[info getDeviceId];
[info getAdjustId]; // 需 plugin_adjust广告功能
swift
guard let ad = SDK.shared.sdkAd() else { return }
ad.setAdListener(listener: myListener)
ad.preloadAd(format: .interstitial)
if ad.isAdReady(format: .interstitial) {
_ = ad.showInterstitialAd(placement: "your_placement")
}objc
id<ZSKSdkAdApi> ad = [[ZSKSDK shared] sdkAd];
if (ad == nil) { return; }
[ad setAdListenerListener:myListener];
[ad preloadAdFormat:ZSKSdkAdFormat.interstitial];
if ([ad isAdReadyFormat:ZSKSdkAdFormat.interstitial]) {
[ad showInterstitialAdPlacement:@"your_placement"];
}AdFormat 枚举说明
| 枚举值 | 说明 |
|---|---|
APP_OPEN | 开屏广告 |
BANNER | Banner广告 |
INTERSTITIAL | 插屏广告 |
REWARDED | 激励视频广告 |
NATIVE | 原生广告 |