关于iOS内购IAP的一个可能导致丢单的问题

关于iOS内购IAP的一个可能导致丢单的问题,第1张

        首先:我只是个iOS开发的菜鸟,语文不及格的学渣。写的东西都只是一点自己的浅显的理解。如有不对,欢迎大神们指点,小弟虚心学习~我只是个梦想成为大神的菜鸟。嫌裂毁

        闲话少说。这篇文章是关于苹果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

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/bake/11967853.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存