cordova-acoustic-connect
Cordova插件 声连接 (CDP + engagement)。封装原生的iOS和Android Connect sdk,并公开一个基于promise的JavaScript API, AcousticConnect,到你的Cordova应用程序。
需求
| 要求 | 版本 |
|---|---|
| node . js | 20 + |
| 科尔多瓦CLI | npm install -g cordova |
| iOS部署目标 | 15.1 + |
| Xcode | 15 + |
| CocoaPods | sudo gem install cocoapods |
安卓 minSdk | 26 |
| Android Studio + SDK | 34 + |
安装
npx cordova plugin add cordova-acoustic-connect-beta
配置
创建 ConnectConfig.json 在你的Cordova项目根目录下(被忽略了——永远不要提交真正的凭据):
{
"Connect": {
"AppKey": "<your-app-key>",
"PostMessageUrl": "<your-collector-url>",
"useRelease": false,
"iOSAppGroupIdentifier": "group.<your-bundle-id>",
"iOSDevelopmentTeam": "<your-apple-team-id>",
"AndroidVersion": "<optional-connect-android-sdk-version-override>",
"iOSVersion": "<optional-connect-ios-sdk-version-override>",
"PushEnabled": true,
"iOSPushMode": "automatic",
"AndroidNotificationIconResName": "<optional-drawable-name>",
"KillSwitchEnabled": false,
"KillSwitchUrl": "<optional-kill-switch-url>"
}
}
| 场 | 描述 |
|---|---|
AppKey | 必需的。连接应用程序键。 |
PostMessageUrl | 必需的。连接收集器端点。 |
iOSAppGroupIdentifier | 应用与iOS NSE/NCE扩展之间的共享应用组ID。 |
iOSDevelopmentTeam | 苹果团队ID。自动设置Xcode签名团队,跳过下面的手动签名和功能步骤。 |
AndroidVersion | pin特定的Connect Android SDK版本(x.y.z),而不是插件的默认值(目前为 11.1.30-beta,或 11.1.17 发布与 useRelease: true). 无效值将被忽略,并出现生成警告。 |
iOSVersion | pin一个特定的Connect iOS SDK pod版本(x.y.z),而不是插件的默认值(>= 2.1.51(浮动:CocoaPods解析最新的版本,对于发布和调试pod)。下面的值 2.1.51 -第一次构建与iOS屏幕捕获和WebView修复-和非版本字符串被忽略与构建警告。 |
PushEnabled | 可选的布尔, true 默认情况下(push一直在这个插件上)。 false 开发应用时不需要推送:在Android上只需要分析 connect 在iOS上,SDK是启用的,没有推送,构建没有 ConnectNSE/ConnectNCE 扩展,没有应用组或 aps-environment 权利和否 remote-notification 背景模式;这个 push.* 呼叫拒绝 ACOUSTIC_PUSH_DISABLED. 请参阅下面的“关闭按钮”。 |
iOSPushMode | 'automatic' (默认)或 'manual'. 只有iOS -安卓总是 'automatic' 在桥的边界。 |
AndroidNotificationIconResName | Android上推送通知图标的可绘制资源名称。后备链:你的名字→插件的捆绑 ic_notification (正确的默认-启动器图标崩溃在交付)→ ic_launcher (遗留)→SDK自己的默认值。 |
KillSwitchEnabled | false (默认)或 true. 在两个平台上控制本地SDK的远程终止开关-见下文。SDK自己的捆绑默认值是 true;这个插件默认是 false 所以应用程序必须明确选择加入。 |
KillSwitchUrl | 远程终止开关检查URL。仅在以下情况下生效 KillSwitchEnabled: true。 |
LocationLoggingEnabled | 可选的。省略字段(或集合) null)来保持原生SDK的默认值不变-不像 KillSwitchEnabled,这个插件可以 不 强制一个默认值。集 true/false 明确选择加入/退出SDK的位置数据收集。只停止位置数据到达收集器-不 不 删除 CoreLocation 链接从编译的iOS SDK,所以它自己不解决苹果的 ITMS-90683 App Store警告(缺失 NSLocationWhenInUseUsageDescription); 仍然需要Info。声明的plist键或没有CoreLocation链接的sdk端构建。 |
ScreenCaptureEnabled | 可选布尔。省略它(或设置) null)或设置 true 保留SDK默认值(在每个屏幕上捕获的布局和截图)。 false 在两个平台上关闭布局和截图捕获,同时屏幕视图保持流动-参见 屏幕截图和隐私。 |
layoutConfig, layoutConfigIos, layoutConfigAndroid | 带有SDK屏幕捕获规则的可选对象(AutoLayout, AppendMapIds). layoutConfig 为共享基线;平台块在其上深度合并(对象合并,数组被替换)。看到 屏幕截图和隐私。 |
杀死开关
这两个原生sdk都默认开启了终止开关(KillSwitchEnabled=true); 这个插件强制关闭它,除非你选择通过 KillSwitchEnabled: true + KillSwitchUrl。
- iOS:
ConnectPlugin.swift的enable()调用applyKillSwitchConfig()之前 和 后ConnectSDK.shared.enable(...)- SDK可能会重新加载其绑定的plist默认值(KillSwitchEnabled=true),因此配置的值被重新应用两次,以使其保持不变。 - 安卓:
ConnectBasicConfig.properties集合KillSwitchEnabled在资产加载时,但这并不是最后的定论-原生SDK的2-argTealeaf.enable(appKey, postMessageUrl)(这handleEnable()调用)有一个无条件设置的内部处理程序KillSwitchEnabled=true并计算自己的URL,一次,在被调用后约100ms。ConnectPlugin.kt通过重新应用配置的值Connect.updateConfig(...)300毫秒后Connect.enable(...),轻松通过窗口,因此值(on或off)实际上是固定的。0参数绑定的auto-init路径(tryBundledConfigInit)根本没有击中这个内部处理程序,所以properties-file值已经正确地应用在那里,而不需要重新应用。
设备上验证:with KillSwitchEnabled: true 和一个真实的 KillSwitchUrl, Android SDK日志 KillSwitchEnabled:true 和 Killswitch has enabled Tealeaf with following session id:... -真正的异步kill-switch检查运行并完成。
插件的 before_prepare Hook在每个节点上读取这个文件 cordova prepare / cordova build。 Connect.useRelease 是使用本机SDK变体的单一事实来源,以及本机SDK日志记录是否冗长:
true→AcousticConnect(发布)pod在iOS上,发布连接工件在Android上。在Android上,ConnectPlugin.kt也称Connect.updateConfig("DisplayLogging", "false", EOCore.getInstance())之后Connect.init()原生(Tealeaf/EOCore/Connect) logcat输出被抑制,不管应用的Gradle构建类型。false(默认)→AcousticConnectDebugiOS上的pod, Android上的详细本地logcat输出(SDK自己的默认值,保持不变)。Android总是使用相同的connect-push-fcmMaven工件,不管useRelease没有单独的调试Maven构件。这个标志决定了Android从哪里解析Connect: withfalsegithub托管的Maven树(go-acoustic/Android_Maven,发布Connect测试版;它们不会到达Maven Central)在谷歌和Maven Central之后声明,仅限于io.github.go-acoustic集团;与true只使用Maven Central,拒绝所有测试版。它还会选择插件的默认Android版本:11.1.30-betaβ与false,11.1.17发布与true。
旗子通过 www/AcousticConnectNativeConfig.json (与iOS原生配置一起生成,捆绑到 assets/www/ (by Cordova) -故意不通过应用程序级别 EOCoreBasicConfig.properties 资产覆盖,因为Android的资产合并取代 整个 文件上的名称冲突和SDK的捆绑默认携带其他几个必需的密钥(例如。 PostMessageTimeInterval),部分覆盖会悄无声息地下降,并在 enable() 时间。
Android在每次构建时都会读取新标记;iOS将CocoaPods的pod名称命名为 plugin.xml 当插件被安装后,所以修改 useRelease 你必须删除并重新添加插件才能生效:
npx cordova plugin rm co.acoustic.connect.push
npx cordova plugin add cordova-acoustic-connect-beta
npx cordova prepare ios
一个完整的 cordova platform rm ios && cordova platform add ios 是 不 这是必需的-早期版本的插件留下了陈旧 "[CP] Prepare AcousticConnectDebug xcframeworks" (或 AcousticConnect)脚本阶段落后于 ConnectNSE/ConnectNCE 调试↔释放开关后的目标,其参考 .xcfilelist 转换后不再存在,并且构建失败 Unable to load contents of file list: .... 插件的 after_prepare hook现在在添加当前版本之前从以前的SDK变体中删除任何此类过时的阶段 plugin rm/add 以上的工作流程就足够了。
注意: useRelease 只控制本机SDK自己的logcat输出。插件桥自己的日志级别(ConnectPlugin.kt)分别通过 AcousticConnect.setLogLevel() 从JavaScript。
快速启动
document.addEventListener('deviceready', async function () {
await AcousticConnect.enable(
'your-app-key',
'https://your-collector-url',
'automatic'
);
await AcousticConnect.logIdentity('email', '[email protected]', 'loggedIn');
}, false);
AcousticConnect 可用作为CommonJS/ES模块导出和作为全局on window (安装通过插件的 <clobbers> 条目),因此可以从plain访问它 <script>基于Cordova的应用程序或从 import/require。
API参考
AcousticConnect.enable(appKey, postURL, pushMode?, options?)
初始化并启用Connect SDK。必须从 deviceready 处理程序在任何其他插件方法之前。
appKey: stringpostURL: stringpushMode?: 'automatic' | 'manual'-默认为'automatic'options?: { iosAppGroupIdentifier?: string, androidIconResName?: string }- 返回
Promise<void>,拒绝{ code, message }无效参数或本机SDK启动失败。
AcousticConnect.disable()
停止所有数据捕获和推送活动。返回 Promise<void>。
AcousticConnect.setLogLevel(level)
level: 'silent' | 'error' | 'warn' | 'info' | 'verbose'. 仅影响网桥日志记录。返回 Promise<void>。
AcousticConnect.logIdentity(identifierName, identifierValue, signalType?, additionalParameters?)
将身份信号记录到Connect SDK中。
identifierName: string——如。'email','userId'identifierValue: string——如。'[email protected]'signalType?: string-默认为'loggedIn'additionalParameters?: Record<string, string>- 返回
Promise<void>
常见的电话:
// Login
AcousticConnect.logIdentity('email', '[email protected]', 'loggedIn', { loginMethod: 'email' });
// Registration
AcousticConnect.logIdentity('email', '[email protected]', 'accountRegistered', { registrationMethod: 'email' });
分析
所有分析方法返回 Promise<void> 然后拒绝 { code, message } (ACOUSTIC_INVALID_ARGS 对于糟糕的论点)。已解决的承诺意味着SDK 排队 事件;这并不意味着收藏者拥有它。事件在设备上批处理并稍后发布,通常在应用程序进入后台时发布。
| 方法 | 笔记 |
|---|---|
logCustomEvent(eventName, values?, level?) | values 是一个 平 对象的字符串/数字/布尔(Android SDK只携带字符串)。 level 是一个非负整数,默认值 3。 |
logSignal(values, level?) | values 是任意JSON,包括嵌套的对象和数组。功能, undefined, NaN/Infinity、日期及通告参考资料均不获接纳。 |
setCurrentScreenName(name) | 设置以后事件归属的屏幕名称。它本身不会发出屏幕视图。 |
logScreenViewContextLoad(name, referrer?) | 进入屏幕的日志。 referrer 是前一个屏幕;空的或 null 意味着没有。 |
logScreenViewContextUnload(name, referrer?) | 留下一个屏幕的日志。在Android上,SDK会丢弃屏幕视图,其屏幕名称在其队列中仍然有未发送的消息,因此卸载您刚刚加载的屏幕会拒绝 ACOUSTIC_INTERNAL_ERROR (returned false). 卸载 之前的 屏幕。 |
logClickEvent(controlId, data?) | 作为 click 自定义事件 携带 controlId 加上可选平房 data。 |
logTextChangeEvent(controlId, { text?, masked? }) | 作为 textChange 自定义事件。原文是 默认为掩码 (每个字符变成 X(只保留长度),然后离开JavaScript。通过 masked: false 按原样发送——永远不要输入密码或个人数据。 |
logExceptionEvent(message, stackInfo?, unhandled?) | 使用名称记录异常事件 Cordova Plugin,将消息作为其描述和 unhandled 国旗。堆栈文本到达 stackTrace 在Android上;在iOS stackTrace 是 (null) (一个 NSException 不携带调用堆栈),文本在 data.stacktrace。 |
flushQueues() | 持久化队列。它不会强制在Android上立即发布网络帖子。 |
isSdkEnabled() | 解析一个严格的布尔值。 |
getSdkVersion() | 解析本地Connect SDK自己的版本。 |
await AcousticConnect.setCurrentScreenName('checkout');
await AcousticConnect.logScreenViewContextLoad('checkout', 'cart');
await AcousticConnect.logCustomEvent('coupon_applied', { code: 'SPRING', amount: 10 });
await AcousticConnect.logClickEvent('btnPay', { method: 'card' });
await AcousticConnect.logTextChangeEvent('txtEmail', { text: email }); // masked
注意事项:
- 页面内的点击和输入不会被自动捕获。 原生SDK无法看到WebView中的DOM事件,所以调用
logClickEvent/logTextChangeEvent你自己(或你自己的听众)。原生控件事件api没有被使用:在设备上,iOS拒绝每个视图使用它们,而Android报告整个WebView作为目标。 logCustomEvent和logSignal每个平台上的有效载荷形状不同。 iOS将它们嵌套在data.value(自定义事件)和signal.data.value(信号);Android则不然。Android也将每个自定义事件的值作为字符串传递,iOS则保留JSON类型。在查询数据时请记住这一点。logSignal在Android上: 之前连接Android SDK版本11.0.24-beta在 顶级 有效负载(到达字符串和布尔值;嵌套在对象或数组中的数字不受影响)。观察到在11.0.21-beta;11.1.10-beta发送它(在模拟器上检查),插件的默认值也是如此。只有当你干掉一个老家伙时才有意义AndroidVersion:然后嵌套数值。
运行时配置项
await AcousticConnect.setConfigItem('DisplayLogging', true, 'EOCore');
const interval = await AcousticConnect.getConfigItem('PostMessageTimeInterval', 0, 'EOCore'); // number
setConfigItem(key, value, moduleName) 接受布尔值、字符串或有限数。 getConfigItem(key, defaultValue, moduleName) 返回类型的值 defaultValue,并在未设置项或不适合该类型时返回默认值 false 保持 false).
| 安卓 | iOS | |
|---|---|---|
moduleName | 选择SDK模块(EOCore, Tealeaf, Connect). 未知模块拒绝使用 ACOUSTIC_INTERNAL_ERROR。 | 忽略:一个配置存储。 |
| 读取SDK设置 | 例如,读取SDK自己的项 DisplayLogging 和 PostMessageTimeInterval。 | 你设置的项会被回读。Android的SDK密钥名称,如 DisplayLogging 和 PostMessageTimeInterval 尝试时返回默认值;没有检查其他sdk拥有的密钥。 |
一个可以解析的集合意味着SDK接受了该项,而不是它改变了行为:大多数项在SDK启动时被读取,所以在此之前设置它们 enable() 在你可以的地方。这两个调用都需要初始化SDK;在此之前, setConfigItem Android上的拒绝。
屏幕截图和隐私
默认情况下,本机SDK捕获视图层次结构和 截图 每个屏幕的。在iOS上,我们可以在每次测试中观察到这一点:屏幕图像的布局信息(类型10)加上屏幕视图本身。在Cordova应用程序中,页面是一个WebView,所以屏幕截图显示页面显示的内容,包括个人数据。
本地屏蔽规则(Masking 内部 AutoLayout)适用于 仅本地控件. 它们不会屏蔽WebView中的文本——WebView显示为一个控件。若要将页面内容排除在捕获之外,请关闭捕获:
{ "Connect": { "ScreenCaptureEnabled": false } }
| 平台 | 什么 false 做 |
|---|---|
| iOS | 之后 enable(),集 AutoLayout.GlobalScreenSettings.CaptureLayoutOn 来 0. 在模拟器上验证:布局和截图停止,屏幕视图继续。 |
| 安卓 | 之前 enable(),集 LogViewLayoutOnScreenTransition 来 false。 未在设备上验证的: SDK捕获的布局停止;端到端的捕获阶段只能在iOS上运行。 |
Android上的布局。 Android SDK从WebView屏幕发送一个布局(类型10) 11.1.10-beta,比插件的默认值更老:在此之前,它等待页面内的Tealeaf web库的id,然后放弃布局。该插件还保留SDK的捕获设置(PrintScreen, LogViewLayoutOnScreenTransition, ScreenshotFormat 和其他人)在 ConnectBasicConfig.properties 因为那个文件取代了SDK自己的;没有它们,SDK拒绝每个布局捕获。该页面没有Tealeaf web库,因此布局将WebView列为一个控件 dcid: "dcid-none" 没有页面内容。
layoutConfig, layoutConfigIos 和 layoutConfigAndroid 携带SDK自己的屏幕规则:
{
"Connect": {
"layoutConfig": {
"AutoLayout": { "GlobalScreenSettings": { "CaptureLayoutDelay": 500 } }
},
"layoutConfigIos": {
"AutoLayout": { "GlobalScreenSettings": { "CaptureLayoutOn": 0 } }
}
}
}
- 在构建时,平台块会深度合并到共享块之上(对象合并,数组被替换)。只有
AutoLayout和AppendMapIds使用;其他键被忽略,并给出警告。 - iOS 将块合并到SDK生效的规则上,因此部分块保留其余部分。
- 安卓 将块写入
ConnectLayoutConfig.json在应用资产中,which 替换SDK的整个布局配置. 给它一个完整的块或省略它;构建在以下情况下发出警告AutoLayout.GlobalScreenSettings不见了。 钩子生成ConnectLayoutConfig.json(和ConnectBasicConfig.properties)在你的Cordova项目根目录中cordova prepare,所以把两者都加到你的.gitignore。 - 只有
CaptureLayoutOn: 0在iOS上生效。不要假定该键的其他值表示“开”。
AcousticConnect.push
与推送相关的方法,命名空间位于 push:
| 方法 | 返回 | 笔记 |
|---|---|---|
push.requestPermission() | Promise<{ granted: boolean, error?: string }> | 显示操作系统级别的推送权限对话框。 |
push.getPermissionState() | Promise<boolean | null> | 读取当前权限状态而不提示。 |
push.didReceiveAuthorization(granted, error?) | Promise<boolean> | 将外部获取的权限结果转发给SDK。 |
push.didReceiveNotification(userInfo) | Promise<boolean> | 仅限手动模式-从您自己的本机委托转发通知收据。 |
push.didReceiveResponse(actionIdentifier, userInfo) | Promise<boolean> | 仅限手动模式-从您自己的本机委托转发通知轻拍响应。 |
在 automatic push模式(默认),SDK拥有原生推送委托和 didReceiveNotification/didReceiveResponse 不需要货代。它们存在的目的是 manual 模式,其中应用拥有自己的本机委托。
关闭推断
集 "PushEnabled": false 在 ConnectConfig.json 对于仅用于分析的应用:没有Firebase,也没有 google-services.json Android上没有推送权限、App Group或通知扩展,iOS上没有通知权限对话框。 iOSAppGroupIdentifier, iOSPushMode 和 AndroidNotificationIconResName 那就没有效果了。
- Android在构建时读取设置(
build-extras.gradle), iOS期间cordova prepare在运行时。更改后运行cordova prepare和重建。 - 切换一个有推送的iOS项目:
cordova prepare以ConnectNSE和ConnectNCE目标从Xcode项目中取出它们的目标从Podfile中取出remote-notification背景模式关闭Info.plist(当另一个插件或config.xml声明它,因为插件需要它)。应用程序组和aps-environment当push打开时插件添加的权利被保留,因为其他插件可能会共享它们:删除平台并重新添加(cordova platform rm ios && cordova platform add ios)来做一个没有他们的项目。 - 随着推离,
push.requestPermission(),push.getPermissionState(),push.didReceiveAuthorization(),push.didReceiveNotification()和push.didReceiveResponse()拒绝与{ code: 'ACOUSTIC_PUSH_DISABLED' };enable()忽略了它pushMode论点。 react-native-acoustic-connect和capacitor-acoustic-connect有相同的开关,但push默认是关闭的;这里它是默认打开的,这样现有的应用程序就不会改变。
iOS推送设置(Xcode)
构建完成后,打开生成的 .xcworkspace 在Xcode中:
- 选择项目→ 签名和功能 →设置团队。
- 添加 推送通知 能力。
后台模式→远程通知权限由插件(plugin.xml 配置文件),不需要手动切换。
Android推送设置
放下一个真实的 google-services.json 到你的Cordova项目根目录(被忽略了)。插件的 after_prepare hook将其复制到每个生成的Android项目中 cordova prepare。
故障排除
常见的构建/推送问题和修复: TROUBLESHOOTING.md。
许可证
在无担保程序的声学许可下许可。看到 许可证 完整的学期。