本文主要是介绍iOS内购IAP(In App Purchases)入门,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
成为ios开发者最大的好处就是,你编写的应用程序会有很多方式可以赚钱。比如,收费版,免费挂广告版,还有就是程序内置购买。
程序内置购买会让你爱不释手,主要有以下原因:
- 相比程序本身的下载收费以,你还可以赚更多的钱。一些用户愿意为那些额外的功能花费更多的金钱!
- 你可以免费发布你的程序(这样的话,用户就可以任意下载了),如果他们喜欢这个程序的话,那么就会有人愿意购买额外功能。
- 在你做完一个程序的时候,你可以在以后的发布版中添加更多的功能,然后这些功能可以用内置购买(这样的话,你就不用为获取更多的利益,再重新制作另一个程序了!)。
我最近正在制作的一个程序里面(Wild Fables,) ,我就决定先把程序免费(其中只包含一个故事),然后把更多的故事放在in-app purchase里面。
我最近正在制作的一个程序里面(Wild Fables,先睹为快!),我决定发布免费的应用,包括一个故事,更多的故事需要付费获取。
在这篇教程里面,你将会学到如何使用程序内置付费来解琐程序里面的本地内容。我将向您展示如何处理应用内购买棘手的异步问题。请谨慎采纳这些建议,因为我的程序也还在开发之中 —— 但是,随着我的知识的积累,我用我获得经验教训来更新教程内容,以确保不误人子弟!:]
这篇教程的前提条件你需要熟悉基本的ios编程概念。如果你还是一个ios开发新手,可以先参考 这些教程 。
In App Rage
那么,本教程将制作一个怎样的程序呢?好吧,在揭晓答案之前,我先介绍一些背景情况。。。
最近,我对 rage comics这玩意儿非常着迷,或者叫做 “F7U12″。如果你以前从没听说过它,它们实际上就是一些非常有趣的漫画,里面有些人非常搞笑和搞怪的人和事。
因此,这篇教程,我们想要叫做“In App Rage”的一个非常小巧的应用,在这个程序里面,用户可以使用内置购买来获得一些漫画。但是,在我们开始编码之前,我们需要先用ios Developer Center和iTunes Connect来为本程序创建一个入口点(a placeholder app entry)。
第一步,就是为这个程序创建一个App ID。所以,登录 iOS Developer Center,选择“App IDs”标签而,然后点击“New App ID”,如下图所示:
你可以按照下面的截图,根据提示输入描述和bundle identifier:
注意,你应该使用自己独特的前缀来修改bundle identifier,使用你自己的域名(如果你有的话),或者如果都不可用的话,根据自己的名字或则其他的独特字符 你需要定义你自己的独一无二的identifier,通常的做法是把你的域名反过来写就行了,然后你也可以基于其它规则来制作啦。
当你完成的时候,点击Submit。好,恭喜你 —— 你现在有一个新的App ID了!现在,你将使用这个ID在iTunes Connect里面来创建一个新的应用了。
首先登录 iTunes Connect,点击“Manage Your Applications”,然后选择“Add New App”,并输入依次App Name,SKU number,同时选择你之前刚刚创建好的Bundle ID。
首先登录 iTunes Connect, 点击“Manage Your Applications”,然后选择 “Add New App”。并输入依次 an App Name, SKU number, 同时选择你之前刚刚创建好的Bundle ID,如下图所示:
你可能必须调整应用程序名称,因为,app名字必须是唯一的,而且我们之前为它添加了一个入口点(entry)。
接下来的两页将要求你输入你的应用程序的一些信息。现在,可以随便填一些内容 —— 之后可以更改内容。但不幸的是,每个带*号的文本框你都必须要填好(包括程序截图,甚至你现在还没有截图,呵呵,造一个吧)。
好吧,让你们看看我对于这个过程的感觉吧,请看下图:
如果你像上面一样出错了,只需要随便填写一些数据就可以了(你可以使用任何图标或者截屏,只要大小合适就行了)。一旦你把所有的错误都解决完以后,你就大功告成啦,oh yeah!
管理 In App Purchases
在你开始编写in app purchase代码之前,你为此创建的placeholder应用程序,同时,你必须在iTunes Connet里面设置好。所以,现在你拥有placeholder应用程序,你现在只需要点击“Manage In App Purchases”按钮就行了,如下图所示:
然后,点击左上角的“Create New”,然后按照下图所示,填写相应的信息:
让我们来解释下这几个文本域的含义吧:
- Reference Name: 这个名字就是在iTunes Connect里面为相应的in-app purchase显示。这个名字你可以随便命名,因为在你的程序里面是看不到它滴。
- Product ID: 在苹果的开发文档里面,这个也叫做“product identifier”,这是一个唯一的字符串,用来标识你的in-app purchase。通常的做法是,使用你的bundle id,然后在最后加一个唯一的字符串表示相应的purchase。
- Type: 你可以选择non-consumable(购买一次,永久使用),comsumable(购买一次,使用一次),或者subscription(自动续款)。本教程中,我们采用non-consumables。
- Cleared for Sale: 当应用程序可用时,这些in-app purchase就可以使用了。
- Price Tier: 设置程序内置购买的价钱。
在你完成上面的设置以后,往下滚动鼠标,然后在Display Detail section部分添加一个English language entry,如下图所示:
稍后,当the in-app purchases可用的时候,当你查询App Store时,会向你返回一些信息。
您可能想知道为什么这一步是必要的(毕竟,你可以在你的应用程序中嵌入这些信息!)好吧,很明显Apple想知道你定的价钱嘛。同时,在App Store里面会根据你填写的这些东西来显示一些信息(比如,内置付费应用排行榜)。最后,如果你这一步设置了,你之后会变得很轻松。因为,它让你不用硬编码这些信息在你的代码之中。而且可以让你动态改变是允许内置购买还是禁止内置购买。
一旦你完成之后,保存entry,然后创建更多,和下面的截图效果类似。不要担心描述信息 —— 在本教程中我们并不会使用它们。
你可能会注意到,这个过程需要花费一段时间,我能够想象,当你的程序有很多内置购买“商品”时,这个创建过程会有多么的烦人!幸运的是,本教程我们体会不到,但是,如果你应用程序真的遇到了这种情况的话,画一个愤怒的漫画,发泄一下吧 :]
提取产品列表(Retrieving Product List)
在你能让用户从你的程序里面购买任何东西之前,你必须向iTunes Connect发送一个查询请求,从服务器上查询可用的产品列表。
我们可以直接在view controller里面添加代码来实现之,但是那样扩展性太不好了,不利于重用。取而代之,我们将创建一个辅助类来管理所有与in-app purchase相关的内容,然后你就可以在你的其它程序里面重用了。
在从服务器上获得产品列表的同时,这个辅助类还会跟踪是否购买了产品。它会将每个已经购买的product identifier保存在NSUserDefaults。
好了,让我们动手实验一下吧!打开XCode,然后选择File\New Project,再选择 iOS\Application\Navigation-based Application,点击Choose。把工程命名为InAppRage,然后点击Save。
接下来,创建IAPHelper类来管理内置付费代码。首先,右击Classes分组,选择File\New File,选择iOS\Cocoa Touch Class\Objective-C class,确保Subclass of NSObject被选中,然后点击Next。把这个文件命名为IAPHelper.m,通过确保“Also create IAPHelper.h” 被选中,然后点击Finish。
我们首先往IAPHelper.m里面添加从iTunes Connect检索产品列表的方法,代码如下:
- (void)requestProducts {self.request = [[[SKProductsRequest alloc] initWithProductIdentifiers:_productIdentifiers] autorelease];_request.delegate = self;[_request start];}
这个方法假设我们已经定义了一个实例变量,叫做 _productIdentifiers ,它包含了product identifiers列表,用来在iTunes Connect中查找(比如,com.raywenderlich.inapprage.drummerrage)。
它然后创建了一个SKProductsRequest实例,这个类是苹果公司定义的,它实现了从iTunes Connect里面提取信息的功能。使用此类灰常easy,你设置这个类的delegate(delegate 实现 SKProductsRequestDelegate中的协议方法),然后就可以调用start方法了。
我们设置IAPHelper类本身作为delegate,那就意味着,产品列表查询完毕时(productsRequest:didReceiveResponse),它会收到一个回调消息。我感到奇怪的是,由于一些原因购买没有成功,并获得错误的回调消息是,我不知道具体怎么处理,所以我稍后用超时处理这些错误 。
Update: erry 在论坛里面指出,SKProductsRequestDelegate协议是从SKRequestDelegate派生而来滴,而SKRequestDelegate协议有一个方法,叫做 request:didFailWithError:,当delegate实现这个方法的时候,你就获得购买失败的信息。如果你想的话,你可以用这个方法替代下面描述的超时方法,感谢Jerry!
好吧,接下来让我们来实现productsRequest:didReceiveResponse 方法吧,具体如下所示:
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {NSLog(@"Received products results..."); self.products = response.products;self.request = nil; [[NSNotificationCenter defaultCenter] postNotificationName:kProductsLoadedNotification object:_products]; }
这个非常简单 —— 它贮存产品列表并返回(是一个SKProducts的数组),然后把request设置为nil(为了释放内存),然后发出一个通知,任何侦听这个通知的对象都会收到这个消息。
接下来添加初始化代码:
- (id)initWithProductIdentifiers:(NSSet *)productIdentifiers {if ((self = [super init])) {// Store product identifiers_productIdentifiers = [productIdentifiers retain];// Check for previously purchased productsNSMutableSet * purchasedProducts = [NSMutableSet set];for (NSString * productIdentifier in _productIdentifiers) {BOOL productPurchased = [[NSUserDefaults standardUserDefaults] boolForKey:productIdentifier];if (productPurchased) {[purchasedProducts addObject:productIdentifier];NSLog(@"Previously purchased: %@", productIdentifier);}NSLog(@"Not purchased: %@", productIdentifier);}self
这篇关于iOS内购IAP(In App Purchases)入门的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!