当处理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])
}
})
}
我希望我的用户能够重新尝试失败的下载,而无需重新发起应用。
我怎样才能做到这一点?
在情况下,它可以帮助任何人,我就做的是解决:
下面的代码:
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将目前的使用与警报阅读“你已经购买了这一点。你想再次免费得到它?”,这是我想要的东西。当用户接受,它将开始重新下载。
这是重新启动下载笨重的方式,但它似乎是这样做的是我能找到的最苹果犹太方式。
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