接收数据的base64EncodedStringWithOptions返回nil

时间:2014-10-03 14:54:38

标签: in-app-purchase base64 ios8 nsdata receipt-validation

我想使用服务器端验证我的应用内购买。 所以我使用以下代码:

- (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;
        }
    };
}

最奇怪的是,应用程序在一台安装了iOS 8.0.2的iPad上崩溃,并且在使用相同iOS版本的其他iPad上没有崩溃。

最糟糕的是,我无法访问应用程序崩溃的设备。

据我所知- base64EncodedStringWithOptions:返回nil,但我不知道原因。

任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

在设备运行某种形式的应用内购买破解程序(例如“IAP Free”或“IAP Cracker”)之前,我已经看到了这个空收据问题,这意味着该设备已被越狱并且是一个应用内购买破解工具已安装。我会确保应用程序崩溃的设备没有运行某种形式的应用内购买破解工具。您可以做的另一件事是忽略空的收据 - 但不要退回任何货物以避免崩溃或返回仅在本地可用的商品。这取决于你如何对破解应用程序内购买的人做出反应 - 有时候假装它在本地工作但限制服务器的功能是好的。