关于iOS集成ReactNative 那些事

介绍

1.现有项目集成ReactNative
2.js文件的简单介绍,常用工具的封装
3.真机调试
4.打包成jsbundle文件

一.现有项目集成ReactNative(手动集成)

  • 在项目根目录下创建package.json文件
package.json内容填写
{
    "name": "Test",
    "version": "0.0.1",
    "private": true,
    "scripts": {
        "start": "node node_modules/react-native/local-cli/cli.js start",
        "test": "jest"
    },
    "dependencies": {
        "react": "~15.4.1",
        "react-native": "0.42.3"
    },
    "devDependencies": {
        "babel-jest": "19.0.0",
        "babel-preset-react-native": "1.9.1",
        "jest": "19.0.2",
        "react-test-renderer": "~15.4.1"
    },
    "jest": {
        "preset": "react-native"
    }
}
  • 在根目录下npm install
  • 添加依赖项目(在项目下创建Libraries文件夹,添加node_modules下的需要的项目)
添加依赖项目.png
  • 添加依赖库
添加依赖库.png
  • 搜索路径下添加$(SRCROOT)/node_modules/react-native/React
header search paths.png
  • 填写XCode的链接器参数Other linker flags
Other linker flags.png
  • 修改info
info.png

好了,到这里手动集成就完成了...

二.js文件的简单介绍,常用工具的封装

在项目根目录下创建一个文件夹,存放所有.js文件

js文件夹.png
  • 引入react-native模块
  • 定义需要的对象(AppRegistry,StyleSheet,View更多的可以参考API)
  • 使用React.createClass创建一个组件,用render方法试图渲染
  • 用StyleSheet.create创建样式表
  • 使用了名为AppRegistry的内置模块进行了“注册”操作
1.png
2.png
3.png

“注册”AppRegistry.registerComponent('Test', () => Load);

  • 关于网络数据获取,这里我使用的是fetch
    https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API
创建一个网络请求js文件(NetWork.js)
// 注册hearURL
let registHeadUrl = 'https://********/'
module.exports = {
    // get 请求
    fetchWork:function (url,callBack,failure) {
        fetch(url)
            .then((response) => response.json())
            .then((jsonData) => {
                // console.log(url + jsonData);
                callBack(jsonData)
            }).catch((error) => {
            failure(error);
        });
    },
    fetchPostWork:function (url,body,callBack,failure) {
        fetch(url, {
            method: "POST",
            headers: {
                'Accept': 'application/json',
                'Content-Type': 'application/json',
            },
            body: JSON.stringify(body)
        }).then(function(res) {
            if (res.ok) {
                res.json().then(function(data) {
                    callBack(data);
                });
            } else if (res.status == 401) {
                failure('401');
            }
        }, function(e) {
            failure(e)
        });
    },
    fetchPutWork:function (url,body,callBack,failure) {
        fetch(url, {
            method: "PUT",
            headers: {
                'Accept': 'application/json',
                'Content-Type': 'application/json',
            },
            body: JSON.stringify(body)
        }).then(function(res) {
            if (res.ok) {
                res.json().then(function(data) {
                    callBack(data);
                });
            } else if (res.status == 401) {
                failure('401');
            }
        }, function(e) {
            failure(e)
        });
    },
    fetchPutWithData:function (url,formData,callBack,failure) {
        fetch(url, {
            method: "PUT",
            body: formData,
            headers: {
                'Content-Type': 'multipart/form-data'
            }
        }).then(function(res) {
            if (res.ok) {
                res.json().then(function(data) {
                    callBack(data);
                });
            } else if (res.status == 401) {
                failure('401');
            }
        }, function(e) {
            failure(e)
        });
    },
    // -----------------------------------------------注册-----------------------------------------
    // 1. 验证手机号是否存在(解析exists字段)
    verifyUserMobile:function (phone,callBack,failure) {
        var url = registHeadUrl+'user_exists?mobile='+phone;
        console.log(url);
        this.fetchWork(url,callBack,failure);
    },

    // 2. 获取验证码(根据手机)
    postMobileVerify:function (phone,callBack,failure) {
        var url = registHeadUrl+'sms'
        var body = {mobile:phone}
        this.fetchPostWork(url,body,callBack,failure)
    },
    // 3. 注册
    registerNewUserWithName:function (nickname,pwd,phone,callBack,failure) {
        var url = registHeadUrl+'register'
        var body = {name:nickname,password:pwd,phoneNumber:phone}
        this.fetchPostWork(url,body,callBack,failure)
    },
    // 4. 修改个人页面
    putUserInfo:function (userID,attact,callBack,failure) {
        var url = registHeadUrl+'users/'+userID
        this.fetchPutWork(url,attact,callBack,failure)
    },
    // 5. 更新头像
    sendUserAvatar:function (userID,avatar,callBack,failure) {
        var url = registHeadUrl+'users/'+userID+'/avatar'
        var photo = {
            uri: avatar,
            type: 'image/jpeg',
            name: 'icon.jpg',
        };
        var data = new FormData()
        data.append('avatar', photo)
        this.fetchPutWithData(url,data,callBack,failure)
    }
};
其他文件调用网络请求类.png
使用.png
  • 在ViewController中安置一个按钮,点击跳转到登录界面(load.js)
viewcontroller.png

在ViewController.m中导入#import <RCTRootView.h>
在对应的方法中修改代码

- (IBAction)loadClick:(id)sender {
    
    NSURL *jsCodeLocation = [NSURL
                             URLWithString:@"http://localhost:8081/ReactNative/load.bundle?platform=ios"];
    //    NSURL *jsCodeLocation = [[NSBundle mainBundle] URLForResource:@"main.jsbundle" withExtension:nil];
    RCTRootView *rootView =
    [[RCTRootView alloc] initWithBundleURL : jsCodeLocation
                         moduleName        : @"iPhoneBIM"
                         initialProperties : nil
                          launchOptions    : nil];
    UIViewController *loadVC = [[UIViewController alloc] init];
    loadVC.view = rootView;
    [self.navigationController pushViewController:loadVC animated:YES];
}

效果图:

load .png

三.真机调试

  • 把localhost改为你的电脑的IP。在Mac系统下,你可以在系统设置/网络里找到电脑的IP地址
  • 确认手机和电脑是在同一个无线网下面
  • 把手机插上数据线,连接到你的电脑,这时候就可以在调试设备里,看到你自己的设备


    真机调试.png

四.打包成jsbundle文件

  • 在项目根目录下创建一个release_ios文件夹
  • react-native bundle --entry-file ReactNative/load.js --platform ios --dev false --bundle-output release_ios/main.jsbundle --assets-dest release_ios/
    jsbudle.png
  • 把assets文件夹和main.jsbundle添加到项目,并修改代码
修改URL.png

好了,基本到这就完成了!
最后,关于CocoaPods集成:ReactNative
1.创建package.json文件,内容同上
2.npm install

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

推荐阅读更多精彩内容