更新记录
1.0.0(2026-10-30)
- 新增 Android/iOS 原生 SDK 初始化与隐私选项,自动采集默认关闭,支持静态配置和运行时身份一致性检查。
- 新增 Facebook 授权登录、退出与会话读取,区分 AccessToken 和 iOS Limited Login 令牌,提供取消、拒绝、超时及明确错误回调。
- 新增链接、图片和视频分享,提供本地媒体校验、临时资源释放及 iOS 明确选择保存到 Photos 后分享。
- 新增 App Events、自定义事件、购买统计、用户关联与队列刷新,区分 SDK 受理和后台确认。
- 新增延迟安装链接查询、普通冷/热启动深链、允许规则、可释放监听和重复事件标识。
- 新增诊断等级、脱敏快照、完整报告、一键复制、固定快照分段及复制失败手动回退。
- 新增 uni-app Vue2/Vue3 与 uni-app x 的业务 tabs 示例、基础/高级/完整接入说明和平台兼容性表。
- 新增统一的 21 项公开 API、16 项错误码与开发者验收步骤,未支持平台返回明确错误。
平台兼容性
uni-app(5.26)
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|
| √ | √ | × | × | √ | × | √ | - | × |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| × | × | × | × | × | × | × | × | × | - | × | × |
uni-app x(5.26)
| Chrome | Safari | Android | iOS | 鸿蒙 | 微信小程序 |
|---|---|---|---|---|---|
| × | × | √ | - | × | × |
其他
| 多语言 | 暗黑模式 | 宽屏模式 | 蒸汽模式 |
|---|---|---|---|
| × | × | × | √ |
lizhao-meta · Meta Facebook 登录、分享、事件与深链
介绍
lizhao-meta 为 uni-app(Vue2/Vue3)与 uni-app x 提供 Android、iOS 官方 Meta SDK 的授权登录、链接/图片/视频分享、App Events、延迟深链及普通深链。
交付内容为待接入验收的原生源码与示例。Android 原生已完成真实依赖编译、边界单元测试和独立验收 APK 构建;双宿主资源、桥接及生成代码另行验证。iOS 已实现原生代码并核对官方 SDK 签名,仍须 Apple 编译、链接和设备验收。真实账号、分享、Meta 后台事件与广告安装归因由开发者使用自己的应用验收;getCapabilitiesSync() 表示当前运行环境与初始化状态,不代表这些外部业务已通过。
功能特色
| 能力 | 对应 API | 解决的问题与边界 |
|---|---|---|
| 原生授权 | login、logout、getSessionSync |
区分 AccessToken 与 iOS Limited Login 的 AuthenticationToken,保留取消、拒绝和原生错误 |
| Facebook 分享 | shareLink、sharePhotos、shareVideo |
使用官方对话框,校验本地媒体;对话框完成不保证帖子公开或返回 postId |
| 事件统计 | logEvent、logPurchase、flushEvents |
明确隐私同意后提交 SDK;本地受理不冒充后台已收到 |
| 两类链接 | fetchDeferredAppLink、getInitialDeepLinkSync、onDeepLink |
将广告安装查询与普通冷/热启动链接区分,业务链接必须通过允许规则 |
| 可控隐私 | initializeMeta、setPrivacyOptions、clearUserId |
自动事件、广告标识和额外采集默认关闭;撤回同意后仍可清除用户关联 |
| 完整诊断 | getDiagnosticsSync、setDiagnosticLevel |
脱敏、请求关联、有界缓存;两个示例均有一键复制、固定快照分段和手动复制回退 |
适合哪些场景
| 场景 | 推荐用法 | 使用边界 |
|---|---|---|
| 海外用户登录 | 显式初始化后调用 login,令牌提交自己的服务端验证 |
需要真实 Meta App、正确签名/Bundle ID及权限;客户端不替代服务端验签 |
| 内容推广 | HTTPS 链接或用户指定的本地图片、视频分享 | 不代替用户选择发布位置或自动发帖;SDK/渠道是否可用以实际设备为准 |
| 转化与购买统计 | 取得统计同意后记录事件或购买金额 | logPurchase 只记统计,不支付、不验证收据、不自动去重 |
| 广告安装跳转 | 首次安装链路查询延迟链接,并独立验收后台归因 | 空回执可能原因未知,不能据此确认没有广告或安装归因 |
| 普通路由跳转 | 原生注册入口,加运行时 scheme/host/path 允许规则 | 只返回链接,业务自行解析、鉴权和跳转,不能直接执行任意 URL |
下载与导入
| 宿主 | 示例代码位置 |
|---|---|
| uni-app Vue2/Vue3 | uni_modules/lizhao-meta/example/uniapp/index.vue |
| uni-app x | uni_modules/lizhao-meta/example/uniappx/index.uvue |
从基础到进阶:按业务模块使用
基础功能配置示例
保留完整 uni_modules/lizhao-meta/ 后从插件根路径导入业务API。报告主源为 uni_modules/lizhao-meta/example/report.uts,传统宿主使用 uni_modules/lizhao-meta/static/report.js;公开类型位于 uni_modules/lizhao-meta/utssdk/interface.uts。
原生构建前配置
固定依赖为官方 Android Maven 的 facebook-core、facebook-login、facebook-share、facebook-applinks,以及 iOS CocoaPods 的 FBSDKCoreKit、FBSDKLoginKit、FBSDKShareKit,SDK 均为 19.0.0;不在插件中内置这些 SDK 二进制。依赖配置见 uni_modules/lizhao-meta/utssdk/app-android/config.json 与 uni_modules/lizhao-meta/utssdk/app-ios/config.json。iOS 最低系统为 15;Android 配置最低 API 为 21,最终最低值还取宿主与合并依赖约束。
- 在 Meta 开发者后台为实际 Android 包名、签名 Key Hash、iOS Bundle ID 配置平台、登录与应用权限。应用审核、测试账号和上线资格由业务自己准备。
- Android 在自己的本地构建副本填写
uni_modules/lizhao-meta/utssdk/app-android/res/values/lizhao_meta.xml:lizhao_meta_app_id、lizhao_meta_client_token、lizhao_meta_callback_scheme(fb 加 App ID)、lizhao_meta_content_authority(com.facebook.app.FacebookContentProvider 加 App ID)。普通深链另填lizhao_meta_deep_link_scheme与lizhao_meta_app_link_host;无需该入口时可在本地配置移除对应 intent-filter,并检查合并 Manifest。 - iOS 在自己的本地构建副本填写
uni_modules/lizhao-meta/utssdk/app-ios/Info.plist的 FacebookAppID、FacebookClientToken、FacebookDisplayName 及 fb 加 App ID 的 CFBundleURLSchemes。保留 SDK 查询 scheme、关闭状态的静态采集开关、FBSDKAemAutoSetupEnabled 和空 FacebookLoggingBehavior。占位值、静态与运行时 App ID/Token 冲突会真实失败。 - 需要 iOS 普通 scheme 时,将自己的 scheme 合入 CFBundleURLTypes。Universal Links 还需宿主自己的 Associated Domains entitlement、有效域名与服务器 AASA;Android HTTPS App Links 需服务器 assetlinks.json 与真实包名/签名。上述服务器文件由用户准备,不随插件交付。
- 运行时
initializeMeta的 App ID/Client Token 必须与本地原生配置相同。不要把自己的 Token、App Secret、签名私钥或生产配置提交仓库。Client Token 是原生客户端配置,不能冒充 App Secret 或当作服务端认证凭据。 - 检查宿主原有 Facebook 登录/分享模块,避免重复 SDK、重复 URL 处理与冲突的 ContentProvider。最终安装包中的
com.facebook.internal.FacebookInitProvider必须缺失或明确禁用,不能仅凭源码的合并指令或自动采集开关确认;该 Provider 被启用时可能在显式初始化前启动 SDK,插件会返回配置冲突。加入本插件后重新原生联编或制作对应自定义基座;WGT/appResource 不能更新旧基座的原生代码。
Android 原生入口和只读文件共享范围在 uni_modules/lizhao-meta/utssdk/app-android/AndroidManifest.xml 与 uni_modules/lizhao-meta/utssdk/app-android/res/xml/lizhao_meta_share_paths.xml;iOS 隐私资源在 uni_modules/lizhao-meta/utssdk/app-ios/PrivacyInfo.xcprivacy。这些声明不能替代宿主自己的隐私说明与实际数据用途核对。
原生配置代码
Android:在自己的本地构建副本修改 uni_modules/lizhao-meta/utssdk/app-android/res/values/lizhao_meta.xml。下面的 REPLACE_... 必须换成自己的真实配置,不能直接用于初始化。深链 scheme 和域名也要换成自己的值。
<resources>
<string name="lizhao_meta_app_id">REPLACE_WITH_META_APP_ID</string>
<string name="lizhao_meta_client_token">REPLACE_WITH_META_CLIENT_TOKEN</string>
<string name="lizhao_meta_callback_scheme">fbREPLACE_WITH_META_APP_ID</string>
<string name="lizhao_meta_content_authority">com.facebook.app.FacebookContentProviderREPLACE_WITH_META_APP_ID</string>
<string name="lizhao_meta_deep_link_scheme">myapp</string>
<string name="lizhao_meta_app_link_host">links.example.com</string>
</resources>
iOS:将以下键合入自己的 uni_modules/lizhao-meta/utssdk/app-ios/Info.plist 构建副本,保留交付文件中的查询 scheme、静态隐私开关、普通深链和其他原有配置;不要用片段覆盖整个文件。App ID、Client Token、应用显示名及回调 scheme 必须对应同一个 Meta 应用。
<key>FacebookAppID</key><string>REPLACE_WITH_META_APP_ID</string>
<key>FacebookClientToken</key><string>REPLACE_WITH_META_CLIENT_TOKEN</string>
<key>FacebookDisplayName</key><string>自己的应用名称</string>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLSchemes</key>
<array><string>fbREPLACE_WITH_META_APP_ID</string><string>myapp</string></array>
</dict>
</array>
在宿主 pages.json 中注册适用页面,只填写自己宿主的那一行路径:
{
"pages": [
{ "path": "uni_modules/lizhao-meta/example/uniappx/index", "style": { "navigationBarTitleText": "Meta Facebook" } }
]
}
uni-app 注册 uni_modules/lizhao-meta/example/uniapp/index.vue 对应的去扩展名路由。uni-app 使用生成的选项式 Vue 页面,uni-app x 使用 UTS 组合式页面;页面只从插件根路径调用业务 API。
最小使用顺序
| 步骤 | 操作 | 预期结果 |
|---|---|---|
| 1 | Meta 后台登记自己的包名/签名或 Bundle ID,填入原生配置并制作自定义基座 | Native SDK、应用身份和回调入口匹配 |
| 2 | 示例“配置”中输入同一 App ID / Client Token,点击初始化 | initialized=true;失败显示真实错误,不使用虚构身份作为成功证据 |
| 3 | 切到“授权”进行登录、查询会话、退出 | 返回令牌类别和权限摘要;完整令牌只交给自己的受信后端 |
| 4 | 根据业务使用分享、事件或深链 | 每次检查 success/fail/complete 及结果的实际含义 |
| 5 | 页面离开时解除自己注册的监听;应用确需整体释放时调用 disposeMeta | 不遗留页面监听,不清除其他页面的数据 |
初始化、隐私与登录
以下是 UTS 可直接使用的函数;由页面将本地输入值传入,不把真实配置写入示例。uni-app 使用对应 .vue 完整页面,其 API 与结果语义相同。
import { initializeMeta, login, getSessionSync, logout } from '@/uni_modules/lizhao-meta'
export function connectMeta(appId: string, clientToken: string) {
initializeMeta({
appId, clientToken,
privacy: { analyticsConsent: false },
success: (result) => { console.log('SDK初始化', result.initialized) },
fail: (error) => { console.error(error.errSubject, error.errCode, error.errMsg) },
complete: (result) => { console.log('初始化终态', result.status) }
})
}
// 在初始化成功且页面处于前台后单独触发。后端生成随机nonce并与这次登录配对。
export function signInMeta(nonce: string) {
login({
permissions: ['public_profile'], nonce,
success: (result) => {
// 令牌只交给受信的自有后端;此处只显示类别,不输出完整会话。
console.log('登录令牌类别', result.session.tokenKind)
},
fail: (error) => { console.error(error.errCode, error.errMsg) }
})
}
export function inspectSession() {
const query = getSessionSync()
if (!query.ok) { console.error(query.error?.errCode, query.error?.errMsg); return }
console.log('本应用是否有会话', query.session != null)
}
export function signOutMeta() {
logout({ fail: (error) => { console.error(error.errCode, error.errMsg) } })
}
iOS 默认 Limited Login;Android 默认 enabled,并明确拒绝 limited。AuthenticationToken 不能当 AccessToken 调用 Graph API;服务端应核对签名、受众、有效期、nonce 和用户绑定。不要在日志中序列化 session。退出只清除本应用 SDK 会话,不承诺退出 Facebook App、清除浏览器账号或撤销后台权限。iOS 首次初始化要求前台状态,不可呈现时返回 9347010。
高级示例
模块二:链接、图片和视频分享
import { shareLink, sharePhotos, shareVideo } from '@/uni_modules/lizhao-meta'
export function postLink(url: string) {
shareLink({ url,
success: (result) => { console.log('分享对话框完成', result.dialogCompleted) },
fail: (error) => { console.error(error.errCode, error.errMsg) }
})
}
export function postPhotos(paths: Array<string>) {
sharePhotos({ paths,
fail: (error) => { console.error(error.errCode, error.errMsg) }
})
}
export function postVideo(path: string, allowSaveVideoToPhotos: boolean) {
shareVideo({ path, allowSaveVideoToPhotos,
fail: (error) => { console.error(error.errCode, error.errMsg) }
})
}
媒体由用户选择并获得可读权限后传入。插件不下载远端媒体,也不扫描相册。Android 支持可访问的绝对路径、file/content URI,图片每张不超过 15MiB、边长不超过 4096,整次解码 Bitmap 预算 64MiB;视频复制到插件受限缓存,最多 200MiB,并检查真实视频轨道与时长。临时文件和授权随任务释放。
iOS 图片每张最多 20MiB、1600 万像素、单边 8192,最多 6 张且总计 2400 万像素;普通本地视频最多 200MiB/600秒。Meta iOS SDK 的视频分享需要 Photos 资产:已有授权且可读的 ph:// 视频可直接使用;普通本地文件默认返回 9347012。只有明确传入 allowSaveVideoToPhotos: true 才申请 Photos 读写权限、保存后分享;分享取消、失败或超时仍可能保留所保存视频,插件不自动删除用户相册资产。已有 Photos 资产的字节大小不能用私有文件属性准确取得,该项会标注未知;仍校验类型、时长与可读性。
模块三:事件与用户关联
import { setPrivacyOptions, logEvent, logPurchase, clearUserId, flushEvents } from '@/uni_modules/lizhao-meta'
export function enableAnalytics() {
// 仅在用户已明确同意统计后调用;不会自动申请ATT。
setPrivacyOptions({ privacy: { analyticsConsent: true },
fail: (error) => { console.error(error.errCode, error.errMsg) }
})
}
export function recordView() {
logEvent({ name: 'content_view', parameters: { content_type: 'article' },
success: (result) => { console.log('SDK受理', result.status, result.serverAcknowledged) },
fail: (error) => { console.error(error.errCode, error.errMsg) }
})
}
export function recordPurchase(amount: number, currency: string) {
logPurchase({ amount, currency,
fail: (error) => { console.error(error.errCode, error.errMsg) }
})
}
export function removeAssociation() {
clearUserId({ fail: (error) => { console.error(error.errCode, error.errMsg) } })
}
export function requestFlush() {
flushEvents({ fail: (error) => { console.error(error.errCode, error.errMsg) } })
}
隐私设置成功后再提交事件。setUserId 只使用业务侧假名 ID;clearUserId 在撤回统计同意后仍可调用。logEvent/logPurchase 的 serverAcknowledged 固定为 false,表示未取得后台确认;flushEvents 仅返回 MetaOperationResult.status=flushRequested。后台接收、去重、广告效果与测试事件均需在自己的 Meta 环境核验。
模块四:延迟深链、普通链接与释放
初始化时填写自己已注册的 deepLinkSchemes、deepLinkHosts,可另加 deepLinkPathPrefixes。不填写允许规则时不交付业务链接。HTTPS 只匹配明确 host;自定义 scheme 单独匹配,路径前缀是解码后的字符串前缀。SDK 授权回跳不作为业务路由事件。
import { fetchDeferredAppLink, getInitialDeepLinkSync, onDeepLink, offDeepLink } from '@/uni_modules/lizhao-meta'
let metaSubscriptionId = ''
let metaPageClosed = false
export function readInstallLink() {
fetchDeferredAppLink({
success: (result) => { console.log('延迟链接查询', result.outcome, result.url != null) },
fail: (error) => { console.error(error.errCode, error.errMsg) }
})
}
export function watchMetaLinks() {
metaPageClosed = false
const initial = getInitialDeepLinkSync()
if (!initial.ok) console.error(initial.error?.errCode, initial.error?.errMsg)
// 初始链接与后续事件可能对应同一次启动,业务按eventId去重。
onDeepLink({
listener: (event) => {
if (!metaPageClosed) console.log('收到路由事件', event.eventId, event.source)
// event.url只交自己的受控路由;不要输出到日志。
},
success: (result) => {
if (metaPageClosed) { offDeepLink({ subscriptionId: result.subscriptionId }); return }
metaSubscriptionId = result.subscriptionId
},
fail: (error) => { console.error(error.errCode, error.errMsg) }
})
}
export function stopMetaLinks() {
metaPageClosed = true
if (metaSubscriptionId.length > 0) {
offDeepLink({ subscriptionId: metaSubscriptionId,
fail: (error) => { console.error(error.errCode, error.errMsg) }
})
metaSubscriptionId = ''
}
}
页面卸载调用 stopMetaLinks();重新注册前先释放旧订阅。disposeMeta 用于应用层释放本插件的等待任务、订阅和缓存,不等于 SDK 全局反初始化、退出账号或撤销已发请求;释放之后可显式重新初始化。超时只结束本次等待,不保证系统/SDK UI 已关闭,原生忙碌锁会保留到真实结束,不能用重试制造多个对话框。
延迟查询的 outcome=found 才带实际且通过允许规则的 URL。Android SDK 回调空链接但不提供错误时为 indeterminate;iOS 空 URL 且无 Error 为 sdkEmpty,均不等于无广告、无归因或已找到链接。普通 scheme/Universal Link/App Link 的 source 与延迟查询不同;插件不把普通链接转换为广告安装归因。iOS 首装查询资格、Meta 策略和真实投放链路需独立验收,不绕过 SDK 私有状态反复伪造首装。
初始化规则与登录选项
以下为 UTS 函数,适用于 uni-app x;传统 uni-app 的对应完整页面使用相同字段。appId、clientToken 与 nonce 由运行时输入或自己的受信后端提供。每个函数由按钮或业务流程显式调用,不自动发起授权。
import { initializeMeta, login, getCapabilitiesSync, MetaFail, MetaCompleteResult } from '@/uni_modules/lizhao-meta'
function configurationFailed(error: MetaFail): void {
console.error(error.errSubject, error.errCode, error.errMsg)
}
function configurationComplete(result: MetaCompleteResult): void {
console.log(result.api, result.status)
}
export function initializeWithRoutes(appId: string, clientToken: string): void {
initializeMeta({
appId: appId, clientToken: clientToken, timeoutMs: 15000,
privacy: {
analyticsConsent: false,
autoLogAppEventsEnabled: false,
advertiserIdCollectionEnabled: false,
autoLogMetadataEnabled: false,
autoLogProductImprovementEnabled: false
},
deepLinkSchemes: ['myapp'],
deepLinkHosts: ['links.example.com'],
deepLinkPathPrefixes: ['/product', '/campaign'],
success: (result) => { console.log('初始化完成', result.initialized) },
fail: configurationFailed, complete: configurationComplete
})
}
export function loginWithChallenge(nonce: string, useLimitedLogin: boolean): void {
const isIos = getCapabilitiesSync().platform == 'app-ios'
login({
permissions: ['public_profile', 'email'],
tracking: isIos && useLimitedLogin ? 'limited' : 'enabled',
nonce: nonce, timeoutMs: 120000,
success: (result) => { console.log('令牌类别', result.session.tokenKind) },
fail: configurationFailed, complete: configurationComplete
})
}
myapp、links.example.com 与路径前缀必须改为自己的原生注册和域名关联规则。iOS 标准登录还受 SDK、系统跟踪授权和 Meta 策略约束;插件不申请 ATT。Android 仅使用 enabled。不要用完整 session 或 nonce 作为日志输出。
分享附言、标签、封面与超时
以下 UTS 函数需在初始化完成、页面前台且文件具有读取权限时显式调用。参数 url、paths、videoPath、previewPath 来自自己的输入或媒体选择结果;取消、失败与完成分别保留。
import { shareLink, sharePhotos, shareVideo, MetaFail, MetaCompleteResult } from '@/uni_modules/lizhao-meta'
function mediaFailed(error: MetaFail): void { console.error(error.errCode, error.errMsg) }
function mediaComplete(result: MetaCompleteResult): void { console.log(result.api, result.status) }
export function shareLinkWithOptions(url: string): void {
shareLink({
url: url, quote: '由发布者确认的分享附言', hashtag: '#uniapp', timeoutMs: 120000,
success: (result) => { console.log('对话框完成', result.dialogCompleted) },
fail: mediaFailed, complete: mediaComplete
})
}
export function sharePhotosWithOptions(paths: Array<string>): void {
sharePhotos({ paths: paths, hashtag: '#uniapp', timeoutMs: 120000,
success: (result) => { console.log('对话框完成', result.dialogCompleted) },
fail: mediaFailed, complete: mediaComplete })
}
export function shareVideoWithOptions(videoPath: string, previewPath: string, allowSaveToPhotos: boolean): void {
shareVideo({ path: videoPath, previewImagePath: previewPath,
allowSaveVideoToPhotos: allowSaveToPhotos, hashtag: '#uniapp', timeoutMs: 120000,
success: (result) => { console.log('对话框完成', result.dialogCompleted) },
fail: mediaFailed, complete: mediaComplete })
}
不需要附言、标签或封面时省略字段,不传空标签或空封面路径。quote 实际展示由渠道决定;分享完成不代表帖子已公开。iOS 的保存选项会创建 Photos 资产,默认关闭,具体限制保留在上面的媒体说明中。
统计同意、全部采集开关与业务参数
只有已经取得相应同意时,才把参数设为 true。以下 UTS 函数分别由自己的隐私设置和统计动作调用,展示所有开关、可选数值与字符串/数字参数;金额以货币主单位传入,不执行支付。
import { setPrivacyOptions, logEvent, logPurchase, setUserId, MetaFail } from '@/uni_modules/lizhao-meta'
function analyticsFailed(error: MetaFail): void { console.error(error.errCode, error.errMsg) }
export function applyAnalyticsConsent(consent: boolean, autoEvents: boolean, advertiser: boolean, metadata: boolean, improvement: boolean): void {
setPrivacyOptions({ privacy: {
analyticsConsent: consent,
autoLogAppEventsEnabled: consent && autoEvents,
advertiserIdCollectionEnabled: consent && advertiser,
autoLogMetadataEnabled: consent && metadata,
autoLogProductImprovementEnabled: consent && improvement
}, fail: analyticsFailed })
}
export function recordContentWithValue(): void {
logEvent({ name: 'content_view', valueToSum: 0,
parameters: { content_type: 'article', item_count: 1 },
success: (result) => { console.log(result.status, result.serverAcknowledged) }, fail: analyticsFailed })
}
export function recordPurchaseWithParameters(amount: number): void {
logPurchase({ amount: amount, currency: 'CNY', parameters: { item_type: 'subscription', quantity: 1 },
success: (result) => { console.log(result.status, result.serverAcknowledged) }, fail: analyticsFailed })
}
export function associatePseudonymousUser(userId: string): void {
setUserId({ userId: userId, fail: analyticsFailed })
}
parameters 不支持布尔、数组和嵌套对象。撤回同意后调用 clearUserId 清除旧关联;不要把手机号、邮箱或姓名当作假名 ID。刷新请求不保证后台已经收到事件。
延迟查询与诊断等级
以下 UTS 函数可从按钮调用。延迟查询需初始化和真实安装链路;诊断等级和快照可在未初始化时使用。详细等级控制本插件诊断,不开启 SDK 原始令牌日志;off 仍保留关键错误。
import { fetchDeferredAppLink, setDiagnosticLevel, getDiagnosticsSync, MetaFail } from '@/uni_modules/lizhao-meta'
function diagnosticsFailed(error: MetaFail): void { console.error(error.errCode, error.errMsg) }
export function queryInstallLinkWithDeadline(): void {
fetchDeferredAppLink({ timeoutMs: 15000,
success: (result) => { console.log(result.outcome, result.url != null, result.reason) }, fail: diagnosticsFailed })
}
function applyMetaLogLevel(level: string): void {
setDiagnosticLevel({ level: level,
success: (result) => { console.log(result.status) }, fail: diagnosticsFailed,
complete: (result) => { console.log(result.status) } })
}
export function enableVerboseMetaLogs(): void { applyMetaLogLevel('verbose') }
export function useNormalMetaLogs(): void { applyMetaLogLevel('normal') }
export function disableRegularMetaLogs(): void { applyMetaLogLevel('off') }
export function inspectMetaDiagnostics(): void {
const snapshot = getDiagnosticsSync()
console.log('等待请求', snapshot.pendingCount, '淘汰日志', snapshot.droppedCount)
}
完整示例
两种宿主完整页面的位置为 uni_modules/lizhao-meta/example/uniapp/index.vue 和 uni_modules/lizhao-meta/example/uniappx/index.uvue。示例采用同一业务分类,切换 tabs 只改变显示,保留配置、请求、选择结果、订阅与日志快照。
| 分类 / 公共区域 | 全部能力与 API | 如何测试 |
|---|---|---|
| 授权 | login、getSessionSync、logout;权限、nonce、登录方式和超时 |
初始化后测试成功、取消、拒绝、会话读取及退出;iOS 可选择 Limited Login |
| 分享 | shareLink、sharePhotos、shareVideo;附言、标签、封面和超时 |
选择自己的媒体,测试预览、取消、不可读文件与实际 SDK 回执;发布由使用者确认 |
| 事件 | setPrivacyOptions、logEvent、logPurchase、setUserId、clearUserId、flushEvents |
核对不同意时拒绝、完整开关、数值 0、购买金额和用户关联;后台另确认接收 |
| 深链 | fetchDeferredAppLink、getInitialDeepLinkSync、onDeepLink、offDeepLink;允许规则和超时 |
分别核对冷/热启动、拒绝未允许链接、订阅释放和真实安装延迟查询 |
| 配置 | initializeMeta、getCapabilitiesSync、disposeMeta;应用身份和初始化超时 |
先配自己的 Native 身份与基座,再测初始化、冲突、释放及重新初始化 |
| 底部公共诊断 | setDiagnosticLevel、getDiagnosticsSync;环境、记录、完整报告和一键复制 |
在业务忙碌时仍可调整诊断;核对完整/分段复制、脱敏和失败手动回退 |
下面是 UTS 连贯调用示例,适用于 uni-app x;传统 uni-app 使用上述选项式完整页面。由页面在前台调用 startMetaExample(appId, clientToken, nonce),页面卸载调用 stopMetaExample();应用层确定需要释放时再调用 releaseMetaExample()。身份及挑战值由自己的配置/后端传入。
import { initializeMeta, login, onDeepLink, offDeepLink, disposeMeta, MetaFail, MetaCompleteResult } from '@/uni_modules/lizhao-meta'
let pageClosed = false
let pageSubscription = ''
let flowGeneration = 0
function flowFailed(error: MetaFail): void { console.error(error.errSubject, error.errCode, error.errMsg) }
function flowComplete(result: MetaCompleteResult): void { console.log(result.api, result.status) }
export function startMetaExample(appId: string, clientToken: string, nonce: string): void {
stopMetaExample()
pageClosed = false
const generation = flowGeneration
initializeMeta({ appId: appId, clientToken: clientToken,
privacy: { analyticsConsent: false }, timeoutMs: 15000,
deepLinkSchemes: ['myapp'], deepLinkHosts: ['links.example.com'],
success: (initialized) => {
if (pageClosed || generation != flowGeneration || !initialized.initialized) return
onDeepLink({
listener: (event) => { if (!pageClosed && generation == flowGeneration) console.log('事件标识与来源', event.eventId, event.source) },
success: (subscription) => {
if (pageClosed || generation != flowGeneration) { offDeepLink({ subscriptionId: subscription.subscriptionId }); return }
pageSubscription = subscription.subscriptionId
}, fail: flowFailed, complete: flowComplete
})
login({ permissions: ['public_profile'], nonce: nonce, timeoutMs: 120000,
success: (result) => { if (!pageClosed && generation == flowGeneration) console.log('登录完成,令牌类别', result.session.tokenKind) },
fail: flowFailed, complete: flowComplete })
}, fail: flowFailed, complete: flowComplete
})
}
export function stopMetaExample(): void {
flowGeneration++
pageClosed = true
if (pageSubscription.length > 0) {
offDeepLink({ subscriptionId: pageSubscription, fail: flowFailed, complete: flowComplete })
pageSubscription = ''
}
}
export function releaseMetaExample(): void {
stopMetaExample()
disposeMeta({ success: (result) => { console.log(result.status) }, fail: flowFailed, complete: flowComplete })
}
完整页面还提供全部 21 项 API 的独立按钮,开发者无需改源码即可切换功能测试。App ID、Token、nonce 与媒体路径不进入日志或持久化存储。业务链接仅显示脱敏摘要,真实路由和服务端验签由自己的业务实现。
开发者接入验收
| 验收项 | 通过依据 |
|---|---|
| 源码 / 基座匹配 | 新包包含对应 Native SDK 与版本;冷启动时 FacebookInitProvider 不提前初始化 SDK |
| 初始化 / 登录 | 自有 Meta 应用、包名/签名或 Bundle ID 正确,成功/取消/拒绝分别真实结算;后端验证令牌 |
| 分享 | 用户选择媒体与发布操作,分别核对 SDK 对话框回执和实际发布结果 |
| 事件 | 取得相应同意,核对 SDK 受理与 Meta 后台接收,购买统计不当作支付 |
| 深链 | 普通链接核允许规则及监听释放;延迟链接走真实安装/投放测试链路,不用 adb 普通打开 URL 代替 |
| 生命周期 / 日志 | 前后台、超时、迟到回调、页面卸载、释放与重初始化,完整/分段系统剪贴板及复制失败回退 |
| 平台 | uni-app Vue2/Vue3、uni-app x 分别验;iOS 另需 Apple 编译/链接、自己的 Bundle 配置和设备 |
完整报告与复制
两个示例底部的“一键复制日志”“分段复制”“完整报告”使用同一脱敏报告源。报告包含报告编号、生成时间/时区、条数/正文长度、首尾标记、环境与版本来源、插件/原生诊断及保留的操作轨迹。运行时取不到构建 HX/编译器/基座版本时明确写 unknown,不拿排查电脑的版本代替应用包。
长报告分段基于固定快照,仅实际复制成功后推进。失败会显示真实脱敏错误并提供手动复制文本,复制不会清空原日志。设备系统剪贴板内容与分段转发完整性仍需在目标宿主验收;静态及传输夹具检查不替代实际手机复制。
API 用途速查
| API | 用途 | 返回或成功结果 |
|---|---|---|
| initializeMeta | 配置、隐私、允许规则并显式初始化 | requestId;MetaInitializeResult |
| setPrivacyOptions | 设置统计同意及各采集开关 | requestId;MetaPrivacyState |
| getCapabilitiesSync | 当前平台、SDK与逐项能力状态 | MetaCapabilities |
| login | 原生授权登录 | requestId;MetaLoginResult.session |
| logout | 清除本应用 SDK 登录会话 | requestId;MetaOperationResult |
| getSessionSync | 同步读取会话,区分失败与合法空 | MetaSessionQuery |
| shareLink | HTTPS 链接分享 | requestId;MetaShareResult |
| sharePhotos | 1–6张本地图片分享 | requestId;MetaShareResult |
| shareVideo | 单个本地/Photos视频分享 | requestId;MetaShareResult |
| logEvent | 标准或自定义事件 | requestId;MetaEventResult |
| logPurchase | 购买统计 | requestId;MetaEventResult |
| setUserId | 设置业务侧假名关联 | requestId;MetaOperationResult |
| clearUserId | 清除旧关联,撤回同意后仍可用 | requestId;MetaOperationResult |
| flushEvents | 请求 SDK 刷新队列 | requestId;MetaOperationResult |
| fetchDeferredAppLink | Meta 广告安装延迟链接查询 | requestId;MetaDeferredLinkResult |
| getInitialDeepLinkSync | 读取冷启动链接结果 | MetaInitialLinkQuery |
| onDeepLink | 持续事件订阅 | requestId;MetaSubscription.subscriptionId |
| offDeepLink | 精确解除订阅 | requestId;MetaOperationResult |
| setDiagnosticLevel | 设置插件诊断详细度 | requestId;MetaOperationResult |
| getDiagnosticsSync | 返回独立脱敏快照 | MetaDiagnostics |
| disposeMeta | 释放本插件资源并结束待处理请求 | requestId;MetaOperationResult |
通用参数、回调和结果
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| success | 对应结果回调 | 否 | 成功至多一次 | 无 | 各API对应结果类型 |
| fail | (MetaFail) => void | 否 | 失败、取消、超时的可识别错误 | 无 | errSubject固定lizhao-meta |
| complete | (MetaCompleteResult) => void | 否 | success或fail后至多一次;回调抛错仍隔离 | 无 | status=succeeded/failed/cancelled/timedOut |
| timeoutMs | number | 否 | initializeMeta/login/分享/fetchDeferredAppLink的等待上限,整数毫秒 | 初始化/延迟查询15000;登录/分享120000 | 1000–300000 |
异步 API 立即返回 requestId;终态回调异步派发,捕获调用时的回调,不受后续修改 options 影响。complete 包含 requestId、api、status、errCode 和 errMsg;成功 errCode=0 只说明该请求成功,业务含义仍取其结果。同步查询返回 {ok,session,error} 或 {ok,link,error};ok=true 可以合法为空,ok=false 必须检查 error。
MetaSession 字段为 tokenKind、accessToken、authenticationToken、userId、expiresAtMs、grantedPermissions、declinedPermissions、platform;可空值为 null。tokenKind 为 accessToken 或 authenticationToken。有效期单位为 Unix 毫秒,未知为 null。MetaShareResult 包含 dialogCompleted、可空 postId;MetaDeferredLinkResult 包含 outcome、可空 url、reason、source、sdkVersion。不要完整打印会话或 URL。
配置与登录参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| appId | string | 是 | initializeMeta的十进制Meta应用ID,最长40字符 | 无 | 与原生配置相同 |
| clientToken | string | 是 | 最长512字符且无空白,不是App Secret | 无 | 与原生配置相同 |
| privacy | MetaPrivacyOptions | setPrivacyOptions必填 | 所有采集项默认关闭;每次设置为完整目标状态 | 初始化省略 | 以下字段 |
| privacy.analyticsConsent | boolean | 提供privacy必填 | 明确业务统计同意 | false | true/false |
| privacy.autoLogAppEventsEnabled | boolean | 否 | SDK自动事件 | false | true/false |
| privacy.advertiserIdCollectionEnabled | boolean | 否 | 广告标识采集,不代替ATT授权 | false | true/false |
| privacy.autoLogMetadataEnabled | boolean | 否 | 额外事件元数据 | false | true/false |
| privacy.autoLogProductImprovementEnabled | boolean | 否 | 产品改进数据 | false | true/false |
| deepLinkSchemes | string[] | 否 | 自有scheme、不带冒号;拒绝SDK保留/危险scheme | 空数组 | 最多32项,每项1–255字符 |
| deepLinkHosts | string[] | 否 | 明确HTTPS域名,无端口/通配符/用户凭据 | 空数组 | 最多32项,每项1–255字符 |
| deepLinkPathPrefixes | string[] | 否 | 解码路径前缀,/开头,无query/fragment或空白 | 空数组,允许已匹配scheme/host的路径 | 最多32项,每项1–255字符 |
| permissions | string[] | 否 | 登录权限名称,不保证全部获批 | public_profile | 1–50项,须Meta审核 |
| tracking | string | 否 | 登录类别 | iOS limited;Android enabled | limited/enabled;Android拒绝limited |
| nonce | string | 否 | 安全随机防重放值,最长256字符且无空白 | SDK安全随机;服务端配对时务必显式传入 | 非空字符串 |
任意额外采集开关开启前需 analyticsConsent=true。MetaPrivacyState 返回实际五项开关、sdkApplied 和来源 source。开关关闭不代表初始化、授权、分享、查询完全不联网;SDK已缓存或已发送的数据也不会因此追溯删除。
分享、事件、订阅和诊断参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| url | string | shareLink必填 | HTTPS且无用户凭据,最长8192字符 | 无 | 用户审核的链接 |
| quote | string | 否 | 链接附言,最长2048字符,实际展示由渠道决定 | 无 | 普通文本 |
| hashtag | string | 否 | 三类分享的单个#标签,最长100字符,无空白 | 无 | 单个标签 |
| paths | string[] | sharePhotos必填 | 已取得可读权限的本地图片 | 无 | 1–6张;平台内存/尺寸限制见前文 |
| path | string | shareVideo必填 | 本地视频;iOS可使用已授权ph://资产 | 无 | 不支持HTTP/data/blob媒体 |
| previewImagePath | string | 否 | 可读的本地视频封面,适用平台同样校验图片 | 无 | 本地路径 |
| allowSaveVideoToPhotos | boolean | 否 | 仅iOS本地文件:明确同意申请相册权限并保存后分享;取消不删除 | false | true/false;Android不使用 |
| name | string | logEvent必填 | 事件名,首位字母/数字/下划线,其余可含空格/连字符 | 无 | 2–40字符 |
| valueToSum | number | 否 | 有限数字,0保留 | 无 | 有限数字 |
| parameters | UTSJSONObject | 否 | 最多25项,键遵守事件名规则;字符串最长100字符或有限数字 | 无 | 不支持布尔值/嵌套对象/数组 |
| amount | number | logPurchase必填 | 非负有限金额,货币主单位,不是分 | 无 | 0保留 |
| currency | string | logPurchase必填 | 三位大写且系统可识别的ISO4217代码 | 无 | 如CNY、USD |
| userId | string | setUserId必填 | 最长100字符,建议业务假名ID | 无 | 避免直接身份信息 |
| listener | (MetaDeepLink) => void | onDeepLink必填 | 持续事件,与注册success分开;含eventId/url/source/receivedAt/platform | 无 | 必须精确释放 |
| subscriptionId | string | offDeepLink必填 | 本插件注册成功后取得的真实ID | 无 | 非空字符串 |
| level | string | setDiagnosticLevel必填 | 只控制本插件诊断,不开启SDK原始令牌日志 | normal | off/normal/verbose |
错误码说明
所有错误的 errSubject 固定为 lizhao-meta;附带 api、requestId、stage、platform,以及可采集的 nativeDomain、nativeCode、nativeType、nativeCause、nativeStack。原生字段可能为 null,输出前均脱敏。
| 错误码 | 含义 | 处理建议 |
|---|---|---|
| 9347001 | 参数无效 | 核对类型、单位、数量及允许规则,不输出敏感原值 |
| 9347002 | 当前平台或能力不支持 | 使用已实现的Android/iOS路径;Android不支持Limited Login |
| 9347003 | 原生桥或SDK未接入 | 核对匹配源码的原生基座,WGT不能补齐 |
| 9347004 | SDK未初始化 | 初始化成功后再调用业务 |
| 9347005 | 配置缺失或冲突 | 核对占位值、静态App ID/Token、scheme、包名/签名及Bundle ID |
| 9347006 | 交互任务忙碌 | 等真实系统/SDK UI结束,不用超时清空原生锁 |
| 9347007 | 用户取消 | 正常取消终态;complete.status=cancelled |
| 9347008 | 权限被拒绝 | 核对系统/Meta授权与权限审核,不伪造资料 |
| 9347009 | 超时 | complete.status=timedOut;原生/后台结果可能未知,不自动重试 |
| 9347010 | 宿主上下文或前台不可用 | 在可呈现的真实页面/Activity调用 |
| 9347011 | 原生调用或桥接失败 | 查看脱敏原始domain/code/cause和前后状态 |
| 9347012 | 媒体不可读或不支持 | 核对文件、轨道、格式、大小、权限及iOS Photos约束 |
| 9347013 | 未授权业务统计 | 取得明确同意后设置隐私选项 |
| 9347014 | 插件已释放 | 不复用旧请求/订阅,需要时显式重新初始化 |
| 9347015 | 深链不在允许范围 | 核对scheme/host/path,业务不执行不可信路由 |
| 9347016 | 操作结果未知 | 按实际回执和业务状态确认,不当成功或自动重复执行 |
取消、超时与结果未知的含义不同;SDK没有提供完整错误的空延迟链接是明确标记的查询结果,不伪造为找到链接,也不静默丢弃。
注意事项
宿主与平台兼容性
平台字段按当前uni_modules规范填写:√支持、x不支持、-待确认。Android的支持证据为真实SDK/原生与宿主编译及已有边界真机记录,真实业务仍由开发者配置验收;iOS不因源码和资源存在而提前标为已通过。
| 宿主 / 渲染 | Android | iOS | 说明 |
|---|---|---|---|
| uni-app Vue2 / Vue3,App-vue | √ | - | Android真实SDK与生成Kotlin已本地验证;iOS提供实现和资源生成,Apple编译/链接及设备待确认 |
| uni-app x(Vapor / VDOM) | √ | - | Android两种渲染模式的真实SDK与生成Kotlin已本地联编;Vapor兼容字段为√。iOS原生源码和示例已提供,Apple与设备待确认 |
| uni-app nvue | x | x | 不在本插件适配范围 |
| HarmonyOS | x | x | 无业务实现,返回9347002 |
| Web / 各小程序 / 快应用 | x | x | 不接入Meta原生业务,返回9347002;Web示例仅可核界面与不支持回执 |
| uniCloud腾讯云/阿里云/支付宝云 | x | x | 不交付云端模块;自己的后端另行实现令牌验证 |
| 依赖或环境 | 要求 |
|---|---|
| HBuilderX / 两宿主 | 最低声明5.33;核心已有5.33的历史编译证据,本轮使用5.34.2026102909。新版完整示例在5.33仍需复验,不将本轮结果写作5.33通过 |
| Android | 插件配置API21起;实际系统最低值取宿主、全部依赖和最终合并Manifest的较高值 |
| iOS | 15.0起;需要自己的Bundle ID、回调入口、Apple工具链与设备验收 |
| Meta SDK | Android Maven和iOS CocoaPods均固定19.0.0,不混用宿主原有重复SDK |
| 隐私 / 系统授权 | 自动采集默认关闭;iOS ATT由应用处理,保存本地视频到Photos须明确选择并取得授权 |
- 平台范围:Android/iOS 原生源码面向 uni-app Vue2/Vue3 与 uni-app x;实际验证分层如介绍所述。Harmony、Web、微信/支付宝等小程序均不支持业务能力,返回 9347002;nvue不在本次验收范围,不声称适配。
- 自定义基座:SDK、Native Kotlin/Swift、Manifest、Info.plist、资源与依赖变化必须重新原生联编/重打对应基座;页面或文档变动通常无需重打。appResource通过不等于最终原生包、Apple链接、设备或Meta服务通过。
- 隐私:初始化、登录、分享及查询可能联网;自动事件、广告标识和额外采集默认关闭。插件不自动申请ATT;广告标识开关不绕过系统限制。不向插件传入App Secret,不记录AccessToken、AuthenticationToken、Client Token、nonce、完整userId和业务URL。
- 媒体与权限:只使用用户选择且有读取权限的资源;iOS本地视频的显式保存会产生相册资产。主应用必须保留真实用途说明,系统拒绝不能当成功。不申请无关存储/通讯录权限以采集诊断。
- 生命周期:页面释放自己的订阅;JS宿主业务listener由可释放Map保留,原生桥仅同步拉取有界链接队列。队列有数量上限,溢出写诊断;订阅不活跃期间不要把它当无限历史存储。dispose不承诺撤销已发网络请求或关闭系统UI。
- 诊断:示例报告保留最多1000条/512KiB UTF-8,超限标明丢弃;原生/插件各有独立有界缓存。缓存、显示、复制前脱敏,默认不上传客户日志。报告的unknown是不具备采集条件,不伪造环境值。更详细诊断可运行时开启。
- 服务验收:真实Meta应用、权限审核、签名、网络与政策决定授权/发帖/事件/归因可用性。测试应分别覆盖取消、拒绝、无Facebook客户端、后台/重入/超时、迟到回调、首次安装、撤回同意和完整系统剪贴板,不以本地测试桩结果代替。
作者系列 UTS 插件
下表来自统一已发布插件清单,仅列已核实的市场条目;各插件支持范围以市场说明为准。
<!-- meta-series-start -->| 插件 | 能力方向 | 插件市场 |
|---|---|---|
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
下载 12729937
赞赏 1959
赞赏
京公网安备:11010802035340号