Ios 如何为React Native with CodePush部署任意资源

Ios 如何为React Native with CodePush部署任意资源,ios,react-native,code-push,Ios,React Native,Code Push,我正在使用CodePush将js包和一些资源部署到我的react本机iOS应用程序中。我没有使用react native bundler从我的项目中收集所有静态图像,而是使用一个构建步骤,将一个名为“static”的文件夹复制到release/assets中。但是除了“静态”文件夹外,在release/assets中还有其他文件夹,其中包含通过uri在应用程序中动态使用的图像和视频(例如{uri:'assets/images/myImage.jpg')。在XCode中构建应用程序时,我只在包中包

我正在使用CodePush将js包和一些资源部署到我的react本机iOS应用程序中。我没有使用react native bundler从我的项目中收集所有静态图像,而是使用一个构建步骤,将一个名为“static”的文件夹复制到release/assets中。但是除了“静态”文件夹外,在release/assets中还有其他文件夹,其中包含通过uri在应用程序中动态使用的图像和视频(例如{uri:'assets/images/myImage.jpg')。在XCode中构建应用程序时,我只在包中包含资产文件夹

从CodePush文档中,我收集到部署release文件夹应该会更新我的所有资产。但事实并非如此

我通过XCode下载了XAppData,您可以看到,CodePush下载了所有内容并将其存储在/Library/Application Support/CodePush/[id]/release中。但它仍然没有显示在应用程序中


有什么想法吗?我是否误解了CodePush的功能?

如您所见,当您通过CLI将目录释放到CodePush服务器时,当最终用户的设备执行更新检查/同步时,它会将目录的全部内容往返到最终用户的设备。也就是说,仅仅因为一个文件在更新中并不意味着它将很不幸地可用

您看到的行为实际上是映像组件在React Native中解析URI的方式的限制。如果使用资产系统指定“source”属性(通过require(“image.png”)调用),它将查找与当前运行的JS包相关的文件。这就是CodePush允许更新图像的方式,因为只要我们的插件将“资产”文件夹放在磁盘上JS捆绑文件的旁边,
组件就会自然地找到它们

但是,当您指定一个URI为“source”属性值的对象(正如您所做的那样)时,Image组件将查找该文件相对于磁盘上的二进制文件,因此,在您更新它们时,它将永远不会查找CodePush放置该文件的位置


因此,CodePush只支持更新通过require语法加载的图像。我会确保更新我们的文档以澄清这一点。抱歉造成混乱

谢谢你,乔纳森。你的回答给了我一个想法。如果我可以在运行时确定当前包的路径,我就可以构建适当的URI。但我还有一个问题。你说“它将往返于整个内容”。这是否意味着客户端每次都有两个下载包中的所有媒体文件?在你的文档中,你说了一些关于差异更新的内容。这包括所有资产还是只包括静态资产。如果是这样,您如何确定脏缓存/更改的文件?是的,很抱歉,服务器仍将生成一个差异更新,并仅将更改的文件发送到客户端。因此,如果您只更改了一个静态图像并发布了CodePush版本,用户将只下载该文件,尽管它不可用。有没有办法通过API获取当前JS包的路径?如果不是,则这是一个功能请求。然后可以很容易地执行,例如{path:codePush.getBundlePath(),uri:'assets/images/myImage.jpg'}这不是一个有文档记录的API,但在iOS上,您可以在Obj-C中调用[CodePushPackage getCurrentPackageFolderPath]来获取最新更新的文件夹,其中包括您更新的资产。不过,我们目前还没有向JS公开这一点,所以您必须自己桥接它。如果有价值的话,我们可以在待办事项列表中添加一项。也许在GitHub上打开一个bug?我很想了解为什么您不使用RN assets系统来处理图像,因为我们目前没有考虑优化对静态图像的支持,所以如果知道我们缺少场景,那就太好了。谢谢。我将尝试一下getCurrentPackageFolderPath。资产的性质更具动态性。它们的URI是在运行时从数据生成的。我尝试(ab)使用CodePush作为一种资产预加载程序,直到我有时间构建一个真正动态的预加载程序和缓存。