无法找到嵌入在应用程序包中的按需资源 [关闭]

Posted

技术标签:

【中文标题】无法找到嵌入在应用程序包中的按需资源 [关闭]【英文标题】:Unable to find On-Demand Resources embedded in App bundle [closed] 【发布时间】:2020-10-05 17:16:45 【问题描述】:

我下载后使用URLForResource查找按需资源,目前可以正常使用。

由于 Apple 在审核期间无法下载 ODR 的一些问题,我现在必须暂时将我的按需资源 AssetPacks 嵌入 App Bundle 中,将 XCode 中的“Embed Asset Packs In Product Bundle”从 false 更改为真的。

问题是,当我使用相同的 URLForResource 方法后,它现在返回 null。

NSURL *myDirectoryURL = [[NSBundle mainBundle] URLForResource:targetFolder withExtension:@""];

既然它们成为产品包的一部分,我不应该以这种方式找到它们吗?


更新: 来自非 ios 开发人员在 Cordova 插件上工作的一些(丑陋)工作代码.. :)

    NSLog(@"[odr] calling nsbrr conditionallyBeginAccessingResourcesWithCompletionHandler..");
    @try
    
      [odrRequest conditionallyBeginAccessingResourcesWithCompletionHandler:^(BOOL resourcesAvailable) 
        if (resourcesAvailable) 
          NSLog(@"[odr] already available (in-bundle) / downloaded.");
          @try
          
            NSURL *myDirectoryURL = [[NSBundle mainBundle] URLForResource:targetFolder withExtension:@""];
            NSLog(@"[odr] Target directory URL: '%@'", myDirectoryURL);
            NSString *res = myDirectoryURL.absoluteString;
            pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:res];
            NSLog(@"[odr] path found, returning it in callback: '%@'", res);
            [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
          
          @catch(id anException) 
            NSString *errMsg = @"Error in path detection or calling callback (in already-downl-odr handler): ";
            errMsg = [errMsg stringByAppendingString:anException];
            NSLog(@"[odr] Exception: '%@'", errMsg);
            pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:errMsg];
            [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
          
         else 
          NSLog(@"[odr] Starting to load (in-bundle) / download..");
          @try
          
            [odrRequest beginAccessingResourcesWithCompletionHandler:^(NSError * _Nullable error) 
              if (error == nil) 
                NSLog(@"[odr] File load / download success.");
                @try
                
                  NSURL *myDirectoryURL = [[NSBundle mainBundle] URLForResource:targetFolder withExtension:@""];
                  NSLog(@"[odr] Target directory URL: '%@'", myDirectoryURL);
                  NSString *res = myDirectoryURL.absoluteString;
                  pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:res];
                  NSLog(@"[odr] path found, returning it in callback: '%@'", res);
                  [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
                
                @catch(id anException) 
                // ...

【问题讨论】:

不清楚问题是什么。按需资源不存储在你的 app bundle 中(你的 app bundle 是不可变的),目前还不清楚“将我的 OnDemandResources AssetPacks 临时嵌入到 App Bundle 中”是什么意思。 @matt 已编辑,现在应该更清楚了。谢谢 targetFolder 是什么?为什么嵌入资产包会导致出现以前不存在的文件夹? 另外,如果这是一个应用程序审查问题“由于 Apple 在审查期间无法下载 ODR 的一些问题”,我会担心问题是什么而不是试图规避它们暂时在测试期间(如大众汽车)。 另外,当您取消嵌入资产包时,您的计划是什么?您将不得不再次通过审核。 【参考方案1】:

您通过嵌入按需资源来回避将服务器用作 ODR 下载源这一事实没有改变您访问它们的方式。您仍然必须有一个 NSBundleResourceRequest 并调用 beginAccessingResourcesWithCompletionHandler: 并访问完成处理程序中的资源,就像您没有打开在 Product Bundle 中嵌入资产包时所做的一样。

因此,您的代码应该保持不变,而不考虑 Embed Asset Packs In Product Bundle 的值。如果在 Embed Asset Packs In Product Bundle 为 NO 时相同的代码有效,但在为 YES 时无效,则您的代码开始错误。

【讨论】:

我解决的方法是:1. 删除了提供非产品 ODR 的 URL(即“资产包清单 URL 前缀”),2. 在我的本地构建中标记的资源是只是占位符(在切换到捆绑 DOR 之前,我需要这些来创建标签并从我的静态服务器下载非产品应用程序的 ODR)。谢谢

以上是关于无法找到嵌入在应用程序包中的按需资源 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

iOS 应用程序中的按需资源 AppStore 上传失败 - 不允许的路径

未从 testflight 下载的按需资源

AppStore 与 TestFlight 的按需资源下载速度

为啥我的按需资源仍处于正在下载...状态?

按需资源如何“离开捆绑包”并到达苹果服务器?

如何下载 On Demand 框架/SDK?