版本記錄
版本號 | 時間 |
---|---|
V1.0 | 2018.07.24 |
前言
大家都知道,ios虛擬商品如寶石、金幣等都需要走內(nèi)購,和蘋果三七分成,如果這類商品不走內(nèi)購那么上不去架或者上架以后被發(fā)現(xiàn)而被下架。最近有一個項目需要增加內(nèi)購支付功能,所以最近又重新集成并整理了下,希望對大家有所幫助。感興趣的可以參考上面幾篇。
1. iOS內(nèi)購IAP(一) —— 基礎(chǔ)配置篇(一)
2. iOS內(nèi)購IAP(二) —— 工程實踐(一)
3. iOS內(nèi)購IAP(三) —— 編程指南之關(guān)于內(nèi)購(一)
4. iOS內(nèi)購IAP(四) —— 編程指南之設(shè)計您的應(yīng)用程序的產(chǎn)品(一)
Retrieving Product Information - 檢索產(chǎn)品信息
在購買過程的第一部分,您的應(yīng)用程序從App Store檢索有關(guān)其產(chǎn)品的信息,向用戶顯示其商店UI,然后讓用戶選擇產(chǎn)品,如圖2-1所示。
Getting a List of Product Identifiers - 獲取產(chǎn)品標(biāo)識符列表
您在應(yīng)用中銷售的每件商品都有唯一的商品標(biāo)識碼product identifier
。 您的應(yīng)用使用這些產(chǎn)品標(biāo)識符從App Store獲取有關(guān)產(chǎn)品的信息,例如定價,并在用戶購買這些產(chǎn)品時提交付款請求。 您的應(yīng)用可以從其應(yīng)用包中的文件中讀取其產(chǎn)品標(biāo)識符列表,也可以從服務(wù)器中獲取它們。 表2-1總結(jié)了兩種方法之間的差異
Table 2-1 Comparison of approaches for obtaining product identifiers
如果您的應(yīng)用具有固定的產(chǎn)品列表,例如應(yīng)用內(nèi)購買以移除廣告或啟用功能,請將列表嵌入應(yīng)用包中。 如果產(chǎn)品標(biāo)識符列表可以更改而不需要更新您的應(yīng)用程序(例如支持其他級別或字符的游戲),請讓您的應(yīng)用從服務(wù)器獲取列表。
沒有運(yùn)行時機(jī)制來獲取特定應(yīng)用程序在App Store Connect中配置的所有產(chǎn)品的列表。 您負(fù)責(zé)管理應(yīng)用的產(chǎn)品列表并將該信息提供給您的應(yīng)用。 如果您需要管理大量產(chǎn)品,請考慮使用App Store Connect中的批量XML上載/下載功能。
1. Embedding Product IDs in the App Bundle - 在App Bundle中嵌入產(chǎn)品ID
在您的應(yīng)用包中包含一個屬性列表文件,其中包含一系列產(chǎn)品標(biāo)識符,例如:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
<string>com.example.level1</string>
<string>com.example.level2</string>
<string>com.example.rocket_car</string>
</array>
</plist>
要從屬性列表中獲取產(chǎn)品標(biāo)識符,請在應(yīng)用程序包中找到該文件并進(jìn)行讀取。
NSURL *url = [[NSBundle mainBundle] URLForResource:@"product_ids"
withExtension:@"plist"];
NSArray *productIdentifiers = [NSArray arrayWithContentsOfURL:url];
2. Fetching Product IDs from Your Server - 從服務(wù)器獲取產(chǎn)品ID
在服務(wù)器上托管帶有產(chǎn)品標(biāo)識符的JSON文件。 例如:
[
"com.example.level1",
"com.example.level2",
"com.example.rocket_car"
]
要從服務(wù)器獲取產(chǎn)品標(biāo)識符,請獲取并讀取JSON文件,如Listing 2-1
所示。 考慮對JSON文件進(jìn)行版本控制,以便應(yīng)用的未來版本可以更改其結(jié)構(gòu),而不會破壞應(yīng)用的舊版本。 例如,您可以命名使用舊結(jié)構(gòu)products_v1.json
的文件和使用新結(jié)構(gòu)products_v2.json
的文件。 如果您的JSON文件比示例中的簡單數(shù)組更復(fù)雜,這將特別有用。
// Listing 2-1 Fetching product identifiers from your server
- (void)fetchProductIdentifiersFromURL:(NSURL *)url delegate:(id)delegate
{
dispatch_queue_t global_queue =
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(global_queue, ^{
NSError *err;
NSData *jsonData = [NSData dataWithContentsOfURL:url
options:NULL
error:&err];
if (!jsonData) { /* Handle the error */ }
NSArray *productIdentifiers = [NSJSONSerialization
JSONObjectWithData:jsonData options:NULL error:&err];
if (!productIdentifiers) { /* Handle the error */ }
dispatch_queue_t main_queue = dispatch_get_main_queue();
dispatch_async(main_queue, ^{
[delegate displayProducts:productIdentifiers]; // Custom method
});
});
}
有關(guān)使用NSURLConnection
(蘋果已棄用)下載文件的信息,請參閱URL Loading System Programming Guide
中的Using NSURLConnection
。
要確保您的應(yīng)用程序保持響應(yīng),請使用后臺線程下載JSON文件并提取產(chǎn)品標(biāo)識符列表。 要最小化傳輸?shù)臄?shù)據(jù),請使用標(biāo)準(zhǔn)HTTP緩存機(jī)制,例如Last-Modified
和If-Modified-Since
標(biāo)頭header。
Retrieving Product Information - 檢索產(chǎn)品信息
要確保您的用戶只能看到實際可供購買的產(chǎn)品,請在顯示應(yīng)用商店用戶界面之前查詢App Store。
使用產(chǎn)品請求對象查詢App Store。 首先,創(chuàng)建SKProductsRequest的實例,并使用產(chǎn)品標(biāo)識符列表對其進(jìn)行初始化。 一定要保持對請求對象的強(qiáng)引用; 否則,系統(tǒng)可能會在請求完成之前解除分配請求。
產(chǎn)品請求檢索有關(guān)有效產(chǎn)品的信息以及無效產(chǎn)品標(biāo)識符的列表,然后調(diào)用其委托來處理結(jié)果。 委托必須實現(xiàn)SKProductsRequestDelegate協(xié)議來處理來自App Store的響應(yīng)。 Listing 2-2顯示了兩段代碼的簡單實現(xiàn)。
// Listing 2-2 Retrieving product information
// Custom method
- (void)validateProductIdentifiers:(NSArray *)productIdentifiers
{
SKProductsRequest *productsRequest = [[SKProductsRequest alloc]
initWithProductIdentifiers:[NSSet setWithArray:productIdentifiers]];
// Keep a strong reference to the request.
self.request = productsRequest;
productsRequest.delegate = self;
[productsRequest start];
}
// SKProductsRequestDelegate protocol method
- (void)productsRequest:(SKProductsRequest *)request
didReceiveResponse:(SKProductsResponse *)response
{
self.products = response.products;
for (NSString *invalidIdentifier in response.invalidProductIdentifiers) {
// Handle any invalid product identifiers.
}
[self displayStoreUI]; // Custom method
}
當(dāng)用戶購買產(chǎn)品時,您需要相應(yīng)的產(chǎn)品對象來創(chuàng)建付款請求,因此請保留對返回給委托的產(chǎn)品對象數(shù)組的引用。如果您的應(yīng)用程序銷售的產(chǎn)品列表可能會更改,您可能需要創(chuàng)建一個自定義類,其中包含對產(chǎn)品對象的引用以及其他信息(例如,從服務(wù)器獲取的圖片或說明文本)。付款請求將在Requesting Payment中討論。
作為無效返回的產(chǎn)品標(biāo)識符通常表示應(yīng)用程序的產(chǎn)品標(biāo)識符列表中存在錯誤,但這可能意味著該產(chǎn)品尚未在App Store Connect中正確配置。良好的日志記錄和良好的用戶界面可以幫助您更輕松地解決此類問題。在生產(chǎn)版本中,您的應(yīng)用需要優(yōu)雅地失敗 - 通常,這意味著顯示應(yīng)用商店UI的其余部分并省略無效產(chǎn)品。在開發(fā)版本中,顯示錯誤以引起對問題的注意。在生產(chǎn)和開發(fā)構(gòu)建中,使用NSLog將消息寫入控制臺,以便記錄無效標(biāo)識符。如果您的應(yīng)用程序從服務(wù)器獲取列表,您還可以定義一種日志記錄機(jī)制,讓您的應(yīng)用程序?qū)o效標(biāo)識符列表發(fā)送回您的服務(wù)器。
Presenting Your App’s Store UI - 展示您應(yīng)用商店UI
由于您應(yīng)用商店的設(shè)計會對您的應(yīng)用內(nèi)銷售產(chǎn)生重要影響,因此值得投入時間和精力來做到正確。為商店UI設(shè)計用戶界面,使其與應(yīng)用程序的其余部分集成。 StoreKit無法為您提供商店UI。只有您足夠了解您的應(yīng)用及其內(nèi)容,才能以最佳方式展示您的產(chǎn)品并與應(yīng)用的其余部分無縫匹配,從而設(shè)計您的商店用戶界面。
在設(shè)計和實現(xiàn)應(yīng)用商店UI時,請考慮以下準(zhǔn)則。
Display a store only if the user can make payments - 僅在用戶可以付款時才顯示商店。要確定用戶是否可以付款,請調(diào)用SKPaymentQueue類的canMakePayments類方法。如果用戶無法進(jìn)行付款(例如,由于父母的限制),則顯示指示商店不可用的UI或完全省略UI的商店部分。
Present products naturally in the flow of your app - 在您的應(yīng)用程序流程中自然呈現(xiàn)產(chǎn)品。在UI中找到最佳位置以顯示應(yīng)用的商店UI。在用戶可以使用它們時在上下文中呈現(xiàn)產(chǎn)品 - 例如,讓用戶在嘗試使用該高級功能時解鎖功能。特別注意用戶第一次瀏覽應(yīng)用時的體驗。
Organize products so that exploration is easy and enjoyable - 組織產(chǎn)品,使探索變得輕松愉快。如果您的應(yīng)用具有足夠少的產(chǎn)品,您可以在一個屏幕上顯示所有內(nèi)容;否則,對產(chǎn)品進(jìn)行分組或分類,使其易于導(dǎo)航。具有大量產(chǎn)品的應(yīng)用程序(例如漫畫書閱讀器或具有許多問題的雜志)尤其受益于使用戶能夠輕松發(fā)現(xiàn)他們想要購買的新項目的界面。通過為產(chǎn)品提供不同的名稱和視覺效果來明確產(chǎn)品之間的差異 - 如有必要,請包括明確的比較。
Communicate the value of your products to your users - 向用戶傳達(dá)產(chǎn)品的價值。用戶想要確切地知道他們將要購買什么。將App Store中的信息(例如產(chǎn)品價格和說明)與來自服務(wù)器或應(yīng)用程序包的其他數(shù)據(jù)(例如產(chǎn)品的圖像或演示)相結(jié)合。在購買產(chǎn)品之前,讓用戶以有限的方式與產(chǎn)品互動。例如,給用戶提供購買新賽車選項的游戲可以允許用戶使用新車進(jìn)行測試。同樣,一個允許用戶購買額外畫筆的繪圖應(yīng)用程序可以讓用戶有機(jī)會在小便箋簿上使用新畫筆進(jìn)行繪制,并查看畫筆之間的區(qū)別。這種設(shè)計為用戶提供了體驗產(chǎn)品的機(jī)會,并確信他們想要購買產(chǎn)品。
Display prices clearly, using the locale and currency returned by the App Store - 使用App Store返回的區(qū)域設(shè)置和貨幣清楚地顯示價格。確保產(chǎn)品價格易于查找且易于閱讀。即使用戶的區(qū)域設(shè)置和價格的區(qū)域設(shè)置不同,也不要嘗試將價格轉(zhuǎn)換為UI中的其他貨幣。例如,考慮一下美國用戶更喜歡英國語言環(huán)境的單位和日期格式。您的應(yīng)用程序根據(jù)英國語言環(huán)境顯示其UI,但仍需要在App Store指定的語言環(huán)境中顯示產(chǎn)品信息。將價格轉(zhuǎn)換為英鎊,以試圖匹配界面其余部分的英國區(qū)域,將是不正確的。用戶在美國擁有App Store帳戶并以美元付款,因此價格將以美元提供給您的應(yīng)用程序。同樣,您的應(yīng)用會以美元顯示其價格。
Listing 2-3
顯示了如何使用產(chǎn)品的區(qū)域設(shè)置信息正確格式化價格
// Listing 2-3 Formatting a product’s price
NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
[numberFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
[numberFormatter setLocale:product.priceLocale];
NSString *formattedPrice = [numberFormatter stringFromNumber:product.price];
用戶選擇要購買的產(chǎn)品后,您的應(yīng)用會連接到App Store以請求為產(chǎn)品付款。
Suggested Testing Steps - 建議的測試步驟
測試代碼的每個部分以驗證您是否已正確實現(xiàn)它。
1. Sign In to the App Store with Your Test Account - 使用您的測試帳戶登錄App Store
在App Store Connect
中創(chuàng)建測試用戶帳戶。
在開發(fā)iOS設(shè)備上,在“設(shè)置”中退出App Store。 然后從Xcode構(gòu)建并運(yùn)行您的應(yīng)用程序。
在開發(fā)macOS設(shè)備上,退出Mac App Store。 然后在Xcode中構(gòu)建您的應(yīng)用程序并從Finder啟動它。
使用您的應(yīng)用進(jìn)行應(yīng)用內(nèi)購買。 系統(tǒng)提示您登錄App Store時,請使用您的測試帳戶。 請注意,文本[Environment:Sandbox]
顯示為提示的一部分,表示您已連接到測試環(huán)境。
如果未顯示文本[Environment:Sandbox]
,則表示您正在使用生產(chǎn)環(huán)境。 確保您正在運(yùn)行應(yīng)用程序的開發(fā)簽名版本。 生產(chǎn)簽名的構(gòu)建使用生產(chǎn)環(huán)境。
重要:請勿使用您的測試用戶帳戶登錄生產(chǎn)環(huán)境。 如果這樣做,測試用戶帳戶將變?yōu)闊o效,無法再使用。
2. Test Fetching the List of Product Identifiers - 測試獲取產(chǎn)品標(biāo)識符列表
如果您的產(chǎn)品標(biāo)識符嵌入在您的應(yīng)用程序中,請在加載后在代碼中設(shè)置斷點(diǎn),并驗證NSArray
實例是否包含預(yù)期的產(chǎn)品標(biāo)識符列表。
如果從服務(wù)器獲取產(chǎn)品標(biāo)識符,請使用Web瀏覽器(如Safari
)或命令行實用程序(如curl
)手動獲取JSON文件,并驗證從服務(wù)器返回的數(shù)據(jù)是否包含預(yù)期的產(chǎn)品標(biāo)識符列表。 還要驗證服務(wù)器是否正確實現(xiàn)了標(biāo)準(zhǔn)HTTP緩存機(jī)制。
3. Test Handling of Invalid Product Identifiers - 無效產(chǎn)品標(biāo)識符的測試處理
故意在應(yīng)用的產(chǎn)品標(biāo)識符列表中包含無效的標(biāo)識符。 (確保在測試后將其刪除。)
在生產(chǎn)版本中,驗證應(yīng)用程序是否顯示其商店UI的其余部分,用戶可以購買其他產(chǎn)品。 在開發(fā)版本中,驗證應(yīng)用程序是否會引起您的注意。
檢查控制臺日志,確認(rèn)您可以正確識別無效的產(chǎn)品標(biāo)識符。
4. Test a Products Request - 測試產(chǎn)品請求
使用您測試的產(chǎn)品標(biāo)識符列表,創(chuàng)建并提交SKProductsRequest實例。 在代碼中設(shè)置斷點(diǎn),并檢查有效和無效產(chǎn)品標(biāo)識符的列表。 如果產(chǎn)品標(biāo)識符無效,請在App Store Connect
中查看您的產(chǎn)品并更正您的JSON文件或?qū)傩粤斜怼?/p>
后記
本篇主要講述了檢索產(chǎn)品信息,感興趣的給個贊或者關(guān)注~~~~