2010-09-22 270 views
4

我正在開發應用程序並在其中使用應用內購買。我已經在iTunes Connect中創建了應用內產品。直到昨天一切工作正常。但今天。它開始給這個錯誤。iphone:應用程序內購買錯誤

「錯誤:支付請求僅限於通過Store Kit的didRecieveResponse方法返回的有效產品。」

我不知道是什麼問題。請回復

回答

13

好,這可能是確鑿的證據 -

據來自商店套件應用程序的官方數據流,你應該嘗試進行購買之前檢索有關可用購買(SKProductsRequest)信息(SKPaymentQueue )。

我添加了代碼來做到這一點,即使本地化的數據沒有被使用。我打了電話,覈實了這個項目是否存在,並且只是拋棄了NSLOG。

購買過程中,沒有錯誤!

然後我刪除了名爲SKProductsRequest的代碼,並重新運行它,並且得到了「Payment requests are restricted ...」錯誤消息。

它似乎像商店套件框架被改變,以便要求您打電話給SKProductsRequest,以便購買行爲正確時,tehy被添加到SKPaymentQueue。

在計算機科學方面,他們似乎已經在兩個邏輯相關但獨立的模塊之間引入了一種依賴性。這是一個非常糟糕的做法。

嘗試將此代碼添加到您的應用程序中,並在對SKPaymentQueue進行「實際」調用之前的某個時刻調用dumpProductInfo並查看它是否開始工作 - 確保使用您的實際產品標識符更新嵌入字符串文本)。

-(void) dumpProductInfo 
{ 
     SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObject:@"com.company.domain.app.purchase"]]; 
     request.delegate = self; 
     [request start]; 
} 

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response 
{ 
    NSArray *myProduct = response.products; 
    // populate UI 
    NSLog(@"Products:"); 
    for (int i = 0; i < [myProduct count]; i++) 
    { 
     SKProduct *product = [myProduct objectAtIndex:i]; 
     NSLog(@"Name: %@ - Price: %f ID: %@" , 
       [product localizedTitle], 
       [[product price] doubleValue], 
       [product productIdentifier]); 

    } 
} 

後續:如下所述,蘋果技術說明QA1691證實了我的想法發生的事情是正確的 - 兩個星期後,我們想通了:P

+0

此外,請查看此技術說明以瞭解有關此嚴重依賴性的更多詳細信息。 http://developer.apple.com/library/ios/#qa/qa2010/qa1691.html – Brandon 2010-11-17 12:37:43

2

我突然開始得到這個了!上次我測試購買代碼的時間是上週末,而且它工作的很好!

我甚至使用以前的版本來測試,以確保沒有代碼更改負責。此版本正在工作,並已提交給商店。

有些東西肯定是改變了,它似乎是從應用程序商店的一面!

我會注意到,商店的「官方」數據流要求應用程序檢索可供購買的產品列表,但是一旦在iTunes Connect中定義了購買行爲,我就會對標識符進行硬編碼。我檢查了購買ID是否已經改變,並且答案是沒有。

爲了讓這個更令人困惑,我把從iTunes上下載的實時應用程序拉下來,並且購買順利。這兩種情況之間的差異 1.一個用我的發展概況,而不是部署配置文件始建 2.一個在沙箱中,而不是「真實的」 3.一個用來測試帳戶做購買運行

爲了確保它不是一個糟糕的測試賬戶,我剛剛創建了一個新賬戶,並試圖用它進行測試。它沒有任何區別。

更新 - 我通過電子郵件向Apple發送了這封電子郵件,但未收到任何回覆,但錯誤突然消失,所有事情都按預期工作!

+0

我們的實時應用程序仍然工作,沒有軟件演變的修復,但新編譯的發佈版本沒有。所以看起來蘋果決定強制執行「先檢查」流程,但只限於新的應用程序。令人困惑的是,至少可以說。 – Felixyz 2010-11-21 09:23:01

2

這裏是我的關於什麼情況發生理論我最近測試的一個新的應用程序的IAP:

  1. 沙箱IAP env不允許你測試IAP了後,你已經批准並提交審查。這是一個新的無證行爲,據我所知,這對我們的iPhone SDK猴子造成了很多麻煩。在此次更改之前,您可以在提交Apple審覈並在App獲得批准之前對其進行測試。

因此,在這種情況下,即使向IAP商店申請有效的產品ID也無濟於事。

  1. 看來,作爲審查過程的一部分,蘋果增加了以下自動化測試:無效您所有的IAP和測試您的應用程序,以確保您與IAP填充你的UI之前發送的有效IAP ID的請求。所以,如果你沒有用你的代碼解決這個問題,你的應用程序將被拒絕,但他們會告訴你,請求有效的ID只是一個推薦的最佳實踐,而不是一個必需的,但根據我的經驗,它現在是必需的。

我希望這會節省一些人的時間 - 一直花費在這個小時,並不得不經過幾個應用程序拒絕,直到我找出它的工作。

+0

我不認爲你的理論的第一部分是正確的:我們有一個在App Store上可用的應用程序,我仍然可以使用測試用戶帳戶進行購買,併成功通過沙盒進行驗證。 – Felixyz 2010-11-21 09:21:10

0

你必須讓它直接從xcode構建,讓沙箱顯然工作。