如果您不知道使用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捆绑包的下载版本。
请发表评论,让我知道我是否有任何遗漏或出现任何错误。