更新记录

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,最终最低值还取宿主与合并依赖约束。

  1. 在 Meta 开发者后台为实际 Android 包名、签名 Key Hash、iOS Bundle ID 配置平台、登录与应用权限。应用审核、测试账号和上线资格由业务自己准备。
  2. 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。
  3. iOS 在自己的本地构建副本填写 uni_modules/lizhao-meta/utssdk/app-ios/Info.plist 的 FacebookAppID、FacebookClientToken、FacebookDisplayName 及 fb 加 App ID 的 CFBundleURLSchemes。保留 SDK 查询 scheme、关闭状态的静态采集开关、FBSDKAemAutoSetupEnabled 和空 FacebookLoggingBehavior。占位值、静态与运行时 App ID/Token 冲突会真实失败。
  4. 需要 iOS 普通 scheme 时,将自己的 scheme 合入 CFBundleURLTypes。Universal Links 还需宿主自己的 Associated Domains entitlement、有效域名与服务器 AASA;Android HTTPS App Links 需服务器 assetlinks.json 与真实包名/签名。上述服务器文件由用户准备,不随插件交付。
  5. 运行时 initializeMeta 的 App ID/Client Token 必须与本地原生配置相同。不要把自己的 Token、App Secret、签名私钥或生产配置提交仓库。Client Token 是原生客户端配置,不能冒充 App Secret 或当作服务端认证凭据。
  6. 检查宿主原有 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 微信登录、分享、支付、小程序与客服 查看插件
<!-- meta-series-end -->

隐私、权限声明

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

Android联网及SDK依赖声明见合并Manifest,选定媒体需已有可访问权限;iOS URL Scheme/可选Universal Links及ATT由宿主配置,插件不自动申请ATT或扫描相册。

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

Meta SDK按用户显式调用执行授权、分享、事件与延迟链接请求。自动事件、广告标识与额外采集默认关闭,须按隐私授权明确开启。诊断默认仅保留在本地内存并脱敏,不自动上传。

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

无