更新记录

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已生效。

官方参考:Android接入、iOS接入、iOS投稿结果。

作者系列 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 微信登录、分享、支付、小程序与客服 查看插件

隐私、权限声明

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

Android网络和目标抖音软件包可见性;仅向抖音临时授予选中媒体读取权限。iOS本地媒体分享需要写入系统相册,已有相册资源按实际读取权限访问。

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

仅用户主动同意隐私并初始化后使用抖音官方SDK;SDK的数据处理以抖音官方隐私政策为准。插件不自动上传媒体或诊断日志,授权码交业务服务端处理。

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

无

暂无用户评论。