React-Native / iOS 混编入原生项目

一脸懵逼:吐槽前言

后面慢慢吐槽

感谢前人分享经验系列 :React-Native 资料

React-Native中文网

iOS 和 Android 开发的 React Native 入门指南

iOSer迈向前端一小步--OC/Swift与RN混编Demo (这里面有OC\RN混编的项目搭建Demo)

(后面如有用到有用的继续补充)

环境配置与项目搭建

环境配置与纯RN搭建看这个就行了

iOS中 RN与OC项目混编 (两个关键文件配置)
  • package.json
  • Podfile

package.json

{
  "name": "RNProjectName",
  "version": "0.0.1",
  "private": true,
  "scripts": {
    "start": "node node_modules/react-native/local-cli/cli.js start"
  },
  "dependencies": {
    "react": "15.4.2",
    "react-native": "0.41.2"
  }
}
name    项目名称
version     版本(遵守‘大版本.次要版本.小版本’的格式)

package.json详解

// 终端中
➜  app-iv3 git:(dev_2.7.2_Dombo_RN) ✗ ls
INTERNATIONAL_README laoyuegou            package-lock.json
README               node_modules         package.json

➜  app-iv3 git:(dev_2.7.2_Dombo_RN) ✗ npm install
cd 到 package.json 所在的文件目录下
npm install 

安装完成后会有一个 node_modules 文件夹


Podfile

#  ====== ====== ====== ====== ====== ====== ====== ====== ====== ====== ====== ======
        pod 'React', :path => ‘../node_modules/react-native', :subspecs => [
        'Core',
        'RCTImage',
        'RCTNetwork',
        'RCTText',
        'RCTWebSocket',
        ]
# 根据需求添加项目中需要的模块
# path 这里要正确设置 node_modules/react-native 的所在路径,每个人不一样

配置完后,pod install 即可安装 React-Native 所以来的相关组件库

React-Native 咋用呢

// 倒入头文件
#import <React/RCTRootView.h>

// 
NSURL *jsCodeLocation = [NSURL
                             URLWithString:@"http://localhost:8081/index.ios.bundle?platform=ios"];
                             
// 传给RN的参数必须是字典类型,要和js代码propertis一致
NSDictionary *params = @{@"scores" : @[
                                     @{@"name" : @"Alex",
                                         @"value": @"42"},
                                     @{@"name" : @"Joel",
                                         @"value": @"10"}
                                     ]
                             };
    // moduleName 要对应index.ios.js 上的 AppRegistry module
RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL : jsCodeLocation
                                                 moduleName        : @"RNTestViewModule"
                                                 initialProperties : params
                                                  launchOptions    : nil];
                                                
// 去掉返回箭头的title
UIBarButtonItem *item = [[UIBarButtonItem alloc] init];
item.title = @"";
self.navigationItem.backBarButtonItem = item;
       
UIViewController *viewController = [UIViewController new];
viewController.view = rootView;
viewController.title = @"承载RN视图的VC";
[self.navigationController pushViewController:viewController animated:YES];

React-Native 0.45.0 以上版本需要下载boost等几个第三方库编译(是需要终端fan qiang的,否则超时失败)

  • package.json
  • Podfile

package.json

{
  "name": "RNProjectName",
  "version": "0.0.1",
  "private": true,
  "scripts": {
    "start": "node node_modules/react-native/local-cli/cli.js start"
  },
  "dependencies": {
    "react": "16.4.1",
    "react-native": "0.56.0"
  }
}

Podfile.json

# Uncomment the next line to define a global platform for your project
react_native_path = './Extern/ReactNative/node_modules/react-native'

platform :ios, '9.0'
inhibit_all_warnings!

target 'RNProject' do
  # Uncomment the next line if you're using Swift or would like to use dynamic frameworks
  # use_frameworks!

    # 'node_modules'目录一般位于根目录中
    # 但是如果你的结构不同,那你就要根据实际路径修改下面的`:path`
    pod 'React', :path => react_native_path, :subspecs => [
    'Core',
    #'BatchedBridge', # 0.45 版本以后需要添加
    'CxxBridge',
    'DevSupport', # 如果RN版本 >= 0.43,则需要加入此行才能开启开发者菜单
    'RCTText',
    'RCTImage',
    'RCTNetwork',
    'RCTWebSocket', # 这个模块是用于调试功能的
    # 在这里继续添加你所需要的模块
    ]
    # 如果你的RN版本 >= 0.42.0,则加入下面这行
    pod 'yoga', :path => react_native_path + '/ReactCommon/yoga'
    # Third party deps
    pod 'DoubleConversion', :podspec => react_native_path + '/third-party-podspecs/DoubleConversion.podspec'
    pod 'glog', :podspec => react_native_path + '/third-party-podspecs/glog.podspec'
    pod 'Folly', :podspec => react_native_path + '/third-party-podspecs/Folly.podspec'
end

剩下步骤跟part1 中的一样不再描述


运行

终端cd 到 package.json 文件下

如果是adb断了就使用一下步骤

  1. adb reverse tcp:8081 tcp:8081
  2. npm start
    如果adb没断,直接
  3. npm start

RN报错与解决方案:
1、Argument list too long: recursive header expansion failed at
解决:查到的一些方法太好使,'node_modules'目录一般放于根目录中,不要放太深层的路径即可

2018-7-24更新,后续再补


IDE:Visual Studio Code

Visual studio Code 写RN所需要的插件

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353

推荐阅读更多精彩内容