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

时间:2019-02-01 03:14:33

标签: swift storekit skdownload

在处理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])
        }
    })
}

我希望我的用户能够重新尝试失败的下载,而不必重新启动该应用程序。

我该如何实现?

2 个答案:

答案 0 :(得分: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 :(得分:-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