闲话少说。这篇文章是关于苹果IAP的一个可能导致项目丢单的bug.(可能是bug,也可能是我没有透彻的领悟苹果的用意,抛出来供大家参考)
问题的根本出现在内购SKMutablePayment 类的 applicationUsername对象在部分情况下会被苹果丢掉,成为null。
applicationUsername 是苹果在iOS7.0及以后为内购增加的一个自定义字段,开发者可以在该字段中记录一些自定义的数据。但是在使用过程中发现,部分(注意强调下,是部分)用户第一次使用苹果内购时,手机会提示用户去绑定yhk。这时用户点确定过去绑定yhk后继续点确定支付,苹果内购回调:
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
方法接收到的付款成功的 SKPaymentTransaction交易中的SKMutablePayment对象的applicationUsername会被苹果置为null.再次强调,这个问题只会部分用户发生。目前还没有找到规律,也没办法复现。
基于以上问题。如果大家的项目将例如内部源销订单号等信息存入applicationUsername中,就有可能导致存入的信息丢失的问题。不同的设计可能会引发不同的bug。由于我的项目将内部订单号存入applicationUsername,丢失后,无法提交服芹备务器校验小票。所以就丢单了。
另外在分享个需要注意的:就是前面提到当用户点击确认绑定手机卡跳走后,苹果会首先返回一个支付取消的通知。如果用户很乖的绑卡并且确认支付,苹果又会返回一个支付成功的通知。所以这里也需要大家注意,不要因此引发什么问题。
可能这个问题对大家来说并不会导致丢单或其他问题。只是在这里给大家分享下这样的一个坑,万一有人跟我一样的做法呢~防止大家入坑,希望能帮到大家~ Ps.马上过年了,祝大家新年愉快。
1.接入前准备1.1导入SuperSdk库
导入SuperSdk库SuperSdk.framework
将SuperSdk.framework拷贝到项目开发目录下,然后丛侍型将SuperSdk.framework拖拽到工程的Frameworks目录下,d出如 下图对话框所示(注意勾选),点击Finish。
1.2 添加SuperSdk.Framework版本号
在项目的info.plist文件里,增加一项用于标识SuperSDK版本号的值, key为sp_version,对应的value值为当前接入SuperSdk.framework的版本。
SuperSdk.framework的版本号请查看下载的资源包中的README.txt
1.3在工程中添加依赖库
在Xcode → Target → Build Phrases →Link Binary WithLibraries中添加以下依赖库
Foundation.framework
UIKit.framework
AdSupport.framework
SystemConfiguration.framework
CoreTelephony.framework
libstdc++.6.dylib
libsqlite3.dylib
注:将AdSupport.framework的status改为optional
1.4 修改工程配置,添加库的链接参数
在工程配置里面,找到Linking部分渗猜,修改Other Linker Flags,添加以下内容
-ObjC
1.5 引用SuperSdk
#import <SuperSdk/SuperSdkOpenApi.h>//接口
#import <SuperSdk/SuperSdkGameData.h>//游戏数据类
#import<SuperSdk/SuperSdkDefines.h>//接口回调方法以及参数和错误码说明
1.6接入母包SDK
为方便游戏开发联调,SuperSDK iOS开发包中有母包SDK,具备登录、支付等功能。游戏只需接入母包SDK即可联调登录、支付、注销、悬浮框等所有功能,只要保证SuperSDK母包正确接入,即可用打包工具一键生成各渠道工程。
1.6.1 添加母包SDK和资源
将从SuperSDK官网下载的iOS开发包解开,找到母包SDK,如下图所示。然后将libs文件夹下的文件(SuperSdkImp.a)和res文件下的文件SuperSdk.bundle拖动到xcode工程目录下并引用到工程中。
1.6.2 配置母包参数
打开打包工具,将支付通知地址和母包自定义参数配置好,自定义参数可向运营获取,支付通知地址为游戏的服务器地址,可向游戏后端获取,然后下载母包配置文件并将引用到工程中的SuperSdk.bundle里的spsdk_config.json和sp_config.json文件替换成母包的配置文件(覆盖)。
1.6.3 增加测试账号和支付金额
(1)打开管理后台http://dev.supersdk.cn/login,输入账号和密码,登陆到管理后台
(2)添加测试账号,并给测试账号增加测试金额。测试账号是母包登陆的时候使用,测试金额是母包支谈脊付时使用。
1.6.4 工程配置(Xcode7环境需要设置)
(1)关闭AppTransportSecurity。在 Info.plist 添加字段如下
(2)需关闭Bitcode,在Target → Build Settings → Build Options → Enable Bitcode
2.SuperSdk基础接口(必接)
2.1创建单例
接口定义
+ (SuperSdkOpenApi*)sharedInstance
调用示例
[SuperSdkOpenApi sharedInstance]
2.2初始化
(1)调用初始化接口:
注:调用初始化回调接口,调用之前游戏必须暂停, 等待初始化成功回调,SDK初始化成功后会紧接着进行整包更新检查,会有一个整包更新检查回调。游戏自身初始化和版本检查请放在SDK对游戏进行整包更新检查回调后执行。
接口定义
-(void)initPlatformWithDeleagte:(id<SuperSdkOpenApiDelegate>) delegate withSuperSdkUrlType:(SuperSdkUrlType)type
参数含义
delegate被委托对象,用于实现回调
type用于区分访问域名的类型,SuperSDK与SuperSDK服务器交互的域名类型及顺序。目前取值范围:SuperSdkUrlTypeDomestic 对应值为0 表示国内;SuperSdkUrlTypeForeign 对应值为1 表示国外,请求北美域名优先;SuperSdkUrlTypeForeignTW 对应值为2 表示国外,请求台湾域名优先;SuperSdkUrlTypeForeignUK 对应值为3 表示国外,请求欧洲域名优先。
调用示例
|[[SuperSdkOpenApi sharedInstance] initPlatformWithDeleagte:self withSuperSdkUrlType:SuperSdkUrlTypeDomestic]|
(2)初始化回调
回调方法
|- (void) OPInitFinish:(int)ret withParam:(NSString *)param|
回调参数含义
retOP_SUCCESS表示初始化成功,其他表示失败SDK初始化成功。游戏需要等待SDK对游戏进行整包更新检查的回调,SDK初始化失败,游戏需要给出玩家初始化失败的提示
param初始化返回的额外数据,一般为空
回调示例
- (void) OPInitFinish:(int)ret withParam:(NSString *)param
{
if (ret == OP_SUCCESS) {
//初始化成功
} else {
//初始化失败
}
}
(3)检查版本回调
初始化成功后会紧接着进行版本检查,版本检查完毕会有版本检查回调。
回调方法
- (void) OPCheckVersion:(int)ret withParam:(NSString *)param
回调参数含义
retOP_CHECK_WITH_NEW_VERSION表示表示调用了SDK整包更新检查接口,并且检测到游戏有新版本,游戏应该停住等待游戏整包更新结束
-OP_CHECK_WITHOUT_NEW_VERSION表示调用了SDK整包更新检查接口,并且检测到游戏没有新版本,游戏继续执行
-OP_CHECK_WITHOUT_CHECK_VERSION表示无SDK整包更新检查接口,游戏做自己的版本更新逻辑
param额外返回数据,一般为空
回调示例
- (void) OPCheckVersion:(int)ret withParam:(NSString *)param
{
switch (ret) {
case OP_CKECK_WITH_NEW_VERSION:
str = @"有更新"
break
case OP_CHECK_WITHOUT_NEW_VERSION:
str = @"没有新版本"
break
case OP_CHECK_WITHOUT_CHECK_VERSION:
str = @"没有更新接口"
break
default:
break
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)