链接:http://oulehui.blog.163.com/blog/static/796146982011731113214878/
Unity做东西是快,但是有些功能是需要额外开发的,比如 IAP (In App Purchase,应用程序内购买)
还好unity提供了灵活的扩展功能,允许嵌入原生代码来做一些unity未实现的功能。
这几天折腾IAP,碰到很多问题,现在终于调通了,记下来备忘。
首先要提到两个链接:
http://troybrant.net/blog/2010/01/in-app-purchases-a-full-walkthrough/
帖子的名字a full walkthrough,翻译过来可以叫做"全攻略"或者“完全手册"
通过在google搜索关键字 in app purchase 全攻略 可以找到好心人翻译的中文版。
原作者是大好人,自己在做iap的时候,一路艰辛,搞定之后分享他的经验,提供完整好用的代码,减少后来者的痛苦。
用作者自己的话说:It took several days of blood, sweat, and tears to get it working in my own application, and hopefully this post has helped short circuit that cycle of pain and suffering for you as well.
十分感谢原作者!
可惜的是这个文章很旧了,里面有些内容已经过时,例如:
1。调试IAP必须上传App。现在已经不需要这样了,上传app之前apple已经允许你管理 InAppProduct
2。建立好Product之后需要等几个小时才能访问。这个貌似也不需要了,我弄好之后很快就能访问了。
分割线————————————————————————————————
下面开始讲代码实现和调试过程:
原作者的代码我就不贴了,只贴一段unity调用该代码的代码。
//InAppPurchase.mm
#import <Foundation/Foundation.h>
#import <StoreKit/StoreKit.h>
#import "InAppPurchaseManager.h"
extern "C" {
bool CanPurchase()
{
return ([SKPaymentQueue canMakePayments]);
}
InAppPurchaseManager *sharedMgr = nil;
void BuyPro()
{
if (sharedMgr == nil) {
sharedMgr = [[InAppPurchaseManager alloc]init];
[sharedMgr loadStore];
}
[sharedMgr purchaseProUpgrade];
}
}
代码说明:这段代码提供了两个函数
一个 CanPurchase用来判断是否可以程序内购买,如果用户通过设置关掉了程序内购买,需要提醒用户打开。
一个是购买Pro版本,即调用InAppPurchaseManager的 purchaseProUpgrade方法
原作者实现的是一个非消费型的产品,即一次付费,终身使用。如果要做消费型的产品,即每次购买都需要付费(常用的道具付费),也很简单,在iTunesConnect里面添加产品的时候选对类型就好了,代码本身都支持。
把包含上面代码的InAppPurchase.mm文件放到unity的Assets/Plugins/ios目录下,记住目录结构,不要犯错,否则xcode会链接不过,报Symbol(s) not found
另外把原作者的4个文件 也放到此目录下。4个文件分别是:
InAppPurchaseManager.h
InAppPurchaseManager.m
SKProduct+LocalizedPrice.h
SKProduct+LocalizedPrice.m
在unity脚本中使用这两个函数的代码如下:(貌似只能c#)
using UnityEngine;
using System.Collections;
using System.Runtime.InteropServices;
public class IAP: MonoBehaviour
{
[DllImport ("__Internal")]
private static extern bool CanPurchase();
[DllImport ("__Internal")]
private static extern void BuyPro();
void OnGUI()
{
if (GUI.Button(Rect(10, 10, 120, 120), "Buy"))
{
if(CanPurchase())
{
Debug.Log("can buy.");
BuyPro();
}
else
{
Debug.Log("you need open in app purchase.");
}
}
}
}
我是把它放在一个gui的button上,当然你也可以根据需要放在任何你需要的地方。
如果要反过来调用,即在原生代码中调用脚本的函数,unity提供一个方法:
UnitySendMessage("game_object", "BuyProSuccess", "Ok");
这个方法调用相当于给名为 game_object的对象调了一个SendMessage("BuyProSuccess",”Ok")
当然对象名,消息名(函数名),参数内容你可以根据自己的需要随便填,参数类型貌似只能String
可以把这行代码加到 InAppPurchaseManager.m的provideContent方法中,用来通知unity对象购买成功,作出相应的处理。
代码相关的部分就这些,其实更复杂更痛苦的更容易犯错的倒是代码之外的东西。
几个注意事项:
1。别忘了在xcode中给你的工程加上StoreKit.framework。官方指南中就一句,make sure link to StoreKit.framework,这句话折腾我半天,我还以为是链接选项呢,找半天没找到,原来是在xcode的Groups & Files窗口(左边的那个列出文件的窗口)中找Frameworks组点右键,Add -> Existing Frameworks... 在弹出对话框中找到StoreKit.framework
2。unity菜单 File-> build settings -> player settings 中 Identification一节中 Bundle Identifier必须要和你在iTunes Connect中建立应用的时候填的bundle identifier一致,一般都是com.yourcompany.appname
3。full walkthrough作者代码中的宏定义kInAppPurchaseProUpgradeProductId对应的字符串需要改成你自己在iTunesConnect中添加Product时设定的id,一般是com.yourcompany.appname.productname,不能丝毫有错,否则Invalid product id
4.在Xcode中project-》edit project settings 中build页,code signing identity->any ios的值必须是你添加app时生成的provisioning profile,即此app专用的provisioning profile,否则 invalid product id,建议删除手机中的其他无关的profile
5。如果消费型产品出现 “您已经购买产品,但尚未下载。。。”,说明事务没有正确结束,如果严格按照我的做法,应该不会出现此问题。
6。碰到各种诡异的问题,实在没辙了,可以考虑从设备中删掉你的应用,重新安装,重启设备等手段。
7。IAP不能在模拟器上运行,直接真机。当然debug或release都行。记得在你的设备上退出你的正式账号,用测试iap一定要用测试账号。测试账号建立请在member center中选择manager users。
8。将下面提供的参考链接通读3遍,有助于避免一些不必要的错误,虽然都很长,但是不要着急,慢慢看。
9。万事不决问google
参考链接:
1。原版的iap walkthrough:
http://troybrant.net/blog/2010/01/in-app-purchases-a-full-walkthrough/
中文链接http://www.cocoachina.com/bbs/read.php?tid-69165-fpage-2.html
2。apple提供的iap教程
http://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/StoreKitGuide/Introduction/Introduction.html
3。apple提供的itunes connect开发者指南(有中文版)
https://itunesconnect.apple.com/docs/iTunesConnect_DeveloperGuide.pdf
4。unity手册中关于插件的部分
http://unity3d.com/support/documentation/Manual/Plugins.html
5。应对xcode 输出 the program being debugged is not being run错误的帖子
http://www.dragdrop.it/devcorner/2010/05/error-from-the-debugger-the-program-being-debugged-is-on-being-run/
分享到:
相关推荐
在IT行业中,Windows Presentation Foundation(WPF)是微软推出的一种用于构建桌面应用程序的框架,而Unity3D则是一个强大的跨平台游戏引擎,广泛应用于游戏开发、虚拟现实(VR)、增强现实(AR)等领域。...
5. 重命名原生项目内的main.m文件后缀为main.mm. 切记 6. 在原生应用的AppDelegate中封装UnityAppController 7.
Unity3D应用嵌入到WPF应用,通过Socket进行消息传输,实现联动控制。MainWindow对应双屏版本示例,DemoWindow对应单屏版本示例,可修改App.xaml中的StartUri进行查看。
在IT领域,将Unity3D游戏引擎嵌入到Windows Forms(WinForm)应用程序中是一种常见的技术结合,可以为用户带来丰富的交互体验。本教程主要关注如何实现这一融合,并且涉及Unity按键事件、WinForm内嵌Unity3D以及...
这种技术可以让开发者在 WinForm 应用程序中嵌入 Unity3D 场景,实现更加丰富的用户体验。 在实现 WinForm 嵌入 Unity3D 场景时,需要使用 UnityWebPlayerControl 控件。在 VS 中,首先需要在 Toolbox 中找到 ...
在这个场景中,我们关注的是"3D WebView for Android and iOS Web Browser 4.2.2",这是一个专门针对Unity 3D的插件,旨在帮助开发者在游戏或应用中嵌入Web内容。 3D WebView插件的主要功能是将标准的HTML5网页集成...
将Unity3D嵌入到WPF中,可以创建出具有强大3D交互功能的桌面应用。 要实现Unity3D地图嵌入WPF,你需要遵循以下步骤: 1. **创建Unity项目**:首先,你需要创建一个Unity项目,并在其中设计和开发地图或任何其他3D...
基于Qt的分析数据软件辅助Unity3D分析模型状态源码 Unity3D是一个比较常见的游戏引擎,可以很方便地驱动游戏模型。但是数据分析似乎不太好,因此,借助Qt框架做一个便于分析数据的软件。以下是做完后展示的效果。 ...
总之,Unity3D与Winform的交互技术为开发者提供了构建创新混合应用的可能,将Unity3D的强大3D渲染能力和Winform的桌面应用程序优势相结合,可以创造出功能丰富、用户体验优良的应用程序。无论是用于游戏开发还是专业...
通过这个视图控制器,用户无需离开当前应用即可查看和购买应用程序、内购项目或订阅。要使用`SKStoreProductViewController`,首先需要导入`StoreKit`框架: ```swift import StoreKit ``` 二、初始化...
在本文中,我们将深入探讨如何实现Winform窗体内嵌Unity3D程序,这是一个结合了桌面应用程序界面(Winform)与游戏引擎(Unity3D)的创新技术。通过这个项目,我们可以实现在Winform窗体中无缝集成Unity3D场景,进行...
在本文中,我们将深入探讨如何在WinForm应用程序中内嵌Unity3D引擎,并实现两者之间的交互。这是一项技术性较强的任务,涉及到多个关键步骤和知识点,让我们逐一解析。 首先,我们要理解Unity3D是一个强大的跨平台...
Unity3D(简称U3D)是一款强大的跨平台游戏开发引擎,它被广泛应用于游戏制作、虚拟现实(VR)、增强现实(AR)以及各种互动应用的开发。在现代的项目中,有时候我们需要在U3D中集成Web页面,以便利用Web前端技术如...
- **多平台支持**:Unity 3D Webview插件支持Android和iOS两大主流移动平台,这意味着你可以创建跨平台的应用程序,无论是在Android设备还是iOS设备上都能顺畅运行。 - **自定义位置和大小**:你可以将Webview嵌入...
Unity3D 是一个功能强大的游戏引擎,可以用于开发各种类型的游戏和应用程序。然而,在某些情况下,我们可能需要在 Unity3D 中调用外部应用程序或网页,以便实现更多的功能。在本文中,我们将讨论如何在 Unity3D 中...
在Unity游戏开发中,将百度Frontia嵌入到iOS应用中是为了实现社交分享功能,同时结合iOS的In-App Purchase(iap)服务,为用户提供在游戏内的购买体验。以下是关于这些知识点的详细说明: 1. **Unity引擎**: ...
在开发过程中,有时我们需要将Unity的内容嵌入到Windows桌面应用中,比如WPF(Windows Presentation Foundation)应用程序,以实现更丰富的用户界面和交互功能。本教程将详细介绍如何在Unity中发布可执行文件(exe)...
在C#的Windows Presentation Foundation(WPF)框架中,开发者经常需要实现将其他应用程序的窗口集成到自己的应用界面中,这种技术通常被称为“嵌入应用程序”或者“窗口嵌入”。这个过程涉及到对操作系统级别的交互...
在iOS应用开发中,可以使用Safari或WKWebView(Web视图框架)将网页内容嵌入到应用程序中。开发者可以通过应用内浏览功能让应用用户在应用程序内部直接查看网页,这增强了应用程序的交互性和用户体验。 在iOS应用...