更新记录
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 |
微信登录、分享、支付、小程序与客服 | 查看插件 |

收藏人数:
购买源码授权版(
试用
赞赏(0)
下载 6486
赞赏 5
下载 12734767
赞赏 1959
赞赏
京公网安备:11010802035340号