接入 iOS

更新时间:
复制 MD 格式

小程序小游戏目前支持 基于已有工程且使用 CocoaPods 的接入方式。本文介绍了采用上述方式接入小程序小游戏和使用小程序小游戏的过程。

前置条件

添加 SDK

小程序小游戏目前已在定制基线 cp_change_56100909 版本中提供支持。

  1. 在 Podfile 文件中,指定基线号为cp_change_56100909。

  2. 执行 pod mpaas update cp_change_56100909 命令更新基线。

  3. 在命令行中执行 pod install 即可完成接入。

安装组件和依赖

在 podfile 中新增以下组件。

mPaaS_pod "mPaaS_Game"
mPaaS_pod "mPaaS_Canvas"

启动游戏

启动参数:xriver

 [MPNebulaAdapterInterface startTinyAppWithId:@"appId" params:@{@"xriver":@(YES)}];

初始化配置

初始化 mPaaS 框架

如果 App 的生命周期并没有交给 mPaaS 框架托管,而是指定为您自己定义的 delegate(如下图所示),那么还需手动初始化 mPaaS 框架。

说明

mPaaS 框架托管是指 App 的 delegate 设置为 DFClientDelegate,此时无需手动初始化 mPaaS 框架。

image.png

  1. 在应用的 window 及 navigationController 创建完成后,调用以下方法初始化 mPaaS 框架。

    image.png

  2. 在 DTFrameworkInterface 的 category 中重写 shouldInheritDFNavigationController 方法并返回 NO,支持导航栏控制器可不继承 DFNavigationController。

    image.png

  3. 若 App 有多个导航栏,且需要在不同导航栏中打开不同小游戏,在切换导航栏后需重新设置容器的导航栏。

    image.png

初始化容器

为了正确启动小游戏,需要在 App 启动完成后调用 SDK 接口,对容器进行初始化。必须在 DTFrameworkInterface 的 - (void)application:(UIApplication *)application beforeDidFinishLaunchingWithOptions:(NSDictionary *)launchOptions 中进行初始化。

- (void)application:(UIApplication *)application beforeDidFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // 初始化容器
    [MPNebulaAdapterInterface initNebula];
}

注意事项

在 cp_change_56100909 基线中如果使用 mPaaS 框架的托管模式和隐私弹框的情况下,设置了开关配置代理 [MPNebulaAdapterInterface shareInstance].configDelegate = self;,则需要同时在以下两个方法中进行设置开关代理;如果没有使用到开关代理,请忽略。

image.png

image.png

账号授权

客户端注入 my.getAuthCode() 能力

参考 自定义 JSAPI 文档注册自定义 JSAPI。

客户端注入 my.getAuthCode() 能力,直接返回 openId。

#import <AriverNebulaPoseidon/NebulaPoseidon.h>

@interface MPJsApiHandler4GetAuthCode : PSDJsApiHandler

@end


@implementation MPJsApiHandler4GetAuthCode

- (void)handler:(NSDictionary *)data context:(PSDContext *)context callback:(PSDJsApiResponseCallbackBlock)callback
{
    // 从App服务端获取authCode/openId
    NSString *authCode = @"";
    NSString *openId = @"";
    NSMutableDictionary *params = NSMutableDictionary.dictionary;
    params[@"authCode"] = authCode;
    params[@"openId"] = openId;
    //回调参数给小程序层
    if (callback) {
        callback(params);
    }
}

广告

初始化时注入广告的小程序 API。

注册 onResize、createBannerAd、createInterstitialAd、createRewardedAd、loadAd、hideAd、destroyAd JSAPI,实现以上 API 时只需要按照以下方式注册后直接回调成功即可。小游戏 cp 按照支付宝规范调用了以上 API,兼容即可。

具体实现如下:

@interface MPJsApiHandler4AdHandler : PSDJsApiHandler

@end


@implementation MPJsApiHandler4AdHandler

- (void)handler:(NSDictionary *)data context:(PSDContext *)context callback:(PSDJsApiResponseCallbackBlock)callback
{
    if (callback) {
        // 回调成功
        callback(@{@"success":@true});
      }
}

注册 showAd,该 JSAPI 为真正展示广告的 API,这里实现显示广告即可。

重要

广告奖励下发时参考代码主动通知小游戏。

入参:adUnitId, 获取到值后通知奖励下发时需要使用。

@interface MPJsApiHandler4ShowAd : PSDJsApiHandler

@end


@implementation MPJsApiHandler4ShowAd

- (void)handler:(NSDictionary *)data context:(PSDContext *)context callback:(PSDJsApiResponseCallbackBlock)callback
{
    if (callback) {
        // showAd success
        callback(@{@"success":@true});

        // showAd 失败
        callback(@{@"error":61201,@"errorMessage":@"xxx"});
}
    
    
    // 广告奖励成功下发后主动通知:
    H5WebViewController *vc = context.currentViewController;
    // adUnitId从data中读,key:adUnitId
    [vc callHandler:@"ON_AD_VIEW_CLOSE" data:@{@"adUnitId":adUnitId ? :@"",@"closeEventId":@"",@"isEnded":@YES} responseCallback:^(id responseData) {
            
    }];
}

关卡上报

本功能专为闯关类游戏设计,适用于具有明确关卡规则与进度体系的场景。

注册自定义 API

reportGameStatus

MPJsApiHandler4ReportGameStatus

image

实现 MPJsApiHandler4ReportGameStatus

//  MPJsApiHandler4ReportGameStatus.h
//  AriverDemo

#import <Foundation/Foundation.h>
#import <AriverNebulaPoseidon/PSDJsApiHandler.h>
NS_ASSUME_NONNULL_BEGIN

@interface MPJsApiHandler4ReportGameStatus : PSDJsApiHandler

@end

NS_ASSUME_NONNULL_END
//  MPJsApiHandler4ReportGameStatus.m
//  AriverDemo

#import "MPJsApiHandler4ReportGameStatus.h"
#import <AriverNebula/H5WebViewController.h>
NS_ASSUME_NONNULL_BEGIN

@implementation MPJsApiHandler4ReportGameStatus

- (void)handler:(NSDictionary *)params context:(PSDContext *)context callback:(PSDJsApiResponseCallbackBlock)callback
{
    if (callback) {
        if (params[@"data"]) {
            callback(@{@"success":@YES});
            
            NSDictionary * data = (NSDictionary *)params[@"data"]; // 关卡数据
            
        } else {
            callback(@{@"success":@NO});
        }
    }
}
@end

NS_ASSUME_NONNULL_END