Unity3d iOS 内购详细流程总汇

http://blog.sina.com.cn/s/blog_4a2183a60101lc8a.html

这几天做app的内购功能,发现网上找的资料都很老了,基本都是2012年以前的,而且基本都是针对有Object-C基础的写的。作为一个从来没有接触过Object-C和XCode的家伙傻逗表示看起来压力山大。教程基本都是纯Object-C代码,涉及到跟Unity交互的很少,也是花了我不少时间。而且都没有demo!下载的插件又复杂的要死根本看不懂。后来经过不懈的google终于在三天里实现了iap,于是写个总结方便那些跟我一样的纯Object-C新手。


教程已经解释的很清楚的我就不再博客里重复了,主要是整理整个完整的流程然后针对教程没有提到的情况做些讲解。

第一步是申请苹果开发者账号,99刀一年。然后设置你的项目,内功功能并申请一个测试账号用来在sandbox里测试。详细教程请点击 【iOS开发必收藏】详解iOS应用程序内使用IAP/StoreKit付费、沙盒(SandBox)测试、创建测试账号流程!

这里遇到了第一个问题, itunesconnection  连不上-.-

然后是第二个问题如何填写BankInfo 还有CNAPS是什么哪里查
CNAPS地址是银行的一个唯一代码, 网上很多教程里给的地址都打不开,这个是绝对可用的
再有就是网银点开里面有个啥银行资料的也有支付行号,不过是几个excel文档要自己搜索,真小气。

ShaDou开户银行遇到点问题,银行发票上的开户银行和网银上的开户银行居然不一致,后来打银行电话得到的那个银行名字查不到支付行号,google也查不到那家银行,估计是改过名字或者搬过家信息没同步更新吧。反正用找到行号填写账户名是可以用的。

填写账户名的时候填中文名的 汉语拼音就可以了,这个也是教程里没提到的。之前填了中文不认,然后打电话给银行银行说什么要开外币账户才有英文账号,其实不用。汉语拼音就可以了。

Xcode代码最开始我参考的是这篇: unity 嵌入iOS的IAP
不过这篇是2011年的,写的不是很清楚,有些函数也是被Xcode弃用了的旧代码,中间出了些错误页不知道怎么解决。
于是我花了好久终于找到一篇满意的: Store Kit Guide(In App Purchase)翻译
这篇有iap流程的图解,每个函数都说的很详细,不过在看这个之前我已经通过前面的学习熟悉了Object-C的基本语法,所以看起来终于不会一头雾水了。  Object-C语法简介看这里

之前看很多教程里还有一个错误就是说 iOS跟 Unity通信必须用.mm也就是Object-C++脚本,后来我看了下文档发现不用。误会估计是中文文档翻译的时候造成的,里面有个.mm格式的例子: 为iOS创建插件 Building Plugins for iOS。然后很多人就以为必须用.mm格式才可以跟Unity通信。 不是的,看原版就知道Object-C的.m格式也可以用,而且不用写 extern "C" , 更方便直接就可以用,所以U官方也就没给例子。大家直接用.m的就可以了。

iOS 跟 Unity 通信的话 一个是函数可以返回基本的 int bool之类的,还有一个就是UnitySendMessage函数,可以传字符串。

然后一个就是导入库,使用内购功能需要在XCode 里面导入 StoreKit 库。导入方法: ios Xcode 如何导入类库
坑爹的就是每次编译xcode都需要导入一次......

demo下载地址
百度网盘 : 

里面包含一个cs 文件
IAPExample.cs   使用例子,脚本

四个插件文件在Plugin/IOS下面
IAPInterface.h
IAPInterface.m Object-C 文件, unity跟xcode的接口
IAPManager.h
IAPManager.m Object-C 文件,处理内购并回调unity函数。
处理过程参考的 Store Kit Guide(In App Purchase)翻译里的内容。

调用外部函数应该不用说了吧?
using System.Runtime.InteropServices;
然后
[DllImport("__Internal")]
private static extern xxx XXX(xx);
不会的同学看Unity手册 : Building Plugins for iOS

我写了几个我认为常用的接口
Object-C 接口
IAPInterface.m
void  InitIAPManager(); //初始化,设置事件监听
bool  IsProductAvailable(); //返回玩家是否开启IAP内购
void  RequstProductInfo( void  *p); //输入商品key列表获取商品信息
void  BuyProduct( void  *p); //输入商品key 购买商品


iOS 返回到Unity的接口
IAPExample.cs
void  ShowProductList( string  s); //获取xcode返回的一个product信息
void  ProvideContent( string  s); //获取xcode返回的商品回执

至于错误提示可以根据需要是直接由Xcode做还是返回到Untiy之类的处理。
我是直接在Xcode里做了。想要在unity里处理的同学就照着这个自己写就好了.

因为技术有限,所以做的比较糙。这个工程只能编译后在真机上连接xcode跑,u里是跑不起来的。

详细功能在IAPManager.m里实现,IAPInterface.m是给Unity调用的接口。
IAPManager  *iapManager  nil;

void  InitIAPManager(){
       iapManager  [[IAPManager  alloc]  init];
       [iapManager attachObserver];
      
}
InitIAPManager函数初始化了一个IAPManager类,同时调用了IAPManager的attachObserver函数,添加了一个监听事件。这个推荐在游戏开始的时候就调用,教程里面有说可以处理之前未完成的消息。

IsProductAvailable 很简单不说了。

void  RequstProductInfo( void  *p){
       NSString  *list  [NSString  stringWithUTF8String:p];
       NSLog(@"productKey:%@",list);
       [iapManager requestProductData:list];
}


RequestProductInfo 这里涉及到把 u 的string字符串转成xcode常用的NSString字符串。 U的脚本需要是UTF8格式如果你直接把商品的Key写在里面。
我设计的格式是用"\t"制表符分割每个key,使用方法:
RequstProductInfo ( "com.dollar.one\tcom.dollar.two" );
这边com.dllar.one 和com.dollar.two是我在itunesconnect里设置的两个商品的key,需要改成你们自己的key,用\t分割每个key。

当苹果返回商品信息时,IPAManager会呼叫Unity场景中物体名为“Main”的身上的脚本的
void ShowProductList(string s) 函数,并返回一个商品信息,商品信息参数用\t分割。如果你输入了多个key,就会收到多条ShowProductList信息。实测3g连app延迟大概在1秒~3秒左右。如果你的key错了会在xcode的调试的那个地方报出来而不会收到ShowProduct回调。


void  BuyProduct( void  *p){
       [iapManager buyRequest:[NSString stringWithUTF8String:p]];
}
BuyProduct函数用来购买一个商品,需要传入一个商品的key,然后IPAManager会呼叫Unity场景中物体名为“Main”的身上的脚本的 void ProvideContent(string s) 函数, 并返回苹果给的商品匿名回执。这个回执很多教程里都没说,其实要什么base64 重新code一下才能用,我已经写到IPAManager里面处理好了。这个回执需要你自己去跟苹果的服务器确认是否是真实的,防止越狱玩家用 IAP free之类的插件作弊。
还有就是注意如果你用的是测试账号,需要去 sandbox.itunes.apple.com/verifyReceipt验证,而不是去 buy.itunes.apple.com/verifyReceipt  验证。如果你提交app审核,苹果也是用的测试账号,这样就需要你自己去判断回执是不是测试账号。如何判断看这里:  IOS 内支付那点事
推荐用自己的服务器发送。 如果用unity的话有可能被破解。
Unity发送验证
string  json  "{\"receipt-data\":\"+YourReceiptCodeBase64+\"}";
WWWForm  wwwForm  new  WWWForm();
wwwForm.AddField("receipt",json);
WWW  www  new  WWW("https://sandbox.itunes.apple.com/verifyReceipt",  wwwForm);

一旦你确定回执是正确的,就可以把商品提供给玩家了。
整个购买流程测试大概要2~15秒都有可能。另外就是跟苹果连的时候一开始经常会连不上,各种错误返回之类的,估计是连美国服务器不稳定,不过过一会就好了。一旦玩家点了一个商品,最好做个处理界面不要让玩家重复点击,不然经常返回这个商品已购买但是未提供之类的错误。等待个15秒如果苹果没有响应再弹个连接失败之类的。

 
有什么不清楚的地方大家可以给我留言,我会持续更新。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
uniapp是一种跨平台的应用开发框架,可以同时开发iOS和Android应用。在uniapp中实现iOS内购需要按照以下步骤进行操作: 1. 首先,在iTunes Connect(https://appstoreconnect.apple.com/)应用后台登录并创建App内购项目,在此过程中需要设置税务和银行卡等配置信息。 2. 然后,在HbuilderX中勾选Apple应用内支付选项。这样可以在uniapp中使用内购功能。 3. 接下来,根据uniapp的支付文档(https://uniapp.dcloud.net.cn/api/plugins/payment.html#requestpayment),使用相应的API进行支付操作。uniapp提供了一些插件,可以方便地实现支付功能。 需要注意的是,iOS内购与Apple Pay是不同的概念。Apple Pay是一种支付方式,类似于支付宝和微信支付,而iOS内购是指在iPhone应用中购买虚拟物品(例如QQ币、鱼翅、电子书等)。 总结来说,要在uniapp中实现iOS内购,需要在iTunes Connect创建内购项目,勾选HbuilderX中的Apple应用内支付选项,并参考uniapp的支付文档进行相应的开发。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [uniapp苹果内购总结](https://blog.csdn.net/weixin_37391237/article/details/126409915)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [iOS内购与apple pay](https://download.csdn.net/download/u011189314/14110233)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值