0

我从 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 的通知以防止测试用户被取消。
4

1 回答 1

1

根据我使用 Apple 托管下载进行应用内购买的经验,如果收到下载对象并且给定的 URL 指向一个不存在的文件,则该交易现在毫无价值(可能来自被无效或删除的测试用户)。最好的办法是完成该交易,如果您需要再次下载,请通过购买或恢复请求新的。新的不仅仅是指向已删除文件的反刍事务,而是与一组新的下载相关联。

于 2013-11-05T00:34:31.060 回答