Objective-C(iOS)接入技巧

QuickSDK | 2018-06-29 | 技术干货

QuickSDK自2014年开始为手游市场提供永久免费的SDK接入解决方案,目前已聚合700余家渠道,独创极速出包技术,灵活的可集成架构,屏蔽渠道之间差异化,一次接入批量出包,全渠道100%上架。下面将向大家介绍使用QuickSDK打包中Objective-C(iOS)接入的技巧。


1.开发包说明

· SMPCQuickSDK.framework是基础库,libSMPCQuickChannel.a是各个渠道的实现库。

2.接入步骤

2.1 QuickSDK一般流程

· 游戏接入SDK随带的母包库进行接口检查。

· 在QuickSDK后台添加渠道,配置参数。

· 测试完毕之后使用打包工具生成渠道,部分渠道需要越狱设备测试。

2.2 开发环境配置

· 将SMPCQuickSDK.framework和母包的libSMPCQuickChannel.a添加到工程中,并选择相应的target

· 在Build Settings中将Architectures设置为armv7+arm64,项目本身需要支持arm64。

    Other Linker Flags添加-ObjC

· Device Orientation 中选中游戏兼容的方向。常见配置

 

   · info.plist中添加,以允许http访问

· 游戏版本设置

游戏的Version(CFBundleShortVersionString)和Build(CFBundleVersion)必须保持一致,且使用x.y.z这样的点分式,比如:1.2.1

数字前面不要加0。因为每个渠道更新读取的版本号不一样,设置Version和Build一致才能保证各个渠道更新都正常,如果不愿意这样设置,可以通过生成的调试工程手动出有这样要求的渠道包,要求Version和Build一致的渠道不多,可以在审核不通过后再修改。

3.接口说明

首先配置项目信息。

3.1 初始化(必接)

3.1.1 获取实例

类:SMPCQuickSDK

函数:+ (SMPCQuickSDK *)defaultInstance;

功能:获取QuickSDK实例

3.1.2 初始化QuickSDK

类:SMPCQuickSDK

函数:


1
- (int)initWithConfig:(SMPCQuickSDKInitConfigure *)configure application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;


功能:使用productKey,productCode,初始化SDK, 由QuickSDK平台分配,在iOS打包工具上可以看到,打包时需要和iOS打包工具上的选择的产品参数一致。

参数:configure封装了 productKey和 productCode

application: 应用的application, 调用函数的参数原封不动的传入即可

launchOptions:应用的launchOptions, 调用函数的参数原封不动的传入即可。

说明:该接口需要在应用加载完成回调中调用,即


1
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{}


案例:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//初始化
  //监听初始化完成事件
  [[NSNotificationCenter defaultCenter] addObserver:self
          selector:@selector(smpcQpInitResult:)
          name:kSmpcQuickSDKNotiInitDidFinished
          object:nil];
  - (void)smpcQpInitResult:(NSNotification *)notify {
          NSLog(@"%@",notify);
          //初始化成功,进行下一步流程 
  }
  SMPCQuickSDKInitConfigure *cfg = [[SMPCQuickSDKInitConfigure alloc] init];
  cfg.productKey = @”09633196”;
  cfg.productCode = @”50840817638746911281319234382938”;   
  int error = [[SMPCQuickSDK defaultInstance] initWithConfig:cfg application: application didFinishLaunchingWithOptions:launchOptions];
  if(error != 0) {
      NSLog(@"不能启动初始化:%d",error);
  }
  //大部分渠道会处理自己内部的初始化失败,如果收到渠道初始化失败,游戏需要去处理,通常的做法让界面处于等待,等0.5s再初始化一次,如果失败就提示检查网络退出游戏


3.2 用户接口

3.2.1 登录接口(必接)

类名:SMPCQuickSDK

函数:- (int)login;

功能:打开登录界面,进入用户登陆流程。

返回值:返回0说明调用接口成功,其他值参考说明。

收到登录成功通知kSmpcQuickSDKNotiLogin后,取得返回值userInfo,取得用户uid、用户昵称/用户名和user_token,也可直接使用接口获取uid,userToken,昵称,参考demo,(可选内容)使用该user_token从服务器获取用户信息。随带Demo中有相关实现。该uid是渠道sdk提供的用户唯一标识,不同渠道间的uid可能发生重叠。

案例:


1
2
3
4
5
6
7
8
9
5..(void)smpcQpLoginResult:(NSNotification *)notify {
NSDictionary *userInfo  = [notify userInfo];
int error = [userInfo objectForKey:@”error”] intValue];
if(error == 0) {
          NSString *uid = [[SMPCQuickSDK defaultInstance] userId];
      NSString *userNick = [[SMPCQuickSDK defaultInstance] userNick];
      NSString *user_token = [[SMPCQuickSDK defaultInstance] userToken];
}
}


3.2.2 注销接口

类名:SMPCQuickSDK

函数: - (int)logout;

功能:主动注销当前用户。

返回值:返回0说明调用接口成功,其他值参考说明。

注意:调用该接口将引起QuickSDK发出一个注销通知kSmpcQuickSDKNotiLogout,游戏开发者收到注销通知后走下一步流程,比如回到游戏登录界面,再调用登录。

3.2.3 用户uid

类名:SMPCQuickSDK

函数:- (NSString *)userId;

功能:获取最后登录用户uid,通常在收到登录通知回调中调用,该uid是渠道sdk提供的用户唯一标识,不同渠道间的uid可能发生重叠。

返回值:最后登录用户的uid,可能为空,在没有收到登录通知时可能已经有值,不能作为判断当前是否有用户登录游戏的依据。

3.2.4 用户userToken

类名:SMPCQuickSDK

函数:- (NSString *)userToken

功能:获取最后一次登录用户的userToken,用于到服务器验证用户。

返回值:最后一次登录用户的userToken

3.2.5 用户昵称

类名:SMPCQuickSDK

函数:- (NSString *)userNick;

3.2.6 更新角色信息(必接)

类名:SMPCQuickSDK

函数:- (void)updateRoleInfoWith:(SMPCQuickSDKGameRoleInfo *)info isCreate:(BOOL)isCreate;

功能:向QuickSDK提交角色信息。

参数:info 角色信息对象,参考类SMPCQuickSDKGameRoleInfo,isCreate表示是否为刚刚创建的角色

返回值:

3.3 充值接口

3.3.1 充值(必接)

类名:SMPCQuickSDK

函数:- (int)payOrderInfo:(SMPCQuickSDKPayOrderInfo *)orderInfo

roleInfo:(SMPCQuickSDKGameRoleInfo *)roleInfo;

功能:订单支付

参数:orderInfo 订单信息

roleInfo 玩家角色信息

说明:orderInfo中

goodId //商品ID IAP时为苹果开发者后台配置的商品id,非IAP时随意,必填

productName //应该为一个通用名称,不包含商品个数,如“勾玉”,“元宝”,必填

cpOrderID //游戏订单号,必填

count //商品数量,如@"60",必填

amount //总价 如@"6",必填

callbackUrl 如果后台没有配置充值回调地址,callbackUrl将作为充值回调地址。选填

extrasParams 透传字段,服务器回调时原样传递, 选填。          

异步充值,用户完成充值操作后会发送充值结果通知。kSmpcQuickSDKNotiRecharge,sdk客户端通知的结果仅供参考,很多渠道没有客户端充值结果回调,以服务器端同步为准。

3.4 扩展接口

3.4.1 AppDelegate事件调用 (必接:只针对原生Objective-C)

说明:对能够使用OC接口的开发者这些回调应该比较容易添加,为了减轻大部分开发者负担,Unity3D和Cocos2d-x的游戏不用接入下面事件调用的代码,打包工具将会自动添加。打包工在Unity3d和cocos2d-x默认系统生命周期delegate文件中添加如下代码,进行并不严格的排重,如果开发者修改了默认的delegate文件将导致添加失败。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
- (void)applicationWillResignActive:(UIApplication *)application {
  [[SMPCQuickSDK defaultInstance] applicationWillResignActive:application];
}
- (void) applicationDidEnterBackground:(UIApplication *)application {
  [[SMPCQuickSDK defaultInstance] applicationDidEnterBackground:application];
}
- (void) applicationWillEnterForeground:(UIApplication *)application {
      
  [[SMPCQuickSDK defaultInstance] applicationWillEnterForeground:application];
}
- (void) applicationDidBecomeActive:(UIApplication *)application {
  [[SMPCQuickSDK defaultInstance] applicationDidBecomeActive:application];
}
- (void) applicationWillTerminate:(UIApplication *)application {
  [[SMPCQuickSDK defaultInstance] applicationWillTerminate:application];
}
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
  {
  [[SMPCQuickSDK defaultInstance] application:application didRegisterForRemoteNotificationsWithDeviceToken:deviceToken];
}
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
  {
  [[SMPCQuickSDK defaultInstance] application:application didFailToRegisterForRemoteNotificationsWithError:error];
}
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(nonnull NSDictionary *)userInfo{
  [[SMPCQuickSDK defaultInstance] application:application didReceiveRemoteNotification:userInfo];
}
-(UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(nullable UIWindow *)window
{
  [[SMPCQuickSDK defaultInstance] application:application supportedInterfaceOrientationsForWindow:window];
  return UIInterfaceOrientationMaskAll;
}
  - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url{
  [[SMPCQuickSDK defaultInstance] openURL:url application:application];
  returnYES;
}
  - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{
  [[SMPCQuickSDK defaultInstance] openURL:url sourceApplication:sourceApplication application:application annotation:annotation];
  returnYES;
}
 - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options{
  [[SMPCQuickSDK defaultInstance] openURL:url application:app options:options];
  returnYES;
}


3.4.2 显示浮动菜单

类名:SMPCQuickSDK

函数:- (void)showToolBar:(SMPC_QUICK_SDK_TOOLBAR_PLACE)place;

功能:显示浮动工具栏。若渠道无此对应接口,调用无效。

案例:当用户登录成功后调用

[[SMPCQuickSDK defaultInstance] showToolBar:SMPC_QUICK_SDK_TOOLBAR_TOP_LEFT];

3.4.3 隐藏浮动菜单

类名:SMPCQuickSDK

函数:- (void)hideToolBar;

功能:隐藏浮动菜单。若渠道无此对应接口,调用无效。

案列:必要时隐藏。

3.4.4 进入用户中心

类名:SMPCQuickSDK

函数:- (int)enterUserCenter;

功能:进入用户中心。若渠道无此对应接口,调用无效。

3.4.5 进入客服中心

类名:SMPCQuickSDK

函数:- (int)enterCustomerCenter;

功能:进入客服中心。

若渠道无此对应接口,直接调用会返回接口不支持的错误码。

3.4.6 进入BBS

类名:SMPCQuickSDK

函数: - (int)enterBBS;

功能:进入渠道BBS。

若渠道无此对应接口,直接调用会返回接口不支持的错误码。

3.4.7 是否支持指定方法

类名:SMPCQuickSDK

函数:-(BOOL)isFunctionTypeSupported:(SMPC_QUICK_SDK_FUNC_TYPE)type;

功能:判断渠道SDK支付支持某个接口,用户中心,客服中心,BBS,暂停等接口不是每个渠道SDK都实现了,所以可以在代码里判断来执行。若渠道无此对应接口,调用无效,会返回接口不支持的错误码。

3.5 其他接口

1
2
3
- (int)channelType;//渠道唯一标识
#pragma mark 平台基本信息
- (NSString *)getConfigValue:(NSString *)key;//获取quick后台配置的自定义参数


4.SDK通知说明

4.1 初始化通知

名称:kSmpcQuickSDKNotiInitDidFinished

说明:成功调用初始化接口后,异步。收到该通知后通过错误码判断渠道SDK是否初始化成功。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SMPC_QUICK_SDK_ERROR_NONE、SMPC_QUICK_SDK_ERROR_INIT_FAILED。
NSDictionary *userInfo = notify.userInfo;
int errorCode = [userInfo[kSmpcQuickSDKKeyError] intValue];
switch(errorCode) {
      caseSMPC_QUICK_SDK_ERROR_NONE:
      {
//初始化成功,进行下一步流程
      }
break;
      caseSMPC_QUICK_SDK_ERROR_INIT_FAILED:
      default:
      {
//初始化失败
      }
break;
}
1
 

4.2 登录成功通知

名称:kSmpcQuickSDKNotiLogin

说明:渠道SDK有用户登录成功时发出。如果游戏已经存在正在游戏的用户,收到该通知时认为是切换账号,需要开发者注销游戏内用户,使用新用户信息进入游戏。

4.3 注销通知

名称:kSmpcQuickSDKNotiLogout

说明:这有2种情况

· 用户从渠道SDK内的用户管理界面注销成功时会发出该通知。

· 游戏调用QuickSDK的用户注销接口后会收到该通知,根据错误码判断注销成功或失败,一般都认为是注销成功,不用考虑失败。

4.4 充值结果通知

名称:kSmpcQuickSDKNotiRecharge

说明:成功调用QuickSDK充值接口后会收到该通知。

通知结果的3种情况根据错误码来判断(SMPC_QUICK_SDK_ERROR_NONE、SMPC_QUICK_SDK_ERROR_RECHARGE_FAILED、SMPC_QUICK_SDK_ERROR_RECHARGE_CANCELLED)。

因为大部分渠道回调都以服务器为准,该结果仅供客户端参考,实际结果以服务器端同步为准。  

通知userInfo中信息说明:


1
2
3
4
5
//错误码
int error = [[userInfo objectForKey:kSmpcQuickSDKKeyError] intValue];
//QuickSDK订单号、cp下单时传入的订单号
NSString *orderID = userInfo[kSmpcQuickSDKKeyOrderId];
NSString *cpOrderID = userInfo[kSmpcQuickSDKKeyCpOrderId];


4.5 暂停结束通知

名称:kSmpcQuickSDKNotiPauseOver

说明:不用监听,某些渠道SDK暂停结束时发出通知。

5.其他说明(必读)

5.1 接口说明

QuickSDK 初始化接口,用户接口,充值统一都支持。所有提供的接口都可以直接调用,有些可能会因为渠道不支持而调用无效。

商务合作

李先生:13880511661

市场合作

赵先生:15390049857

技术支持

彭女士:18202818615

官方技术交流群

QQ群:608554925