0

处理SKDownload更新时,我不确定如何对.failed状态做出反应。

我在Apple 的开发者论坛中看到了发布的指南,但这意味着我必须等到用户退出并重新启动应用程序才能重新开始下载。

稍后当用户重新启动应用程序并在启动时调用 addTransactionObserver 方法时,事务观察器将检测到不完整的Transaction 并通过 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])
        }
    })
}

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

我怎样才能做到这一点?

4

2 回答 2

0

如果它可以帮助任何人,我决定做的是:

  1. 完成交易,因为这是Apple 推荐的,我们似乎别无选择*
  2. 向用户显示一条错误消息,因为总会有一个
  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 会在使用时提示“您已经购买了这个。您想免费再次获得它吗?”,这正是我想要的。当用户接受时,它将再次开始下载。

这是一种重新开始下载的笨拙方式,但它似乎是我能找到的最符合 Apple-Kosher 的方式。

于 2019-02-03T22:33:42.670 回答
-2
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  
于 2019-02-01T03:20:43.897 回答