首页 > 其他分享 >【Swift开发】混合开发-React Native集成到原生iOS项目

【Swift开发】混合开发-React Native集成到原生iOS项目

时间:2023-05-22 13:06:13浏览次数:53  
标签:react Demo iOS ReactnativeIOS React 添加 Swift native


一、场景描述

针对目前项目需求,部分功能需要动态热部署,因此考虑使用React Native。下面有个Demo介绍原生iOS项目是如何与React Native集成的。先贴下React Native中文网是官方教程:React Native嵌入到现有原生应用

对老项目来说,官方推荐使用第三方包管理器CoCoaPods来自动集成,但是考虑到目前我们项目中没有使用CoCoaPods,原因如下:

1、CoCoaPods 克隆第三方代码简直是慢
2、CoCoaPods会自动创建一些目录,不利于项目管理。

综上所述,因此采用手动集成,下面介绍手动集成方法。

二、手动集成相关步骤

1、用Xcode创建一个原生的iOS项目

打开Xcode -> Create a new Xcode project -> Single View Application -> Demo-ReactnativeIOS

【Swift开发】混合开发-React Native集成到原生iOS项目_混合开发


目前,我们的已经创建好了一个iOS项目Demo-ReactnativeIOS,接下来就是集成React Native的步骤了。

2、安装react-native

在Demo-ReactnativeIOS项目目录建一个reactnative目录,用于存放我们的react-native相关文件,再创建一个package.json文件,用于初始化react-native。

【Swift开发】混合开发-React Native集成到原生iOS项目_ios_02

// package.json
{
  "name": "Demo-ReactnativeIOS",
  "version": "1.0.0",
  "private": true,
  "scripts": {
    "start": "node node_modules/react-native/local-cli/cli.js start"
  },
  "dependencies": {
    "react": "15.4.1",
    "react-native": "0.39.2"
  }
}

执行安装:

$ cd reactnative
$ npm install

【Swift开发】混合开发-React Native集成到原生iOS项目_ios_03


安装成功后,reactnative目录会产生一个node_modules,里面就是react-native所有依赖的项目包。安装的过程中如果出现一些警告WARN,这个没关系,是有些第三方库没有及时更新的原因。

3、创建index.ios.js文件

在reactnative目录下创建 index.ios.js 文件:

"use strict";

import React from "react";
import { AppRegistry, StyleSheet, Text, View } from "react-native";

class RNHighScores extends React.Component {
  render() {
    var contents = this.props["scores"].map(score => (
      <Text key={score.name}>
        {score.name}:{score.value}
        {"\n"}
      </Text>
    ));
    return (
      <View style={styles.container}>
        <Text style={styles.highScoresTitle}>2048 High Scores!</Text>
        <Text style={styles.scores}>{contents}</Text>
      </View>
    );
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: "center",
    alignItems: "center",
    backgroundColor: "#FFFFFF"
  },
  highScoresTitle: {
    fontSize: 20,
    textAlign: "center",
    margin: 10
  },
  scores: {
    textAlign: "center",
    color: "#333333",
    marginBottom: 5
  }
});

// 整体js模块的名称
AppRegistry.registerComponent("RNHighScores", () => RNHighScores);

index.ios.js这个就是js的初始化入口文件。到这一步,我们已经完成react-native的准备工作,接下来就是开始集成了。

4、原生iOS项目手动集成react-native

  • 添加react-native工程文件:由于项目没有使用Cocoapods进行第三方依赖包管理,所有我们需要手动将react-native工程包添加到我们的原生ios工程中。打开 reactnative/node_modules/react-native 目录,找到相关的项目包,将React相关的工程包手动添加到项目中:
添加 `react-native/React/React.xcodeproj`到项目中
添加 `react-native/Libraries/Network/RCTNetwork.xcodeproj`到项目中
添加 `react-native/Libraries/Text/RCTText.xcodeproj`到项目中
添加 `react-native/Libraries/WebSocket/RCTWebSocket.xcodeproj`到项目中
添加 `react-native/Libraries/ActionSheetIOS/RCTActionSheet.xcodeproj`到项目中

添加完成如下图:

【Swift开发】混合开发-React Native集成到原生iOS项目_ios_04


到这一步,我们已经将React相关工程包手动添加到Demo-ReactnativeIOS工程项目中。目前我们只添加了5个React工程包,如果后续开发中还需要其他工程包,按第4步依次添加就可以。

  • 添加相关frameworks文件: 接下来要将相关的frameworks文件添加到工程中, ReactnativeIOS -> TARGETS -> ReactnativeIOS -> Build Phases -> Link Binary With Libraries 。

点击 + 号,将所有 .a 文件(除了 “***-tvOS.a” 结尾)选中并添加。

【Swift开发】混合开发-React Native集成到原生iOS项目_ios_05

  • 添加libc++.tbd文件
  • 添加搜索头文件的地址 Demo-ReactnativeIOS -> TARGETS -> Demo-ReactnativeIOS -> Build Settings -> Header Search Paths ,添加一条 $(SRCROOT)/reactnative/node_modules/react-native/React ,选择 recursive

【Swift开发】混合开发-React Native集成到原生iOS项目_iOS_06

  • 添加 “Swift-OC-Bridging-Header.h” 桥接文件 和 “-ObjC” :(如果项目是Swift编写的话,还要添加下面两步配置,如果是OC的话,直接跳过这一步设置)

(1) Demo-ReactnativeIOS -> TARGETS -> Demo-ReactnativeIOS -> Build Settings -> Objective-C Bridging Header,添加一条 $(PROJECT_DIR)/Demo-ReactnativeIOS/Swift-OC-Bridging-Header.h

【Swift开发】混合开发-React Native集成到原生iOS项目_ios_07

(2) Demo-ReactnativeIOS -> TARGETS -> Demo-ReactnativeIOS -> Build Settings -> Other Linker Flags, 添加一条 “-ObjC”

【Swift开发】混合开发-React Native集成到原生iOS项目_iOS_08


这样我们就react-native集成到现有的ios工程中。

5、添加react-native应用

我们在原生ios应用中添加一个视图容器,用于展示react-native实现的内容。

@IBAction func jump_Click(_ sender: Any) {
        // 加载资源文件
        let jsCodeLocation = URL(string: "http://localhost:8081/index.ios.bundle?platform=ios")
        let mockData:NSDictionary = ["scores":
            [
                ["name":"Alex", "value":"42"],
                ["name":"Joel", "value":"10"]
            ]
        ]
        
        // 创建RN交互容器视图
        let rootView = RCTRootView(
            bundleURL: jsCodeLocation,
            moduleName: "RNHighScores",
            initialProperties: mockData as [NSObject : AnyObject],
            launchOptions: nil
        )
        let vc = UIViewController()
        vc.view = rootView
        self.present(vc, animated: true, completion: nil)
    }

到这一步,我们所有的集成工作已经完成,接下来就是运行项目。

6、启动RN开发服务器

在运行我们的项目之前,我们需要先启动我们的开发服务器。进入 reactnative目录 ,然后启动。

$ cd reactnative
$ react-native start

【Swift开发】混合开发-React Native集成到原生iOS项目_Text_09


当看到终端中出现React packager ready,标志着我们的服务已经开启了。

7、更新App Transport Security

直接运行项目会报 Could not connect to development server 错误,官网中有这段话:

在iOS 9以上的系统中,除非明确指明,否则应用无法通过http协议连接到localhost主机。 我们建议你在Info.plist文件中将localhost列为App Transport Security的例外。 如果不这样做,在尝试通过http连接到服务器时,会遭遇这个错误 - Could not connect to development server.

打开工程中的 Info.list 文件,添加下面配置即可:

<key>NSAppTransportSecurity</key>  
<dict>  
    <key>NSExceptionDomains</key>
    <dict>
        <key>localhost</key>
        <dict>
            <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
            <true/>
        </dict>
    </dict>
</dict>

8、运行iOS项目

通过Xcode点击项目或者 command + R 运行项目,顺利的话就会出现如下画面。

【Swift开发】混合开发-React Native集成到原生iOS项目_混合开发_10

Demo下载地址:Demo-ReactnativeIOS

三、总结:

在手动集成的过程中,要注意Xcode一些相关的参数配置,以及搭建基本的 React Native 开发环境(Homebrew、Node等)、网页HTML开发。

相关链接地址:
React Native 中文网HTML 教程


标签:react,Demo,iOS,ReactnativeIOS,React,添加,Swift,native
From: https://blog.51cto.com/u_13481937/6322956

相关文章

  • 【iOS开发】This application's application-identifier entitlement does not match
    Xcode编译报错:Thisapplication’sapplication-identifierentitlementdoesnotmatchthatoftheinstalledapplication.Thesevaluesmustmatchforanupgradetobeallowed.原因:两次编译的用的证书不一致。解决:把之前装的app卸载,重新安装下。......
  • 【iOS开发】后台定位&&socket长链接
    参考:iOS9后台定位无限后台定位注意:这个上架appstore可能会被拒绝,如果你的应用不是和地图类相关的话。目前没想到好的解决方案,有的话请发邮件告诉博主一下,谢谢!!!......
  • 【iOS开发】iOS系统更新到10.3以上无法下载企业应用
    问题描述:iOS系统10.3以上系统,通过公司app发布平台下载企业应用,在Safari中点击下载链接,服务器报错无法链接到iapp.ihefe.com。如图:解决办法:打开通用-》关于本机-》证书信任设置,然后把iapp.ihefe.com给打开,点击继续就行了。如图:......
  • 【iOS开发】launch Images启动图片设置(UILaunchImageFile)之002
    一、实现效果:通过直接给图片起默认的名字,让app启动页自动加载启动图片。二、注意点:·图片命名一定要按苹果官方的指定规则命名,图片的像素也要符合规则;·如果横竖屏图片都需要,记得在Xcode中勾选上项目支持横竖屏。三、官方描述:四、LaunchImage命名规则实例https://developer.apple.......
  • 【iOS开发】Device Compatibility(设备兼容性)
    设备兼容性https://developer.apple.com/library/content/documentation/DeviceInformation/Reference/iOSDeviceCompatibility/DeviceCompatibilityMatrix/DeviceCompatibilityMatrix.html......
  • 【Swift 开发】IDFA存储到钥匙串中保证永久不变,除非系统重装
    一、IDFA值会发生改变的情况在何种情况下,应用的IDFA值会发生改变?在iOS的设置应用中选择“重置所有设置”*没有影响在iOS的设置应用中“清除所有的内容和设置”*advertisingIdentifier和identifierForVendor都会受到影响重新设置变为新值通过iTunes还原设备*advertisin......
  • 【iOS】MD5 与Base64 的区别
    MD5不可逆性(只能加密)。任意长度的明文字符串,加密后得到的密文字符串是长度固定的。Base64可逆性(能加密和解密)。可以将图片等二进制文件转换为文本文件。可以把非ASCII字符的数据转换成ASCII字符,避免不可见字符。......
  • 【iOS开发】for in 可变数组 崩溃
    该问题来自一道笔试题:一、执行下面代码会发生什么?什么解决?NSMutableArray*array=[NSMutableArrayarrayWithObjects:@"122",@"333",@"444",nil];for(NSString*stringinarray){[arrayremoveObject:string];}答:会崩溃,提示NSGenericExc......
  • 【iOS开发】APP增量更新和热修复
    一、业务环境公司提出我们的app每次更新不要全部下载,只需要下载修改的部分。二、实现方式通过使用第三方平台,不用下载AppStore上的app,进而进行代码bug的修复。JSPatchPlatform:iOSApp热修复服务平台......
  • 【iOS开发】一些常见的警告解决方案(更新中。。。)
    UnknownpatterncolorfortheBackgroundColorattribute1.背景色属性为未知模式的颜色解决:默认xib里面控件的背景色为Default。如果出现警告,可能是你定义的颜色Xcode启动时识别不了,请重新检查每个控件的背景色,在设置一下颜色就可以了。Unusedvariable‘temString’2.变量没有......