2014-10-03 66 views
3

我想驗證我在使用服務器端的應用程序購買。 於是我就用下面的代碼:base64EncodedStringWithOptions用於接收數據返回無

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions 
{ 
    for (SKPaymentTransaction * transaction in transactions) { 

     switch (transaction.transactionState) 
     { 
      case SKPaymentTransactionStatePurchased: 
      { 
       NSData *reciptData = [NSData dataWithContentsOfURL:[[NSBundle mainBundle] appStoreReceiptURL]]; 
       if(reciptData) { 
        NSDictionary *parameters = @{@"receipt_data" : [reciptData base64EncodedStringWithOptions:0]};//App crashes here -[__NSPlaceholderDictionary initWithObjects:forKeys:count:]: attempt to insert nil object from objects[0] 
       } 
      } 
       break; 

      default: 
       break; 
     } 
    }; 
} 

最奇怪的是在一個iPad上的應用程序崩潰的iOS 8.0.2,並使用相同的IOS版本上的其他不會崩潰。

最糟糕的是我無法訪問應用程序崩潰的設備。

據我所知- base64EncodedStringWithOptions:返回nil但我不知道爲什麼。

任何人都可以幫助我嗎?

回答

0

在設備運行某種形式的應用內購買破解程序(如「IAP免費」或「IAP破解程序」,這意味着該設備已被越獄並且應用內購買破解之前)工具已安裝。我會確保應用程序崩潰的設備不運行某種形式的應用內購買破解工具。您可以做的另一件事是忽略空的收據 - 但不返回任何商品以避免崩潰或返回僅在本地可用的商品。這取決於你想如何對付應用內購買的人做出反應 - 有時假裝它可以在本地工作但限制服務器的功能是很好的。

+0

感謝您的回覆。但是,應用程序正在我的設備上運行,並沒有越獄。如果我不解鎖功能,那麼我的用戶只是失去了他的錢,但如果我解鎖它,那麼爲什麼我應該使用驗證? – 2014-10-21 14:05:12

+0

一般來說,即使解碼失敗,我也會建議解鎖項目 - 不要崩潰 - 就像讓黑客/ bug獲取虛擬物品一樣。但是,如果某些內容存儲在服務器上並需要驗證 - 那麼它將在服務器上驗證失敗,或者不會將其傳遞到服務器 – abdollar 2014-10-21 18:16:10

+0

它與服務器端功能有關,我不會將它傳遞給此服務器案件。但是空的收據是什麼原因,我怎樣才能避免它? – 2014-10-21 19:18:23