更新记录

1.0.0(2026-11-02)

  • 新增小红书官方 SDK 注册、能力查询、图文与视频交接、取消状态及本地诊断入口候选实现。
  • 新增 Android 官方 SDK 图文、视频及完整 Motion Photo 容器交接候选,按真实 sessionId 关联回执,提供独立文件访问配置、超时和取消处理。
  • 新增明确的提交与发表边界,严格实况默认拒绝未验证的动态交接,保留显式尝试真实相册资产或完整容器的选项。
  • 新增 uni-app 与 uni-app x 图文、视频、实况和配置分类示例,覆盖来源选择、视频封面、超时、取消及完整脱敏诊断报告;真实平台支持与未验收范围以根说明为准。

平台兼容性

uni-app(5.33)

Vue2 Vue2插件版本 Vue3 Vue3插件版本 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
√ 1.0.0 √ 1.0.0 × × - - - - -
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟
× × × × × × × × × × × ×

uni-app x(5.33)

Chrome Safari Android iOS 鸿蒙 微信小程序
× × - - - ×

lizhao-xhs-share 小红书笔记、图文、视频分享

介绍

lizhao-xhs-share 是面向 uni-app 和 uni-app x 的小红书分享 UTS 插件,通过官方 SDK 将图文笔记或视频交给小红书,适用于 Android、iOS 和 Harmony 应用。

统一接口覆盖渠道注册、分享能力检测、图文与视频交接、取消和诊断;可搭配作者的实况照片、微信及系统分享插件,按业务需要选择资源和发布渠道。两个宿主均提供可操作示例和完整日志复制入口。

真实渠道和各宿主的完整验收仍在进行。接入方需自行取得与应用匹配的 AppKey 并完成平台审核;用户须在小红书核对内容并确认发表。

接入前先核对 使用说明
AppKey 与审核 使用自己的应用标识、签名及平台审核配置;小红书分享开放平台页面显示暂停接入,申请与恢复状态以官方实时信息为准
支持的平台 Android 支持可读本地文件 / HTTPS,iOS 支持本地文件 / HTTPS / 获授权的相册资产;Harmony 仅支持 HTTPS 图文或视频
分享结果 registered 表示本地注册,submitted 表示 SDK 接受交接;二者均不表示笔记已经发表
实况资源 默认拒绝未经验证的实况交接;用户明确允许后,可尝试 iOS 相册实况资产或 Android 完整 Motion Photo 容器,动态和音频需在接收端核验
原生依赖 Android 官方 AAR 随插件提供,AndroidX / OkHttp 等依赖仍需按配置解析;首次接入须原生联编或制作匹配基座
暂无 AppKey 可搭配 lizhao-live-photo 准备发布资源或使用 lizhao-share-plus 系统分享;实际可选目标和接收效果由系统与目标应用决定

功能特色

功能 能解决什么问题 对应 API / 配置
图文笔记 将 1–18 张图片交给小红书,适合商品展示、活动海报和内容分享 shareXhsNote、type=images、images
视频笔记 交接一个视频,并可提供封面;用户在小红书完成编辑和发表 shareXhsNote、type=video、video、cover
多端统一调用 uni-app / uni-app x 使用同一套业务 API,分别接入 Android、iOS 和 Harmony registerXhsShare、shareXhsNote
多种媒体来源 Android 使用可读文件或 HTTPS;iOS 还可使用获授权的相册资产;Harmony 使用 HTTPS XhsShareSource、kind=file/url/album
实况照片搭配 与实况插件配合,显式尝试交接 iOS 相册实况或 Android 完整 Motion Photo;不保证接收端保留动态 allowUnverifiedLivePhoto、资源协议
分享状态与取消 区分本地准备、SDK 交接、取消及结果未知,避免把交接回执当作发表成功 cancelXhsShare、timeoutMs、result-unknown
能力与诊断 检查客户端安装、注册、忙碌状态与笔记类型;双宿主示例提供完整日志复制、分段及失败手动回退 getXhsShareCapabilities、getXhsShareDiagnostics

适合哪些场景

业务场景 推荐用法 使用边界
商品、活动或生活记录 选择图片并交接图文笔记 图片须可读取或能被小红书访问;标题正文不保证自动填入
创作作品或短视频分享 交接单个视频,可选择提供封面 实际格式、大小与账号限制以 SDK 和客户端为准
iOS 本地媒体分享 传入可读路径、file URL 或获授权的相册 localIdentifier 相册 ID 不是文件路径,也不跨设备使用
搭配实况照片插件 选择并准备真实实况原件,用户明确允许后尝试交接 接收端是否保留动态、音频及最终发表需自行核验
Harmony 图文 / 视频 使用公网 HTTPS 资源,配置前台 Ability 和客户端查询 不支持本地文件、相册或实况;实际调用 SDK 分享后,再次分享须重启宿主
暂无 AppKey 先用实况插件准备资源,或使用系统分享 系统目标及接收效果需人工核对,不能把普通封面冒充实况
取消或结果未知 保留请求号和完整诊断,前往小红书核对 已交接的内容不能保证撤回,不自动重发

下载与导入

宿主 示例代码位置
uni-app Vue2 / Vue3 uni_modules/lizhao-xhs-share/example/uniapp/index.vue
uni-app x uni_modules/lizhao-xhs-share/example/uniappx/index.uvue

从基础到进阶:按业务模块使用

基础功能配置示例

将完整插件目录导入自己的工程,先完成第八节的平台配置与原生联编,再打开对应宿主示例。所有业务 API 只从 @/uni_modules/lizhao-xhs-share 根入口导入;AppKey、域名和素材由自己的应用提供,不在源码或日志中放 Secret、Token 或客户媒体正文。

步骤 填什么 / 做什么 真实结果
1. 注册页面 按第四节选自己的 .vue / .uvue 文件,将下方项合并到 pages.json 不覆盖已有页面;两个宿主的路由路径相同
2. 配置渠道 自己审核取得的 appKey;iOS 必填以 / 结尾的 HTTPS universalLink Android / Harmony 不使用 iOS Universal Link;本说明在不使用时省略该字段
3. 本地注册 用户同意隐私政策后,在应用前台调用 registerXhsShare registered 不等于审核 / 鉴权成功
4. 查询能力 读取 ready、busy、installed、noteTypes 和 reason ready=false 时先按 reason 解决;ready=true 仍需实际渠道验证
5. 交接图片 用户主动调用 shareXhsNote,明确 type=images 与真实 HTTPS 图片 收到 submitted 后在小红书确认内容和发表,不自动重发
{
  "pages": [
    {
      "path": "uni_modules/lizhao-xhs-share/example/uniappx/index",
      "style": { "navigationBarTitleText": "小红书分享" }
    }
  ]
}

上面为 uni-app x;uni-app Vue2 / Vue3 把 path 改为 uni_modules/lizhao-xhs-share/example/uniapp/index.vue 对应的无后缀页面路径。此 JSON 仅展示要合并的页面项。

uni-app x 最小调用:由不同按钮分别触发注册和分享。传入自己真实的 AppKey、Universal Link 与 HTTPS 图片;Android / Harmony 的 universalLink 参数可以传空串给本函数,本函数会省略字段,iOS 会真实拒绝缺少回流配置的注册。Android SDK小包随插件提供,仍需按第八节集成固定依赖、Provider和匹配新基座,不把本机SDK探针当作真实宿主业务通过。

import { registerXhsShare, getXhsShareCapabilities, shareXhsNote,
  RegisterXhsShareOptions } from '@/uni_modules/lizhao-xhs-share'

function configureXhs(appKey: string, universalLink: string): string {
  const options: RegisterXhsShareOptions = {
    appKey, timeoutMs: 120000,
    success: (result) => { console.log(result.state, '本地注册结束;鉴权尚需实际核验') },
    fail: (error) => { console.error(error.errSubject, error.errCode, error.stage, error.errMsg) },
    complete: (summary) => { console.log(summary.requestId, summary.status) }
  }
  if (universalLink.length > 0) options.universalLink = universalLink
  return registerXhsShare(options)
}
function sendHttpsImage(imageUrl: string): string | null {
  const capability = getXhsShareCapabilities()
  if (!capability.ready) { console.warn(capability.reason); return null }
  return shareXhsNote({
    type: 'images', images: [{ kind: 'url', value: imageUrl, protocol: 'image' }],
    allowUnverifiedLivePhoto: false, timeoutMs: 120000,
    success: (result) => {
      console.log(result.state, result.published, result.receiverVerified)
      // submitted也不表示已发表,后两项始终false。
    },
    fail: (error) => { console.error(error.errCode, error.nativeCode, error.nativeShareState, error.errMsg) },
    complete: (summary) => { console.log(summary.requestId, summary.status) }
  })
}

uni-app Vue2 / Vue3 使用相同对象字段;普通 JS 去掉类型声明,完整页面见本节第三层。空或非法业务参数先返回 9388001 的异步 fail;iOS 缺少真实 Universal Link 或包内配置时可返回 9388003。不要用演示字符串替代审核配置来证明 SDK 可用。

高级示例

需求 传入方式 平台边界
多图 images 传 1–18 个 XhsShareSource 公共入口上限不是小红书账号发布能力保证;不要混传 video / cover
单视频及可选封面 type=video,video 为真实视频;cover 可省略或 null 封面按 image 校验;不同时传非空 images
标题 / 正文 title 最多 200 字符,content 最多 10000 字符 只是桥接参数上限;官方自动填充受限,不保证客户端自动填入
iOS 普通本地文件 kind=file,绝对路径或本机 file URL 不接收 _doc 等未转换相对路径;不接收其他插件 resourceId
iOS 相册 kind=album,真实 localIdentifier 插件读取真实媒体类型;有限权限未必能访问指定资产
iOS 实况尝试 album + apple-live-photo + 显式 allowUnverifiedLivePhoto=true 只允许资产交接尝试,不承诺保留动态;默认 false 时真实检测到实况也拒绝
Android普通媒体候选 file或HTTPS,明确image/video类型,album拒绝 本次小包已内置;实际权限按来源授权与最终Manifest核对,不套用iOS相册权限
Android实况尝试 唯一完整container以file + android-motion-photo交接,显式allowUnverifiedLivePhoto=true 默认严格模式9388008;不取封面、不拆散件,接收端动态仍unverified
Harmony 仅 kind=url 的公网 HTTPS 普通图文 / 视频 实况协议一律拒绝,即使显式允许;不自动上传本地媒体
超时 / 取消 timeoutMs 默认 120000;用 shareXhsNote 返回的请求号取消 提交前取消与提交后未知分开,返回宿主不表示取消

uni-app x 的 HTTPS 视频配置;把自己的真实地址作为参数传入,不填虚构示例 URL。无封面时传 null,不用空地址伪造封面;普通 JS 删除类型注解即可。

import { shareXhsNote, XhsShareSource } from '@/uni_modules/lizhao-xhs-share'

function sendVideo(videoUrl: string, coverUrl: string | null,
  title: string, content: string): string {
  const video: XhsShareSource = { kind: 'url', value: videoUrl, protocol: 'video' }
  let cover: XhsShareSource | null = null
  if (coverUrl != null) cover = { kind: 'url', value: coverUrl!, protocol: 'image' }
  return shareXhsNote({
    type: 'video', images: [], video, cover, title, content,
    allowUnverifiedLivePhoto: false, timeoutMs: 180000,
    success: (result) => { console.log(result.state, '请在小红书核对视频及发表结果') },
    fail: (error) => { console.error(error.errCode, error.nativeCode, error.nativeShareState) },
    complete: (summary) => { console.log(summary.status) }
  })
}

uni-app x 的 iOS 本地 / 相册配置。先完成注册;下段两个函数对应两个明确操作,不能在普通图片失败时自动调用实况函数。文件、相册 ID 不进入日志;共享前保持原件可读。

import { shareXhsNote } from '@/uni_modules/lizhao-xhs-share'

function sendIosImageFile(absolutePath: string): string {
  return shareXhsNote({
    type: 'images', images: [{ kind: 'file', value: absolutePath, protocol: 'image' }],
    success: (result) => { console.log(result.state) },
    fail: (error) => { console.error(error.errCode, error.errMsg) }
  })
}
function tryIosAlbumAsset(localIdentifier: string, userAllowsUnverifiedLivePhoto: boolean = false): string {
  return shareXhsNote({
    type: 'images',
    images: [{ kind: 'album', value: localIdentifier,
      protocol: userAllowsUnverifiedLivePhoto ? 'apple-live-photo' : 'image' }],
    allowUnverifiedLivePhoto: userAllowsUnverifiedLivePhoto,
    success: (result) => {
      console.log(result.state, result.published, result.receiverVerified) // 始终不作发表/保留证明。
    },
    fail: (error) => { console.error(error.errCode, error.errMsg) }
  })
}

protocol 是明确声明,不是转换开关。iOS 会核验相册 asset 的实际类型和 photoLive:普通图不能声明 apple-live-photo,实况也不能通过省略协议或声明 image 绕过默认保护。android-motion-photo / harmony-moving-photo 不会转换为 Apple 配对;Android候选只在显式允许后尝试完整Motion Photo文件,Harmony仍明确拒绝全部实况协议。

Android普通图片候选使用真实可读文件,不使用相册ID。下例适用于uni-app x,普通JS去掉类型注解;HTTPS普通图片继续使用基础示例的sendHttpsImage。先完成本节注册、Android原生配置和匹配新基座,再由用户按钮调用。

import { shareXhsNote } from '@/uni_modules/lizhao-xhs-share'

function sendAndroidImageFile(absolutePath: string): string {
  return shareXhsNote({
    type: 'images', images: [{ kind: 'file', value: absolutePath, protocol: 'image' }],
    allowUnverifiedLivePhoto: false, timeoutMs: 120000,
    success: (result) => { console.log(result.state, '请到小红书核对普通图片及发表结果') },
    fail: (error) => { console.error(error.errCode, error.nativeCode, error.nativeShareState) },
    complete: (summary) => { console.log(summary.requestId, summary.status) }
  })
}

普通图片入口不能接收封面后宣称保留实况。要尝试Motion Photo,使用后面的真实准备结果与显式允许入口;协议、文件和用户选择必须一致,不把完整实况标成普通image来规避严格保护。

取消与诊断使用同一请求号关联。下面适用于 uni-app x;普通 JS 去掉类型声明。取消返回的是取消请求自己的 requestId,targetRequestId 才是原分享任务。

import { cancelXhsShare, getXhsShareDiagnostics } from '@/uni_modules/lizhao-xhs-share'

function cancelOne(shareRequestId: string): string {
  return cancelXhsShare({
    targetRequestId: shareRequestId, timeoutMs: 10000,
    success: (result) => {
      console.log(result.accepted, result.state)
      if (result.state == 'result-unknown') console.warn('只结束本地等待,先核对小红书,不能保证撤回')
    },
    fail: (error) => { console.error(error.errCode, error.errMsg) },
    complete: (summary) => { console.log(summary.status) }
  })
}
const diagnostics = getXhsShareDiagnostics()
console.log(diagnostics.pluginId, diagnostics.buildMark,
  diagnostics.pendingCount, diagnostics.droppedCount, diagnostics.entries.length)
// 需要报告时使用示例底部完整诊断,不把原始媒体URL、AppKey或正文写日志。

文案只在用户主动点按时复制;本函数可放入两种宿主页面,不在注册、分享或回流时自动调用。

export function copyNoteText(title, content) {
  uni.setClipboardData({
    data: title + '\n' + content,
    success() { console.log('文案已复制,请自行在小红书粘贴') },
    fail() { console.error('复制失败,请在当前输入框手动选择需要的文案') }
  })
}

完整示例

下面串联配置、注册、能力检查、用户主动分享、取消和退出。它演示 HTTPS 普通图片,按 iOS / Harmony 与 Android候选的各自边界使用;Android还须完成固定依赖、Provider与原生联编。请先按第八节配置包内身份与权限,不将注册和 ready 视为鉴权通过。示例不会自动清空输入、重复交接或删除媒体。

uni-app x 可注册页面:

<template>
  <view style="padding: 12px;">
    <input v-model="appKey" placeholder="自己的审核 AppKey" />
    <input v-model="universalLink" placeholder="iOS HTTPS Universal Link,末尾 /" />
    <input v-model="imageUrl" placeholder="自己可访问的 HTTPS 普通图片" />
    <button :disabled="busy" @click="initialize">注册 SDK</button>
    <button :disabled="busy || needsCheck" @click="send">交接图片</button>
    <button @click="cancel">取消 / 核对</button>
    <button @click="confirmChecked">已核对小红书中的实际结果</button>
    <button @click="diagnose">读取诊断摘要</button>
    <text>{{ status }}</text>
  </view>
</template>
<script setup lang="uts">
import { ref } from 'vue'
import { onUnload } from '@dcloudio/uni-app'
import { registerXhsShare, getXhsShareCapabilities, shareXhsNote,
  cancelXhsShare, getXhsShareDiagnostics, RegisterXhsShareOptions } from '@/uni_modules/lizhao-xhs-share'
const appKey = ref('')
const universalLink = ref('')
const imageUrl = ref('')
const status = ref('填写自己的配置与素材')
const busy = ref(false)
const needsCheck = ref(false)
let disposed = false
let shareRequestId = ''
function initialize(): void {
  if (disposed || busy.value) return
  busy.value = true
  const options: RegisterXhsShareOptions = {
    appKey: appKey.value, timeoutMs: 120000,
    success: () => { if (!disposed) status.value = 'SDK本地注册完成,鉴权仍需实际分享核验' },
    fail: (error) => { if (!disposed) status.value = error.errCode.toString() + ':' + error.errMsg },
    complete: () => { if (!disposed) busy.value = false }
  }
  if (universalLink.value.length > 0) options.universalLink = universalLink.value
  registerXhsShare(options)
}
function send(): void {
  if (disposed || busy.value || needsCheck.value) return
  const capability = getXhsShareCapabilities()
  if (!capability.ready) { status.value = capability.reason; return }
  busy.value = true
  shareRequestId = shareXhsNote({
    type: 'images', images: [{ kind: 'url', value: imageUrl.value, protocol: 'image' }],
    allowUnverifiedLivePhoto: false, timeoutMs: 120000,
    success: (result) => {
      if (disposed) return
      needsCheck.value = true
      status.value = result.state + ';请在小红书核对内容与发表结果'
    },
    fail: (error) => {
      if (disposed) return
      if (error.errCode == 9388011) needsCheck.value = true
      status.value = error.errCode.toString() + ':' + error.errMsg
    },
    complete: () => { if (!disposed) busy.value = false }
  })
}
function cancel(): void {
  if (disposed || shareRequestId.length == 0) return
  cancelXhsShare({ targetRequestId: shareRequestId,
    success: (result) => {
      if (disposed) return
      if (result.state == 'result-unknown') needsCheck.value = true
      status.value = '取消状态=' + result.state + ';不表示外部内容已撤回'
    },
    fail: (error) => { if (!disposed) status.value = error.errMsg }
  })
}
function confirmChecked(): void {
  if (disposed || busy.value) return
  const capability = getXhsShareCapabilities()
  if (capability.busy) { status.value = capability.reason; return }
  needsCheck.value = false
  status.value = '已记录人工核对;再次交接仍按SDK实际能力检查'
}
function diagnose(): void {
  const value = getXhsShareDiagnostics()
  if (!disposed) status.value = value.capabilities.reason + ';日志数=' +
    value.entries.length.toString() + ';丢弃数=' + value.droppedCount.toString()
}
onUnload(() => {
  disposed = true
  if (busy.value && shareRequestId.length > 0) cancelXhsShare({ targetRequestId: shareRequestId })
  // SDK拥有的读取副本由原生安全收口,不删除调用方文件、相册资产或目标App数据。
})
</script>

uni-app Vue2 / Vue3 对应页面脚本如下。使用上面相同模板,变量改为 data、方法放入 methods,生命周期使用 onUnload;不需要组合式 API 适配依赖。

import { registerXhsShare, getXhsShareCapabilities, shareXhsNote,
  cancelXhsShare, getXhsShareDiagnostics } from '@/uni_modules/lizhao-xhs-share'
export default {
  data() {
    return { appKey: '', universalLink: '', imageUrl: '', status: '填写自己的配置与素材',
      busy: false, needsCheck: false, shareRequestId: '', disposed: false }
  },
  onUnload() {
    this.disposed = true
    if (this.busy && this.shareRequestId) cancelXhsShare({ targetRequestId: this.shareRequestId })
  },
  methods: {
    initialize() {
      if (this.disposed || this.busy) return
      this.busy = true
      const options = { appKey: this.appKey, timeoutMs: 120000,
        success: () => { if (!this.disposed) this.status = '本地注册完成,鉴权仍需实际核验' },
        fail: (error) => { if (!this.disposed) this.status = error.errCode + ':' + error.errMsg },
        complete: () => { if (!this.disposed) this.busy = false }
      }
      if (this.universalLink.length > 0) options.universalLink = this.universalLink
      registerXhsShare(options)
    },
    send() {
      if (this.disposed || this.busy || this.needsCheck) return
      const capability = getXhsShareCapabilities()
      if (!capability.ready) { this.status = capability.reason; return }
      this.busy = true
      this.shareRequestId = shareXhsNote({
        type: 'images', images: [{ kind: 'url', value: this.imageUrl, protocol: 'image' }],
        allowUnverifiedLivePhoto: false, timeoutMs: 120000,
        success: (result) => {
          if (!this.disposed) { this.needsCheck = true; this.status = result.state + ';请在小红书核对实际结果' }
        },
        fail: (error) => {
          if (this.disposed) return
          if (error.errCode === 9388011) this.needsCheck = true
          this.status = error.errCode + ':' + error.errMsg
        },
        complete: () => { if (!this.disposed) this.busy = false }
      })
    },
    cancel() {
      if (this.disposed || !this.shareRequestId) return
      cancelXhsShare({ targetRequestId: this.shareRequestId,
        success: (result) => {
          if (this.disposed) return
          if (result.state === 'result-unknown') this.needsCheck = true
          this.status = '取消状态=' + result.state + ';不能保证撤回'
        },
        fail: (error) => { if (!this.disposed) this.status = error.errMsg }
      })
    },
    confirmChecked() {
      if (this.disposed || this.busy) return
      const capability = getXhsShareCapabilities()
      if (capability.busy) { this.status = capability.reason; return }
      this.needsCheck = false
      this.status = '已记录人工核对;再次交接仍需能力检查'
    },
    diagnose() {
      const value = getXhsShareDiagnostics()
      if (!this.disposed) this.status = value.capabilities.reason + ';日志数=' +
        value.entries.length + ';丢弃数=' + value.droppedCount
    }
  }
}

以上完整调用流程省略了重复的诊断界面布局;随包两个宿主示例按图文、视频、实况、配置分类,顶部标签仅切换显示,不清空输入、取消请求或重建报告。底部状态和完整日志为公共区域。

分类 / 公共区域 能力 / API 实际测试方法
图文 shareXhsNote、images 选择相册图片或逐行填写 1–18 个 HTTPS / 文件 / iOS 相册资源,设置标题正文后主动交接;一次选图最多 9 张
视频 shareXhsNote、video、cover 选择视频或填写资源,可单独选择封面及其来源;无封面留空,检查返回结果
实况 shareXhsNote、protocol、allowUnverifiedLivePhoto 选择 iOS 相册实况或 Android 完整 Motion Photo;先检查默认严格拒绝,再由用户明确允许尝试。鸿蒙实况选项用于验证不支持的真实回执
配置 registerXhsShare、getXhsShareCapabilities、timeoutMs 填自己的 AppKey、iOS Universal Link 和超时毫秒数;测试空值、安装状态、ready 和 busy,注册不代表鉴权通过
公共状态 / 取消 getXhsShareCapabilities、cancelXhsShare 检查能力和当前回执;分享准备期取消、交接后取消、超时及结果未知分别核对,不自动重发
公共诊断 getXhsShareDiagnostics 比较操作前后阶段与真实 SDK 来源、数值码及丢弃数,不记录 Key、资源路径或媒体正文
公共复制 一键复制日志、完整报告、下一段、新快照、失败手动回退 核对同一报告编号、长度和首尾;复制失败不推进段号,不清原日志;手机实际剪贴板仍待设备验收

相册按钮使用宿主的系统选择器;返回的临时路径须满足当前平台的可读来源要求。Harmony 的小红书 SDK 仅接收 HTTPS,因此本地选择的文件不能直接用于 Harmony 分享;实况来源需保留真实相册资产或完整容器,不以普通选图结果冒充实况。

宿主 完整示例路径
uni-app x uni_modules/lizhao-xhs-share/example/uniappx/index.uvue;报告helper:uni_modules/lizhao-xhs-share/example/report.uts
uni-app Vue2 / Vue3 uni_modules/lizhao-xhs-share/example/uniapp/index.vue;报告helper:uni_modules/lizhao-xhs-share/static/report.js
可选实况组合 uni_modules/lizhao-live-photo/example/composition/share.uvue、uni_modules/lizhao-live-photo/example/composition/share.vue;只有另行导入实况、微信和系统分享插件后注册

与实况、微信、系统分享组合

可选插件 分工 导入与使用边界
lizhao-live-photo,插件市场 选择、展示和检查实况照片,prepareLivePhotoPublish 准备发布资源 从其根入口调用,详见 uni_modules/lizhao-live-photo/readme.md;不把 resourceId 当本插件的 source.value
lizhao-wechat-kit,插件市场 普通图片用share(type=1,scene=1)交接朋友圈,或仅打开微信 用自己的微信AppID / iOS Universal Link;普通图片没有实况保留合同,不代表已发表
lizhao-share-plus,插件市场 无小红书AppKey时使用适用的系统文件分享 目标列表由系统决定;targetPackage不表示定位朋友圈;不能由普通文件回执证明保留实况

组合流程为“真实选择 → 检查 / 准备 → 用户明确交接 → 核对目标实际结果 → 不再读取后释放原资源”。iOS实况先取得 prepareLivePhotoPublish 返回的真实 assetId;Android候选必须保留完整container,只有allowUnverifiedLivePhoto=true才尝试单个File交接,默认严格模式仍9388008。本地容器还会核对JPEG、XMP标记/长度与实际MP4尾部,不能本地验证的实况HTTPS来源明确拒绝;Harmony本插件不能接收MovingPhoto、本地文件或相册ID。

以下 uni-app x 函数由用户按钮触发,接收真实准备结果。默认不尝试未验证实况;显式允许后也只交接相册ID,published与receiverVerified仍为false。普通JS去掉类型导入与注解,完整双宿主组合按钮见上表真实路径。

import { PrepareLivePhotoPublishResult } from '@/uni_modules/lizhao-live-photo'
import { shareXhsNote } from '@/uni_modules/lizhao-xhs-share'

function tryPreparedAppleAsset(prepared: PrepareLivePhotoPublishResult,
  userAllowsUnverifiedLivePhoto: boolean = false): string | null {
  if (!userAllowsUnverifiedLivePhoto || prepared.representation != 'live-photo' ||
      prepared.protocol != 'apple-live-photo' || prepared.assetId == null) return null
  return shareXhsNote({
    type: 'images', images: [{ kind: 'album', value: prepared.assetId!, protocol: 'apple-live-photo' }],
    allowUnverifiedLivePhoto: true,
    success: (result) => { console.log(result.state, result.published, result.receiverVerified) },
    fail: (error) => { console.error(error.errCode, error.errMsg) },
    complete: (summary) => { console.log(summary.status) }
  })
}

Android候选接收prepareLivePhotoPublish实际返回的唯一container。下面函数默认false时不交接;如果直接调用shareXhsNote声明android-motion-photo却未允许,严格模式仍返回9388008。显式true只尝试完整单文件,不改用封面或图片/视频散件。uni-app x:

import { PrepareLivePhotoPublishResult } from '@/uni_modules/lizhao-live-photo'
import { getXhsShareCapabilities, shareXhsNote } from '@/uni_modules/lizhao-xhs-share'

function tryPreparedMotionPhoto(prepared: PrepareLivePhotoPublishResult,
  userAllowsUnverifiedLivePhoto: boolean = false): string | null {
  if (!userAllowsUnverifiedLivePhoto || prepared.representation != 'live-photo' ||
      prepared.protocol != 'android-motion-photo' || prepared.files.length != 1 ||
      prepared.files[0].role != 'container') return null
  const capability = getXhsShareCapabilities()
  if (!capability.ready) { console.warn(capability.reason); return null }
  return shareXhsNote({
    type: 'images', images: [{ kind: 'file', value: prepared.files[0].path,
      protocol: 'android-motion-photo' }],
    allowUnverifiedLivePhoto: true, timeoutMs: 120000,
    success: (result) => { console.log(result.state, result.published, result.receiverVerified) },
    fail: (error) => {
      console.error(error.errCode, error.nativeCode, error.nativeShareState)
      if (error.errCode == 9388011) console.warn('结果未知,请核对小红书,不自动重发')
    },
    complete: (summary) => { console.log(summary.requestId, summary.status) }
  })
}

uni-app Vue2 / Vue3使用相同真实准备结果:

import { getXhsShareCapabilities, shareXhsNote } from '@/uni_modules/lizhao-xhs-share'

export function tryPreparedMotionPhoto(prepared, userAllowsUnverifiedLivePhoto = false) {
  if (!userAllowsUnverifiedLivePhoto || prepared.representation !== 'live-photo' ||
      prepared.protocol !== 'android-motion-photo' || prepared.files.length !== 1 ||
      prepared.files[0].role !== 'container') return null
  const capability = getXhsShareCapabilities()
  if (!capability.ready) { console.warn(capability.reason); return null }
  return shareXhsNote({
    type: 'images', images: [{ kind: 'file', value: prepared.files[0].path,
      protocol: 'android-motion-photo' }],
    allowUnverifiedLivePhoto: true, timeoutMs: 120000,
    success(result) { console.log(result.state, result.published, result.receiverVerified) },
    fail(error) {
      console.error(error.errCode, error.nativeCode, error.nativeShareState)
      if (error.errCode === 9388011) console.warn('先核对小红书,不自动重发')
    },
    complete(summary) { console.log(summary.requestId, summary.status) }
  })
}

已核对实际Android SDK图片File链路的字节码:该链路复制字节流,不解码重压缩、不在JPEG EOI处截断。这只能说明SDK此发送准备路径没有主动剥离容器尾部;客户端读取、编辑和发表后的动态/音频仍为unverified,不是“实况发表已通过”的证明。

本插件没有公开“释放其他插件资源”接口。由实况插件产生的原件仍交给其releaseLivePhotoResources;外部系统 / SDK仍可能读取时先保留,确认目标读取结束后再释放,逐项检查released/reason。iOS相册资产不因释放临时resource而删除;取消、超时、返回宿主均不能作为读取结束证明。

API 用途速查

API 同步返回 用途与成功边界
registerXhsShare(options) string:本次requestId 注册官方SDK;success.state=registered仅为本地注册
getXhsShareCapabilities() XhsShareCapabilities 无参数、同步读取快照,不申请照片权限,不证明鉴权
shareXhsNote(options) string:本次requestId 交接图文 / 视频;success.state=submitted,不证明已发表或动态保留
cancelXhsShare(options) string:取消请求自己的requestId 对原分享请求本地取消 / 查询,SDK已交接时不能撤回
getXhsShareDiagnostics() XhsShareDiagnostics 无参数、同步独立脱敏快照,不自动上传或复制

通用异步参数与回调

参数 类型 必填 说明 默认值 可选参数
options 对应Options或null 是 三个异步入口缺省为null;非法参数在请求号返回后异步fail/complete,不伪造成功 null,无效 下面各业务字段
timeoutMs number 否 毫秒,1000–600000有限整数;Native优先区分准备 / 提交阶段,UTS桥留1000ms回执宽限 120000 1000–600000
success (result: XhsShareReceipt) => void 否 本地注册、提交或取消回执;不代表发表 无 无
fail (error: XhsShareFail) => void 否 错误带请求、操作、阶段及可取得的原生数值分类 无 无
complete (result: XhsShareCompletion) => void 否 success/fail之后至多一次;unknown必须人工核对 无 无

请求号在回调前返回。success/fail互斥且各至多一次,complete随后至多一次;业务回调抛错被隔离并留下安全诊断,仍执行complete。重复 / 迟到原生回执不再通知业务。最多同时保留16个待结算公共请求,超限明确忙碌;这不表示允许同时打开多个分享会话。

注册参数 RegisterXhsShareOptions

参数 类型 必填 说明 默认值 可选参数
appKey string 是 自己审核取得的AppKey;1–256字符,仅字母、数字、下划线、点、连字符;符合格式不证明凭据有效 无 无
universalLink string iOS是,其他端否 HTTPS,非空主机、以/结尾,不含查询或fragment;iOS还检查自身Scheme与前台配置。Android/Harmony不使用该字段,非使用时省略 无 自己真实配置的Universal Link
timeoutMs、success、fail、complete 见通用表 否 注册也遵守通用超时和回调合同 见通用表 无

媒体来源 XhsShareSource

参数 类型 必填 说明 默认值 可选参数
kind string 是 来源种类,按平台分别校验,不自动把句柄或相册ID当文件路径 无 file、url、album
value string 是 1–8192字符,无换行/NUL;url为HTTPS,file为平台实际可读的本地来源,album为iOS真实localIdentifier。Android候选接受file/HTTPS、拒绝album 无 对应kind的真实值
protocol string 否 明确媒体语义,不触发转换;有值须与真实类型相符。iOS核验相册实况,Android候选仅显式允许后尝试android-motion-photo完整File,Harmony拒绝全部实况协议 无,仍做实际平台校验 image、video、apple-live-photo、android-motion-photo、harmony-moving-photo

url须不含账号密码。Harmony额外拒绝明显本地地址,只交接公网HTTPS,不发探测请求、不承诺目标端可达。iOS普通file资源在自有目录复制后预检,单文件最多512MiB、会话副本总计最多1GiB;这些是本插件保护上限,不代替官方更严格的限制。album只在iOS支持,limited授权仅能访问当前获准资产。Android的file接受可读绝对路径、无authority/query/fragment的file://或已有读授权的content://,后台复制为自有输入副本;HTTPS交给官方SDK,不由本插件自动下载。不能本地验证完整容器的实况URL明确拒绝,不把album或另一个插件的resourceId当作文件。

分享参数 ShareXhsNoteOptions

参数 类型 必填 说明 默认值 可选参数
type string 是 图文或单视频,明确分支 无 images、video
images XhsShareSource[] type=images时是 1–18项;不能与video/cover混传;type=video时省略或空数组 [],图文时无效 image来源
video XhsShareSource或null type=video时是 唯一真实视频来源,不能与非空images混传 null,视频时无效 video来源
cover XhsShareSource或null 否 仅视频分支,按image校验;省略时不造假URL,真实效果由客户端决定 null image来源
title string 否 公共参数最多200字符;不保证SDK或目标App自动填入 空字符串 自己的标题
content string 否 公共参数最多10000字符;不保证自动填入,不自动写剪贴板 空字符串 自己的正文
allowUnverifiedLivePhoto boolean 否 false保持严格保护;iOS真实相册实况、Android候选完整Motion Photo File仅在显式true后尝试未验交接,不保证接收端动态。true不启用Harmony实况支持 false true、false
timeoutMs、success、fail、complete 见通用表 否 提交后回执未知不自动重发 见通用表 无

取消参数 CancelXhsShareOptions

参数 类型 必填 说明 默认值 可选参数
targetRequestId string 是 原shareXhsNote返回的有效请求号;1–160字符,仅字母、数字、下划线、点、冒号、连字符 无 无
timeoutMs、success、fail、complete 见通用表 否 取消有自己的requestId;不能以accepted判断外部笔记已撤回 见通用表 无

回执、完成和错误对象

XhsShareReceipt字段 类型 解释
errMsg、requestId、operation string 消息、本次请求号和register/share/cancel操作;取消回执的请求号不是目标号
accepted boolean 本次操作是否在所报告阶段被接受;不证明鉴权或发表
state XhsShareReceiptState registered、submitted、cancelled-before-handoff、result-unknown、not-found,含义见下表
published boolean 当前始终false;没有提供最终发表证明
receiverVerified boolean 当前始终false;没有核验接收端内容、动态或音频
nativeCode number或null 可取得的官方基础错误码,未知则null
nativeShareState number或null 可取得的官方分享状态数值,未知则null;不与本地state混为一谈
state / 场景 业务处理
registered SDK本地注册完成,仍需真实AppKey、账号与渠道验收
submitted SDK已接受交接阶段,去小红书核对,不自动再发;不能当作最终成功发表
cancelled-before-handoff 原分享在SDK调用前已取消;原分享请求可收到9388009/complete(cancelled)
result-unknown 已经或可能交接,只终止本地等待;取消请求complete(unknown),先人工核对
not-found 当前没有可取消的活动目标;不证明历史分享已取消、失败或发表
对象 字段与类型 合同
XhsShareCompletion errSubject:string、errCode:number、errMsg:string、requestId:string、operation:string、status status为success/failed/cancelled/unknown;errCode=0只表示当前请求成功阶段,成功取消也可能status=unknown
XhsShareFail errSubject:string、errCode:XhsShareErrorCode、errMsg:string、requestId:string、operation:string、stage:string errSubject固定lizhao-xhs-share;错误码见下一节,不只保存一句失败提示
XhsShareFail nativeCode:number或null、nativeShareState:number或null、nativeType:string或null 真实可取得的原生数值与安全分类;未知保留null,不猜测原生堆栈

各平台按真实SDK阶段回执:Android等待匹配sessionId的SDK回调才结算,成功也只报告submitted;iOS / Harmony可能先返回交接回执再收到后续平台事件。一次性success/complete不会因后续终态再触发;后续信息进入诊断和隔离状态。不要把回调次数、回到前台或第二次SDK回调当作可靠的最终发表证明。

能力与诊断快照

XhsShareCapabilities字段 类型 含义 / 来源
pluginId、pluginVersion、platform string 插件构建身份与实际平台;pluginVersion由本次清单生成/校验
installed boolean或null 官方SDK / 系统能确认的安装状态;null表示未知,未配置查询Scheme也可能影响结果
registered boolean 本地注册状态,不能代替审核 / 鉴权
ready boolean 仅在Native报告可用、已注册、installed=true且不忙碌时为true,不保证业务成功
busy boolean 准备、等待终态或安全隔离;按reason核对,不自动解锁或重试
sdkVersion string Android官方getSdkVersion、iOS运行时apiVersion读取或unknown;Harmony没有该运行API,明确unknown
sdkDistributionVersion string 实际集成官方制品的分发身份,与包内元数据、运行时API分开
livePhotoPreservation string 当前只有unverified或unsupported,从不返回“已验证保留”
noteTypes string[] 实际Native支持的images/video;不支持平台为空数组
reason string 未就绪、忙碌、限制或待验原因
XhsShareDiagnostics字段 类型 含义
pluginId、pluginVersion、buildMark、platform string 本次构建与实际运行来源;不以排查电脑版本冒充安装包身份
capabilities XhsShareCapabilities 取报告时真实能力快照
entries XhsShareDiagnosticEntry[] 独立的脱敏操作日志副本,默认最多1000条/524288字符消息预算
droppedCount、pendingCount number 累计覆盖/丢弃条数、尚未本地结算的公共请求数;不等同SDK已无外部会话
nativeDiagnostics string Native快照的脱敏文本、来源与边界;原始快照超过16384字符会明确标记截断
XhsShareDiagnosticEntry sequence:number、timeMs:number、level:string、operation:string、requestId:string、stage:string、message:string、errCode:number或null 保留真实时间、顺序、请求关联与阶段;敏感值不进入缓存

两宿主示例报告包含编号、生成时间及时区、日志数、长度、首尾标记、环境与上述快照。HX/编译器/基座来源无法取得时写unknown;完整报告与固定快照分段不清空日志,只有复制成功才推进段号,失败可手动选择全文/当前段。手机OS剪贴板全量回读、长报告重组和真实失败提示仍需目标设备验收。

错误码说明

errSubject 固定为 lizhao-xhs-share。保留errCode、requestId、operation、stage及可取得的nativeCode/nativeShareState/nativeType;参数合法不证明SDK或业务可用。没有把系统面板打开、注册或submitted当作最终发表。

错误码 含义 处理建议
9388001 参数无效 核对必填字段、类型、数量、协议、来源、超时和URL格式;可选Universal Link非空时须格式有效,iOS仍需真实配置
9388002 平台或来源不支持 Web/小程序不支持;Android候选拒绝album;Harmony只HTTPS,不能传本地或相册
9388003 未配置 / 未注册或包内配置缺失 核对真实AppKey、iOS Universal Link、xhs回流Scheme与相册用途;配置后重新原生联编
9388004 客户端未安装或无法检测 核对小红书安装和宿主querySchemes / iOS查询Scheme;不要由检测失败伪造可用
9388005 SDK注册、交接拒绝或业务错误 结合原生数值码、阶段、配置与审核资质核对;本地注册不证明鉴权
9388006 权限拒绝或所需权限不足 检查实际照片权限、limited资产范围及SDK报告的目标端剪贴板/相册权限,不吞原始数值码
9388007 忙碌、重复交互或安全隔离 等待真实收口;Harmony 实际调用 SDK 分享后或注册状态异常时须重启宿主,不自动解锁
9388008 实况保留不支持 / 尚未验证 默认严格实况拒绝;只有显式允许后才尝试iOS真实相册资产或Android完整Motion Photo单File;Harmony仍拒绝,不自动退成封面
9388009 用户或本地准备取消 原分享complete(cancelled);与submitted后的未知分开,不代表已经撤回外部内容
9388010 SDK调用前准备或排队超时 核对来源、权限和前台状态;不要把超时当成成功或立即循环重试
9388011 交接 / 结果未知 可能已到SDK或小红书,先人工核对目标;取消和超时不能撤回,禁止自动重发
9388012 原生桥接、SDK接口或回执无效 检查匹配基座、真实SDK、请求身份及诊断,不修改生成物伪造通过
9388013 素材读取、相册访问或私有副本失败 核对文件可读性、大小、媒体类型和相册授权;不删除原件后重试
9388014 无可交互前台页面 / Ability上下文 在应用前台由用户操作,核对页面生命周期与原生集成

在提交前取消,原任务走9388009;提交前超时为9388010。SDK已开始或已交接后取消/超时而无法确认终态时,原任务可走9388011,取消回执可为result-unknown。share已收到submitted后,一次性回调不重发,晚到事件保留在诊断;无自动回跳也不能判定取消。

注意事项

宿主、运行端与验证范围

插件市场兼容性字段使用 √ 表示支持、x 表示不支持、- 表示待确认。下表中的待确认不等于没有代码实现,也不代表已完成真实宿主或平台业务验收。

宿主 / 平台 当前实现 验证与使用边界
uni-app x App / Vapor 根入口 UTS 与对应 Native;市场字段为 - Vapor 三端示例资源已导出;完整基座、Apple 原生链接和设备仍待验证,原生 VDOM 另验
uni-app Vue2 / Vue3 独立 .vue 示例与相同公共 API;市场 Vue2、Vue3 字段为 √ 两种 Vue 版本已分别通过 Android 资源编译、生成 Kotlin 联编和页面模型检查;完整基座及渠道仍需验收
uni-app App vue / nvue 市场字段为 -,等待相应宿主验收 nvue、匹配基座及真实分享链尚未验证,不以资源导出或模型测试冒充真机业务通过
iOS 官方XCFramework、Swift媒体准备、URL / Universal Link生命周期Hook;最低构建目标iOS12 本地静态核对不等于Apple SwiftCompile/链接;照片limited与搭配实况图库需iOS14+,账号、设备、回流和最终发表仍未验
Android 官方 SDK 原生接入,file / HTTPS 图文与视频;SDK 最低 API 21 官方 AAR 随包提供;独立原生壳已验证资源读取和无 Key 错误路径,完整宿主、真实 AppKey 鉴权、回流与发表仍需验收
Harmony 官方HAR与真实ArkTS Native,仅HTTPS图文/视频 独立Native已在API22真实编译;未因此宣称完整双宿主、签名HAP、设备、账号和其他API等级已验收
Web x,不支持小红书 App SDK 可由业务另选适用的系统 / 网页方案,不伪装 App 渠道成功
微信 / 支付宝等小程序、快应用 x,不支持 存在拒绝入口不是分享支持,不猜测跳转 URL
uniCloud x,不是云端插件 不提供云服务端分享能力

AppKey、自动填充与SDK版本来源

项目 要求 / 真实边界
开放平台 官方分享开放平台页面显示暂停接入;申请是否开放及审核进度以平台实时信息为准,不承诺立即取得 AppKey
应用身份 自己的AppKey、Bundle ID / 包名、签名与平台审核配置必须匹配;SDK本地接受注册不能代替鉴权
标题正文 官方限制自动填充,传入title/content不证明已填入;用户可主动复制粘贴,不保证自动发表或自动返回宿主
iOS制品 官方分发1.2.19,原包两slice元数据仍为1.2.18;运行时另读apiVersion或unknown,三者分别记录
Harmony制品 使用官方HAR 1.0.4;SDK没有公开运行版本API,sdkVersion为unknown,sdkDistributionVersion记录分发身份
Android制品 官方xhssharesdk_release_v1.1.8.aar原样内置,183414字节;getSdkVersion常量1.1.8、最低API21,188类公开签名与字节码已核对。制品核对不等于原生联编、鉴权或设备验收
市场链接 本插件详情以实际市场页面为准;作者系列表只列已核实的其他插件

官方接入问答当前说明不支持 Pod 集成,官方归档也未提供可核验的 podspec。本插件按官方手动方案随插件保留原始静态 XCFramework 和许可,共 20 个文件、13,875,660 字节;没有杜撰 Pod 坐标或要求客户另找大包。SDK 随工程参与原生构建,不能据此保证任意客户工程的云打包体积或费用。将来取得可验证的官方仓储坐标或获授权的自建源后,应先核对制品身份与 Apple 链接再迁移。

Android依赖交付、资源授权与SDK会话

Android 随插件提供官方原件 uni_modules/lizhao-xhs-share/utssdk/app-android/libs/xhssharesdk_release_v1.1.8.aar,183414 字节,SHA-256 为 aded5edfa1dc84b4c7fbbd7b3d20af61692e9bcfc08e6d989a775e0cb0607ba0。getSdkVersion 常量为 1.1.8,SDK Manifest 最低 API 21。无需另找 SDK 下载或手拷文件;SDK 制品身份不代表鉴权、匹配基座或实际发表已经完成。

交付项 当前状态 / 接入要求
官方SDK 内置的原始 AAR 随插件参与构建,无需部署自建 SDK 仓储;保留官方二进制原件
固定依赖 uni_modules/lizhao-xhs-share/utssdk/app-android/config.json 固定androidx.core:core:1.13.1与com.squareup.okhttp3:okhttp:4.12.0,构建时仍需解析这些依赖
依赖唯一性 核对与宿主已有AndroidX / OkHttp的实际解析和合并结果,不使用latest/+,不排除必需依赖来假装通过;小包内置不保证任意完整工程的云打包体积或费用
Provider配置 uni_modules/lizhao-xhs-share/utssdk/app-android/AndroidManifest.xml 声明独立XhsShareFileProvider,authority=${applicationId}.lizhao.xhs.share.provider,exported=false、grantUriPermissions=true;不覆盖宿主其他Provider
可共享目录 uni_modules/lizhao-xhs-share/utssdk/app-android/res/xml/lizhao_xhs_share_paths.xml 仅配置cache-path:name=lizhao_xhs_share,path=lizhao_xhs_share/,不开放整个缓存或外部存储
实际权限 官方AAR显式声明INTERNET、com.xingin.xhs包查询与SDK分享Activity;插件Manifest增加Provider。读取file/content来源需已有访问授权,不额外申请整库相册 / 存储权限;最终权限仍以实际合并Manifest/APK核对
file / HTTPS file接受可读绝对路径、无authority/query/fragment的file://、已有读授权的content://,后台复制为自有输入副本;HTTPS普通媒体只交官方SDK,不自动下载;album明确拒绝
严格实况 默认9388008;显式true仅允许本地完整Motion Photo容器File单附件,校验JPEG、XMP标记/长度与实际MP4尾部;无法核对完整容器的实况URL和其他平台实况拒绝,普通image检测到实况也需显式允许
真实SDK回调 官方回调带sessionId;Android Native等待匹配会话回调才完成请求,success也只为submitted。隔离重复 / 迟到 / 不匹配回执,SDK会话与公共requestId不是同一标识
重复分享 不沿用Harmony“每进程只能一次”的限制;仍须等待真实会话收口,busy或结果未知时按reason处理,不并发开启或自动解锁重发
registered / submitted 只报告本地注册 / SDK交接阶段,不代表AppKey审核、网络鉴权、接收端实况或最终发表;published和receiverVerified仍始终false
缓存寿命 关闭SDK自动删缓存;准备期未交接副本可在安全收口后清理,已交接副本不设定时删除,未知时保留以免目标读取中丢失文件
验证边界 Kotlin 联编、独立原生壳、双宿主生成物、匹配基座、账号 / 客户端回流及手机剪贴板分别验收;未完成的项目不能用 AAR 核对或文档检查代替

内置 SDK、固定依赖解析、原生联编与真实渠道鉴权是不同层级。使用时仍须制作匹配原生基座;真实渠道鉴权与发表需要自己的有效 AppKey、账号和设备。提交前取消可停止本地准备,已交接后取消不能撤回;提前返回宿主或回执超时不能推断 SDK 已停止读取,结果未知时保持隔离。

iOS配置、权限与回流

插件已交付 uni_modules/lizhao-xhs-share/utssdk/app-ios/Info.plist 的xhsdiscover查询和相册读/写用途,以及 uni_modules/lizhao-xhs-share/utssdk/app-ios/config.json 的系统框架 / 库。它没有写入假AppKey、客户Scheme或域名;合并自己的配置后重新原生编译,不覆盖已有其他SDK配置。

必须配置 填写与核对方式
URL Scheme 最终安装包CFBundleURLTypes包含xhs加自己的AppKey,例如下方xhsYOUR_APP_KEY仅为待替换示意
查询Scheme LSApplicationQueriesSchemes包含xhsdiscover;插件已声明,仍需核对最终安装包合并结果
Universal Link 注册传入自己的HTTPS地址,路径末尾保留/;不含账号密码、query或fragment
Associated Domains / AASA 自己的签名权限启用applinks域名,域名正确部署匹配应用身份和回流路径的AASA;Native不能代替Apple签名或服务器配置
相册权限 最终包保留真实用途说明;当前分享准备会检查/申请照片读写权限,包括普通file/url分支,limited仅允许访问已授权资产
隐私与前台 在用户同意隐私政策后、应用前台注册和发起分享;不在后台偷偷申请权限或改剪贴板
生命周期Hook 插件平台入口导出正式UTSiOSHookProxy并转发URL/Universal Link;最终生成、Apple链接和实际回流仍需验证,不自己重复消费或吞掉其他SDK的回流

下面内容与自己的Info.plist合并。YOUR_APP_KEY是待替换项,不是可用配置;不要把整个plist替换成此片段。

<key>CFBundleURLTypes</key>
<array>
  <dict>
    <key>CFBundleURLSchemes</key>
    <array><string>xhsYOUR_APP_KEY</string></array>
  </dict>
</array>

签名权限可通过自己的宿主配置,或 uni_modules/lizhao-xhs-share/utssdk/app-ios/UTS.entitlements(需自行创建并使用自己的真实域名,当前插件未随包提供)合并;以下YOUR_ASSOCIATED_DOMAIN须替换为自己的Associated Domains域名,并与注册UL / AASA一致。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"><dict>
  <key>com.apple.developer.associated-domains</key>
  <array><string>applinks:YOUR_ASSOCIATED_DOMAIN</string></array>
</dict></plist>

imageID仅是官方SDK字段;本插件先核验真实PHAsset及photoLive,再在显式true时交接相册ID,没有发送封面或JPEG/MOV散件冒充实况。小红书接收、编辑、发表后是否保留动态和音频仍需真实账号/设备验收。

Harmony配置与每进程一次交接

插件 uni_modules/lizhao-xhs-share/utssdk/app-harmony/config.json 声明真实OHPM依赖,uni_modules/lizhao-xhs-share/utssdk/app-harmony/module.json5 只声明实际需要的INTERNET。宿主入口模块的 src/main/module.json5 是自己原生工程中的文件,须把下项合并到该入口模块现有module对象;不要写到HAR模块,HAR不允许querySchemes。

{
  "module": {
    "querySchemes": ["xhsdiscover"]
  }
}
项目 约束
HTTPS 只接受公网HTTPS普通图片或视频;不自动下载 / 上传本地资源,不接收album ID,不提供MovingPhoto接口
前台上下文 由实际前台UIAbility提供;缺少时9388014,不伪造Ability或自动启动
安装检测 官方canOpenLink依赖宿主querySchemes;失败先检查客户端和查询配置,不能假定SDK已可用
SDK回调 官方回流没有可信的原始请求关联,提交与后续事件阶段也不能安全区分;首次success只返回submitted
重复交接 一旦实际调用 SDK 的 shareNote,不论后续成功 / 失败 / 异常,本进程都保持隔离;再次分享需重启宿主,9388007 及 reason 会说明。正常注册后仍可发起首次分享
注册所有权 SDK持有注册时UIAbilityContext并保留事件订阅,无公开卸载接口;同一宿主不要另有代码共用/重注册这个单例
取消 调用前可停止准备;调用后只结束本地等待,保留隔离,不承诺撤回或自动重新就绪
SDK内部日志 官方SDK会写系统hilog且无公开关闭开关;本插件诊断脱敏不等于已关闭第三方SDK内部系统日志

资源寿命、诊断和验收

项目 必须处理
资源所有权 不接受另一个插件resourceId;file原件、相册资产仍归原调用方。本插件只清理自己拥有的副本,不删除用户相册或Provider文件
iOS读取副本 SDK可能读取时保留私有副本;未知 / 取消 / 超时不靠TTL假装读取已结束。无可靠终态的当前会话可能保留到进程结束 / 系统临时目录回收
iOS隔离 正常可靠关联终态后可再次操作;无法安全关联、未知、回流指纹容量耗尽等路径保留busy并提示核对或重启,不沿用Harmony“每进程一次”作为所有iOS路径的结论
退出页面 取消仍在准备的分享,隔离迟到结果,不恢复已卸载界面;本地取消不会撤回已经交接的笔记
文案与隐私 不默认上传日志,不自动写剪贴板;Key、URL、相册ID、路径、标题正文不进入操作日志,未知原生信息保留unknown/null
完整报告 底部一键复制含环境、插件快照和会话保留日志;同一快照分段、失败手动回退,不清空记录;手机实际剪贴板尚未验收
原生基座 新增Android SDK/Kotlin/Provider/资源、iOS SDK/Swift/Hook与Harmony依赖,必须重新原生联编或重打对应匹配自定义基座;只更新WGT/appResource不能更新旧基座原生部分
微信 / 系统分享 另装可选插件时各自的SDK、权限和基座要求也必须满足;普通微信图片不是实况,系统回执不是发表回执
验证分层 文档静态、UTS/UVue语法、资源导出、Kotlin/Swift/ArkTS原生编译、匹配宿主基座、真实账号/设备/剪贴板分别记录,低层级不替代高层级
当前未验 Apple真实SwiftCompile/链接、新基座完整uni-app/uni-app x调用链、有效AppKey鉴权、目标App回流/取消/超时、最终发表及实况保留,均需后续独立验证

作者系列 UTS 插件

以下为作者已发布并核实的其他 UTS 插件,可按业务需要搭配使用。

插件 能力方向 插件市场
lizhao-alipay-kit 支付宝授权登录、App 支付与脱敏诊断 查看插件
lizhao-app-keepalive 应用保活、唤醒、自愈与报告 查看插件
lizhao-bg-audio 背景音频播放、队列、倍速与事件 查看插件
lizhao-ble BLE 扫描、连接、读写、通知与自动重连 查看插件
lizhao-call-kit 电话、短信、通讯录原生能力 查看插件
lizhao-camera-pro 原生相机、拍照录像、水印与媒体保存 查看插件
lizhao-cast-screen DLNA 投屏、AirPlay 路由入口 查看插件
lizhao-choose-file 原生文件选择、上传、进度与取消 查看插件
lizhao-device-id 设备标识、隐私策略与诊断 查看插件
lizhao-doc-corrector 文档扫描、矫正、增强与识别 查看插件
lizhao-emu-detect 模拟器环境检测、风险评分与证据 查看插件
lizhao-float-window 悬浮窗、画中画、权限与诊断 查看插件
lizhao-gallery-pro 相册媒体分页、筛选、缩略图与导出 查看插件
lizhao-hce-card NFC 虚拟卡、APDU 交互与 NDEF 标签模拟 查看插件
lizhao-health 健康数据授权、查询、统计与写入 查看插件
lizhao-http-server 本地 HTTP 服务、文件传输与实时通信 查看插件
lizhao-icon-pro SVG 图标组件、多主题与缓存 查看插件
lizhao-id-photo 证件照制作、尺寸换算、换底色与模板换装 查看插件
lizhao-img-eraser 图片去水印、局部修复与原生编辑器 查看插件
lizhao-live-activity 实时活动、系统胶囊与普通通知降级 查看插件
lizhao-live-photo 实况照片选取、展示预览与原件处理 查看插件
lizhao-nfc-pro NFC 标签读写、NDEF、IsoDep 与诊断 查看插件
lizhao-notify-pro 本地通知、点击动作、进度与定时提醒 查看插件
lizhao-novel-reader 原生小说阅读、仿真翻页与段落评论 查看插件
lizhao-office-view Office 与 PDF 文件预览、进度与缓存管理 查看插件
lizhao-pdf-pro PDF 阅读、签批、真实写回与页面处理 查看插件
lizhao-scan-pro 原生扫码、连续扫码、相册识别 查看插件
lizhao-serial-port 路径串口、USB 串口、多会话收发与诊断 查看插件
lizhao-share-plus 系统分享、远程文件下载后分享 查看插件
lizhao-smart-tts 系统 TTS、云端合成、听书方案 查看插件
lizhao-sqlite-pro 原生 SQLite、迁移、备份与诊断 查看插件
lizhao-sse-pro SSE、Line、JSONL 与 Raw 流式请求 查看插件
lizhao-tcp-pro TCP 客户端、服务端、多连接与诊断 查看插件
lizhao-usb-storage U 盘、移动硬盘文件浏览、读写与批量复制 查看插件
lizhao-video-editor 视频裁剪、压缩、取帧与 FFmpeg/FFprobe 查看插件
lizhao-video-feed 短视频上下滑、短剧选集与分页加载 查看插件
lizhao-video-player 原生视频播放器、清晰度与播放交互 查看插件
lizhao-video-thumb 视频封面、批量取帧与 Base64 返回 查看插件
lizhao-vpn-pro 企业 VPN、IKEv2、安全接入与脱敏诊断 查看插件
lizhao-wechat-kit 微信登录、分享、支付、小程序与客服 查看插件

隐私、权限声明

1. 本插件需要申请的系统权限列表:

Android SDK使用网络、目标客户端查询及独立FileProvider交接所选资源;iOS按实际资源访问申请相册权限;Harmony使用网络及指定资源URL。包装层不额外采集设备标识,SDK收集范围以官方说明和客户隐私声明为准。

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

只在用户主动分享时向小红书官方SDK交接所选资源与明确传入的内容;诊断在本地脱敏,不自动上传。SDK收集范围以随包官方隐私说明和客户隐私声明为准。

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

无

暂无用户评论。