【发布时间】:2020-02-09 23:54:22
【问题描述】:
我们的应用每次都能在我们测试过的所有 iOS 设备上顺利运行(从 xcode/adhoc 生产/调试中全新安装或更新,我们都尝试过)。但它在应用审核中被拒绝,因为它似乎永远不会提供按需资源,即使资源的下载完成且没有错误。
我们正在访问相机回调阻塞区域中的资源。如果资源可用,我们继续使用它,否则我们只在下载完成后执行 beginAccessingResourcesWithCompletionHandler() 和免费回调块。问题是应用程序审阅者说它下载(有一个进度条),然后一遍又一遍地要求重新下载。为什么刚下载成功就不可用(注意没有错误)?
[request conditionallyBeginAccessingResourcesWithCompletionHandler:^(BOOL resourcesAvailable) {
if (resourcesAvailable)
{
/* use the resource. */
/* unblock the callback. done. */
}
else
{
/* ask to download resource */
[request beginAccessingResourcesWithCompletionHandler:^(NSError * _Nullable error) {
if (error)
{
NSLog(@"%@", error);
/* don't unblocked. return. will hang. */
}
/* unblock the callback. done. resource should be available next camera frame. */
}];
} }];
这也不是存储空间不足的问题。我们已经涵盖并测试了这一点。此外, beginAccessingResourcesWithCompletionHandler() 返回没有错误。
【问题讨论】:
-
这是真实代码的精简版。它遵循网络上的所有示例。你做一个有条件的开始,如果它失败了,你就做一个 beginAccess 下载。你是说 beginAccessingResourcesWithCompletionHandler() 只需要从主线程调用吗?为什么?我没有看到任何地方提到过。完成处理程序也返回没有错误。如果由于不在主线程中而导致下载出现问题,它不应该返回错误吗?
-
我确实在列表 4-3 中看到他们在主线程上开始访问。 developer.apple.com/library/archive/documentation/…
-
我正在向商店发送一个修订版,它将 beginAccessing 放在主线程块中。无法在测试设备上重现它很困难。如果解决了就会更新。
-
哦,这只是一个非常大的代码库。我不能倾倒整个东西,它只是不可读。 OnDemand 资源实际上是内置在金属着色器中的神经网络的权重,当相机缓冲区回调开始时正在编译。在未完成对 OnDemand 资源的访问和网络编译之前,需要跳过相机缓冲区回调。如果网络尚未完成编译(第一步是下载所述 OnDemand 资源),只需退出相机回调即可完成此操作。这就是我阻止回调的意思。
-
将 beginAccess 放在主线程调用中并不能解决问题。仍然在审核中被拒绝,因为在他们的设备上它仍然没有看到 resourcesAvailable,即使在第一次 beginAccess 完成后没有错误(它成功下载了资源)。
标签: ios app-store on-demand-resources