SKDownload的内容URL不是零,但不存在



我正在使用StoreKit构建应用程序的应用内购买部分,在购买和下载由Apple托管的内容时面临奇怪的行为。

代码如下:

SKPaymentQueue.default().add(delegate)
...
SKPaymentQueue.default().add(payment)

func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
transactions.forEach { transaction in
switch transaction.transactionState {
case .purchased, .restored:
if transaction.downloads.isEmpty {
SKPaymentQueue.default().finishTransaction(transaction)
didPurchaseProduct(nil)
} else {
SKPaymentQueue.default().start(transaction.downloads)
}
case .failed:
SKPaymentQueue.default().finishTransaction(transaction)
didFailWithError(transaction.error)
case .deferred: break
case .purchasing: break
@unknown default:
fatalError("Unhandled case (transaction.transactionState)")
}
}
}
func paymentQueue(_ queue: SKPaymentQueue, updatedDownloads downloads: [SKDownload]) {
downloads.forEach { download in
switch download.state {
case .waiting: break
case .active: break
case .paused: break
case .finished:
didPurchaseProduct(download)
case .failed: didFailWithError(nil)
case .cancelled: didFailWithError(nil)
}
}
}

下载处理

do {
guard let url = download.contentURL else {
promise(.failure(.noContentURL))
return
}
print("download.contentURL =", url.absoluteString)
print("download.contentURL exists:", FileManager.default.fileExists(atPath: url.path))
let path = url.appendingPathComponent("Contents").appendingPathComponent("Content.json")
let data = try Data(contentsOf: path, options: .mappedIfSafe)
let package = try JSONDecoder().decode(CardPackage.self, from: data)
promise(.success(.didProcessDownload(package)))
SKPaymentQueue.default().finishTransaction(download.transaction)
} catch {
print(error.localizedDescription)
promise(.failure(.decodeErrorDidOccur))
SKPaymentQueue.default().finishTransaction(download.transaction)
}

我面临的问题如下。附加到事务的SKDownload有一个contentURL,它不是nil,但它对应于一个不存在的文件夹。这些是打印的日志

download.contentURL = file:///private/var/mobile/Containers/Data/Application/EE97399D-974F-417A-AA50-969E3C238693/Library/Caches/StoreKit/13484324297981572924/
download.contentURL exists: false
The file “Content.json” couldn’t be opened because there is no such file.

有没有人知道为什么会发生这种情况以及如何修复它?

我遇到了同样的问题,我怀疑问题是在我开发StoreKit集成的某个时候,我删除了已安装的应用程序。当应用程序被重新安装时,它收到了一个新的容器,因此一个新的缓存目录,但以前未完成的事务的下载仍然持有指向旧安装容器的url,当然不再存在。

无法为未完成的事务创建新的下载。

解决方案是通过使用 完成事务来丢弃不可访问的下载。SKPaymentQueue.default().finishTransaction(download.transaction)

,然后通过实现恢复购买来完成StoreKit集成。

当您恢复购买时,您将获得一个新的交易和一个新的下载。

假设这是不应该在生产环境中发生的事情,但如果发生了,我想唯一合适的行动是告诉用户出了问题,并指示他们恢复购买。

最新更新