http://www.cocoachina.com/ios/20150612/12110.htmlhtml
本文檔爲您解答應用內購相關的常見問題。ios
配置(Configuration)數組
1.我必須上傳一個二進制文件來測試應用內購麼?服務器
不,測試應用內購(In-App Purchase,如下簡稱IAP)不須要上傳二進制文件。app
注:在應用程序準備好接受審覈批准以前,不要將開發中的二進制文件上傳到iTunes Connect。若是二進制文件出如今iTunes Connect中,但功能不完整,那麼App Review將審查二進制文件,頗有可能會拒絕該文件。在iTunes Connect中,若是App Review拒絕了最新的二進制文件,測試IAP將會失敗。一個變通方案是上傳沒有IAP功能的二進制文件經過App Review。一旦二進制文件經過審覈,就能夠測試IAP功能。iphone
2.我如何啓用通配符App ID來支持IAP?ide
參考以下步驟:測試
在Xcode或者iTunes Connect中識別確認app當前的Bundle ID。更多信息請查看About Bundle IDs。ui
參考Registering App IDs中的步驟1-6和8-10,更新通配符App ID以支持IAP。this
3.支持自動訂閱商品的最低版本是什麼?
iOS系統:iOS 4.2
OS系統:OS X 10.9
4.什麼時候使用SKPaymentQueue的restoreCompletedTransactions方法?
在以下兩種狀況下,你只能使用SKPaymentQueue的restoreCompletedTransactions方法來恢復自動訂閱或者非消耗性商品:
1.在消費者擁有的其餘設備上安裝它們。
2.在相關應用程序被刪除的設備上從新安裝它們。
5.在iTunes Connect中,能夠爲每一個應用程序建立多少個IAP商品ID?
閱讀Configuring a Product能夠找到答案。
錯誤信息(Error Messages)
1.您的帳戶信息已經更改(Your account info has changed)
因爲你在設備上登錄App Store時使用的是測試帳戶,因此你會收到一條「您的帳戶信息已經更改」的消息。一旦使用這個帳戶登錄商品購買環境,沙盒(Sandbox)就會檢測到你的用戶帳戶不可用。要解決這個問題,須要在設備的設置應用程序中退出當前帳號,在iTunes Connect中建立一個新的測試帳戶,當Store Kit提示確認從你的應用內購買時,使用這個帳戶。
2.不能鏈接到iTunes Store(Cannot connect to iTunes Store)
「Cannot connect to iTunes Store」的問題或許是由如下的一個或多個緣由引發:
沙盒不可達。
你的應用程序沒有bundle version(CFBundleVersion)。更多信息請查看Setting the Version Number and Build String
你的應用程序是在模擬器上運行,不支持應用內購買。
你嘗試購買的商品不在出售之列。更多信息請查看Query the App Store for product information before presenting your app’s store UI
3.該Apple ID還沒有在iTunes Store中使用(This Apple ID has not yet been used in this iTunes Store)
收到該條消息意味着你使用測試帳號登錄了iTunes Store。要解決這個問題,你須要在設備中的設置應用程序中退出當前帳號,在iTunes Connect中建立一個新的測試帳戶,當Store Kit提示確認從你的應用程序內購買時,使用這個帳戶。
4.你已經購買該商品,點擊肯定再次免費下載該商品(You've already purchased this. Tap OK to download it again for free)
該條消息並非一個通知而非錯誤提示。它的意思是你正在購買一個已經購買過的非消耗性商品。你無需爲已經購買過的非消耗性商品付費。
5.你已購買該應用內購買商品,但還沒有下載(You've already purchased this In-App Purchase but it hasn't been downloaded)
收到該條消息是由於你在應用程序中沒有調用SKPaymentQueue的finishTransaction:method方法。調用finishTransaction:方法能夠從購買隊列中刪除一個事務。
6.該帳戶不是測試帳戶,請在沙盒環境中建立一個新帳戶(This is not a test user account. Please create a new account in the Sandbox environment)
當Store Kit提示確認購買時,你使用iTunes帳戶登陸,會收到這個信息。要解決這個問題,須要在設備中的設置應用程序中退出App Store,當Store Kit提示確認從你的應用程序內購買時,使用沙盒測試用戶帳戶。
本土化(Localization)
在iTunes Connect中個人應用內購已本土化爲多種語言。可是,localizedDescription和localizedTitle屬性老是返回英文信息,即使測試設備的語言不是英文。
localizedDescription和localizedTitle返回的本土化信息語言是基於當前iTunes Store的語言而不是當前設備所設置的語言。好比,在iTunes Connect中你的應用內購針對德語進行了本地化,但你使用英文測試帳戶登陸,那麼localizedDescription和localizedTitle都將返回英文信息。若是須要返回德語信息,在你的測試設備上使用德語測試帳號登錄。
Receipt
1.我應該使用哪一個URL來驗證Receipt?(What url should I use to verify my receipt?)
在沙盒中測試應用程序以及應用程序處於審覈狀態時,使用沙盒URL:https://sandbox.itunes.apple.com/verifyReceipt
當應用程序經過審覈上架App Store時,使用商品URL:https://buy.itunes.apple.com/verifyReceipt
注:確保將應用程序用於驗證的receipt發送至App Store。
必定要先使用商品URL覈實你的receipt;若是收到一個21007狀態碼,那接下來要使用沙盒URl驗證。按照這個步驟,當app處於測試狀態或在sandbox環境下進行審覈,或者上架App Store,可以讓你避免在URL之間切換。
21007狀態碼錶示該receipt是一個sandbox receipt,但已被髮送至商品服務進行驗證。0狀態碼錶示已正確驗證receipt。
2.當前receipt 無效或者與當前用戶ID不匹配(Current receipt invalid or mismatched ds person id)
收到這條消息是由於你的應用程序中缺乏OS X App Store receipt。更多關於如何從應用程序中獲取receipt的消息請查看:Receipt Validation Programming Guide
3.Receipt驗證失敗,狀態爲<一串數字>(Verifying my receipt fails with a status of)
可能緣由:
在iOS app中,你沒有使用base64編碼對回單數據進行編碼。
發佈到App Store的對象不是JSON格式。Listing 1是自動訂閱的正確JSON對象:
Listing 1 驗證自動訂閱的有效receipt示例:
1
2
3
4
|
{
"receipt-data"
:
"..."
,
"password"
:
"..."
}
|
4.應用審覈不能查看已購買成功的目錄
若是應用程序在購買成功後經過App Store驗證receipt,請檢查你的應用程序是否使用了正確的App Store URL來驗證receipt。更多信息請查看What url should I use to verify my receipt?
5.在購買成功後,個人應用程序使用paymentQueue:updatedTransactions:驗證receipt。可是,返回的receipt中包含了一個空in_app數組而不是預期的產品。
空in_app數組表示Store Kit沒有爲當前用戶記錄任何交易。或許是沒有更新應用程序receipt,若果是這樣,應用程序能夠通知用戶還沒有出現receipt,是否要進行刷新。若是用戶贊成,應用程序會使用SKReceiptRefreshRequest類來更新receipt。此時,若是Store Kit已經記錄用戶購買信息,那應用程序receipt將會顯示在in_app數組中。更多關於如何更新receipt的信息請查看:Refreshing the App Receipt
訂閱(Subscriptions)
1.使用Xcode 6不能將託管內容上傳至iTunes Connect
這是目前存在的一個bug。爲了解決這個問題,請使用Application Loader上傳包含託管內同的包。步驟以下:
在Xcode Archives Organizer中,選擇包含託管內容的文檔。
單擊Export
在彈出的對話框中,選擇Export as an Installer Package.
單擊Next開始生成你的包,而後選擇Export保存你的包(一個文件擴展名爲.pkg的文件)。
使用Application Loader上傳這個包,更多信息請查看:Using Application Loader
下圖演示爲託管內容生成一個包,圖中的數字對應上述步驟。
2.如何從自動更新訂閱服務更改成IAP商品?
參考以下步驟:
在iTunes Connect中關掉Clear for Sale標誌,從而移除當前自動更新訂閱的商品/服務,而後將其從代碼中移除。此時將會禁止商品/服務的自動更新,並會給用戶發一封郵件。記住,你必須爲用戶提供已付費的商品/服務,直到訂閱終止。此外,以前自動更新訂閱的商品/服務都是可恢復的。例如,若是你的用戶在4月1號購買了一個月的訂閱,可是這個訂閱將在4月19日下線,那你也必須提供已購買的內容直到5月1日。
建立一個新的IAP商品類型,而後更新二進制文件來使用它。更多信息請查看:Creating In-App Purchase Products
注:須要該步驟是由於一旦應用內購類型被建立,則不能再更改。
3.經過App Store中驗證應用程序receipt,而後分析是否須要向你的用戶提供相關功能。更多信息請查看:Receipt Validation Programming Guide
3.如何知道用戶是否將其聯繫信息分享給我?
使用receipt中的Subscription Expiration Date (expires_date)字段來檢測用戶是否將本身的信息共享給你。
假設你決定爲購買一個月訂閱服務並願意分享我的信息的顧客提供7天免費試用,Store Kit將爲你提供一個receipt,這個receipt的expires_date存儲了7天再加1個月的長度。在首次購買後,你的訂閱服務將於1月零7天后到期,此後的每月都將爲其開啓自動更新。
4.即便在前臺運行,個人應用程序也未收到任何自動更新提醒
若是你的應用程序有一個穩定的交易觀察者,那麼在打開或者從後臺恢復時,它都將接收到全部自動更新提醒。更多信息請查看:Add a transaction queue observer at application launch
疑難解答(Troubleshooting)
1.爲何個人產品標識符在invalidProductIdentifiers數組中被退返?
或許因爲如下一個或多個緣由:
1.沒有使用Explicit App ID。
2.在iTunes Connect中,蘋果拒絕了你最新向iTunes Connect提交的二進制碼。
3.你沒有清除iTunes Connect中在售的IAP產品。
4.沒有使用與正確的App ID相關聯的Provisioning Profile註冊你的應用程序。
5.可能修改了商品,可是這些修改沒有在全部App Store的服務器中生效。
6.未能完成全部財政需求表。更多信息請查看:Contracts, Tax, and Banking
7.你的商品由蘋果託管上,內容還沒有上傳至iTunes Connect上。更多關於上傳託管內容的信息請查看:Hosting Non-Consumable Products with Apple
注:商品內容上傳到iTunes Connect上以前,你的商品標識符將是無效的。若是內容還沒準備好,那麼可在iTunes Connect中禁用Hosting Content with Apple功能即可以解決這個問題。一旦內容準備好能夠上傳了,就可從新啓用該功能。
8.在iTunes Connect中指定的商品標示符與應用程序中SKProductsRequest對象所使用的標示符不匹配。更多關於商品標示符的信息請查看:Technical Q&A, QA1329, 'In-App Purchase Product Identifiers'。
2.調用payment queue的restoreCompletedTransactions 方法不能恢復app中的任何商品
可能由如下一個或多個緣由引發:
1.你的商品有還沒有完成的交易。若是付費隊列中有未完成的交易,則恢復進程不返回商品。更多關於結束交易的信息請查看:Finish the transaction。
2.你沒有任何先前購買過的非消耗類、自動更新訂閱以及免費訂閱的商品。
3.你試圖恢復的非更新訂閱或消耗類商品是不可恢復的類型。restoreCompletedTransactions方法只能恢復非消耗類商品、自動更新訂閱以及免費訂閱的商品。
注:在無可恢復產品的狀況下,Store Kit不會調用paymentQueue:updatedTransactions:方法。
4.應用程序的編譯版本號(CFBundleVersion) 沒有按照開發指南建立版本號。CFBundleVersion是一個由點號隔開的三個無符號整數組成的字符串。更多信息請查看:Setting the Version Number and Build String。
參考:
iTunes Connect Developer Guide
In-App Purchase Programming Guide
Receipt Validation Programming Guide
Getting Started with In-App Purchase on iOS and OS X
Technical Note TN2387 In-App Purchase Best Practices
In-App Purchase Configuration Guide for iTunes Connect
Technical Q&A, QA1329, 'In-App Purchase Product Identifiers'