如果您不知道使用Objective-C在做什么,则为React Native动态更新Javascript资源

对于正在工作的项目,我正在创建一个React Native应用程序。 React Native的好处是您可以从远程服务器加载javascript包(可以说是应用程序的大脑)。 这意味着您可以进行更新和更改,而无需经过App Store批准过程。

不利的一面是,在应用程序实际加载之前,需要一两秒钟的时间来加载捆绑软件。 除非您有一些花哨的Objective-C或Swift“加载”动画,否则它只会显示白屏。 我没有iOS编程方面的经验,所以我决定做第二件事-从设备本地加载捆绑软件。

我能够整理本指南中的大部分内容,但其中一些我必须自己弄清楚。

所以你想动态更新你的React Native App
在工作中,我们最近在应用程序中发布了第一个React Native组件,并且我一直在考虑如何(以及是否… medium.com)

React Native为您提供了将JS捆绑软件存储在应用程序捆绑软件中的选项,这几乎为您提供了即时的加载时间。 我可以使用该机制来做我想要的。

首先,我需要检查是否有下载的JS捆绑包,或者是否需要使用应用程序的捆绑包:

  //这是应用程序本身的文档目录。 
NSString * documentDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)firstObject];
  // filePath代表下载的包所在的位置。 它位于应用程序的documents目录中。 
NSString * filePath = [documentDir stringByAppendingPathComponent:@” main-loaded.jsbundle”];
  NSURL * codeLocation = [NSURL URLWithString:filePath]; 
  //如果执行路径中没有文件,则使用应用程序包 
 如果(![[NSFileManager defaultManager] fileExistsAtPath:filePath]){ 
  //加载应用程序包的javascript 
jsCodeLocation = [[NSBundle mainBundle] URLForResource:@“ main” withExtension:@“ jsbundle”]];
  NSLog(@“从应用程序包中加载”); 
  }其他{ 
  //加载下载的Javascript捆绑包。 
jsCodeLocation = codeLocation;
  NSLog(@“从远程捆绑包加载”); 
  } 

如果只是将其放入AppDelegate.m文件中,由于它不会将任何内容下载到documents文件夹,因此每次都会加载应用程序包。

接下来,我从远程服务器异步加载Javascript捆绑包(在我的情况下,我使用Amazon S3托管它)

  remoteCode = [NSURL URLWithString:@” https:// ***您的JavaScript包的路径***“]]; 
  //异步发出请求 
NSURLRequest * request = [NSURLRequest requestWithURL:remoteCode];
  [NSURLConnection sendAsynchronousRequest:请求队列:[NSOperationQueue currentQueue] completeHandler:^(NSURLResponse *响应,NSData *数据,NSError *错误){ 
 如果(错误){ 
  NSLog(@“下载错误:%@”,error.description); 
  } 
 如果(数据){ 
  //将数据保存到文件路径 
[data writeToFile:filePathatomic:YES];
  NSLog(@“文件已保存到%@”,filePath); 
  } 
  }]; 

这将下载捆绑软件并将其保存到文件路径,但仅在应用程序已加载之后。

最后,使用样板React Native代码将React Native视图插入到Objective-C应用程序中。

  RCTRootView * rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation 
  moduleName:@“ ***您的模块名称***” 
  initialProperties:无 
  launchOptions:launchOptions]; 

现在,只要您的应用加载,它将使用Javascript捆绑包的下载版本。

请发表评论,让我知道我是否有任何遗漏或出现任何错误。