我应该如何处理失败的SKDownload?

问题描述 投票:0回答:2

当处理SKDownload更新我不知道如何到.failed状态作出反应。

我已经看到了张贴在Apple's Developer Forum指导,但其言下之意是,我必须等待,直到用户退出,将重新启动应用程序重新开始下载。

后来,当用户将重新启动应用程序和addTransactionObserver方法被调用在启动时,交易观察者将检测incompleteTransaction并通知通过updatedTransactions委托方法的应用。应用程序可以重试下载托管的内容。

矛盾的是,在this tutorial,我奉命却反其道而行之,并完成交易,让用户尝试通过恢复购买重新下载。

有许多方法来改善用户体验,即使在下载失败......我们可以完成交易,并且用户可以使用恢复按钮来下载文件。

如果我们给用户的选择,则交易不能完成,直到我们确信我们不会再使用它(例如,如果你打算以后继续下载,然后不完成交易)。

这意味着,我可以恢复失败的下载。那可能吗?

paymentQueue: updatedDownloads方法如下:

public func paymentQueue(_ queue: SKPaymentQueue, updatedDownloads downloads: [SKDownload]) {
    downloads.forEach ({ (download) -> Void in
        switch download.state {
        case .active:
            // Update the UI to allow user to pause/cancel download
        case .cancelled:
            // Update UI to show download cancelled
            queue.finishTransaction(download.transaction)
        case .failed:
            let description = download.error?.localizedDescription
            //  <-------------------- retry the download? What should I do here?
        case .finished:
            // Update the UI to reflect download complete
            queue.finishTransaction(download.transaction)
        case .paused:
            // Update the UI to allow user to resume download
        case .waiting:
            // Begin download immediately, on advice of: https://stackoverflow.com/a/23602553/3718806
            queue.start([download])
        }
    })
}

我希望我的用户能够重新尝试失败的下载,而无需重新发起应用。

我怎样才能做到这一点?

swift storekit skdownload
2个回答
0
投票

在情况下,它可以帮助任何人,我就做的是解决:

  1. 完成交易,因为这是表里如一Apple recommends,我们没有有选择*
  2. 显示错误消息给用户,因为会有always be one
  3. 以“重新下载”按钮替换“购买”按钮。 (即,假装的用户成功下载的内容,并随后将其删除)
  4. 当按下“重新下载”按钮,尝试再次购买,并让storekit自动拒绝向用户收费的两倍,并提供让他们再次下载该内容。

下面的代码:

public func paymentQueue(_ queue: SKPaymentQueue, updatedDownloads downloads: [SKDownload]) {
    downloads.forEach ({ (download) -> Void in
        switch download.state {
        ...
        case .failed:
            queue.finishTransaction(download.transaction)
            let description = download.error!.localizedDescription
            // show error to user
            // change 'buy' button text to read 'redownload'
        ...
        }
    })
}

// later, when 'redownload' is tapped to buy the same SKProduct
    let payment = SKPayment(product: product)
    SKPaymentQueue.default().add(payment)

笔记:

*因为没有办法重新启动下载失败(如最好的,我可以告诉,有人请纠正我,如果我错了)。

SKPaymentQueue.default().add(SKPayment(product: skProduct))是安全的,因为StoreKit将目前的使用与警报阅读“你已经购买了这一点。你想再次免费得到它?”,这是我想要的东西。当用户接受,它将开始重新下载。

这是重新启动下载笨重的方式,但它似乎是这样做的是我能找到的最苹果犹太方式。


-1
投票
for download in downloads {  

    switch download.downloadState {  

    case .active:  
        // deal with active  

        break  
    case .failed:  
    // inform the user the download failed  

    // should I close the transaction here? ie:  
    SKPaymentQueue.default().finishTransaction(download.transaction)  

    break  
  // cut code...  
    }  

} // end each download  
© www.soinside.com 2019 - 2024. All rights reserved.