下载iAP托管内容卡在SKDownloadState上等待一些用户

时间:2013-11-06 11:32:36

标签: ios iphone in-app-purchase iap-hosted-content

相当于标题所说的内容。该代码适用于沙盒环境中的所有开发设备以及我的大多数用户。但是,有一些用户报告说下载过程没有超出等待状态(SKDownloadStateWaiting),即使是一直到夜晚也是如此。有些人设法在几次尝试后完成下载(完全关闭应用程序并完成恢复购买功能),因此它看起来确实是完全随机的。

以下是我用来管理下载的代码:

- (void)paymentQueue:(SKPaymentQueue *)queue updatedDownloads:(NSArray *)downloads
{
    SKDownload *download = [downloads objectAtIndex:0];
    SKPaymentTransaction *transaction = download.transaction;

    // Keep track of download status
    switch (download.downloadState) {
        case SKDownloadStateActive:
            // Present time remaining and percentage
            break;

        case SKDownloadStateWaiting:
            // Present "Waiting..." label
            break;

        case SKDownloadStateFinished:
            [self purchaseNonconsumableAtURL:download.contentURL forProductIdentifier:productIdentifier];
            [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
            break;

        case SKDownloadStateFailed:
            [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
            break;

        case SKDownloadStateCancelled:
            [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
            break;

        default:
            break;
    }
}

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:3)

您可以尝试通过调用

开始SKDownloadStateWaiting中的下载
[[SKPaymentQueue defaultQueue] startDownloads:[NSArray arrayWithObject:download]];

我的应用程序总是会获得永久性的等待下载"当它试图恢复早期交易时的状态。我编辑了paymentQueue updatedDownloads功能,这样无论何时下载它处于等待状态的下载,它都会将该下载传递给startDownloads,这似乎解决了这个问题。

答案 1 :(得分:0)

值得检查您的用户是否在其设备上设置了12小时(上午/下午)或24小时,特别是如果您在本地执行收据验证并确保某些日期字段存在/有效(例如,购买日期) )。我的收据没有经过12小时时间设置的用户验证,我遇到了问题。为了使这更具优势,12小时时间用户的收据验证只有在GMT下午进行购买时才会失败。 这肯定值得在沙盒中进行测试

如果您在收据验证中使用DateFormatter / NSDateFormatter,请确保将区域设置设置为使用24小时时间(例如en_GB)以确保其使用24小时时间格式。

例如,在Swift 3中,我的收据验证器的时间格式化程序属性将是这样的:

private let dateFormatter: DateFormatter = {
    let formatter = DateFormatter()
    formatter.timeZone = TimeZone(secondsFromGMT: 0)
    formatter.locale = Locale(identifier: "en_GB")
    formatter.dateFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"
    return formatter
}()