內(nèi)購(gòu)流程

內(nèi)購(gòu)?fù)暾敿?xì)的流程苗踪,網(wǎng)站如下:

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

具體內(nèi)容

第一印象覺(jué)得In-App Purchase(簡(jiǎn)稱(chēng)IAP)非常簡(jiǎn)單颠区。Apple提供的大量文檔應(yīng)該讓開(kāi)發(fā)者很快熟悉地熟悉。那麼通铲,為什麼在你的應(yīng)用中集成IAP特性就如此令人生厭呢瓦呼?

這是因?yàn)樵陂_(kāi)發(fā)過(guò)程中不可避免會(huì)出現(xiàn)一些錯(cuò)誤。而但這些錯(cuò)誤發(fā)生的時(shí)候,你就抓瞎了央串。雖然Apple提供了有關(guān)IAP的大量文檔,但他們並未提及集 成IAP的詳細(xì)步驟碗啄。而且對(duì)StoreKit集成過(guò)程中出現(xiàn)的問(wèn)題也沒(méi)有一個(gè)核對(duì)清單质和。另外對(duì)於為什麼諸如產(chǎn)品ID非法之類(lèi)的問(wèn)題也沒(méi)有提供 NSError之類(lèi)的對(duì)象來(lái)告訴你原因。

在試用了各種可能的解決方案后稚字,你只能身心疲憊饲宿,彷徨無(wú)助。

為了提高你的效率和減少你的痛苦胆描,我覺(jué)定利用此文來(lái)介紹一下實(shí)現(xiàn)IAP的詳細(xì)步驟瘫想。本文很詳細(xì),有點(diǎn)長(zhǎng)昌讲。甚至可能太長(zhǎng)了国夜,但不像Apple的文檔,它提供了為實(shí)現(xiàn)IAP的每一個(gè)步驟短绸。

廢話少說(shuō)车吹,我們直入主題吧。

概況

IAP能正常工作的秘訣:分成兩個(gè)步驟:

創(chuàng)建及提取產(chǎn)品描述

購(gòu)買(mǎi)產(chǎn)品

第一個(gè)步驟是你可能遇到問(wèn)題的部分醋闭。一旦你在代碼中成功地獲取了產(chǎn)品描述窄驹,編寫(xiě)購(gòu)買(mǎi)產(chǎn)品的代碼不過(guò)是小菜一碟。

我們先看看步驟1证逻。

創(chuàng)建及提取產(chǎn)品描述

下面是有關(guān)創(chuàng)建產(chǎn)品及提取其描述的非常粗略的步驟:

創(chuàng)建唯一的App ID

生成及安裝新的provisioning profile文件

在Xcode中更新 bundle ID 及 code signing profile

如果還沒(méi)做的話乐埠,請(qǐng)?jiān)趇Tunes Connect中提交有關(guān)你程序的 metadata

如果還沒(méi)做的話,請(qǐng)?jiān)趇Tunes Connect中提交你程序的二進(jìn)制碼

為IAP添加新產(chǎn)品

編寫(xiě)提取產(chǎn)品描述的代碼

等待幾小時(shí)

提取產(chǎn)品描述的代碼非常簡(jiǎn)單囚企,但其他步驟則很容易錯(cuò)丈咐。

注意: 為提取產(chǎn)品描述,你並不需要在iTunes Connect中創(chuàng)建IAP測(cè)試用戶洞拨。

1. 創(chuàng)建唯一的App ID

為支持IAP扯罐,你的App ID不能包括通配符(“*”)。為確定你的App Id是否包括通配符烦衣,請(qǐng)登錄http://developer.apple.com/iphone,在 iPhone Developer Program Portal中選擇左邊菜單中的 “App IDs”檢查你的 App ID歹河。

下面是一個(gè)唯一的App ID:

7DW89RZKLY.com.runmonster.runmonsterfree

下面不是一個(gè)唯一的 App ID:

7DW89RZKLY.com.runmonster.*

如果你還沒(méi)有一個(gè)唯一的App ID,按如下步驟創(chuàng)建一個(gè):

(1) 在developer portal中的 App IDs 部分花吟,選擇“New App ID”

(2)填寫(xiě)下列信息:

1)Display name(顯示名): 選取一個(gè)不同的App ID的名稱(chēng)秸歧。你不能編輯或刪除舊的App ID,所以你必須為你的App ID提供一個(gè)新名稱(chēng)以避免混淆衅澈。

2)Prefix(前綴): 生成一個(gè)新的前綴键菱,或者如果你的程序是通過(guò)Keychain Services API分享數(shù)據(jù)的系列程序中之一的話,則選用已存在的前綴今布。

3)Suffix(後綴): com.companyname.appname (這是通用格式 – 注意沒(méi)有使用通配符)经备。

(3)按 “Save”

(4)按 App ID旁的“Configure” 鏈接

(5)選取 “Enable In App Purchase”選擇框

(6)按“Done”

2. 創(chuàng)建一個(gè)新的Provisioning Profile文件

在創(chuàng)建了新的App ID后,你需要生成一個(gè)指向這個(gè)App ID的新provisioning profile拭抬。

下面就是令人痛苦的生成和安裝新provisioning profile的詳細(xì)步驟:

1在 iPhone Developer Portal中, 選擇左邊的Provisioning部分

2確保你處?kù)禗evelopment 標(biāo)籤下, 按下右上角的 “New Profile”

3填入所需信息並指向你剛創(chuàng)建的唯一的App ID

4如果你在Actions條目下看到 “Pending”,那麼請(qǐng)按下“Development”標(biāo)籤標(biāo)題進(jìn)行刷新

5點(diǎn)擊 “Download” 下載新的profile文件

6將profile文件拖入到Dock中Xcode圖標(biāo)上進(jìn)行安裝

7如果你想在硬盤(pán)上保存provisioning profile侵蒙,那麼你可以按如下步驟手工安裝profile:

1)在Xcode中, 選擇 Window > Organizer

2)選擇左邊 “Provisioning Profiles” 分類(lèi)

3)Ctrl-按下profile > Reveal in Finder

4)將新profile拖入到 profile Finder 窗口

3. 更新Xcode 設(shè)置

在Xcode中安裝了 profile 文件后造虎,你需要對(duì)使用此provisiong profile的項(xiàng)目進(jìn)行一些編輯工作:

編輯項(xiàng)目 .plist 文件使其 Bundle ID 與 App ID 匹配。忽略ID開(kāi)始部分的字母數(shù)字序列纷闺。例如算凿,在Developer Portal中你的App ID為“7DW89RZKLY.com.runmonster.runmonsterfree”,那麼在Bundle ID中你只需輸入“com.runmonster.runmonsterfree” 犁功。

編輯項(xiàng)目的 target 信息以使用新的provisioning profile:

選取 Project > Edit Active Target

選取頂部“Build” 標(biāo)籤

選取需要的 configuration (通常為 Debug)

在Code Signing Identity中選擇新的provisioning profile

在Code Signing Identity之下的行中(可能名為 Any iPhone OS Device)選擇新的provisioning profile

4. 添加你的應(yīng)用程序

如果你的程序已經(jīng)發(fā)表到App Store了氓轰,那麼可以略過(guò)此步驟。

在你將產(chǎn)品添加到 iTunes Connect之前浸卦,你必須添加此產(chǎn)品所需的程序署鸡。如果你的程序還沒(méi)有100%完成也無(wú)需擔(dān)心,你可以先提交具有部分?jǐn)?shù)據(jù)的程序镐躲,最後再提交真實(shí)的程序储玫。

注意: 只有 SKU 和 version(版本)部分是以後不可修改的

登錄到 http://developer.apple.com/iphone

點(diǎn)擊右邊鏈接進(jìn)入 iTunes Connect

注意:你必須先登錄到developer.apple.com,否則會(huì)有不測(cè)發(fā)生(譯者註:具體是什麼不測(cè)我也不太清楚萤皂,膽大的請(qǐng)自己試一下)

在 iTunes Connect主頁(yè)點(diǎn)擊 “Manage Your Applications”

在右上角點(diǎn)擊“Create New Application”

填寫(xiě)程序所需的一切信息撒穷。當(dāng)要求程序二進(jìn)制碼時(shí),請(qǐng)選擇稍後上傳選項(xiàng)裆熙。

5. 提交程序二進(jìn)制碼

Apple的文檔中沒(méi)有任何地方提及詳情端礼,但它卻是必須的步驟。要成功測(cè)IAP功能入录,你必須提交程序的二進(jìn)制碼蛤奥。即使你的程序還沒(méi)有100%完成,你仍然需要提交二進(jìn)制碼僚稿。然而凡桥,你也可以立即擯棄你的二進(jìn)制碼,使其不會(huì)進(jìn)入審核階段蚀同。

下面這些步驟非常關(guān)鍵缅刽,我可是因?yàn)樯僮隽四承┎襟E而度過(guò)了一段非常痛苦的時(shí)間:

生成App Store發(fā)佈版程序

如果你不知怎麼做,請(qǐng)?jiān)?iPhone Developer Portal 中點(diǎn)擊左方的 Distribution標(biāo)籤蠢络,並選擇 “Prepare App” 標(biāo)籤衰猛。然後,根據(jù)藍(lán)色鏈接的指示:

獲取iPhone發(fā)行許可證

創(chuàng)建並下載在App Store發(fā)行所需的iPhone Distribution Provisioning Profile

在Xcode中生成程序的發(fā)行版

在iTunes Connect中進(jìn)入程序頁(yè)

選擇 “Upload Binary”

上傳.zip壓縮程序

如果你的程序還沒(méi)有100%完成以進(jìn)行審核刹孔,那麼請(qǐng)點(diǎn)擊iTunes Connect中你程序首頁(yè)中的 “Reject Binary”鏈接啡省。程序的狀態(tài)應(yīng)該更新為 “Developer Rejected”.

不用擔(dān)心,由於程序的狀態(tài)是“Developer Rejected”,Apple是不會(huì)對(duì)其進(jìn)行審核的卦睹。你可以在任何時(shí)候提交程序的新版本並使其狀態(tài)為“Developer Rejected”畦戒,這不會(huì)對(duì)以後程序正式提交的等待時(shí)間有任何影響。

6. 添加產(chǎn)品

完成了以上所有步驟后分预,我們最終可以向iTunes Connect中添加產(chǎn)品了兢交。

確保登錄到 http://developer.apple.com/iphone

進(jìn)入 iTunes Connect 主頁(yè)

點(diǎn)擊 “Manage Your in App Purchases” 鏈接

點(diǎn)擊 “Create New”

選擇你的程序

填寫(xiě)下列產(chǎn)品信息:

Reference Name(參考名稱(chēng)): 產(chǎn)品的通用名稱(chēng)。比如笼痹,我使用的是 “Pro Upgrade”。此名稱(chēng)是不允許進(jìn)行編輯的酪穿,它不會(huì)顯示於App Store中凳干。

Product ID(產(chǎn)品ID): 你產(chǎn)品的唯一id晨横。通常格式是 com.company.appname.product咆贬,但它可以說(shuō)任何形式。它並不要求以程序的App ID作為前綴切油。

Type(類(lèi)型): 有三種選擇

Non-consumable(非消耗品): 僅需付費(fèi)一次 (例如你希望將出現(xiàn)從免費(fèi)版升級(jí)為專(zhuān)業(yè)版)

Consumable(消耗品): 每次下載都需要付費(fèi)

Subscription(預(yù)訂): 循環(huán)反覆

Price Tier(價(jià)格等級(jí)): 產(chǎn)品價(jià)格只磷。參見(jiàn)不同等級(jí)的價(jià)格列表经磅。

Cleared for Sale(等待銷(xiāo)售): 一定要選取此項(xiàng),否則的話钮追,測(cè)試時(shí)會(huì)發(fā)生非法產(chǎn)品ID的錯(cuò)誤预厌。

Language to Add(增加的語(yǔ)言): 選一項(xiàng)。下列兩項(xiàng)將出現(xiàn):

Displayed Name(顯示名稱(chēng)): 用戶看到的產(chǎn)品名稱(chēng)元媚。比如我選擇 “Upgrade to Pro”轧叽。

Description(描述): 對(duì)產(chǎn)品進(jìn)行描述。此處輸入的文本將與Displayed Name 及 Price 一起在你代碼中提取 SKProduct時(shí)出現(xiàn)刊棕。

Screenshot(截屏): 展示你產(chǎn)品的截屏炭晒。儘管屏幕上會(huì)顯示“提交截屏?xí)|發(fā)產(chǎn)品審核過(guò)程”之類(lèi)的文字(個(gè)人拙見(jiàn),這是非常糟糕的設(shè)計(jì))甥角,你還是可以安全地提交截屏而不會(huì)使產(chǎn)品 進(jìn)入審核過(guò)程网严。存儲(chǔ)后,選擇“Submit with app binary” (隨程序二進(jìn)制碼一起提交)選項(xiàng)嗤无。是產(chǎn)品與程序二進(jìn)制綁定在一起震束,所以在你最後正式提交100%完成的程序二進(jìn)制碼時(shí),產(chǎn)品也會(huì)隨之提交翁巍。

點(diǎn)擊 “Save”

7. 編寫(xiě)代碼

下面我們開(kāi)始編寫(xiě)代碼對(duì)剛加入到iTunes Connect中的產(chǎn)品信息進(jìn)行提取驴一。我訪問(wèn)產(chǎn)品數(shù)據(jù),我們需要使用 StoreKit framework灶壶。

注意: StoreKit 無(wú)法在模擬器上工作肝断。你必須在真機(jī)上進(jìn)行測(cè)試。

1.添加 StoreKit framework 到你的項(xiàng)目中。

2.添加SKProduct引用到你的 .h 文件中:



上面代碼有幾點(diǎn)需要注意:指定產(chǎn)品id時(shí)胸懈,你必須使用完整產(chǎn)品id担扑。例如,上例中使用 “com.runmonster.runmonsterfree.upgradetopro”趣钱。僅使用 “upgradetopro” 將不會(huì)正常工作涌献。如果在productsRequest:didReceiveResponse:中response.products 為 nil,而你的產(chǎn)品id出現(xiàn)於 response.invalidProductIdentifers 數(shù)組中時(shí)首有,那麼請(qǐng)做好心理準(zhǔn)備開(kāi)始一場(chǎng)徒勞的搜索戰(zhàn)吧燕垃。 StoreKit API沒(méi)有提供任何幫助,也沒(méi)有任何指示關(guān)於為什麼你的id是無(wú)效的井联。很可愛(ài)卜壕,不是嗎?SKProduct類(lèi)提供了有關(guān)程序標(biāo)題和描述的本地化版本烙常,但是價(jià)格則沒(méi)有本地化版本轴捎。下面是針對(duì)此疏忽提供的代碼:12345678910// SKProduct+LocalizedPrice.h#import#import@interface SKProduct (LocalizedPrice)

@property (nonatomic, readonly) NSString *localizedPrice;

@end

// SKProduct+LocalizedPrice.m

#import "SKProduct+LocalizedPrice.h"

@implementation SKProduct (LocalizedPrice)

- (NSString *)localizedPrice

{

NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];

[numberFormatter setFormatterBehavior:NSNumberFormatterBehavior10_4];

[numberFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];

[numberFormatter setLocale:self.priceLocale];

NSString *formattedString = [numberFormatter stringFromNumber:self.price];

[numberFormatter release];

return formattedString;

}

@end

加入上述代碼,測(cè)試一下蚕脏。你應(yīng)該在控制臺(tái)窗口中看見(jiàn)產(chǎn)品信息了侦副。然而更大的可能是,你得到了一個(gè)無(wú)效的產(chǎn)品id驼鞭。我下一篇文章將介紹怎樣對(duì)這個(gè)問(wèn)題進(jìn)行調(diào)試秦驯。但是,下面的步驟8有可能是阻礙你前進(jìn)的障礙终议。

8. 等待幾小時(shí)遵循了上述所有步驟汇竭,但是你的產(chǎn)品仍然是無(wú)效的?你是否兩次穴张,三次细燎,四次不懈努力地確認(rèn)你是否遵循了上面提到的每個(gè)步驟?你是否已經(jīng)對(duì)網(wǎng)上IAP信息少得可憐而感到絕望皂甘?那麼玻驻,你應(yīng)該等待。你的產(chǎn)品要進(jìn)入iTunes Connect使得Apple準(zhǔn)備好沙箱環(huán)境需要一些時(shí)間偿枕。對(duì)於我而言璧瞬,我是經(jīng)過(guò)了無(wú)數(shù)次產(chǎn)品無(wú)效錯(cuò)誤的絕望。而在24小時(shí)后渐夸,我沒(méi)有修改任何一行代碼嗤锉, 但產(chǎn)品id變?yōu)橛行АN艺J(rèn)為要使產(chǎn)品發(fā)佈到Apple的網(wǎng)絡(luò)系統(tǒng)需要幾個(gè)小時(shí)的時(shí)間墓塌,但如果你有時(shí)間的話瘟忱,你可以像我一樣等上24個(gè)小時(shí)奥额。購(gòu)買(mǎi)產(chǎn)品至此你應(yīng)該已經(jīng)成功地獲取了 SKProduct 描述。比較而言访诱,支持購(gòu)買(mǎi)產(chǎn)品相對(duì)簡(jiǎn)單些垫挨。僅需下面三個(gè)步驟:編寫(xiě)代碼支持事務(wù)(transaction)在iTunes Connect中添加程序測(cè)試用戶在設(shè)備中登錄你的 iTunes Store 帳號(hào)購(gòu)買(mǎi)測(cè)試我們從編寫(xiě)支持事務(wù)所需代碼開(kāi)始。1. 編寫(xiě)代碼支持事務(wù)首先注意:你將負(fù)責(zé)開(kāi)發(fā)產(chǎn)品購(gòu)買(mǎi)的用戶界面触菜。StoreKit 未提供任何與用戶界面相關(guān)的元素九榔。如果你希望你的購(gòu)買(mǎi)用戶界面與App Store一樣,那麼你要自己完成涡相。下面所有代碼都是有關(guān)事務(wù)處理的後臺(tái)部分哲泊。這是一個(gè)單獨(dú)的類(lèi)只有一條簡(jiǎn)單的API以供外部類(lèi)(比如view controller)調(diào)用進(jìn)行購(gòu)買(mǎi)。如果你找到將其集成到你程序的購(gòu)買(mǎi)部分的方法催蝗,那麼我推薦你使用類(lèi)似方案攻旦。首先,需要遵循 SKPaymentTransactionObserver 協(xié)議:12345678910111213141516171819// InAppPurchaseManager.h// add a couple notifications sent out when the transaction completes#define kInAppPurchaseManagerTransactionFailedNotification @"kInAppPurchaseManagerTransactionFailedNotification"#define kInAppPurchaseManagerTransactionSucceededNotification @"kInAppPurchaseManagerTransactionSucceededNotification"…@interface InAppPurchaseManager : NSObject{

}

// public methods

- (void)loadStore;

- (BOOL)canMakePurchases;

- (void)purchaseProUpgrade;

@end

上面我們定義了兩個(gè)新的notification生逸,它們將作為購(gòu)買(mǎi)事務(wù)的結(jié)果被發(fā)送。在上例中我們?nèi)匀皇褂门c獲取產(chǎn)品描述同一個(gè)InAppPurchaseManager類(lèi)且预。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

// InAppPurchaseManager.m

#define kInAppPurchaseProUpgradeProductId @"com.runmonster.runmonsterfree.upgradetopro"

#pragma -

#pragma Public methods

//

// call this method once on startup

//

- (void)loadStore

{

// restarts any purchases if they were interrupted last time the app was open

[[SKPaymentQueue defaultQueue] addTransactionObserver:self];

// get the product description (defined in early sections)

[self requestProUpgradeProductData];

}

//

// call this before making a purchase

//

- (BOOL)canMakePurchases

{

return [SKPaymentQueue canMakePayments];

}

//

// kick off the upgrade transaction

//

- (void)purchaseProUpgrade

{

SKPayment *payment = [SKPayment paymentWithProductIdentifier:kInAppPurchaseProUpgradeProductId];

[[SKPaymentQueue defaultQueue] addPayment:payment];

}

#pragma -

#pragma Purchase helpers

//

// saves a record of the transaction by storing the receipt to disk

//

- (void)recordTransaction:(SKPaymentTransaction *)transaction

{

if ([transaction.payment.productIdentifier isEqualToString:kInAppPurchaseProUpgradeProductId])

{

// save the transaction receipt to disk

[[NSUserDefaults standardUserDefaults] setValue:transaction.transactionReceipt forKey:@"proUpgradeTransactionReceipt" ];

[[NSUserDefaults standardUserDefaults] synchronize];

}

}

//

// enable pro features

//

- (void)provideContent:(NSString *)productId

{

if ([productId isEqualToString:kInAppPurchaseProUpgradeProductId])

{

// enable the pro features

[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"isProUpgradePurchased" ];

[[NSUserDefaults standardUserDefaults] synchronize];

}

}

//

// removes the transaction from the queue and posts a notification with the transaction result

//

- (void)finishTransaction:(SKPaymentTransaction *)transaction wasSuccessful:(BOOL)wasSuccessful

{

// remove the transaction from the payment queue.

[[SKPaymentQueue defaultQueue] finishTransaction:transaction];

NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:transaction, @"transaction" , nil];

if (wasSuccessful)

{

// send out a notification that we’ve finished the transaction

[[NSNotificationCenter defaultCenter] postNotificationName:kInAppPurchaseManagerTransactionSucceededNotification object:self userInfo:userInfo];

}

else

{

// send out a notification for the failed transaction

[[NSNotificationCenter defaultCenter] postNotificationName:kInAppPurchaseManagerTransactionFailedNotification object:self userInfo:userInfo];

}

}

//

// called when the transaction was successful

//

- (void)completeTransaction:(SKPaymentTransaction *)transaction

{

[self recordTransaction:transaction];

[self provideContent:transaction.payment.productIdentifier];

[self finishTransaction:transaction wasSuccessful:YES];

}

//

// called when a transaction has been restored and and successfully completed

//

- (void)restoreTransaction:(SKPaymentTransaction *)transaction

{

[self recordTransaction:transaction.originalTransaction];

[self provideContent:transaction.originalTransaction.payment.productIdentifier];

[self finishTransaction:transaction wasSuccessful:YES];

}

//

// called when a transaction has failed

//

- (void)failedTransaction:(SKPaymentTransaction *)transaction

{

if (transaction.error.code != SKErrorPaymentCancelled)

{

// error!

[self finishTransaction:transaction wasSuccessful:NO];

}

else

{

// this is fine, the user just cancelled, so don’t notify

[[SKPaymentQueue defaultQueue] finishTransaction:transaction];

}

}

#pragma mark -

#pragma mark SKPaymentTransactionObserver methods

//

// called when the transaction status is updated

//

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions

{

for (SKPaymentTransaction *transaction in transactions)

{

switch (transaction.transactionState)

{

case SKPaymentTransactionStatePurchased:

[self completeTransaction:transaction];

break;

case SKPaymentTransactionStateFailed:

[self failedTransaction:transaction];

break;

case SKPaymentTransactionStateRestored:

[self restoreTransaction:transaction];

break;

default:

break;

}

}

}

要測(cè)試上面的新代碼槽袄,你還需要編寫(xiě)調(diào)用 loadStore, canMakePurchases 以及 purchaseProUpgrade 方法的代碼。

有關(guān)上述代碼的詳細(xì)解釋?zhuān)?qǐng)參考官方 In App Purchase Programming Guide (IAP編程指南)

上述代碼有幾個(gè)部分是針對(duì)我的程序的锋谐。例如遍尺,在 provideContent:中,NSUserDefaults 中的@”isProUpgradePurchased” BOOL 字段被設(shè)定為 YES涮拗。程序的其他部分將檢查此BOOL值以確定是否需要啟動(dòng)專(zhuān)業(yè)版功能乾戏。如果你正好也要實(shí)現(xiàn)免費(fèi)升級(jí)專(zhuān)業(yè)版的功能,那麼你可以使用同樣的方法三热。

2. 添加測(cè)試用戶

為測(cè)試上述代碼鼓择,你需要在 iTunes Connect 中創(chuàng)建測(cè)試用戶以對(duì)IAP功能進(jìn)行測(cè)試。你可以使用測(cè)試帳號(hào)購(gòu)買(mǎi)產(chǎn)品而不被Apple收取費(fèi)用就漾。

按以下步驟創(chuàng)建測(cè)試用戶:

登錄到 http://developer.apple.com/iphone

進(jìn)入 iTunes Connect

選擇iTunes Connect首頁(yè)中的 “Manage Users”

選擇 “In App Purchase Test User”

選擇 “Add New User”

填入用戶信息. 所有信息都不必是合法的呐能。建議使用虛假簡(jiǎn)短的email地址及簡(jiǎn)短的密碼。

選擇 “Save”

測(cè)試時(shí)你需要輸入這些email地址和密碼抑堡。

3. 在你的設(shè)備中退出登錄

在進(jìn)行程序購(gòu)買(mǎi)功能測(cè)試前摆出,你必須在你的設(shè)備中退出iTunes Store。遵循以下步驟:

打開(kāi)Settings App

點(diǎn)擊 “Store” 行

點(diǎn)擊 “Sign Out”

4. 購(gòu)買(mǎi)測(cè)試

現(xiàn)在首妖,終於可以開(kāi)始進(jìn)行IAP功能的測(cè)試了偎漫。測(cè)試很簡(jiǎn)單:

運(yùn)行你設(shè)備中的程序

進(jìn)行購(gòu)買(mǎi)

當(dāng)程序提示輸入用戶名和密碼時(shí),輸入?yún)?shù)用戶的信息

如果你使用同一賬戶進(jìn)行購(gòu)買(mǎi)時(shí)有缆,系統(tǒng)將提示你已經(jīng)購(gòu)買(mǎi)了此產(chǎn)品象踊。按“Yes”就可以再次下載此產(chǎn)品温亲。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市通危,隨后出現(xiàn)的幾起案子铸豁,更是在濱河造成了極大的恐慌,老刑警劉巖菊碟,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件节芥,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡逆害,警方通過(guò)查閱死者的電腦和手機(jī)头镊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)魄幕,“玉大人相艇,你說(shuō)我怎么就攤上這事〈吭桑” “怎么了坛芽?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)翼抠。 經(jīng)常有香客問(wèn)我咙轩,道長(zhǎng),這世上最難降的妖魔是什么阴颖? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任活喊,我火速辦了婚禮,結(jié)果婚禮上量愧,老公的妹妹穿的比我還像新娘钾菊。我一直安慰自己,他們只是感情好偎肃,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布煞烫。 她就那樣靜靜地躺著,像睡著了一般软棺。 火紅的嫁衣襯著肌膚如雪红竭。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,301評(píng)論 1 301
  • 那天喘落,我揣著相機(jī)與錄音茵宪,去河邊找鬼。 笑死瘦棋,一個(gè)胖子當(dāng)著我的面吹牛稀火,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播赌朋,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼凰狞,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼篇裁!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起赡若,我...
    開(kāi)封第一講書(shū)人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤达布,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后逾冬,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體黍聂,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年身腻,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了产还。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡嘀趟,死狀恐怖脐区,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情她按,我是刑警寧澤牛隅,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站酌泰,受9級(jí)特大地震影響倔叼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜宫莱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望哩罪。 院中可真熱鬧授霸,春花似錦、人聲如沸际插。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)框弛。三九已至辛辨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間瑟枫,已是汗流浹背斗搞。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留慷妙,地道東北人僻焚。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像膝擂,于是被迫代替她去往敵國(guó)和親虑啤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子隙弛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容