iOS內(nèi)購IAP(五) —— 編程指南之檢索產(chǎn)品信息(一)

版本記錄

版本號 時間
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所示。

Figure 2-1 Stages of the purchase process—displaying store UI

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-ModifiedIf-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)注~~~~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,321評論 6 543
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,559評論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,442評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,835評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,581評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,922評論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,931評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,096評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,639評論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,374評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,591評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,104評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,789評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,196評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,524評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,322評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,554評論 2 379

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