更新记录
1.0.0(2026-10-30)
- 新增抖音 OpenSDK 隐私后初始化、安装与能力检测,以及授权码登录接口。
- 新增 Android、iOS 本地媒体准备、单图/多图/单视频投稿、好友/群单图和已审核链接分享接口。
- 新增请求关联、单次回调、超时结果未知、本地取消及原始 SDK 错误分类。
- 新增 uni-app Vue2/Vue3 与 uni-app x 示例,按授权登录、媒体投稿、好友分享、配置四个 Tabs 分类,公共区域保留状态、诊断和完整报告。
- 新增脱敏诊断快照、完整日志复制、固定快照分段、复制回读核对及手动回退,媒体选择包含中文取消摘要和真实大小单位。
- 新增固定版本仓储配置、基础/高级/完整接入示例、十项公开 API 测试索引及平台兼容说明;真实支持范围以根 README 和 platforms 为准。
平台兼容性
uni-app(5.33)
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|
| √ | √ | × | × | - | - | - | - | × |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| × | × | × | × | × | × | × | × | × | × | × | × |
uni-app x(5.33)
| Chrome | Safari | Android | iOS | 鸿蒙 | 微信小程序 |
|---|---|---|---|---|---|
| × | × | - | - | × | × |
抖音授权登录与分享
介绍
面向 uni-app、uni-app x 的国内抖音 OpenSDK UTS 插件,提供授权码登录、媒体投稿和好友/群分享。当前为开发候选源码,Android/iOS 的编译与实际业务验收范围见“注意事项”;本插件不接入海外 TikTok,也不代替业务服务端登录系统。
功能特色
| 能力 | 接入方法 | 行为 |
|---|---|---|
| 隐私后初始化 | initDouyin |
接收 ClientKey 与真实隐私同意状态,检查当前安装包与回跳配置。 |
| 安装/能力检测 | getDouyinCapabilities |
返回可采集的客户端状态、SDK信息与能力限制;受限信息明确标注 unknown。 |
| 授权码登录 | loginDouyin |
使用官方授权界面,验证 state,取得授权码后交业务服务端换取令牌。 |
| 单图/多图/单视频投稿 | publishDouyinMedia |
原生准备本地媒体,前往抖音编辑页或发布页;必须收到SDK结果才结束等待。 |
| 好友/群分享 | shareDouyinImageToContacts、shareDouyinLinkToContacts |
通过抖音官方选择界面发送一张图片或已审核链接,不指定或自动选择联系人。 |
| 可排查的结果 | 诊断/日志API | 请求关联、SDK原始错误码、阶段、取消/超时和资源状态进入脱敏快照。 |
| 双宿主示例 | 完整示例页面 | 可复制全部日志、固定快照分段,以及复制失败后的手动回退。 |
适合哪些场景
| 场景 | 推荐用法 | 使用边界 |
|---|---|---|
| 为已有账号系统增加抖音入口 | 初始化后调用授权登录,将 code 与 state 交服务端 | 服务端验证当前业务会话和 state 后交换令牌;客户端不能保存 Client Secret。 |
| 用户完成修图、剪辑后投稿 | 将用户选择或生成的本地媒体交投稿API | 需获得开放平台投稿权限;iOS会将普通本地文件保存至相册。 |
| 分享文章、活动页面给好友 | 使用已通过抖音审核的链接及其卡片字段 | 未审核或与后台登记不符的链接可能被SDK拒绝,插件不能绕过审核。 |
| 分享一张图片给好友/群 | 单图联系人分享API | 不支持联系人视频、多图、纯文本或任意文件发送。 |
| 排查偶发回跳失败 | 从示例底部复制完整报告 | 不上传日志;报告脱敏后仍应按自己的隐私流程检查再提供。 |
下载与导入
| 宿主 | 示例代码位置 |
|---|---|
| uni-app(Vue2 / Vue3) | uni_modules/lizhao-douyin-kit/example/uniapp/index.vue |
| uni-app x | uni_modules/lizhao-douyin-kit/example/uniappx/index.uvue |
从基础到进阶:按业务模块使用
基础功能配置示例
接入准备
| 步骤 | 配置与操作 |
|---|---|
| 导入 | 导入完整 uni_modules/lizhao-douyin-kit/,保留原生配置、资源和平台入口;页面从 @/uni_modules/lizhao-douyin-kit 导入。 |
| 开放平台应用 | 登记自己的 Android 包名/签名与 iOS Bundle ID,获得 ClientKey,分别申请授权、投稿、好友分享能力。调试与发行签名分别核对。 |
| iOS 回跳 | 修改 uni_modules/lizhao-douyin-kit/utssdk/app-ios/Info.plist,将 CFBundleURLSchemes 中占位值替换为自己的 ClientKey;保留查询 Scheme、相册用途说明。最终安装包与初始化 ClientKey 必须一致。 |
| SDK 与基座 | Android 配置见 uni_modules/lizhao-douyin-kit/utssdk/app-android/config.json,iOS 见 uni_modules/lizhao-douyin-kit/utssdk/app-ios/config.json;首次接入或原生变化需原生联编/自定义基座。WGT 不能添加或更新原生 SDK。 |
| 注册页面 | 在自己的 pages.json 添加对应示例无扩展名路径。uni-app 使用选项式 Vue2/Vue3 示例;uni-app x 使用 UTS 页面。 |
| 使用顺序 | 进入“配置”填写 ClientKey,真实同意隐私后初始化,再切换“授权登录 / 媒体投稿 / 好友分享”。“检测安装与能力”不要求先初始化。 |
下面是 uni-app x 的最小登录函数,放在页面 script setup lang="uts" 内。点击自己的登录按钮时传入输入框的 ClientKey、用户实际隐私选择和业务服务端为当前会话签发的一次性 state。初始化、登录均保留失败与完成回调。
import { initDouyin, loginDouyin, DouyinInitOptions, DouyinLoginOptions } from '@/uni_modules/lizhao-douyin-kit'
function authorize(clientKey: string, privacyAccepted: boolean, serverState: string): void {
const initOptions: DouyinInitOptions = {
clientKey: clientKey,
privacyAccepted: privacyAccepted,
success: () => {
const loginOptions: DouyinLoginOptions = {
scopes: ['user_info'],
state: serverState,
timeoutMs: 120000,
success: (result) => {
// 在此把 result.authCode、result.state 交自己的业务服务端;不打印授权码。
uni.showToast({ title: '已取得授权码', icon: 'none' })
},
fail: (error) => { uni.showToast({ title: error.errMsg, icon: 'none' }) },
complete: (result) => { console.log('登录 complete', result.errCode) }
}
loginDouyin(loginOptions)
},
fail: (error) => { uni.showToast({ title: error.errMsg, icon: 'none' }) },
complete: (result) => { console.log('初始化 complete', result.errCode) }
}
initDouyin(initOptions)
}
privacyAccepted 不要写死 true。state 推荐由服务端生成并绑定当前会话;缺省由原生安全随机生成,但业务仍要验证关联关系。插件不预设业务服务端,不把授权码或 Client Secret 存入日志。完整 uni-app 选项式写法见下文。
高级示例
以下 TypeScript/UTS 片段适用于 uni-app x 页面方法;每段根 import 与函数均完整,调用参数来自自己的输入、服务端或系统选择器。媒体与分享函数均须在初始化成功之后、没有其他抖音交互请求时调用。
授权域、关联值与超时
| 配置 | 填写方式 | 边界 |
|---|---|---|
| scopes | 默认 ['user_info'];将自己已获批的 1–3 项传入函数 |
不凭插件示例推断已获得权限 |
| state | 一次性的服务端会话值;投稿跟踪可使用业务申请的官方 ShareID | 不重复使用固定字面量,不写明文日志 |
| timeoutMs | 毫秒整数,默认 120000,可配置 15000–600000 | 超时只结束本地等待,不证明抖音没有执行 |
import { loginDouyin, DouyinLoginOptions } from '@/uni_modules/lizhao-douyin-kit'
function authorizeWithOptions(approvedScopes: string[], serverState: string): string {
const options: DouyinLoginOptions = {
scopes: approvedScopes, state: serverState, timeoutMs: 180000,
success: (result) => { uni.showToast({ title: '授权成功,请由服务端处理授权码', icon: 'none' }) },
fail: (error) => { uni.showToast({ title: error.errMsg, icon: 'none' }) },
complete: (result) => { console.log('授权等待结束', result.errCode) }
}
return loginDouyin(options)
}
图片、视频、话题与目标页
函数传入自己选择的可读文件路径,video=false 表示图片,video=true 表示一个视频;goToPublish=false 进入编辑页,true 请求进入发布页。话题数组由业务填写,最多 3 项,每项 1–80 字符;空数组表示不添加默认话题。officialShareId 由业务服务端按官方流程取得,没有时传 null。
import { publishDouyinMedia, DouyinPublishOptions, DouyinMedia } from '@/uni_modules/lizhao-douyin-kit'
function publishLocalFiles(paths: string[], video: boolean, topics: string[], goToPublish: boolean, officialShareId: string | null): string {
const media: DouyinMedia[] = paths.map((path: string): DouyinMedia => { return { kind: 'localFile', path: path } })
const options: DouyinPublishOptions = {
mediaType: video ? 'video' : 'image', media: media,
title: '我的作品', hashtags: topics, targetPage: goToPublish ? 'publish' : 'edit',
state: officialShareId, timeoutMs: 120000,
success: (result) => {
uni.showToast({ title: '收到抖音SDK回执', icon: 'none' })
// result.mediaIds 是 iOS 实际使用或新增的相册标识,插件不会自动删除相册项目。
},
fail: (error) => { uni.showToast({ title: error.errMsg, icon: 'none' }) },
complete: (result) => { console.log('投稿等待结束', result.errCode) }
}
return publishDouyinMedia(options)
}
示例页通过 uni.chooseImage、uni.chooseVideo 获取真实本地路径,视频大小按选择器返回的 KB 展示。iOS 传普通本地文件之前必须说明会保存到系统相册,完整示例已提供确认提示。
下面的函数演示三种显式媒体来源;不自动推断类型或获取权限。传入的本地路径、Android URI、iOS 相册标识均由调用方实际取得,不存在随插件附带的演示文件。已有相册资源和 content URI 只在对应系统使用。
import { shareDouyinImageToContacts, DouyinImageShareOptions, DouyinMedia } from '@/uni_modules/lizhao-douyin-kit'
function shareChosenImage(path: string, androidUri: string, photoId: string, source: string): string {
let media: DouyinMedia = { kind: 'localFile', path: path }
if (source == 'androidContentUri') media = { kind: 'androidContentUri', path: androidUri }
if (source == 'iosPhotoAsset') media = { kind: 'iosPhotoAsset', path: photoId }
const options: DouyinImageShareOptions = {
media: media, state: null, timeoutMs: 120000,
success: () => { uni.showToast({ title: '收到单图分享回执', icon: 'none' }) },
fail: (error) => { uni.showToast({ title: error.errMsg, icon: 'none' }) },
complete: (result) => { console.log('单图分享等待结束', result.errCode) }
}
return shareDouyinImageToContacts(options)
}
已审核链接发好友 / 群
传入自己的已审核 HTTPS 链接、封面与真实卡片文字;插件不会代为选择收件人。state=null 使用本地安全随机关联值,需要官方追踪时改为自己的官方 ShareID。
import { shareDouyinLinkToContacts, DouyinLinkShareOptions } from '@/uni_modules/lizhao-douyin-kit'
function shareApprovedLink(url: string, coverUrl: string, title: string, description: string): string {
const options: DouyinLinkShareOptions = {
url: url, coverUrl: coverUrl, title: title, description: description,
state: null, timeoutMs: 120000,
success: () => { uni.showToast({ title: '收到链接分享回执', icon: 'none' }) },
fail: (error) => { uni.showToast({ title: error.errMsg, icon: 'none' }) },
complete: (result) => { console.log('链接分享等待结束', result.errCode) }
}
return shareDouyinLinkToContacts(options)
}
能力检测、取消与监听释放
checkCapabilities() 可在初始化前调用;beginLogObservation() 在需要监听时调用。把业务 API 实际返回的 requestId 传给 finishObservation(),可用于页面卸载时取消本地等待并释放订阅。subscriptionId 是 on 返回的字符串,off 不传回调函数。
import { getDouyinCapabilities, cancelDouyinRequest, getDouyinDiagnosticsSync, onDouyinLog, offDouyinLog, DouyinCallbacks, DouyinLogEntry } from '@/uni_modules/lizhao-douyin-kit'
let logSubscriptionId = ''
function beginLogObservation(): void {
if (logSubscriptionId.length > 0) return
logSubscriptionId = onDouyinLog((entry: DouyinLogEntry): void => {
console.log(entry.time, entry.level, entry.api, entry.requestId, entry.message)
})
}
function checkCapabilities(): string {
const options: DouyinCallbacks = {
success: (result) => { console.log('安装状态', result.installed, '能力限制', result.capabilityNote) },
fail: (error) => { uni.showToast({ title: error.errMsg, icon: 'none' }) },
complete: (result) => { console.log('检测 complete', result.errCode) }
}
return getDouyinCapabilities(options)
}
function finishObservation(requestId: string): void {
if (requestId.length > 0) console.log('本地取消是否受理', cancelDouyinRequest(requestId))
if (logSubscriptionId.length > 0) { offDouyinLog(logSubscriptionId); logSubscriptionId = '' }
const snapshot = getDouyinDiagnosticsSync()
console.log('脱敏快照', JSON.stringify(snapshot))
}
复制完整诊断使用示例底部的“一键复制日志”;“完整报告 / 新快照”生成固定快照,分段复制只在写入与回读相符后前进。失败保留当前段与错误,并展开报告供长按手动复制。新快照明确显示尚未复制,不沿用旧成功提示;复制不清空日志,也不输出其他剪贴板内容。
完整示例
按 Tabs 测试全部公开能力
| 分类 / 公共区域 | 能力 / API | 测试方法 |
|---|---|---|
| 配置 | initDouyin |
填自己的 ClientKey,勾选真实隐私同意,再初始化;分别检查成功及空值/错误配置的 fail、complete。 |
| 授权登录(默认) | loginDouyin |
初始化成功后登录,检查成功、主动取消和超时;授权码仅交服务端处理,不写日志。 |
| 媒体投稿 | publishDouyinMedia |
分别选择单图、多图、一个视频并投稿,检查 SDK 回执;iOS 先确认相册写入提示。高级目标页、话题、ShareID 按上方代码测试。 |
| 好友分享:单图 | shareDouyinImageToContacts |
恰好选择一张图片,在抖音内选择好友或群;选错类型/数量应给真实提示。 |
| 好友分享:链接 | shareDouyinLinkToContacts |
填已审核链接、标题、描述和封面,检查分享与取消;无效 HTTPS 参数进入真实错误处理。 |
| 当前状态(公共) | getDouyinCapabilities |
点击“检测安装与能力”,观察 installed、SDK/客户端信息及 capabilityNote;权限是否获批仍由开放平台决定。 |
| 当前状态(公共) | cancelDouyinRequest |
有待处理请求时点击“取消本地等待”,核对单次 fail/complete;不能把本地取消当作撤回外部操作。 |
| 诊断日志(公共) | getDouyinDiagnosticsSync |
生成完整报告,核对版本、环境、原生快照与操作日志;全量/分段复制及失败手动回退均保留。 |
| 页面生命周期 | onDouyinLog、offDouyinLog |
进入页面自动订阅;切换四个标签不重新订阅、不改请求或清空输入;退出页面释放,再进入开启新会话。 |
全部十个公开 API 都通过真实插件根入口调用。无有效 ClientKey 时可检查配置校验、安装/能力、选择媒体、诊断与复制;真实授权、投稿、好友分享需要自己的已审核配置。标签只改变展示,不清表单、已选媒体、忙碌状态或固定报告。结果始终显示在公共区域;诊断不占用业务标签。
完整界面主源为 uni_modules/lizhao-douyin-kit/example/uniappx/index.uvue,普通 uni-app 为 uni_modules/lizhao-douyin-kit/example/uniapp/index.vue;共享控制器在 uni_modules/lizhao-douyin-kit/example/controller.uts,普通宿主生成辅助模块在 uni_modules/lizhao-douyin-kit/static/controller.js。两种页面保持同一真实调用、取消、监听释放与完整报告合同。
uni-app(Vue2 / Vue3)完整登录流程
下面可直接放入一个已注册的 .vue 页面。ClientKey 与服务端 state 默认空白,由自己的应用提供;它串联配置、初始化、登录、成功/失败/完成、取消和卸载释放。正式使用仍须把 success 内的授权码交自己的服务端,不以客户端成功提示代替建立业务登录会话。
<template>
<view>
<input v-model="clientKey" :disabled="busy" placeholder="自己的 ClientKey" />
<input v-model="serverState" :disabled="busy" placeholder="服务端的一次性 state" />
<button :disabled="busy" @click="privacy = !privacy">{{ privacy ? '已同意隐私政策' : '阅读并同意隐私政策' }}</button>
<button :disabled="busy || !privacy" @click="authorize">初始化并登录</button>
<button v-if="busy" @click="cancel">取消本地等待</button>
<text>{{ status }}</text>
</view>
</template>
<script>
import { initDouyin, loginDouyin, cancelDouyinRequest, onDouyinLog, offDouyinLog } from '@/uni_modules/lizhao-douyin-kit'
export default {
data() { return { clientKey: '', serverState: '', privacy: false, busy: false, disposed: false, requestId: '', subscriptionId: '', status: '请填写配置' } },
onLoad() {
this.subscriptionId = onDouyinLog(entry => { console.log(entry.time, entry.api, entry.message) })
},
onUnload() {
this.disposed = true
if (this.requestId.length > 0) cancelDouyinRequest(this.requestId)
offDouyinLog(this.subscriptionId)
},
methods: {
authorize() {
if (this.busy || !this.privacy || this.disposed) return
this.busy = true
this.status = '初始化中'
this.requestId = initDouyin({
clientKey: this.clientKey.trim(), privacyAccepted: this.privacy,
success: () => {
if (this.disposed) return
this.status = '等待抖音授权'
this.requestId = loginDouyin({
scopes: ['user_info'], state: this.serverState.trim() || null, timeoutMs: 120000,
success: result => {
if (this.disposed) return
this.status = '已取得授权码,请提交自己的服务端'
// 在此处理 result.authCode / result.state,禁止输出到日志。
},
fail: error => { if (!this.disposed) this.status = error.errCode + ':' + error.errMsg },
complete: result => {
if (!this.disposed && this.requestId === result.requestId) { this.busy = false; this.requestId = '' }
}
})
},
fail: error => { if (!this.disposed) this.status = error.errCode + ':' + error.errMsg },
complete: result => {
// 初始化成功后已有新登录请求;旧 complete 不得清除新请求状态。
if (!this.disposed && this.requestId === result.requestId) { this.busy = false; this.requestId = '' }
}
})
},
cancel() {
if (this.requestId.length > 0 && !cancelDouyinRequest(this.requestId)) this.status = '请求可能已结束,等待完成回调'
}
}
}
</script>
uni-app x 的完整界面与生命周期写法请使用上表 .uvue 主源;基础、高级片段可放入其 UTS 脚本。两种完整界面都保留授权、投稿、分享、配置及底部全量诊断;这里的精简流程仅用于说明业务串联,不替代完整示例的诊断功能。
API 用途速查
| API | 用途 | 返回 |
|---|---|---|
initDouyin(options) |
隐私同意后的初始化 | requestId字符串;异步success/fail/complete |
getDouyinCapabilities(options) |
安装状态和能力检测 | requestId字符串;异步结果 |
loginDouyin(options) |
发起抖音授权 | requestId字符串;异步授权码 |
publishDouyinMedia(options) |
本地图片/视频投稿 | requestId字符串;异步SDK回执 |
shareDouyinImageToContacts(options) |
单图分享给好友/群 | requestId字符串;异步SDK回执 |
shareDouyinLinkToContacts(options) |
已审核链接分享给好友/群 | requestId字符串;异步SDK回执 |
cancelDouyinRequest(requestId) |
取消指定请求的本地等待 | boolean,是否接受取消 |
getDouyinDiagnosticsSync() |
取得脱敏诊断快照 | DouyinDiagnostics |
onDouyinLog(listener) |
注册日志监听 | 订阅ID字符串 |
offDouyinLog(subscriptionId) |
释放指定日志订阅 | void |
通用异步参数与回调
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| success | (DouyinResult) => void | 否 | 成功回调,至多一次 | 不调用 | 初始化/能力/授权/SDK成功终态 |
| fail | (DouyinFail) => void | 否 | 错误回调,至多一次 | 不调用 | 见错误码 |
| complete | (DouyinResult 或 DouyinFail) => void | 否 | 成功或失败后调用,至多一次 | 不调用 | 与对应终态同一结果 |
| state | string | 否 | 登录关联值或投稿官方ShareID;不在日志明文保留,不可循环复用固定字面量 | 原生安全随机 | 最大512个UTF8字节,无控制字符 |
| timeoutMs | number | 否 | 等待毫秒数,超时不能推断业务未执行 | 120000 | 15000–600000整数 |
state、timeoutMs适用于登录/投稿/好友分享,不适用于初始化和能力检测。任一业务回调抛出异常不影响随后complete;原生回执先确定终态再异步进入页面,迟到或重复回执被忽略。只允许一个涉及抖音UI的交互请求;等待期间不应切换ClientKey或重置SDK。
各方法业务参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| init.clientKey | string | 是 | 开放平台移动应用ClientKey,需与安装包匹配 | 无 | 当前应用真实配置 |
| init.privacyAccepted | boolean | 是 | 用户真实同意应用及SDK隐私政策 | 无 | true才初始化 |
| login.scopes | string[] | 否 | 已获批且业务必需的授权域 | ['user_info'] | 1–3项,字母/数字/下划线/点 |
| publish.mediaType | string | 是 | 同一请求媒体种类 | 无 | image、video |
| publish.media | DouyinMedia[] | 是 | 本地媒体列表 | 无 | 图片1–35;视频1个 |
| publish.title | string | 否 | 投稿标题 | 空字符串 | 最多500字符 |
| publish.hashtags | string[] | 否 | 默认话题,受开放平台审批限制 | [] | 最多3项,每项1–80字符 |
| publish.targetPage | string | 否 | 请求前往抖音编辑或发布页 | edit | edit、publish |
| imageShare.media | DouyinMedia | 是 | 一张可读取图片 | 无 | 同下表媒体来源 |
| linkShare.url | string | 是 | 已审核的HTTPS链接 | 无 | 最大4096字符 |
| linkShare.title | string | 是 | 卡片标题 | 无 | 1–200字符 |
| linkShare.description | string | 是 | 卡片描述 | 无 | 1–1000字符 |
| linkShare.coverUrl | string | 是 | 卡片封面HTTPS地址 | 无 | 最大4096字符 |
| cancel.requestId | string | 是 | API实际返回的请求编号 | 无 | 当前待处理请求 |
| on.listener | (DouyinLogEntry) => void | 是 | 日志监听回调 | 无 | 保存返回订阅ID用于off释放 |
媒体来源
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| kind | string | 是 | 显式声明来源,不能把路径猜作相册标识 | 无 | localFile、androidContentUri、iosPhotoAsset |
| path | string | 是 | 与kind匹配的可读文件路径/URI/相册标识;不自动获取无权限资源 | 无 | 最大8192字符 |
localFile在UTS胶水解析宿主本地路径后交原生,调用方对象不被回写;HTTP媒体地址不按本地文件处理。iOS标识仅在iOS使用,Android content URI仅在Android使用。
成功结果与错误字段
DouyinResult含:errSubject、errCode=0、errMsg、requestId、api、status、authCode、state、permissions、sdkVersion、installed、clientVersion、supportsPublish、supportsContacts、capabilityNote、mediaIds、shareState。status分别为 initialized、capabilities、authorized、sdkSucceeded;其他方法不适用字段为null/空数组或明确的unknown,布尔能力值应结合capabilityNote和检测API阅读。登录返回authCode/state/permissions,检测返回实际能力信息;mediaIds记录iOS实际使用/新增的相册标识。SDK版本以实际原生快照来源为准,公共层拿不到时写unknown。
DouyinFail含:errSubject、errCode、errMsg、requestId、api、stage,以及可空rawCode、shareState、nativeType、nativeCause、nativeStack。原生详情脱敏;拿不到的信息为null而不是猜测。DouyinDiagnostics含pluginId/pluginVersion/buildMark/platform/activeRequestId/logs/droppedCount/nativeSnapshot;日志条目含time/level/api/requestId/message。原生快照另外记录SDK、应用和系统来源、阶段、媒体准备/权限/资源租期等实际可采集信息。
错误码说明
所有错误的 errSubject 为 lizhao-douyin-kit。插件错误码与SDK原始码分开;原始信息保留在 rawCode/shareState,不要将某个SDK错误码当作插件固定编号。
| 错误码 | 含义 | 建议 |
|---|---|---|
| 9371001 | 参数无效 | 检查类型、必填项、媒体数量、地址和超时范围。 |
| 9371002 | 当前平台不支持 | 在Android/iOS App使用;不要在Web或小程序伪装登录。 |
| 9371003 | SDK尚未初始化 | 用户同意隐私后先init并等待成功。 |
| 9371004 | 隐私未同意或回跳配置无效 | 核对ClientKey、iOS Scheme及实际同意状态。 |
| 9371005 | 交互忙碌 | 等待原请求complete,或取消其本地等待。 |
| 9371006 | 未安装或客户端不支持 | 核对安装/版本及软件包可见性,提示用户安装或升级。 |
| 9371007 | SDK明确报告用户取消 | 不当作服务故障,允许用户主动重试。 |
| 9371008 | 系统/开放平台权限不足 | 检查相册权限、应用签名和已审核能力。 |
| 9371009 | 媒体不存在或不可读 | 重选可访问文件,确认URI授权和相册资源仍有效。 |
| 9371010 | 媒体限制不满足 | 检查JPEG/PNG/MP4、数量、大小、时长和尺寸。 |
| 9371011 | SDK发送或处理失败 | 查看rawCode/shareState及诊断原生原因;iOS20016属于发布失败。 |
| 9371012 | 请求关联不匹配 | 使用一次性state,检查重复/过期请求和回跳配置。 |
| 9371013 | 超时,结果未知 | 不自动重复投稿或发消息;先核对抖音实际状态。 |
| 9371014 | 已取消本地等待 | 抖音操作可能仍在进行,不能当作已撤回。 |
| 9371015 | 内容未发布 | iOS20015可能是存草稿或账号发布限制,查看抖音实际界面。 |
| 9371016 | 桥接或回执无效 | 使用包含当前插件的匹配基座,复制完整诊断。 |
| 9371017 | 保存系统相册失败 | 检查权限、资源和设备空间;保留真实原生错误。 |
恢复前台不代表用户取消;只有SDK明确取消或业务主动取消本地等待才使用对应语义。SDK调用同步返回true只表示接受发送,最终SDK成功也不等于发布审核或内容落地完成。需要服务器最终状态时,接入方按官方流程申请ShareID并使用Webhook/查询接口,插件不伪造发布凭证。
注意事项
平台与验收边界
package.json 按当前官方 uni_modules 规范分别声明 uni-app、uni-app x:√ 表示支持,x 表示不支持,- 表示待确认。官方字段规范。Vue 框架兼容和系统业务验收是两个维度;能显示示例或返回“不支持”不能证明已实现抖音登录/分享。
| 字段 / 平台 | 声明 | 当前范围与验证边界 |
|---|---|---|
| uni-app.vue.vue2 / vue3 | √ / √ | 通用选项式示例与共享 JS 控制器;分别验证框架、生成物和浏览器交互。此项不等于各系统真实授权通过。 |
| uni-app.app.android / uni-app-x.app.android | - / - | 已有 Kotlin/SDK 编译、MI 8 无 ClientKey 宿主及独立 APK 回归证据;有效 ClientKey 登录、投稿、好友分享及当前完整宿主仍待验收。 |
| uni-app.app.ios / uni-app-x.app.ios | - / - | 已提供 Swift/Photos/UTS Hook 实现及资源生成;Apple 编译、链接、匹配 iPhone 与真实业务待验。 |
| uni-app.app.vue / nvue | - / - | vue 提供双版本示例;nvue 未提供独立示例且未验,不用 vue/Web 结果代替。 |
| dcloudext.vapor | x | 市场设置未声明 Vapor 支持;示例源码采用 Vapor 写法,资源与既有无 Key 检查不等于完整业务验收。 |
| Harmony(两个宿主) | x | 仅提供明确不支持的入口,返回 9371002;当前没有抖音鸿蒙 SDK 登录/分享实现。 |
| Web Chrome / Safari | x | 可预览布局和诊断,原生业务返回不支持;不提供网页 OAuth 或网页投稿。 |
| 微信、支付宝、抖音、百度、快手、京东、鸿蒙元服务、QQ、飞书、小红书小程序 | x | 不实现小程序授权/分享;仅已交付的平台入口提供明确拒绝语义,未声明所有小程序均可编译。uni-app x 市场节点目前只列微信。 |
| 华为 / 联盟快应用 | x | 无对应实现。 |
| uniCloud 腾讯云 / 阿里云 / 支付宝云 | x | 本插件是客户端插件,不提供云端实现或令牌交换服务。 |
| 暗黑 / 多语言 / 宽屏专项适配 | x | 当前示例为中文浅色工具页,无专项适配声明。 |
市场 displayName 按指定文案保留“支持安卓 iOS 鸿蒙”;其中鸿蒙尚无实现,请以以上兼容矩阵及实际 API 为准,不将标题当作鸿蒙可用性承诺。
| 版本层级 | 要求 |
|---|---|
| HBuilderX / 宿主最低声明 | HBuilderX ^5.33.0,uni-app / uni-app x ^5.33;不推断更早版本可用。当前整理验证使用 HBuilderX 5.34.2026102909。 |
| Android | 插件配置最低 API 21,实际取宿主和依赖较高值;uni-app x Vapor 当前宿主要求 API 23 起,VDOM 与传统宿主另按其要求。已验 MI 8 为 API 29,不代表测试了最低系统。 |
| iOS | 插件目标 iOS 13 起,实际取宿主与 SDK 较高值;未实测最低系统。 |
| 抖音 Android SDK | 固定 Maven 0.2.0.10,按官方仓储解析;不能排除缺失安全依赖假装构建成功。 |
| 抖音 iOS SDK | 固定 CocoaPods 4.2.5;Windows 资源导出不能替代 Apple 编译和链接。 |
Android 原生配置在 uni_modules/lizhao-douyin-kit/utssdk/app-android/config.json;iOS 配置在 uni_modules/lizhao-douyin-kit/utssdk/app-ios/config.json。SDK 回跳由插件导出的 UTSiOSHookProxy 转发,不需要业务修改 AppDelegate 或安装 swizzle。首次添加插件、修改原生源码/依赖/权限/资源需新原生联编或匹配自定义基座;只整理示例与文档通常不需要重打原生基座。当前电脑的 HX 版本不是既有安装包的构建版本,诊断按实际来源记录。
没有与包名、签名、Bundle ID 匹配的已审核 ClientKey 和能力权限时,参数失败、资源编译或本地验收 APK 均不能冒充真实授权、投稿、分享成功。iOS 完整编译/设备验收独立待办。
媒体限制
| 内容 | 接收范围与限制 |
|---|---|
| 图片投稿 | JPEG/PNG,1–35 张,客户端限制优先;iOS 无图集能力时最多 12 张。单图最多 32 MiB。 |
| 图片尺寸 | iOS 单图最多 4000 万像素,宽高比 1/2.2–2.2;Android 最多 1 亿像素,宽高比 1/3–3。 |
| 视频投稿 | 单个 MP4,最多 512 MiB、60 分钟;iOS 至少 3 秒;短边小于 2160、长边小于 4096;不支持多视频或图视频混合。 |
| 好友 / 群 | 一张图片或已审核 HTTPS 链接卡片;不支持联系人视频、多图、纯文本或任意文件。 |
| 媒体来源 | localFile 为宿主可解析文件;androidContentUri 要求应用已有读取权;iosPhotoAsset 要求已有可访问相册标识。 |
| 网络媒体 | 不自动下载;先由宿主下载为本地可读文件。扩展名检查不能替代原生解码与元数据检查。 |
| 平台能力 | 不提供小程序卡片、拍摄器、音乐/贴纸/POI、日常转发或海外 TikTok 能力。 |
隐私、媒体与生命周期
- 按抖音官方SDK隐私说明向用户披露数据处理,在真实同意之后初始化;插件日志不默认上传。授权码、Token、Client Secret、用户账号和媒体原文不得写入日志或仓库。
- 官方SDK可能使用网络能力与自己的事件数据;“插件不上传诊断”不等于整个SDK不采集数据。上架时按实际SDK官方声明填写隐私清单。
- Android不申请任意存储或通讯录权限。只对插件暂存副本临时授予抖音读取;已发送文件为避免SDK继续读取而短期保留,按租期清理自己的目录,绝不删除用户原文件。
- iOS通过系统相册跨进程共享。已有相册标识需实际可读,本地媒体保存需用户授权;不能将写入权限误当全部相册读取权限。新增相册项目不会自动删除。
- 应用进程被杀后原页面闭包无法恢复。首版不保存授权码、不承诺冷启动恢复原回调;无法关联的回跳不会被报告成成功,需用户重新发起。
- 仅将明确无敏感信息的业务摘要写入自己的日志;复制报告前再次检查。缓存有条数/容量上限,截断和丢弃计数明确记录;详细错误和环境以实际可采集字段为准。
依赖与原生基座
Android依赖和仓库详见 uni_modules/lizhao-douyin-kit/utssdk/app-android/config.json;iOS固定DouyinOpenSDK CocoaPods依赖及资源处理见 uni_modules/lizhao-douyin-kit/utssdk/app-ios/config.json。构建环境需能访问这些仓库,仓储解析失败不是运行时业务失败。
新增或更新SDK、Kotlin/Swift、原生资源、Manifest/Info.plist、依赖或回跳配置后,必须重新原生联编或重打对应自定义基座。appResource/WGT不能更新基座内已编译原生代码。Apple编译和真实客户端界面必须用当前源码包验收;不要在旧基座中仅更新页面后宣称新SDK已生效。
作者系列 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-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
下载 12731057
赞赏 1959
赞赏
京公网安备:11010802035340号