Swift 我应该如何处理失败的下载?

Swift 我应该如何处理失败的下载?,swift,storekit,skdownload,Swift,Storekit,Skdownload,处理SKDownload更新时,我不确定如何应对失败的状态 我已经看到了中发布的指南,但这意味着我必须等到用户退出并重新启动应用程序才能重新启动下载 稍后,当用户重新启动应用程序并在启动时调用addTransactionObserver方法时,事务观察者将检测到未完成的事务,并通过updatedTransactions委托方法通知应用程序。应用程序可以再次重试下载托管内容 与此相反,在中,我被指示做相反的事情,并完成交易,让用户通过恢复购买再次尝试下载 即使下载失败,也有很多方法可以改善用户体验

处理
SKDownload
更新时,我不确定如何应对
失败的状态

我已经看到了中发布的指南,但这意味着我必须等到用户退出并重新启动应用程序才能重新启动下载

稍后,当用户重新启动应用程序并在启动时调用addTransactionObserver方法时,事务观察者将检测到未完成的事务,并通过updatedTransactions委托方法通知应用程序。应用程序可以再次重试下载托管内容

与此相反,在中,我被指示做相反的事情,并完成交易,让用户通过恢复购买再次尝试下载

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

如果我们为用户提供选项,则在我们确定不再使用该事务之前,该事务不应完成(例如,如果您计划稍后继续下载,则不要完成该事务)

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

我的
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])
        }
    })
}
public func paymentQueue(queue:SKPaymentQueue,updatedownloads下载:[SKDownload]){
downloads.forEach({(下载)->Void in
开关下载状态{
案件.现行:
//更新UI以允许用户暂停/取消下载
案件.已取消:
//更新UI以显示下载已取消
queue.finishTransaction(下载.transaction)
案例。失败:
let description=download.error?.localizedDescription

//如果这对任何人都有帮助,我决定做的是:

  • 完成交易,因为这是什么,我们似乎没有选择*
  • 向用户显示错误消息,因为将
  • 将“购买”按钮替换为“重新下载”按钮。(即,假装用户成功下载内容并随后将其删除)
  • 当按下“重新下载”按钮时,尝试再次购买,并让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会在使用时显示一个警告,上面写着“您已经购买了这个。您想免费获得它吗?”,这正是我想要的。当用户接受后,它将再次开始下载


    这是一种笨拙的方式来重新启动下载,但这似乎是我能找到的最符合苹果犹太教义的方式。

    Hi Rutvik,您刚刚将我在问题中链接的示例中的代码粘贴到这里。您能帮我理解这是如何回答问题的吗?
    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)