iOS Handle IAP下载在SKDownloadStateFailed状态下失败

时间:2014-01-14 09:50:55

标签: ios iphone ios7

我们的应用程序通过应用程序购买向用户下载的苹果托管额外内容提供,但有些用户报告下载问题。

它似乎在中途失败,提醒用户并重置所有按钮等以允许用户再次购买(他们已经购买的免费)。如果用户然后尝试在应用中重新购买或恢复购买,它仍然会失败。以下代码处理失败状态。

-(void) paymentQueue:(SKPaymentQueue *)queue updatedDownloads:(NSArray *)downloads{
for (SKDownload *download in downloads){
    switch (download.downloadState){
        case SKDownloadStateActive:{
            //code removed for post
            break;
        }  
        case SKDownloadStateCancelled:{ break; }
        case SKDownloadStateFailed:
        {
            //log the error
            NSLog(@"Transaction error: %@", download.transaction.error.localizedDescription);

            //let the user know
            [[[UIAlertView alloc] initWithTitle:@"Error!" message:[NSString stringWithFormat:@"%@ download failed, please try again later", download.contentIdentifier] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] show];

            //post notification - caught in view controller for updating buy buttons etc
            [[NSNotificationCenter defaultCenter] postNotificationName:IAPHelperDownloadFailedNotification object:download userInfo:nil];

            // This should delete the download assets from the Cache folder.
            NSError* error = nil;
            [[NSFileManager defaultManager] removeItemAtURL:download.contentURL error:&error];
            if(error){
                //
            }

            //finish the transaction
            [[SKPaymentQueue defaultQueue] finishTransaction:download.transaction];

            break;
        }

        case SKDownloadStateFinished:{
            //code removed for post
            break;
        }

        case SKDownloadStatePaused:{
            break;
        }

        case SKDownloadStateWaiting:{
            break;
        }
    }
}

我查看了堆栈溢出和其他地方以及我在应用程序购买中找到的小例子都与上面相同。任何帮助或信息都会很棒。

1 个答案:

答案 0 :(得分:0)

我遇到了类似的问题,并在Apple的IAP常见问题解答中找到了可能的解决方案: 问:如何解决“您已购买此应用程序内购买但尚未下载的问题。”错误信息? 答:您已收到“您已购买此应用程序内购买但未下载的消息。”错误消息,因为您没有在您的应用程序中调用SKPaymentQueue的finishTransaction:方法。调用finishTransaction:允许您从支付队列中删除交易。

我想我会要求我的IAP引擎在应用程序退出时检查是否有任何IAP正在处理(当用户在下载时停止应用程序时出现问题),如果是,则调用finishTransaction:。

希望它有所帮助。