在处理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])
}
})
}
我希望我的用户能够重新尝试失败的下载,而不必重新启动该应用程序。
我该如何实现?
答案 0 :(得分:0)
万一它对任何人都有帮助,我决定要做的是:
以下代码:
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