Skip to content

iOS SDK (旧) ​

Zeus SDK iOS 接入指南 ​

SDK信息

  • SDK 版本:1.0.0

环境要求 ​

项目要求
Xcode15.x 或更高
iOS Deployment Target≥ 15.0
Swift5.9+(宿主为 Swift 时)

集成 ​

添加SDK UI 资源 ​

  1. 将库中的 compose-resource 拷贝到项目根目录和 .xcodeproj 项目同级。

image.png

  1. 选中Targets下的 Build Phases

image.png

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

image.png

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

image.png

添加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 **

字段说明
statusHTTP 语义状态码(成功 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 参数说明

字段类型说明
devBooleantrue = 沙盒/调试环境
appIdIntZeus 后台分配的 App ID
langString语言代码,默认 "en",后续应为用户设置的语言
gdprBoolean是否启用 GDPR/UMP 同意流程
loginBrandString登录页品牌文案,默认为 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 主要字段说明

字段说明
orderIdZeus 订单号
skuId商品 ID
clientSendRewardtrue 时须调用 finishPurchase
jwsRepresentationApple JWS 凭证
storeTransactionIdStoreKit 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_adjust
objc
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开屏广告
BANNERBanner广告
INTERSTITIAL插屏广告
REWARDED激励视频广告
NATIVE原生广告