iOS精华iOS开发iOS Developer

iOS动态化之React Native

2016-12-31  本文已影响361人  i_belive

近段时间来,关于移动客户端方面的动态化解决方案有了不少。之前的JSPatch,滴滴的解决方法:DynamicCocoa,微信iOS开发团队的解决方案:OCS。而今天需要说道的是React Native。

1. 背景

首先简单介绍下滴滴和微信的解决方案。

ps:OCS完整介绍

2. 抉择

通过上面的简单介绍,可以看出DynamicCocoa和OCS都还是很厉害的。对于iOS开发人员,可以不需要去花费过多的时间来学习其他语言,使用原生的Object-C也可以基本完成动态化。然后在实际开发中,以及实际的项目中,功能不仅仅是在iOS平台上面,同时在Android中也需要。这个时候就比较尴尬了。但是ReactNative却不一样,他是跨平台的,可以同时支持iOS和Android,同时可以达到原生的效果(虽然和其他两个的性能上还是有些差距),而且现在的手机性能都在不断提升,利弊权衡下,个人觉得ReactNative相对是更优选择。

3. ReactNative应用

这里主要相对于现有工程

步骤:

npm init
def react_native
    # 取决于你的工程如何组织,你的node_modules文件夹可能会在别的地方。
    # 请将:path后面的内容修改为正确的路径(一定要确保正确~~)。
    pod 'React', :path => ‘./ReactComponent/node_modules/react-native', :subspecs => [
    'Core',
    'ART',
    'RCTActionSheet',
    'RCTAdSupport',
    'RCTGeolocation',
    'RCTImage',
    'RCTNetwork',
    'RCTPushNotification',
    'RCTSettings',
    'RCTText',
    'RCTVibration',
    'RCTWebSocket',
    'RCTLinkingIOS',
    ]
end
pod install
NSString * strUrl = @"http://127.0.0.1:8081/index.ios.bundle?platform=ios&dev=true";
    NSURL * jsCodeLocation = [NSURL URLWithString:strUrl];
    
    RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation
                                                        moduleName:@"AwesomeProject"
                                                 initialProperties:nil
                                                     launchOptions:nil];
    self.view = rootView;
npm start

4. ReactNative发布

在技术上来讲当然可以把react程序放在服务器上,但是加载速度就比较慢,在用户体验上当然也会减分不少。因此可以通过打离线包(jsbundle)的方式,通过服务端控制来实现程序的动态化(类似JSPatch发布机制)。

命令说明
react-native bundle

Options:

命令 枚举 解释
--entry-file index.ios.js 入口文件
--platform "ios"/"android" 平台
--transformer /packager/transformer.js transformer
--dev false /true 调试开关
--prepack false/true
--bridge-config
--bundle-output 路径 bundle包目标路径
--assets-dest 资源文件路径 资源文件路径
NSURL * jsCodeLocation = [[NSBundle mainBundle ] URLForResource:@"main" withExtension:@"jsbundle"];
RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation moduleName:@"AwesomeProject" initialProperties:nil launchOptions:nil];
self.view = rootView;
上一篇下一篇

猜你喜欢

热点阅读