我从 Apple 服务器托管的内容下载到工作,但在我的 IAP UI 的进一步开发中,我遇到了需要重新下载内容的情况。
本例中的内容是一个 zip 文件,它是在 Xcode 中作为图像包和包含相关数据的 plist 文件创建的。
原始下载运行良好,我能够像处理目录一样处理 zip 文件。
在继续开发该应用程序时,我从我的测试设备中删除了该应用程序。这意味着内容不再在设备上。应用内交易从未完成,所以我希望下载再次处理。
最初,zip 文件被下载并保存到缓存目录,我可以从那里处理它。但现在,IAP 框架似乎认为 zip 文件存在,但实际上并非如此。该paymentQueue:updatedDownloads:
方法在下载状态等于SKDownloadStateFinished
没有任何下载活动发生时触发。好的。那不是我能控制的。我只需要查看我提供的下载 URL,对吗?所以,在case SKDownloadStateFinished:
我有一个调用[self processURL:download.contentURL fromProduct:download.contentIdentifier];
,它处理引用的下载。这是该方法的开始:
-(void)processURL:(NSURL *)directoryURL fromProduct:(NSString *)productIdentifier
{
int itemsAdded = 0;
NSFileManager *filemanager = [NSFileManager defaultManager];
NSMutableSet *masterIndex = [NSMutableSet new];
BOOL isDir;
if ([filemanager fileExistsAtPath:[directoryURL path] isDirectory:&isDir]) {
NSLog(@"URL %@ exists. Is it a directory? %@",directoryURL,isDir?@"YES":@"NO");
} else {
NSLog(@"URL %@ does not exist.",directoryURL);
}
我得到的输出是:
URL file://localhost/private/var/mobile/Applications/40733984-E18D-4450-A98E-D8CCC56D2600/Library/Caches/8E29E63C-9C32-4D92-AC84-23BDA946DE5F.zip/ does not exist.
一个电话[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
似乎没有帮助。它只是认为它已经完成而无需重新下载 zip 文件。
关于做什么的任何建议?
编辑:这真的令人沮丧。自从我的原始帖子以来,我尝试了以下方法: * 重新启动我的 iPad * 重新启动 Xcode * 在我的 iPad 上运行干净(我没有屏住呼吸 - 我希望清除我认为无法访问的缓存目录清洁实用程序) * 使用 plist 文件中的更新信息更新了我的应用内购买包。* 更新了应用内购买包的版本。
当它尝试下载时,它仍在尝试下载相同的 zip 文件名,但它仍然不存在。我认为通过更改包,即使包名称相同,下载也会拉取不同的 zip 名称。但也许它只是一个哈希或包名。
我有一个想法,缓存目录以某种方式损坏。我的下一步将是创建另一个具有不同包名称的包。我猜这会很好,但这并不能解决我的问题。
我也知道可能导致问题的情况。似乎 Xcode 5 响应按下构建和运行按钮的速度较慢。结果是我点了两次。当然,这会导致问题。在这种情况下,我想,我得到了某种致命的拥抱,锁住了我的 iPad。我必须手动关闭它并重新启动它两次,然后才能正确恢复。
编辑:新项目没有下载。这是我检查过的项目清单。请编辑此内容以包含更多项目,以检查您是否想到更多。
- 确保未在生产中使用测试用户。如果是这样,则需要创建一个新的测试用户。
- 确保对象注册为 SKPaymentTransactionObserver。这包括设置界面,以及
[[SKPaymentQueue defaultQueue] addTransactionObserver:self]
在启动时进行调用。 - 确保用户可以付款。
- 确保
transaction.transactionState == SKPaymentTransactionStatePurchased
(或者SKPaymentTransactionStateRestored
如果恢复交易) - 确保事务未完成 (
[[SKPaymentQueue defaultQueue] finishTransaction:transaction]
)。 - 确保产品 ID 与 iTunes Connect 中设置的产品 ID 匹配(好吧,如果不是这样,您将无法购买它)。
- 在物理设备上测试。这些下载无法在模拟器上进行测试。
- (推测)关闭 App Store 的通知以防止测试用户被取消。