云信 WebSDK ReactNative Demo 导读

初始化

  • 本demo建议使用react-native >=0.51 的版本

项目初始化及调试

  1. 配置iOS/Android相关运行环境,可以参考:ReactNative搭建开发环境
  2. 下载demo工程至本地
  3. 通过yarnnpm安装js包依赖,即工程目录下,命令行执行:yarnnpm install
  4. Demo工程已对依赖做过了相应的配置,无需再执行 react-native link 命令,否则会报重复依赖的错误!!!
  5. 打开模拟器或者连接真机调试:
  • iOS环境:
    • iOS需要实现保证已安装XCode
    • 控制台执行 react-native run-ios
  • 安卓环境:
    • 打开android-studio => 打开已有工程 => 选择<工程文件夹>/android目录
    • 点击android-studio右上方 同步(sync)按钮
    • (首次运行需要)根据提示,需要额外安装sdk-24, sdk-25, sdk-26的版本库(如果之前没有装过)
    • 打开安卓模拟器(android-studio右上角绿色三角形符号)
    • 控制台执行 react-native run-android
  1. 控制台日志输出:
  • iOS环境: react-native log-ios
  • 安卓环境: react-native log-android
  1. 更多调试方法参看:调试RN

iOS工程初始化的一些问题

Print: Entry, ":CFBundleIdentifier", Does Not Exist

一般通过react-native run-ios,会去下载boostdouble-conversionfollyglog等4个包,由于国内镜像源资源有所损坏,所以可能编译报错,开发者可以替换node_modules/react-native/third-party中的报内容。

相应的包,demo工程已经放到nim目录下供开发者参考

线上Release包发布

线上发布环境,云信sdk初始化配置debug选项务必设置为false,否则console.error可能会导致应用崩溃

iOS发布

1.双击 <工程目录>/ios 目录下的 NIM_ReactNative_Demo.xcodeproj 工程 2.选择 build device -> Generic iOS Device, 然后 clean 一下工程,选择 Product -> Archive 3.等待一段时间,出现如下界面 4.选择 Export 后出现选择发布的方式,这里我们的证书对应 enterprise,因此这样选择,具体选择请参考自己申请的证书类型 5.接下来这个页面可以保持默认 6.选择对应的 distribution 证书 这样就导出了 ipa 包用于发布于一些第三方管理平台例如蒲公英,如果需要发布 App Store 配置基本类似,这里不赘述。

android发布

  1. 打开控制台,进入app/android文件夹
  2. 执行命令:./gradlew assembleRelease
  3. 安卓签名请参考打包APK

Demo工程项目

项目结构

  • 项目入口:
    • index.js
      • 全局使用 global.IOS / global.__ANDROID 判断是哪个平台
    • App.js
      • 被index.js挂载,用于初始化页面状态管理器mobx
    • android 安卓编译及运行工程
    • ios iOS编译及运行工程
    • src - 项目代码编写的地方
      • index.js
        • 页面入口,用于路由管理
      • components/navBottom.js
        • 导航栏组件,在功能页中引入
      • page
        • 页面编写,所有需要被使用的页面 均需被注册在 src/pages/index.js 中,方便 src/index.js及src/tabNavigator.js所引用
        • 引入方式如 import Pages from './pages' => Pages.Login Pages.Session ...
      • components
        • UI组件
      • store
        • mobx 状态中心管理地址
        • actions
          • mobx全局提交事件,其中link.js为云信sdk全局连接状态管理
        • stores
          • 云信sdk的连接、收发消息、存储管理等一切事件所存储的数据
      • themes
        • css 样式文件,所有需要被使用的样式 均需被注册在 src/themes/index.js,方便页面及组件所引用
        • 引入方式如 import { globalStyle } from '../themes'
      • res
        • 图片等资源文件
      • configs
        • 配置信息
      • common
        • 设备信息等公共信息
      • util
        • 一些功能方法,诸如贴图表情、md5、数组操作、时间处理等等

RN TextInput输入中文Bug解决

  • React-Native 升级到0.55.4以后,TextInput不支持输入中文,需要额外对ios做特殊处理,具体参考源码 src/component/chatBox.js

云信SDK的使用

简述

本地数据库

RN-SDK同时支持含数据库和不含数据库的使用方式,根据开发者的业务场景,可自行处理。

  • 不使用数据库,即在sdk初始化时对db设为false即可,如:
  const nim = NIM.getInstance({
    // debug: true,
    appKey: 'appKey',
    account: 'account',
    token: 'token',
    db: false,
    onconnect: onConnect,
    onwillreconnect: onWillReconnect,
    ondisconnect: onDisconnect,
    onerror: onError
  });
  • 使用数据库,需要开发者安装使用realmrealm,RN-SDK目前不支持但不限制使用sqlite3作为本地数据库,开发者可以根据自己的需要,额外做存储处理。
  • RN-SDK可以通过usePlugin方法将数据库挂在到sdk实例上,用法如下:
  const SDK = require('NIM_Web_SDK_v5.*.js');
  const Realm = require('realm');
  // 此处将外置的realm数据库挂载到sdk上,供sdk使用
  SDK.usePlugin({
    db: Realm,
  });
  const nim = SDK.NIM.getInstance({
    // debug: true,
    appKey: 'appKey',
    account: 'account',
    token: 'token',
    db: true,
    onconnect: onConnect,
    onwillreconnect: onWillReconnect,
    ondisconnect: onDisconnect,
    onerror: onError
  });

消息推送

  • iOS推送
    • iOS 端推送配置首先需要开发者去苹果官网申请具有推送能力的证书,可参考 iOS 推送配置
    • 配置完证书后,按照 RN 推送配置添加相关能力
  • 安卓推送
    • 参考demo的安卓推送(java)文件目录在 ./android/nimpush,
    • 参考demo的安卓推送(js)文件目录在 ./nim/NIM_Android_Push.js
    • 配置参见安卓推送配置
  // iOS/安卓端外推送代码
  const iosPushConfig = {
    tokenName: 'push_online',
  };
  const androidPushConfig = {
    xmAppId: '2882303761517806219',
    xmAppKey: '5971780672219',
    xmCertificateName: 'RN_MI_PUSH',
    hwCertificateName: 'RN_HW_PUSH',
    mzAppId: '113798',
    mzAppKey: 'b74148973e6040c6abbda2af4c2f6779',
    mzCertificateName: 'RN_MZ_PUSH',
    fcmCertificateName: 'RN_FCM_PUSH',
  };
  var nim = SDK.NIM.getInstance({
    // ...
    iosPushConfig,
    androidPushConfig,
    // ...
  })

  // 安卓端内推送示例代码
  import { showNotification } from '../nim/NIM_Android_Push';
  showNotification({
    icon: '', title: msg.from, content: showText, time: `${msg.time}`,
  });

发送文件/图片等

由于RN-SDK发送文件消息需要额外获取文件消息的属性一起发送,所以不建议直接使用sendFile接口发送文件,而是先通过previewFile获取文件的句柄,通过其他api方法将文件属性添加回文件对象,最后再使用sendFile接口发送文件。以下为发送图片文件的示例:

  nim.previewFile({
    type: 'image',
    filePath: options.filePath,
    uploadprogress(obj) {
      // ...
    },
    done: (error, file) => {
      // 通过其他API接口获取到长、宽、大小等图片属性
      file.w = options.width;
      file.h = options.height;
      file.md5 = options.md5;
      file.size = options.size;
      const { scene, to } = options;
      if (!error) {
        constObj.nim.sendFile({
          type: 'image',
          scene,
          to,
          file,
          done: (err, msg) => {
            if (err) {
              return;
            }
            this.appendMsg(msg);
          },
        });
      }
    },
  });
  • 消息需要额外附加属性列表:
    • 图片对象
      • size: 大小, 单位byte
      • md5: md5
      • w: 宽, 单位px
      • h: 高, 单位px
    • 音频对象
      • size: 大小, 单位byte
      • md5: md5
      • dur: 长度, 单位ms
    • 视频对象
      • size: 大小, 单位byte
      • md5: md5
      • w: 宽, 单位px
      • h: 高, 单位px
      • dur: 长度, 单位ms
    • 文件对象
      • size: 大小, 单位byte
      • md5: md5

参见消息对象

全局属性注入

由于浏览器环境的全局变量为window,而react-native的全局变量为global,其属性不尽相同,为了做到兼容及适配,RN-SDK会mock一些属性,诸如global.navigator, global.location, global.io等,一般不影响用户正常使用

常用配置

应用图标更改

  • iOS更改目录 <项目路径>/ios/NIM_ReactNative_Demo/Images.xcassets/AppIcon.appiconset

  • Android更改目录 <项目路径>/android/app/src/main/res

应用显示名称更改

  • iOS更改地址 更改图中 Display Name 或者修改 info.plist 配置

//... other keys CFBundleDisplayName 更换你想替换的名称 //... ```
  • Android更改地址 <项目路径>/android/app/src/main/res/values/strings.xml
  <resources>
    <string name="app_name">{所需更改的APP名}</string>
  </resources>

NPM镜像库配置(国内淘宝镜像)

第三方依赖

其他参考阅读

Demo展示