SDK · React Native

@imcore/sdk/react-native 在完整 TypeScript IM SDK 上增加 AsyncStorage 持久化、AppState 前后台管理、NetInfo 网络恢复重连,以及 React Native 原生 文件上传。它同时支持 Expo 与 bare React Native,自身不包含原生模块。

安装

npm install @imcore/sdk @react-native-async-storage/async-storage \
  @react-native-community/netinfo

创建客户端

import { AppState } from 'react-native';
import AsyncStorage from '@react-native-async-storage/async-storage';
import NetInfo from '@react-native-community/netinfo';
import { createReactNativeClient } from '@imcore/sdk/react-native';

const im = createReactNativeClient({
  url: 'wss://im.example.com/acc',
  auth: {
    getToken: () => authStore.accessToken,
    getLogin: () => ({ userID: authStore.userID, userName: authStore.userName }),
  },
  storage: AsyncStorage,
  storageNamespace: `@my-app/imcore/${authStore.userID}/`,
  appState: AppState,
  netInfo: NetInfo,
});

await im.start();
await im.dm.send({ targetUserID: '1002', text: '来自移动端的消息' });

// 退出登录时移除 AppState/NetInfo 监听并关闭连接。
im.stop();

SDK 直接使用 React Native 全局提供的 WebSocketfetchFormDatastart() 只在应用可联网且未进入后台时连接;默认进入 background 后释放 连接,回到 active 后自动恢复。若宿主自己管理后台连接策略,可设置 disconnectOnBackground: false

多账号应用必须按账号设置不同的 storageNamespace。消息缓存、离线发送队列、 草稿和上次推送注册信息都会写入传入的 AsyncStorage。

服务端 Origin 配置

React Native 的 WebSocket 无法可靠自定义 Origin 请求头。原生移动端接入时, 服务端需要设置 auth.allow_empty_origin: true,或在可信网关实施等价的来源策略。 JWT 鉴权仍然必须开启。

离线发送与重连补拉

const result = await im.dm.sendQueued({
  targetUserID: '1002',
  text: '网络恢复后发送',
});

im.on('reconnected', async () => {
  await im.dm.historyPage({ targetUserID: '1002', afterID: lastMessageID });
  await im.operations.deviceSyncState();
});

持久化离线队列会在鉴权成功后自动发送。应用仍需在 reconnected 回调中按游标 补拉挂起期间错过的消息与多端状态。

文件上传

图片或文件选择器返回的文件描述符可以直接传入:

const uploaded = await im.media.upload({
  file: {
    uri: picked.assets[0].uri,
    name: picked.assets[0].fileName ?? 'photo.jpg',
    type: picked.assets[0].mimeType ?? 'image/jpeg',
  },
  type: 'image',
  scene: 'dm',
  targetUserID: '1002',
});

await im.dm.send({ targetUserID: '1002', segments: [uploaded.segment] });

相册、相机、通知与网络权限仍由宿主应用申请,SDK 不会主动请求系统权限。