In App PurchasesIAP 应用程序内购买完全攻略.docx
- 文档编号:10155418
- 上传时间:2023-05-24
- 格式:DOCX
- 页数:18
- 大小:24.99KB
In App PurchasesIAP 应用程序内购买完全攻略.docx
《In App PurchasesIAP 应用程序内购买完全攻略.docx》由会员分享,可在线阅读,更多相关《In App PurchasesIAP 应用程序内购买完全攻略.docx(18页珍藏版)》请在冰点文库上搜索。
InAppPurchasesIAP应用程序内购买完全攻略
InAppPurchases(IAP应用程序內购买):
完全攻略
原文:
参考:
第一印象觉得In-AppPurchase(简称IAP)非常简单。
Apple提供的大量文档应该让开发者很快熟悉地熟悉。
那麽,为什麽在你的应用中集成IAP特性就如此令人生厌呢?
这是因为在开发过程中不可避免会出现一些错误。
而但这些错误发生的时候,你就抓瞎了。
虽然Apple提供了有关IAP的大量文档,但他们并未提及集成IAP的详细步骤。
而且对StoreKit集成过程中出现的问题也没有一个核对清单。
另外对于为什麽诸如产品ID非法之类的问题也没有提供NSError之类的对象来告诉你原因。
在试用了各种可能的解决方桉后,你只能身心疲惫,彷徨无助。
为了提高你的效率和减少你的痛苦,我觉定利用此文来介绍一下实现IAP的详细步骤。
本文很详细,有点长。
甚至可能太长了,但不像Apple的文档,它提供了为实现IAP的每一个步骤。
废话少说,我们直入主题吧。
概况
IAP能正常工作的秘诀:
分成两个步骤:
创建及提取产品描述
购买产品
第一个步骤是你可能遇到问题的部分。
一旦你在代码中成功地获取了产品描述,编写购买产品的代码不过是小菜一碟。
我们先看看步骤1。
创建及提取产品描述
下面是有关创建产品及提取其描述的非常粗略的步骤:
创建唯一的AppID
生成及安装新的provisioningprofile文件
在Xcode中更新bundleID及codesigningprofile
如果还没做的话,请在iTunesConnect中提交有关你程序的metadata
如果还没做的话,请在iTunesConnect中提交你程序的二进制码
为IAP添加新产品
编写提取产品描述的代码
等待几小时
提取产品描述的代码非常简单,但其他步骤则很容易错。
注意:
为提取产品描述,你并不需要在iTunesConnect中创建IAP测试用户。
1.创建唯一的AppID
为支持IAP,你的AppID不能包括通配符(“*”)。
为确定你的AppId是否包括通配符,请登录iPhoneDeveloperProgramPortal中选择左边菜单中的“AppIDs”检查你的AppID。
下面是一个唯一的AppID:
7DW89RZKLY.com.runmonster.runmonsterfree
下面不是一个唯一的AppID:
7DW89RZKLY.com.runmonster.*
如果你还没有一个唯一的AppID,按如下步骤创建一个:
在developerportal中的AppIDs部分,选择“NewAppID”
填写下列信息:
Displayname(显示名):
选取一个不同的AppID的名称。
你不能编辑或删除旧的AppID,所以你必须为你的AppID提供一个新名称以避免溷淆。
Prefix(前缀):
生成一个新的前缀,或者如果你的程序是通过KeychainServicesAPI分享数据的系列程序中之一的话,则选用已存在的前缀。
Suffix(后缀):
panyname.appname(这是通用格式–注意没有使用通配符)。
按“Save”
按AppID旁的“Configure”链接
选取“EnableInAppPurchase”选择框
按“Done”
2.创建一个新的ProvisioningProfile文件
在创建了新的AppID后,你需要生成一个指向这个AppID的新provisioningprofile。
下面就是令人痛苦的生成和安装新provisioningprofile的详细步骤:
在iPhoneDeveloperPortal中,选择左边的Provisioning部分
确保你处于Development标籤下,按下右上角的“NewProfile”
填入所需信息并指向你刚创建的唯一的AppID
如果你在Actions条目下看到“Pending”,那麽请按下“Development”标籤标题进行刷新
点击“Download”下载新的profile文件
将profile文件拖入到Dock中Xcode图标上进行安装
如果你想在硬盘上保存provisioningprofile,那麽你可以按如下步骤手工安装profile:
在Xcode中,选择Window>Organizer
选择左边“ProvisioningProfiles”分类
Ctrl-按下profile>RevealinFinder
将新profile拖入到profileFinder窗口
3.更新Xcode设置
在Xcode中安装了profile文件后,你需要对使用此provisiongprofile的项目进行一些编辑工作:
编辑项目.plist文件使其BundleID与AppID匹配。
忽略ID开始部分的字母数字序列。
例如,在DeveloperPortal中你的AppID为“7DW89RZKLY.com.runmonster.runmonsterfree”,那麽在BundleID中你只需输入“com.runmonster.runmonsterfree”。
编辑项目的target信息以使用新的provisioningprofile:
选取Project>EditActiveTarget
选取顶部“Build”标籤
选取需要的configuration(通常为Debug)
在CodeSigningIdentity中选择新的provisioningprofile
在CodeSigningIdentity之下的行中(可能名为AnyiPhoneOSDevice)选择新的provisioningprofile
4.添加你的应用程序
如果你的程序已经发表到AppStore了,那麽可以略过此步骤。
在你将产品添加到iTunesConnect之前,你必须添加此产品所需的程序。
如果你的程序还没有100%完成也无需担心,你可以先提交具有部分数据的程序,最后再提交真实的程序。
注意:
只有SKU和version(版本)部分是以后不可修改的
登录到
点击右边链接进入iTunesConnect
注意:
你必须先登录到,否则会有不测发生(译者注:
具体是什麽不测我也不太清楚,胆大的请自己试一下)
在iTunesConnect主页点击“ManageYourApplications”
在右上角点击“CreateNewApplication”
填写程序所需的一切信息。
当要求程序二进制码时,请选择稍后上传选项。
5.提交程序二进制码
Apple的文档中没有任何地方提及详情,但它却是必须的步骤。
要成功测IAP功能,你必须提交程序的二进制码。
即使你的程序还没有100%完成,你仍然需要提交二进制码。
然而,你也可以立即摈弃你的二进制码,使其不会进入审核阶段。
下面这些步骤非常关键,我可是因为少做了某些步骤而度过了一段非常痛苦的时间:
生成AppStore发佈版程序
如果你不知怎麽做,请在iPhoneDeveloperPortal中点击左方的Distribution标籤,并选择“PrepareApp”标籤。
然后,根据蓝色链接的指示:
获取iPhone发行许可证
创建并下载在AppStore发行所需的iPhoneDistributionProvisioningProfile
在Xcode中生成程序的发行版
在iTunesConnect中进入程序页
选择“UploadBinary”
上传.zip压缩程序
如果你的程序还没有100%完成以进行审核,那麽请点击iTunesConnect中你程序首页中的“RejectBinary”链接。
程序的状态应该更新为“DeveloperRejected”.
不用担心,由于程序的状态是“DeveloperRejected”,Apple是不会对其进行审核的。
你可以在任何时候提交程序的新版本并使其状态为“DeveloperRejected”,这不会对以后程序正式提交的等待时间有任何影响。
6.添加产品
完成了以上所有步骤后,我们最终可以向iTunesConnect中添加产品了。
确保登录到
进入iTunesConnect主页
点击“ManageYourinAppPurchases”链接
点击“CreateNew”
选择你的程序
填写下列产品信息:
ReferenceName(参考名称):
产品的通用名称。
比如,我使用的是“ProUpgrade”。
此名称是不允许进行编辑的,它不会显示于AppStore中。
ProductID(产品ID):
你产品的唯一id。
通常格式是pany.appname.product,但它可以说任何形式。
它并不要求以程序的AppID作为前缀。
Type(类型):
有三种选择
Non-consumable(非消耗品):
仅需付费一次(例如你希望将出现从免费版升级为专业版)
Consumable(消耗品):
每次下载都需要付费
Subscription(预订):
循环反覆
PriceTier(价格等级):
产品价格。
参见不同等级的价格列表。
ClearedforSale(等待销售):
一定要选取此项,否则的话,测试时会发生非法产品ID的错误。
LanguagetoAdd(增加的语言):
选一项。
下列两项将出现:
DisplayedName(显示名称):
用户看到的产品名称。
比如我选择“UpgradetoPro”。
Description(描述):
对产品进行描述。
此处输入的文本将与DisplayedName及Price一起在你代码中提取SKProduct时出现。
Screenshot(截屏):
展示你产品的截屏。
儘管屏幕上会显示“提交截屏会触发产品审核过程”之类的文字(个人拙见,这是非常糟糕的设计),你还是可以安全地提交截屏而不会使产品进入审核过程。
存储后,选择“Submitwithappbinary”(随程序二进制码一起提交)选项。
是产品与程序二进制绑定在一起,所以在你最后正式提交100%完成的程序二进制码时,产品也会随之提交。
点击“Save”
7.编写代码
下面我们开始编写代码对刚加入到iTunesConnect中的产品信息进行提取。
我访问产品数据,我们需要使用StoreKitframework。
注意:
StoreKit无法在模拟器上工作。
你必须在真机上进行测试。
1.添加StoreKitframework到你的项目中。
2.添加SKProduct引用到你的.h文件中:
1复制代码//InAppPurchaseManager.h
2#import
3#definekInAppPurchaseManagerProductsFetchedNotification@"kInAppPurchaseManagerProductsFetchedNotification"
4@interfaceInAppPurchaseManager:
NSObject
5{
6SKProduct*proUpgradeProduct;
7SKProductsRequest*productsRequest;
8}
注意:
InAppPurchaseManager是一个单例类,它处理程序中所有IAP任务。
它是本文中的示例程序。
3.产品请求,并在相应.m文件中实现代理协议:
9复制代码//InAppPurchaseManager.m
10-(void)requestProUpgradeProductData
11{
12NSSet*productIdentifiers=[NSSetsetWithObject:
@"com.runmonster.runmonsterfree.upgradetopro"];
13productsRequest=[[SKProductsRequestalloc]initWithProductIdentifiers:
productIdentifiers];
14productsRequest.delegate=self;
15[productsRequeststart];
16
17//wewillreleasetherequestobjectinthedelegatecallback
18}
19#pragmamark-
20#pragmamarkSKProductsRequestDelegatemethods
21-(void)productsRequest:
(SKProductsRequest*)requestdidReceiveResponse:
(SKProductsResponse*)response
22{
23NSArray*products=response.products;
24proUpgradeProduct=[productscount]==1?
[[productsfirstObject]retain]:
nil;
25if(proUpgradeProduct)
26{
27NSLog(@"Producttitle:
%@",proUpgradeProduct.localizedTitle);
28NSLog(@"Productdescription:
%@",proUpgradeProduct.localizedDescription);
29NSLog(@"Productprice:
%@",proUpgradeProduct.price);
30NSLog(@"Productid:
%@",proUpgradeProduct.productIdentifier);
31}
32
33for(NSString*invalidProductIdinresponse.invalidProductIdentifiers)
34{
35NSLog(@"Invalidproductid:
%@",invalidProductId);
36}
37
38//finallyreleasethereqestwealloc/init’edinrequestProUpgradeProductData
39[productsRequestrelease];
40
41[[NSNotificationCenterdefaultCenter]postNotificationName:
kInAppPurchaseManagerProductsFetchedNotificationobject:
selfuserInfo:
nil];
42}
上面代码有几点需要注意:
指定产品id时,你必须使用完整产品id。
例如,上例中使用“com.runmonster.runmonsterfree.upgradetopro”。
仅使用“upgradetopro”将不会正常工作。
如果在productsRequest:
didReceiveResponse:
中response.products为nil,而你的产品id出现于response.invalidProductIdentifers数组中时,那麽请做好心理准备开始一场徒劳的搜索战吧。
StoreKitAPI没有提供任何帮助,也没有任何指示关于为什麽你的id是无效的。
很可爱,不是吗?
SKProduct类提供了有关程序标题和描述的本地化版本,但是价格则没有本地化版本。
下面是针对此疏忽提供的代码:
43复制代码//SKProduct+LocalizedPrice.h
44#import
45#import
46@interfaceSKProduct(LocalizedPrice)
47@property(nonatomic,readonly)NSString*localizedPrice;
48@end
49复制代码//SKProduct+LocalizedPrice.m
50#import"SKProduct+LocalizedPrice.h"
51@implementationSKProduct(LocalizedPrice)
52-(NSString*)localizedPrice
53{
54NSNumberFormatter*numberFormatter=[[NSNumberFormatteralloc]init];
55[numberFormattersetFormatterBehavior:
NSNumberFormatterBehavior10_4];
56[numberFormattersetNumberStyle:
NSNumberFormatterCurrencyStyle];
57[numberFormattersetLocale:
self.priceLocale];
58NSString*formattedString=[numberFormatterstringFromNumber:
self.price];
59[numberFormatterrelease];
60returnformattedString;
61}
62@end
加入上述代码,测试一下。
你应该在控制台窗口中看见产品信息了。
然而更大的可能是,你得到了一个无效的产品id。
我下一篇文章将介绍怎样对这个问题进行调试。
但是,下面的步骤8有可能是阻碍你前进的障碍。
8.等待几小时
遵循了上述所有步骤,但是你的产品仍然是无效的?
你是否两次,三次,四次不懈努力地确认你是否遵循了上面提到的每个步骤?
你是否已经对网上IAP信息少得可怜而感到绝望?
那麽,你应该等待。
你的产品要进入iTunesConnect使得Apple准备好沙箱环境需要一些时间。
对于我而言,我是经过了无数次产品无效错误的绝望。
而在24小时后,我没有修改任何一行代码,但产品id变为有效。
我认为要使产品发佈到Apple的网络系统需要几个小时的时间,但如果你有时间的话,你可以像我一样等上24个小时。
购买产品
至此你应该已经成功地获取了SKProduct描述。
比较而言,支持购买产品相对简单些。
仅需下面三个步骤:
编写代码支持事务(transaction)
在iTunesConnect中添加程序测试用户
在设备中登录你的iTunesStore帐号
购买测试
我们从编写支持事务所需代码开始。
1.编写代码支持事务
首先注意:
你将负责开发产品购买的用户界面。
StoreKit未提供任何与用户界面相关的元素。
如果你希望你的购买用户界面与AppStore一样,那麽你要自己完成。
下面所有代码都是有关事务处理的后台部分。
这是一个单独的类只有一条简单的API以供外部类(比如viewcontroller)调用进行购买。
如果你找到将其集成到你程序的购买部分的方法,那麽我推荐你使用类似方桉。
首先,需要遵循SKPaymentTransactionObserver协议:
63复制代码//InAppPurchaseManager.h
64//addacouplenotificationssentoutwhenthetransactioncompletes
65#definekInAppPurchaseManagerTransactionFailedNotification@"kInAppPurchaseManagerTransactionFailedNotification"
66#definekInAppPurchaseManagerTransactionSucceededNotification@"kInAppPurchaseManagerTransactionSucceededNotification"
67…
68@interfaceInAppPurchaseManager:
NSObject
69{
70…
71}
72//publicmethods
73-(void)loadStore;
74-(BOOL)canMakePurchases;
75-(void)purchaseProUpgrade;
76@end
上面我们定义了两个新的notification,它们将作为购买事务的结果被发送。
在上例中我们仍然使用与获取产品描述同一个InAppPurchaseManager类。
77复制代码//InAppPurchaseManager.m
78#definekInAppPurchaseProUpgradeProductId@"com.runmonster.runmonsterfree.upgradetopro"
79…
80#pragma-
81#pragmaPublicmethods
82//
83//callthismethodonceonstartup
84//
85-(void)loadStore
86{
87//restartsanypurchasesiftheywereinterruptedlasttimetheappwasopen
88[[SKPaymentQueuedefaultQueue]addTransactionObserver:
self];
89
90//gettheproductdescription(definedinearlysections)
91[selfrequestProUpgradeProductData];
92}
93//
94//
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- In App PurchasesIAP 应用程序内购买完全攻略 应用程序 购买 完全 攻略