├── .gitignore
├── CHANGELOG.md
├── LICENSE
├── README.md
├── core
├── sensorsdata.amd.min.js
├── sensorsdata.es6.min.js
└── sensorsdata.min.js
├── dist
├── v2
│ ├── sensorsdata.amd.js
│ ├── sensorsdata.es6.js
│ └── sensorsdata.js
└── web
│ ├── plugin
│ ├── abtesting-sdk-web
│ │ ├── README.md
│ │ ├── abtest.amd.min.js
│ │ ├── abtest.esm.min.js
│ │ ├── abtest.min.js
│ │ └── vabtest.min.js
│ ├── aes-encryption
│ │ ├── index.closure.js
│ │ ├── index.es6.js
│ │ ├── index.js
│ │ └── readme.md
│ ├── ajax-sender
│ │ ├── index.closure.js
│ │ ├── index.es6.js
│ │ ├── index.js
│ │ └── readme.md
│ ├── amp
│ │ ├── index.closure.js
│ │ ├── index.es6.js
│ │ ├── index.js
│ │ └── readme.md
│ ├── android-bridge
│ │ ├── index.closure.js
│ │ ├── index.es6.js
│ │ ├── index.js
│ │ └── readme.md
│ ├── android-obsolete-bridge
│ │ ├── index.closure.js
│ │ ├── index.es6.js
│ │ ├── index.js
│ │ └── readme.md
│ ├── batch-sender
│ │ ├── index.closure.js
│ │ ├── index.es6.js
│ │ ├── index.js
│ │ └── readme.md
│ ├── beacon-sender
│ │ ├── index.closure.js
│ │ ├── index.es6.js
│ │ ├── index.js
│ │ └── readme.md
│ ├── channel-utm
│ │ ├── index.closure.js
│ │ ├── index.es6.js
│ │ ├── index.js
│ │ └── readme.md
│ ├── channel
│ │ ├── index.closure.js
│ │ ├── index.es6.js
│ │ ├── index.js
│ │ └── readme.md
│ ├── console-logger
│ │ ├── index.closure.js
│ │ ├── index.es6.js
│ │ └── readme.md
│ ├── custom-events-sender
│ │ ├── index.closure.js
│ │ ├── index.es6.js
│ │ ├── index.js
│ │ └── readme.md
│ ├── debug-sender
│ │ ├── index.closure.js
│ │ ├── index.es6.js
│ │ ├── index.js
│ │ └── readme.md
│ ├── deeplink
│ │ ├── index.closure.js
│ │ ├── index.es6.js
│ │ ├── index.js
│ │ └── readme.md
│ ├── disable-sdk
│ │ ├── index.closure.js
│ │ ├── index.es6.js
│ │ ├── index.js
│ │ └── readme.md
│ ├── exposure
│ │ ├── index.closure.js
│ │ ├── index.es6.js
│ │ ├── index.js
│ │ └── readme.md
│ ├── ga-forward-sensorsdata
│ │ ├── index.closure.js
│ │ ├── index.es6.js
│ │ ├── index.js
│ │ └── readme.md
│ ├── general-encryption
│ │ ├── index.closure.js
│ │ ├── index.es6.js
│ │ ├── index.js
│ │ └── readme.md
│ ├── image-sender
│ │ ├── index.closure.js
│ │ ├── index.es6.js
│ │ ├── index.js
│ │ └── readme.md
│ ├── ios-bridge
│ │ ├── index.closure.js
│ │ ├── index.es6.js
│ │ ├── index.js
│ │ └── readme.md
│ ├── ios-obsolete-bridge
│ │ ├── index.closure.js
│ │ ├── index.es6.js
│ │ ├── index.js
│ │ └── readme.md
│ ├── jsapp-sender
│ │ ├── index.closure.js
│ │ ├── index.es6.js
│ │ ├── index.js
│ │ └── readme.md
│ ├── other-plugin-readme.md
│ ├── pageleave
│ │ ├── index.closure.js
│ │ ├── index.es6.js
│ │ ├── index.js
│ │ └── readme.md
│ ├── pageload
│ │ ├── index.closure.js
│ │ ├── index.es6.js
│ │ ├── index.js
│ │ └── readme.md
│ ├── readme.md
│ ├── register-properties
│ │ ├── index.closure.js
│ │ ├── index.es6.js
│ │ ├── index.js
│ │ └── readme.md
│ ├── register-property-page-height
│ │ ├── index.closure.js
│ │ ├── index.es6.js
│ │ ├── index.js
│ │ └── readme.md
│ ├── sat-props-patch
│ │ ├── index.closure.js
│ │ ├── index.es6.js
│ │ ├── index.js
│ │ └── readme.md
│ ├── session-event
│ │ ├── index.closure.js
│ │ ├── index.es6.js
│ │ ├── index.js
│ │ └── readme.md
│ ├── sf-instant-event
│ │ ├── index.closure.js
│ │ ├── index.es6.js
│ │ ├── index.js
│ │ └── readme.md
│ ├── sf-sdk-web
│ │ ├── README.md
│ │ ├── popup.amd.min.js
│ │ ├── popup.esm.min.js
│ │ ├── popup.min.js
│ │ ├── webPopup.amd.min.js
│ │ ├── webPopup.esm.min.js
│ │ └── webPopup.min.js
│ ├── site-linker-concat-utm
│ │ ├── index.closure.js
│ │ ├── index.es6.js
│ │ ├── index.js
│ │ └── readme.md
│ ├── site-linker
│ │ ├── index.closure.js
│ │ ├── index.es6.js
│ │ ├── index.js
│ │ └── readme.md
│ ├── sm-encryption
│ │ ├── index.closure.js
│ │ ├── index.es6.js
│ │ ├── index.js
│ │ └── readme.md
│ ├── user-encrypt-default
│ │ ├── index.closure.js
│ │ ├── index.es6.js
│ │ └── readme.md
│ ├── utm
│ │ ├── index.closure.js
│ │ ├── index.es6.js
│ │ ├── index.js
│ │ └── readme.md
│ └── wechat-webview-channel
│ │ ├── index.closure.js
│ │ ├── index.es6.js
│ │ ├── index.js
│ │ └── readme.md
│ ├── sensorsdata.amd.js
│ ├── sensorsdata.d.ts
│ ├── sensorsdata.es6.d.ts
│ ├── sensorsdata.es6.js
│ └── sensorsdata.js
├── heatmap.min.js
├── package.json
├── sensorsdata.amd.min.js
├── sensorsdata.es6.min.js
├── sensorsdata.min.d.ts
├── sensorsdata.min.js
├── vapph5define.min.js
├── version.js
└── vtrack.min.js
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | git.properties
3 |
4 | /product
5 |
6 | ### Intellij ###
7 | # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm
8 |
9 | *.iml
10 |
11 | ## Directory-based project format:
12 | .idea/
13 |
14 | ## File-based project format:
15 | *.ipr
16 | *.iws
17 |
18 | ## Plugin-specific files:
19 |
20 | # IntelliJ
21 | /out/
22 |
23 | # mpeltonen/sbt-idea plugin
24 | .idea_modules/
25 |
26 | # JIRA plugin
27 | atlassian-ide-plugin.xml
28 |
29 | # Python
30 | __pycache__
31 | *.pyc
32 |
33 | # Crashlytics plugin (for Android Studio and IntelliJ)
34 | com_crashlytics_export_strings.xml
35 | crashlytics.properties
36 | crashlytics-build.properties
37 |
38 | # java build files
39 | target
40 | ui/node_modules
41 | ui/build
42 |
43 | # debug scripts.
44 | deploy.sh
45 | ftpsync.settings
46 |
47 | *.swp
48 | .DS_Store
49 |
50 | # Xcode
51 | build/*
52 | *.pbxuser
53 | !default.pbxuser
54 | *.mode1v3
55 | !default.mode1v3
56 | *.mode2v3
57 | !default.mode2v3
58 | *.perspectivev3
59 | !default.perspectivev3
60 | *.xcworkspace
61 | !default.xcworkspace
62 | xcuserdata
63 | profile
64 | *.moved-aside
65 | *.cer
66 | *.p12
67 | *.mobileprovision
68 |
69 | # AppCode
70 | .idea
71 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | 软件名称:神策分析 SDK
2 | 版本号:所有版本
3 | 许可协议版本:1.0
4 |
5 | 1. 商业许可协议(用于商业用途需购买许可)
6 | 任何商业用途必须获得商业许可。
7 |
8 | 商业许可协议条款:
9 |
10 | - 商业用途:任何直接或间接产生收入的用途都需要购买商业许可。
11 | - 付款条款:在使用本软件用于商业用途之前,您必须支付全额许可费用。具体的付款方式将在双方联系后提供。
12 | - 商业支持:购买商业许可后,您将获得一年的技术支持和软件更新服务。
13 | - 禁止再许可:商业用户不得再许可、转售或转让本软件。每份商业许可仅适用于单一实体或公司。
14 | - 源代码访问:购买商业许可的用户将获得本软件的代码访问权限,并可根据业务需求进行内部修改。但不得公开发布或再分发修改后的版本。
15 | - 使用范围限制:商业许可仅限于购买者的内部使用,不得与第三方共享或用于为第三方提供服务。任何超出许可范围的使用行为均需额外授权,并可能产生额外费用。
16 | - 联系信息:如需购买商业许可,请联系 dv@sensorsdata.com。
17 | - 知识产权声明:本软件的版权归神策网络科技(北京)有限公司所有。购买商业许可仅授予您使用权,所有权仍归属本公司。
18 | - 终止条款: 如果您未支付相关费用或违反本协议的任何条款,商业许可将自动终止。您必须立即停止所有商业用途,并销毁或删除所有软件副本。
19 |
20 | 2. 附加授权规则条款
21 | 授权规则条款:
22 |
23 | - 功能限制:未经本软件作者的明确书面许可,您不得移除、绕过或规避本软件中的任何功能限制或试用限制。
24 | - 商标使用:未经授权,您不得在宣传、市场推广或销售产品时使用本软件的名称、商标或品牌标识。任何商标使用必须得到明确的书面许可。
25 | - 修改条款:本协议的条款可能会不时更新,用户有责任定期检查最新版本。任何重大更改将通过项目主页或电子邮件通知用户。
26 |
27 | 3. 联系方式
28 | 如需更多信息或申请商业许可,请联系 dv@sensorsdata.com。
29 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | [神策数据](https://www.sensorsdata.cn/)
2 |
3 |
4 | [](https://github.com/sensorsdata/sa-sdk-javascript/blob/master/LICENSE)
5 | [](https://github.com/sensorsdata/sa-sdk-javascript/releases)
6 |
7 | # sa-sdk-javascript
8 | ## 神策简介
9 |
10 | [**神策数据**](https://www.sensorsdata.cn/)
11 | (Sensors Data),隶属于神策网络科技(北京)有限公司,是一家专业的大数据分析服务公司,大数据分析行业开拓者,为客户提供深度用户行为分析平台、以及专业的咨询服务和行业解决方案,致力于帮助客户实现数据驱动。神策数据立足大数据及用户行为分析的技术与实践前沿,业务现已覆盖以互联网、金融、零售快消、高科技、制造等为代表的十多个主要行业、并可支持企业多个职能部门。公司总部在北京,并在上海、深圳、合肥、武汉等地拥有本地化的服务团队,覆盖东区及南区市场;公司拥有专业的服务团队,为客户提供一对一的客户服务。公司在大数据领域积累的核心关键技术,包括在海量数据采集、存储、清洗、分析挖掘、可视化、智能应用、安全与隐私保护等领域。 [**More**](https://www.sensorsdata.cn/about/aboutus.html)
12 |
13 | ## SDK 简介
14 |
15 | SensorsAnalytics SDK 是国内第一家开源商用版用户行为采集 SDK,目前支持代码埋点、全埋点、App 点击图、可视化全埋点等。目前已累计有 1500 多家付费客户,2500+ 的 App 集成使用,作为 App 数据采集利器,致力于帮助客户挖掘更多的商业价值,为其精准运营和业务支撑提供了可靠的数据来源。其采集全面而灵活、性能良好,并一直保持稳定的迭代,经受住了时间和客户的考验。
16 |
17 | ## 使用说明
18 |
19 | 使用方法请参考文档 https://manual.sensorsdata.cn/sa/latest/tech_sdk_client_web-7548149.html
20 | 如有疑问请联系邮箱 shengyonggen@sensorsdata.cn
21 | 注意 SDK 可能不完全向前兼容,请查看版本更新说明 [CHANGELOG.md](CHANGELOG.md) ,如果有说明不兼容的话,需要升级神策分析对应的版本
22 |
23 | ## 更新日志
24 |
25 | 请参见 [CHANGELOG.md](CHANGELOG.md)
26 |
27 | ## License
28 |
29 | [License 协议](LICENSE)
30 |
--------------------------------------------------------------------------------
/dist/web/plugin/abtesting-sdk-web/README.md:
--------------------------------------------------------------------------------
1 | # A/B 测试
2 | 神策 A/B 测试 WEB SDK 插件用于支持神策 A/B 测试产品功能。
3 | ## 功能
4 | 参考官网说明 [AB 测试 Web SDK 集成](https://manual.sensorsdata.cn/abtesting/latest/web-sdk-a-b-testing-105447652.html)
5 | ## 注意
6 | - 插件和 SDK 必须在同一个版本中,请勿混合不同版本的 SDK 和插件进行使用。
--------------------------------------------------------------------------------
/dist/web/plugin/aes-encryption/readme.md:
--------------------------------------------------------------------------------
1 | # 埋点数据 AES 加密
2 |
3 | ## 功能
4 | 为了加强埋点数据的安全性,神策分析支持对埋点数据进行加密,并以密文的形式对数据进行发送。
5 | AES 加密插件在数据上报前通过 AES 算法对数据进行加密。
6 |
7 | ## 集成
8 | ### ES Module 方式
9 | ```javascript
10 | import AesEncryption from '/dist/web/plugin/aes-encryption/index.es6.js';
11 | sensors.use(AesEncryption,{
12 | k:'加密密钥',
13 | kid: '密钥编号',
14 | khash: '密钥哈希值'
15 | });
16 | ```
17 |
18 | ### 参数说明:
19 | - `k`: AES 加密密钥,类型:string。
20 | - `kid`: 加密密钥 id,类型:number。
21 | - `khash`: 密钥哈希值,类型:string。
22 |
23 |
24 | 初始化参数信息需要从神策服务器后端获取。
25 | 登录神策服务器,执行以下命令:
26 |
27 | 1. 生成对称密钥命令
28 | `sh /sensorsdata/main/program/edge/edge/bin/generate_web_symmetric_key.sh -t AES`
29 | 2. 生成密钥后需要重启 Edge 模块才能生效
30 | `spadmin restart -p edge -m edge`
31 |
32 | ## 变动
33 | 加密后的数据在上报时,通过抓包或浏览器网络请求栏查看数据消息体中可以看到 payload 参数,payload 参数的值为加密后的密文。
34 |
35 | ## ⚠️ 注意
36 | - 批量发送方式不支持 AES 加密插件。
37 | - 本功能需要服务端的配合,可以联系神策客户成功/项目经理协助开通服务端解密功能。
38 | - 开启加密后,如果服务端不支持解密,数据无法入库,会丢失,埋点管理中不会有报错。
39 | - 版本要求
40 | - Edge v0.3.0 及以上版本
41 | - SDF 2.3 及以上版本
42 |
43 | - 插件和 SDK 必须在同一个版本中,请勿混合不同版本的 SDK 和插件进行使用。
--------------------------------------------------------------------------------
/dist/web/plugin/ajax-sender/index.closure.js:
--------------------------------------------------------------------------------
1 | !function(){"use strict";function n(n,e,t){if(e&&(n.plugin_name=e),t&&n.init){var a=n.init;n.init=function(o,i){function u(){a.call(n,o,i)}return r(o,n,e),o.readyState&&o.readyState.state>=3||!o.on?u():void o.on(t,u)}}return n}function r(n,r,e){function t(r,t){n.logger?n.logger.msg.apply(n.logger,t).module(e+""||"").level(r).log():n.log&&n.log.apply(n,t)}r.log=function(){t("log",arguments)},r.warn=function(){t("warn",arguments)},r.error=function(){t("error",arguments)}}function e(r,e,t){return n(r,e,t),r.plugin_version=c,r}function t(n){var r=new l.AjaxSend(n);r.start()}function a(n,r){var e=null,a=null;l.isObject(n.config)&&(e=n.config.send_type,a=l.optimizeServerUrl(n.config.server_url));var o="ajax"===e||!e&&"ajax"===u.para.send_type;if(o&&l.isSupportCors()){var i=a||n.server_url;n.server_url=i,n.data=u.kit.encodeTrackData(n.data),l.isArray(i)&&i.length?l.each(i,function(r){n.callback=null,n.server_url=r,t(n)}):"string"==typeof i&&""!==i?t(n):u.log("\u5f53\u524d server_url \u4e3a\u7a7a\u6216\u4e0d\u6b63\u786e\uff0c\u53ea\u5728\u63a7\u5236\u53f0\u6253\u5370\u65e5\u5fd7\uff0cnetwork \u4e2d\u4e0d\u4f1a\u53d1\u6570\u636e\uff0c\u8bf7\u914d\u7f6e\u6b63\u786e\u7684 server_url\uff01"),r.cancellationToken.stop()}return n}function o(){"ajax"!==u.para.send_type||l.isSupportCors()||(u.para.send_type=u.DEFAULT_SEND_TYPE)}function i(){u.on("sdkInitPara",function(){o()}),u.on("sdkAfterInitPara",function(){u.registerInterceptor("sendDataStage",{send:{priority:120,entry:a}})})}var u,l,c="1.27.4",s={plugin_name:"AjaxSender",init:function(n){u=n,l=u._,i()}},f=e(s);return f}();
--------------------------------------------------------------------------------
/dist/web/plugin/ajax-sender/index.es6.js:
--------------------------------------------------------------------------------
1 | var sd,_,sdkversion_placeholder="1.27.4";function wrapPluginInitFn(n,e,r){if(e&&(n.plugin_name=e),r&&n.init){var t=n.init;n.init=function(a,i){if(wrapLogFn(a,n,e),a.readyState&&a.readyState.state>=3||!a.on)return o();function o(){t.call(n,a,i)}a.on(r,o)}}return n}function wrapLogFn(n,e,r){function t(e,t){n.logger?n.logger.msg.apply(n.logger,t).module(r+""||"").level(e).log():n.log&&n.log.apply(n,t)}e.log=function(){t("log",arguments)},e.warn=function(){t("warn",arguments)},e.error=function(){t("error",arguments)}}function createPlugin(n,e,r){return wrapPluginInitFn(n,e,r),n.plugin_version=sdkversion_placeholder,n}function sendData(n){new _.AjaxSend(n).start()}function sendInterceptor(n,e){var r=null,t=null;if(_.isObject(n.config)&&(r=n.config.send_type,t=_.optimizeServerUrl(n.config.server_url)),("ajax"===r||!r&&"ajax"===sd.para.send_type)&&_.isSupportCors()){var a=t||n.server_url;n.server_url=a,n.data=sd.kit.encodeTrackData(n.data),_.isArray(a)&&a.length?_.each(a,function(e){n.callback=null,n.server_url=e,sendData(n)}):"string"==typeof a&&""!==a?sendData(n):sd.log("\u5f53\u524d server_url \u4e3a\u7a7a\u6216\u4e0d\u6b63\u786e\uff0c\u53ea\u5728\u63a7\u5236\u53f0\u6253\u5370\u65e5\u5fd7\uff0cnetwork \u4e2d\u4e0d\u4f1a\u53d1\u6570\u636e\uff0c\u8bf7\u914d\u7f6e\u6b63\u786e\u7684 server_url\uff01"),e.cancellationToken.stop()}return n}function initPara(){"ajax"!==sd.para.send_type||_.isSupportCors()||(sd.para.send_type=sd.DEFAULT_SEND_TYPE)}function senderInit(){sd.on("sdkInitPara",function(){initPara()}),sd.on("sdkAfterInitPara",function(){sd.registerInterceptor("sendDataStage",{send:{priority:120,entry:sendInterceptor}})})}var AjaxSender={plugin_name:"AjaxSender",init:function(n){_=(sd=n)._,senderInit()}},index=createPlugin(AjaxSender);export default index;
--------------------------------------------------------------------------------
/dist/web/plugin/ajax-sender/index.js:
--------------------------------------------------------------------------------
1 | (window.SensorsDataWebJSSDKPlugin=window.SensorsDataWebJSSDKPlugin||{}).AjaxSender=function(){"use strict";function n(n,e,t){if(e&&(n.plugin_name=e),t&&n.init){var a=n.init;n.init=function(o,i){function u(){a.call(n,o,i)}return r(o,n,e),o.readyState&&o.readyState.state>=3||!o.on?u():void o.on(t,u)}}return n}function r(n,r,e){function t(r,t){n.logger?n.logger.msg.apply(n.logger,t).module(e+""||"").level(r).log():n.log&&n.log.apply(n,t)}r.log=function(){t("log",arguments)},r.warn=function(){t("warn",arguments)},r.error=function(){t("error",arguments)}}function e(r,e,t){return n(r,e,t),r.plugin_version=s,r}function t(n){var r=new l.AjaxSend(n);r.start()}function a(n,r){var e=null,a=null;l.isObject(n.config)&&(e=n.config.send_type,a=l.optimizeServerUrl(n.config.server_url));var o="ajax"===e||!e&&"ajax"===u.para.send_type;if(o&&l.isSupportCors()){var i=a||n.server_url;n.server_url=i,n.data=u.kit.encodeTrackData(n.data),l.isArray(i)&&i.length?l.each(i,function(r){n.callback=null,n.server_url=r,t(n)}):"string"==typeof i&&""!==i?t(n):u.log("\u5f53\u524d server_url \u4e3a\u7a7a\u6216\u4e0d\u6b63\u786e\uff0c\u53ea\u5728\u63a7\u5236\u53f0\u6253\u5370\u65e5\u5fd7\uff0cnetwork \u4e2d\u4e0d\u4f1a\u53d1\u6570\u636e\uff0c\u8bf7\u914d\u7f6e\u6b63\u786e\u7684 server_url\uff01"),r.cancellationToken.stop()}return n}function o(){"ajax"!==u.para.send_type||l.isSupportCors()||(u.para.send_type=u.DEFAULT_SEND_TYPE)}function i(){u.on("sdkInitPara",function(){o()}),u.on("sdkAfterInitPara",function(){u.registerInterceptor("sendDataStage",{send:{priority:120,entry:a}})})}var u,l,s="1.27.4",c={plugin_name:"AjaxSender",init:function(n){u=n,l=u._,i()}},f=e(c);return f}();
--------------------------------------------------------------------------------
/dist/web/plugin/ajax-sender/readme.md:
--------------------------------------------------------------------------------
1 | # Ajax 发送数据
2 | >⚠️ 此插件已自动集成在 SDK 中,禁止手动使用!
3 |
4 | ## 功能
5 | 初始化 Web SDK 配置 `send_type` 为 `ajax` 时,页面行为数据通过 Ajax 的 POST 方式发送采集数据。
6 |
7 | ## ⚠️ 注意
8 | - 插件和 SDK 必须在同一个版本中,请勿混合不同版本的 SDK 和插件进行使用。
--------------------------------------------------------------------------------
/dist/web/plugin/amp/index.closure.js:
--------------------------------------------------------------------------------
1 | !function(){"use strict";function t(t,n,s){if(n&&(t.plugin_name=n),s&&t.init){var e=t.init;t.init=function(r,d){function o(){e.call(t,r,d)}return i(r,t,n),r.readyState&&r.readyState.state>=3||!r.on?o():void r.on(s,o)}}return t}function i(t,i,n){function s(i,s){t.logger?t.logger.msg.apply(t.logger,s).module(n+""||"").level(i).log():t.log&&t.log.apply(t,s)}i.log=function(){s("log",arguments)},i.warn=function(){s("warn",arguments)},i.error=function(){s("error",arguments)}}function n(i,n,e){return t(i,n,e),i.plugin_version=s,i}var s="1.27.4",e={sd:null,init:function(t){if(this.sd)return!1;if(this.sd=t,!this.sd||!this.sd._)return!1;var i=this.sd._.cookie.get("sensors_amp_id"),n=this.sd.store._state.distinct_id;if(i&&i.length>0){var s="amp-"===i.slice(0,4);if(i!==n){if(!s)return!1;this.sd.store._state.first_id?(this.sd.identify(i,!0),this.sd.saEvent.send({original_id:i,distinct_id:n,type:"track_signup",event:"$SignUp",properties:{}},null),this.setAmpId(n)):this.sd.identify(i,!0)}}else this.setAmpId(n);this.addListener()},addListener:function(){var t=this;this.sd.events.on("changeDistinctId",function(i){t.setAmpId(i)}),this.sd.events.isReady()},setAmpId:function(t){this.sd._.cookie.set("sensors_amp_id",t)}},r=n(e,"Amp","sdkReady");return r}();
--------------------------------------------------------------------------------
/dist/web/plugin/amp/index.es6.js:
--------------------------------------------------------------------------------
1 | var sdkversion_placeholder="1.27.4";function wrapPluginInitFn(i,t,n){if(t&&(i.plugin_name=t),n&&i.init){var e=i.init;i.init=function(s,r){if(wrapLogFn(s,i,t),s.readyState&&s.readyState.state>=3||!s.on)return d();function d(){e.call(i,s,r)}s.on(n,d)}}return i}function wrapLogFn(i,t,n){function e(t,e){i.logger?i.logger.msg.apply(i.logger,e).module(n+""||"").level(t).log():i.log&&i.log.apply(i,e)}t.log=function(){e("log",arguments)},t.warn=function(){e("warn",arguments)},t.error=function(){e("error",arguments)}}function createPlugin(i,t,n){return wrapPluginInitFn(i,t,n),i.plugin_version=sdkversion_placeholder,i}var amp={sd:null,init:function(i){if(this.sd)return!1;if(this.sd=i,!this.sd||!this.sd._)return!1;var t=this.sd._.cookie.get("sensors_amp_id"),n=this.sd.store._state.distinct_id;if(t&&t.length>0){var e="amp-"===t.slice(0,4);if(t!==n){if(!e)return!1;this.sd.store._state.first_id?(this.sd.identify(t,!0),this.sd.saEvent.send({original_id:t,distinct_id:n,type:"track_signup",event:"$SignUp",properties:{}},null),this.setAmpId(n)):this.sd.identify(t,!0)}}else this.setAmpId(n);this.addListener()},addListener:function(){var i=this;this.sd.events.on("changeDistinctId",function(t){i.setAmpId(t)}),this.sd.events.isReady()},setAmpId:function(i){this.sd._.cookie.set("sensors_amp_id",i)}},index=createPlugin(amp,"Amp","sdkReady");export default index;
--------------------------------------------------------------------------------
/dist/web/plugin/amp/index.js:
--------------------------------------------------------------------------------
1 | (window.SensorsDataWebJSSDKPlugin=window.SensorsDataWebJSSDKPlugin||{}).Amp=function(){"use strict";function t(t,n,s){if(n&&(t.plugin_name=n),s&&t.init){var e=t.init;t.init=function(r,o){function d(){e.call(t,r,o)}return i(r,t,n),r.readyState&&r.readyState.state>=3||!r.on?d():void r.on(s,d)}}return t}function i(t,i,n){function s(i,s){t.logger?t.logger.msg.apply(t.logger,s).module(n+""||"").level(i).log():t.log&&t.log.apply(t,s)}i.log=function(){s("log",arguments)},i.warn=function(){s("warn",arguments)},i.error=function(){s("error",arguments)}}function n(i,n,e){return t(i,n,e),i.plugin_version=s,i}var s="1.27.4",e={sd:null,init:function(t){if(this.sd)return!1;if(this.sd=t,!this.sd||!this.sd._)return!1;var i=this.sd._.cookie.get("sensors_amp_id"),n=this.sd.store._state.distinct_id;if(i&&i.length>0){var s="amp-"===i.slice(0,4);if(i!==n){if(!s)return!1;this.sd.store._state.first_id?(this.sd.identify(i,!0),this.sd.saEvent.send({original_id:i,distinct_id:n,type:"track_signup",event:"$SignUp",properties:{}},null),this.setAmpId(n)):this.sd.identify(i,!0)}}else this.setAmpId(n);this.addListener()},addListener:function(){var t=this;this.sd.events.on("changeDistinctId",function(i){t.setAmpId(i)}),this.sd.events.isReady()},setAmpId:function(t){this.sd._.cookie.set("sensors_amp_id",t)}},r=n(e,"Amp","sdkReady");return r}();
--------------------------------------------------------------------------------
/dist/web/plugin/amp/readme.md:
--------------------------------------------------------------------------------
1 | # google amp
2 |
3 | ## 功能
4 | AMP 提供了可分析用户行为数据的 `` 元素,通过该元素实现对神策埋点数据的采集。该插件实现同域名 AMP 页面和非 AMP 页面的用户统一。
5 | 参考官网链接 [AMP SDK 集成文档](https://manual.sensorsdata.cn/sa/latest/tech_sdk_client_web_amp-129827527.html)
6 |
7 | ## ⚠️ 注意
8 | - 插件和 SDK 必须在同一个版本中,请勿混合不同版本的 SDK 和插件进行使用。
--------------------------------------------------------------------------------
/dist/web/plugin/android-bridge/index.closure.js:
--------------------------------------------------------------------------------
1 | !function(){"use strict";function e(e){return y&&y.call(f,JSON.stringify(e))}function i(e){return v.call(f)&&b&&b.call(f,JSON.stringify(e))}function r(e,i){return i&&"function"==typeof i[e.callType]&&i[e.callType]()}function a(e,i,r){if(i&&(e.plugin_name=i),r&&e.init){var a=e.init;e.init=function(s,t){function o(){a.call(e,s,t)}return n(s,e,i),s.readyState&&s.readyState.state>=3||!s.on?o():void s.on(r,o)}}return e}function n(e,i,r){function a(i,a){e.logger?e.logger.msg.apply(e.logger,a).module(r+""||"").level(i).log():e.log&&e.log.apply(e,a)}i.log=function(){a("log",arguments)},i.warn=function(){a("warn",arguments)},i.error=function(){a("error",arguments)}}function s(e,i,r){return a(e,i,r),e.plugin_version=w,e}function t(){if(c=window.SensorsData_APP_New_H5_Bridge,_=c&&c.sensorsdata_track,l=_&&c.sensorsdata_get_server_url&&c.sensorsdata_get_server_url(),p("---test---fail---",!u,u.bridge.activeBridge,!l),u&&!u.bridge.activeBridge&&l)return u.bridge.activeBridge=j,u.para.app_js_bridge&&!u.para.app_js_bridge.is_mui&&(u.bridge.is_verify_success=l&&u.bridge.validateAppUrl(l),p("---test---bridge-verify-",u.bridge.is_verify_success)),u.bridge.bridge_info={touch_app_bridge:!0,platform:"android",verify_success:u.bridge.is_verify_success?"success":"fail",support_two_way_call:!!c.sensorsdata_js_call_app},u.para.app_js_bridge?void u.registerInterceptor("sendDataStage",{send:{priority:60,entry:o}}):void p("---test---app_js_bridge is not configured, data will not be sent by android bridge.")}function o(e,i){if(p("---test---datasend-",u.bridge.is_verify_success),u.para.app_js_bridge.is_mui||"item_set"===e.data.type||"item_delete"===e.data.type)return e;var r=e.callback;return u.bridge.is_verify_success?(p("---test---bridge-verify-success---",e.data),_&&_.call(c,JSON.stringify(g.extend({server_url:u.para.server_url},e.data))),g.isFunction(r)&&r(),i.cancellationToken.cancel(),e):(p("---test---bridge-verify-fail-----",u.bridge.is_verify_success),u.para.app_js_bridge.is_send?(u.debug.apph5({data:e.data,step:"4.2",output:"all"}),e):(g.isFunction(r)&&r(),i.cancellationToken.cancel(),e))}function d(e){var i=e.callType;return i in m.commands?m.commands[i](e,c):void(c&&g.isFunction(c.sensorsdata_js_call_app)&&c.sensorsdata_js_call_app(JSON.stringify(e)))}var c,_,l,u,g,p,f=window.SensorsData_App_Visual_Bridge,v=f&&f.sensorsdata_visualized_mode,y=f&&f.sensorsdata_visualized_alert_info,b=f&&f.sensorsdata_hover_web_nodes,m={isVerify:function(){return v&&(v===!0||v.call(f))},commands:{app_alert:e,visualized_track:i,page_info:i,sensorsdata_get_app_visual_config:r}},w="1.27.4",j={init:function(e){u=e,g=u&&u._,p=u&&u.log||console&&console.log||function(){},t()},handleCommand:d},S=s(j,"AndroidBridge","sdkAfterInitPara");return S}();
--------------------------------------------------------------------------------
/dist/web/plugin/android-bridge/index.es6.js:
--------------------------------------------------------------------------------
1 | var vbridge=window.SensorsData_App_Visual_Bridge,vmode=vbridge&&vbridge.sensorsdata_visualized_mode,valert=vbridge&&vbridge.sensorsdata_visualized_alert_info,vhover=vbridge&&vbridge.sensorsdata_hover_web_nodes;function alertApp(e){return valert&&valert.call(vbridge,JSON.stringify(e))}function hoverNode(e){return vmode.call(vbridge)&&vhover&&vhover.call(vbridge,JSON.stringify(e))}function callBridge(e,r){return r&&"function"==typeof r[e.callType]&&r[e.callType]()}var anBridge,anTrack,anServerUrl,sd,_,log,vbridge$1={isVerify:function(){return vmode&&(!0===vmode||vmode.call(vbridge))},commands:{app_alert:alertApp,visualized_track:hoverNode,page_info:hoverNode,sensorsdata_get_app_visual_config:callBridge}},sdkversion_placeholder="1.27.4";function wrapPluginInitFn(e,r,a){if(r&&(e.plugin_name=r),a&&e.init){var i=e.init;e.init=function(n,d){if(wrapLogFn(n,e,r),n.readyState&&n.readyState.state>=3||!n.on)return s();function s(){i.call(e,n,d)}n.on(a,s)}}return e}function wrapLogFn(e,r,a){function i(r,i){e.logger?e.logger.msg.apply(e.logger,i).module(a+""||"").level(r).log():e.log&&e.log.apply(e,i)}r.log=function(){i("log",arguments)},r.warn=function(){i("warn",arguments)},r.error=function(){i("error",arguments)}}function createPlugin(e,r,a){return wrapPluginInitFn(e,r,a),e.plugin_version=sdkversion_placeholder,e}var AndroidBridge={init:function(e){_=(sd=e)&&sd._,log=sd&&sd.log||console&&console.log||function(){},initBridge()},handleCommand:handleCommand};function initBridge(){anBridge=window.SensorsData_APP_New_H5_Bridge,anTrack=anBridge&&anBridge.sensorsdata_track,anServerUrl=anTrack&&anBridge.sensorsdata_get_server_url&&anBridge.sensorsdata_get_server_url(),log("---test---fail---",!sd,sd.bridge.activeBridge,!anServerUrl),sd&&!sd.bridge.activeBridge&&anServerUrl&&(sd.bridge.activeBridge=AndroidBridge,sd.para.app_js_bridge&&!sd.para.app_js_bridge.is_mui&&(sd.bridge.is_verify_success=anServerUrl&&sd.bridge.validateAppUrl(anServerUrl),log("---test---bridge-verify-",sd.bridge.is_verify_success)),sd.bridge.bridge_info={touch_app_bridge:!0,platform:"android",verify_success:sd.bridge.is_verify_success?"success":"fail",support_two_way_call:!!anBridge.sensorsdata_js_call_app},sd.para.app_js_bridge?sd.registerInterceptor("sendDataStage",{send:{priority:60,entry:sendData}}):log("---test---app_js_bridge is not configured, data will not be sent by android bridge."))}function sendData(e,r){if(log("---test---datasend-",sd.bridge.is_verify_success),sd.para.app_js_bridge.is_mui||"item_set"===e.data.type||"item_delete"===e.data.type)return e;var a=e.callback;return sd.bridge.is_verify_success?(log("---test---bridge-verify-success---",e.data),anTrack&&anTrack.call(anBridge,JSON.stringify(_.extend({server_url:sd.para.server_url},e.data))),_.isFunction(a)&&a(),r.cancellationToken.cancel(),e):(log("---test---bridge-verify-fail-----",sd.bridge.is_verify_success),sd.para.app_js_bridge.is_send?(sd.debug.apph5({data:e.data,step:"4.2",output:"all"}),e):(_.isFunction(a)&&a(),r.cancellationToken.cancel(),e))}function handleCommand(e){var r=e.callType;if(r in vbridge$1.commands)return vbridge$1.commands[r](e,anBridge);anBridge&&_.isFunction(anBridge.sensorsdata_js_call_app)&&anBridge.sensorsdata_js_call_app(JSON.stringify(e))}var index=createPlugin(AndroidBridge,"AndroidBridge","sdkAfterInitPara");export default index;
--------------------------------------------------------------------------------
/dist/web/plugin/android-bridge/index.js:
--------------------------------------------------------------------------------
1 | (window.SensorsDataWebJSSDKPlugin=window.SensorsDataWebJSSDKPlugin||{}).AndroidBridge=function(){"use strict";function e(e){return b&&b.call(f,JSON.stringify(e))}function i(e){return v.call(f)&&y&&y.call(f,JSON.stringify(e))}function r(e,i){return i&&"function"==typeof i[e.callType]&&i[e.callType]()}function a(e,i,r){if(i&&(e.plugin_name=i),r&&e.init){var a=e.init;e.init=function(s,t){function o(){a.call(e,s,t)}return n(s,e,i),s.readyState&&s.readyState.state>=3||!s.on?o():void s.on(r,o)}}return e}function n(e,i,r){function a(i,a){e.logger?e.logger.msg.apply(e.logger,a).module(r+""||"").level(i).log():e.log&&e.log.apply(e,a)}i.log=function(){a("log",arguments)},i.warn=function(){a("warn",arguments)},i.error=function(){a("error",arguments)}}function s(e,i,r){return a(e,i,r),e.plugin_version=w,e}function t(){if(c=window.SensorsData_APP_New_H5_Bridge,_=c&&c.sensorsdata_track,l=_&&c.sensorsdata_get_server_url&&c.sensorsdata_get_server_url(),p("---test---fail---",!u,u.bridge.activeBridge,!l),u&&!u.bridge.activeBridge&&l)return u.bridge.activeBridge=S,u.para.app_js_bridge&&!u.para.app_js_bridge.is_mui&&(u.bridge.is_verify_success=l&&u.bridge.validateAppUrl(l),p("---test---bridge-verify-",u.bridge.is_verify_success)),u.bridge.bridge_info={touch_app_bridge:!0,platform:"android",verify_success:u.bridge.is_verify_success?"success":"fail",support_two_way_call:!!c.sensorsdata_js_call_app},u.para.app_js_bridge?void u.registerInterceptor("sendDataStage",{send:{priority:60,entry:o}}):void p("---test---app_js_bridge is not configured, data will not be sent by android bridge.")}function o(e,i){if(p("---test---datasend-",u.bridge.is_verify_success),u.para.app_js_bridge.is_mui||"item_set"===e.data.type||"item_delete"===e.data.type)return e;var r=e.callback;return u.bridge.is_verify_success?(p("---test---bridge-verify-success---",e.data),_&&_.call(c,JSON.stringify(g.extend({server_url:u.para.server_url},e.data))),g.isFunction(r)&&r(),i.cancellationToken.cancel(),e):(p("---test---bridge-verify-fail-----",u.bridge.is_verify_success),u.para.app_js_bridge.is_send?(u.debug.apph5({data:e.data,step:"4.2",output:"all"}),e):(g.isFunction(r)&&r(),i.cancellationToken.cancel(),e))}function d(e){var i=e.callType;return i in m.commands?m.commands[i](e,c):void(c&&g.isFunction(c.sensorsdata_js_call_app)&&c.sensorsdata_js_call_app(JSON.stringify(e)))}var c,_,l,u,g,p,f=window.SensorsData_App_Visual_Bridge,v=f&&f.sensorsdata_visualized_mode,b=f&&f.sensorsdata_visualized_alert_info,y=f&&f.sensorsdata_hover_web_nodes,m={isVerify:function(){return v&&(v===!0||v.call(f))},commands:{app_alert:e,visualized_track:i,page_info:i,sensorsdata_get_app_visual_config:r}},w="1.27.4",S={init:function(e){u=e,g=u&&u._,p=u&&u.log||console&&console.log||function(){},t()},handleCommand:d},j=s(S,"AndroidBridge","sdkAfterInitPara");return j}();
--------------------------------------------------------------------------------
/dist/web/plugin/android-bridge/readme.md:
--------------------------------------------------------------------------------
1 | # Android 平台打通
2 | > web 已内置已使用
3 |
4 | ## 功能
5 | 安卓 APP 内嵌 H5 打通插件使得内嵌 H5 页面行为数据通过 APP 进行发送,使得 H5页面 和 APP 数据达到用户统一。
6 | 对于嵌入 App 中 H5 页面,如果 App 也集成了神策分析的 SDK ,H5 页面数据可以通过 App 进行上报,会自动添加 App 获取到的预置属性。
7 |
8 | 在使用打通插件后,同时还需要在 App 端进行打通配置,参考[安卓打通](https://manual.sensorsdata.cn/sa/latest/sdk-android-7541696.html#id-%E9%9B%86%E6%88%90%E6%96%87%E6%A1%A3%EF%BC%88Android%EF%BC%89-%E6%89%93%E9%80%9AApp%E4%B8%8EH5)。
9 | 更多关于打通功能说明请查看[官网文档](https://manual.sensorsdata.cn/sa/latest/app-h5-1573914.html)。
10 |
11 | ### 原理
12 | App SDK 暴露桥对象到浏览器控件 `window` 全局对象, JS SDK 通过该对象将上报数据发送给 App SDK。 App SDK 对数据进行处理及上报。
13 |
14 | ## 变动
15 | App 上报数据中会添加 App 端相关的数据例如运营商名称 `$carrier`。浏览器网络请求中不再有数据上报请求。
16 |
17 | ## ⚠️ 注意
18 | - 插件和 SDK 必须在同一个版本中,请勿混合不同版本的 SDK 和插件进行使用。
--------------------------------------------------------------------------------
/dist/web/plugin/android-obsolete-bridge/index.closure.js:
--------------------------------------------------------------------------------
1 | !function(){"use strict";function e(e){return y&&y.call(b,JSON.stringify(e))}function n(e){return v.call(b)&&m&&m.call(b,JSON.stringify(e))}function r(e,n){return n&&"function"==typeof n[e.callType]&&n[e.callType]()}function a(e,n,r){if(n&&(e.plugin_name=n),r&&e.init){var a=e.init;e.init=function(t,s){function o(){a.call(e,t,s)}return i(t,e,n),t.readyState&&t.readyState.state>=3||!t.on?o():void t.on(r,o)}}return e}function i(e,n,r){function a(n,a){e.logger?e.logger.msg.apply(e.logger,a).module(r+""||"").level(n).log():e.log&&e.log.apply(e,a)}n.log=function(){a("log",arguments)},n.warn=function(){a("warn",arguments)},n.error=function(){a("error",arguments)}}function t(e,n,r){return a(e,n,r),e.plugin_version=B,e}function s(){if(f("ObsoleteBridge---test---init---"),d=window.SensorsData_APP_JS_Bridge,c=d&&d.sensorsdata_track,u=d&&d.sensorsdata_verify,_=d&&d.sensorsdata_visual_verify,f("ObsoleteBridge-",g.bridge.activeBridge,u,c,_),g&&!g.bridge.activeBridge&&(u||c||_)){g.bridge.activeBridge=S;var e=u||c;if(_&&(e=!!_.call(d,JSON.stringify({server_url:g.para.server_url})),f("ObsoleteBridge---called-return",e)),g.bridge.bridge_info={touch_app_bridge:!0,platform:"android",verify_success:e?"success":"fail"},!g.para.app_js_bridge)return void f("app_js_bridge is not configured, data will not be sent by android obsolete bridge.");g.registerInterceptor("sendDataStage",{send:{priority:80,entry:o}}),f("Android obsolete bridge inits succeed.")}}function o(e,n){if(f("ObsoleteBridge---senddata"),g.para.app_js_bridge.is_mui||"item_set"===e.data.type||"item_delete"===e.data.type)return e;var r=e.callback;if(u){var a=u&&u.call(d,JSON.stringify(p.extend({server_url:g.para.server_url},e.data)));return f("ObsoleteBridge---anVerify-success",a),a?(p.isFunction(r)&&r(),n.cancellationToken.cancel(),e):g.para.app_js_bridge.is_send?(g.debug.apph5({data:e.data,step:"3.1",output:"all"}),e):(p.isFunction(r)&&r(),n.cancellationToken.cancel(),e)}return f("ObsoleteBridge---is-send-old-way",g.para.app_js_bridge.is_send),c&&c.call(d,JSON.stringify(p.extend({server_url:g.para.server_url},e.data))),p.isFunction(r)&&r(),n.cancellationToken.cancel(),e}function l(e){f("ObsoleteBridge---handleCommadn");var n=e.callType;return n in O.commands?(f("ObsoleteBridge---",n,O.commands),O.commands[n](e,d)):d&&p.isFunction(d.sensorsdata_js_call_app)?(f("ObsoleteBridge---handleCommadn-abridge"),d.sensorsdata_js_call_app(JSON.stringify(e))):void 0}var d,c,u,_,g,p,f,b=window.SensorsData_App_Visual_Bridge,v=b&&b.sensorsdata_visualized_mode,y=b&&b.sensorsdata_visualized_alert_info,m=b&&b.sensorsdata_hover_web_nodes,O={isVerify:function(){return v&&(v===!0||v.call(b))},commands:{app_alert:e,visualized_track:n,page_info:n,sensorsdata_get_app_visual_config:r}},B="1.27.4",S={init:function(e){g=e,p=g&&g._,f=g&&g.log||console&&console.log||function(){},s()},handleCommand:l},w=t(S,"AndroidObsoleteBridge","sdkAfterInitPara");return w}();
--------------------------------------------------------------------------------
/dist/web/plugin/android-obsolete-bridge/index.es6.js:
--------------------------------------------------------------------------------
1 | var vbridge=window.SensorsData_App_Visual_Bridge,vmode=vbridge&&vbridge.sensorsdata_visualized_mode,valert=vbridge&&vbridge.sensorsdata_visualized_alert_info,vhover=vbridge&&vbridge.sensorsdata_hover_web_nodes;function alertApp(e){return valert&&valert.call(vbridge,JSON.stringify(e))}function hoverNode(e){return vmode.call(vbridge)&&vhover&&vhover.call(vbridge,JSON.stringify(e))}function callBridge(e,r){return r&&"function"==typeof r[e.callType]&&r[e.callType]()}var anBridge,anTrack,anVerify,anVisualVerify,sd,_,log,vbridge$1={isVerify:function(){return vmode&&(!0===vmode||vmode.call(vbridge))},commands:{app_alert:alertApp,visualized_track:hoverNode,page_info:hoverNode,sensorsdata_get_app_visual_config:callBridge}},sdkversion_placeholder="1.27.4";function wrapPluginInitFn(e,r,a){if(r&&(e.plugin_name=r),a&&e.init){var i=e.init;e.init=function(n,d){if(wrapLogFn(n,e,r),n.readyState&&n.readyState.state>=3||!n.on)return o();function o(){i.call(e,n,d)}n.on(a,o)}}return e}function wrapLogFn(e,r,a){function i(r,i){e.logger?e.logger.msg.apply(e.logger,i).module(a+""||"").level(r).log():e.log&&e.log.apply(e,i)}r.log=function(){i("log",arguments)},r.warn=function(){i("warn",arguments)},r.error=function(){i("error",arguments)}}function createPlugin(e,r,a){return wrapPluginInitFn(e,r,a),e.plugin_version=sdkversion_placeholder,e}var AndroidObsoleteBridge={init:function(e){_=(sd=e)&&sd._,log=sd&&sd.log||console&&console.log||function(){},initBridge()},handleCommand:handleCommand};function initBridge(){if(log("ObsoleteBridge---test---init---"),anBridge=window.SensorsData_APP_JS_Bridge,anTrack=anBridge&&anBridge.sensorsdata_track,anVerify=anBridge&&anBridge.sensorsdata_verify,anVisualVerify=anBridge&&anBridge.sensorsdata_visual_verify,log("ObsoleteBridge-",sd.bridge.activeBridge,anVerify,anTrack,anVisualVerify),sd&&!sd.bridge.activeBridge&&(anVerify||anTrack||anVisualVerify)){sd.bridge.activeBridge=AndroidObsoleteBridge;var e=anVerify||anTrack;anVisualVerify&&(e=!!anVisualVerify.call(anBridge,JSON.stringify({server_url:sd.para.server_url})),log("ObsoleteBridge---called-return",e)),sd.bridge.bridge_info={touch_app_bridge:!0,platform:"android",verify_success:e?"success":"fail"},sd.para.app_js_bridge?(sd.registerInterceptor("sendDataStage",{send:{priority:80,entry:sendData}}),log("Android obsolete bridge inits succeed.")):log("app_js_bridge is not configured, data will not be sent by android obsolete bridge.")}}function sendData(e,r){if(log("ObsoleteBridge---senddata"),sd.para.app_js_bridge.is_mui||"item_set"===e.data.type||"item_delete"===e.data.type)return e;var a=e.callback;if(anVerify){var i=anVerify&&anVerify.call(anBridge,JSON.stringify(_.extend({server_url:sd.para.server_url},e.data)));return log("ObsoleteBridge---anVerify-success",i),i?(_.isFunction(a)&&a(),r.cancellationToken.cancel(),e):sd.para.app_js_bridge.is_send?(sd.debug.apph5({data:e.data,step:"3.1",output:"all"}),e):(_.isFunction(a)&&a(),r.cancellationToken.cancel(),e)}return log("ObsoleteBridge---is-send-old-way",sd.para.app_js_bridge.is_send),anTrack&&anTrack.call(anBridge,JSON.stringify(_.extend({server_url:sd.para.server_url},e.data))),_.isFunction(a)&&a(),r.cancellationToken.cancel(),e}function handleCommand(e){log("ObsoleteBridge---handleCommadn");var r=e.callType;return r in vbridge$1.commands?(log("ObsoleteBridge---",r,vbridge$1.commands),vbridge$1.commands[r](e,anBridge)):anBridge&&_.isFunction(anBridge.sensorsdata_js_call_app)?(log("ObsoleteBridge---handleCommadn-abridge"),anBridge.sensorsdata_js_call_app(JSON.stringify(e))):void 0}var index=createPlugin(AndroidObsoleteBridge,"AndroidObsoleteBridge","sdkAfterInitPara");export default index;
--------------------------------------------------------------------------------
/dist/web/plugin/android-obsolete-bridge/index.js:
--------------------------------------------------------------------------------
1 | (window.SensorsDataWebJSSDKPlugin=window.SensorsDataWebJSSDKPlugin||{}).AndroidObsoleteBridge=function(){"use strict";function e(e){return y&&y.call(b,JSON.stringify(e))}function n(e){return v.call(b)&&m&&m.call(b,JSON.stringify(e))}function r(e,n){return n&&"function"==typeof n[e.callType]&&n[e.callType]()}function i(e,n,r){if(n&&(e.plugin_name=n),r&&e.init){var i=e.init;e.init=function(t,s){function o(){i.call(e,t,s)}return a(t,e,n),t.readyState&&t.readyState.state>=3||!t.on?o():void t.on(r,o)}}return e}function a(e,n,r){function i(n,i){e.logger?e.logger.msg.apply(e.logger,i).module(r+""||"").level(n).log():e.log&&e.log.apply(e,i)}n.log=function(){i("log",arguments)},n.warn=function(){i("warn",arguments)},n.error=function(){i("error",arguments)}}function t(e,n,r){return i(e,n,r),e.plugin_version=O,e}function s(){if(f("ObsoleteBridge---test---init---"),d=window.SensorsData_APP_JS_Bridge,c=d&&d.sensorsdata_track,u=d&&d.sensorsdata_verify,g=d&&d.sensorsdata_visual_verify,f("ObsoleteBridge-",_.bridge.activeBridge,u,c,g),_&&!_.bridge.activeBridge&&(u||c||g)){_.bridge.activeBridge=B;var e=u||c;if(g&&(e=!!g.call(d,JSON.stringify({server_url:_.para.server_url})),f("ObsoleteBridge---called-return",e)),_.bridge.bridge_info={touch_app_bridge:!0,platform:"android",verify_success:e?"success":"fail"},!_.para.app_js_bridge)return void f("app_js_bridge is not configured, data will not be sent by android obsolete bridge.");_.registerInterceptor("sendDataStage",{send:{priority:80,entry:o}}),f("Android obsolete bridge inits succeed.")}}function o(e,n){if(f("ObsoleteBridge---senddata"),_.para.app_js_bridge.is_mui||"item_set"===e.data.type||"item_delete"===e.data.type)return e;var r=e.callback;if(u){var i=u&&u.call(d,JSON.stringify(p.extend({server_url:_.para.server_url},e.data)));return f("ObsoleteBridge---anVerify-success",i),i?(p.isFunction(r)&&r(),n.cancellationToken.cancel(),e):_.para.app_js_bridge.is_send?(_.debug.apph5({data:e.data,step:"3.1",output:"all"}),e):(p.isFunction(r)&&r(),n.cancellationToken.cancel(),e)}return f("ObsoleteBridge---is-send-old-way",_.para.app_js_bridge.is_send),c&&c.call(d,JSON.stringify(p.extend({server_url:_.para.server_url},e.data))),p.isFunction(r)&&r(),n.cancellationToken.cancel(),e}function l(e){f("ObsoleteBridge---handleCommadn");var n=e.callType;return n in S.commands?(f("ObsoleteBridge---",n,S.commands),S.commands[n](e,d)):d&&p.isFunction(d.sensorsdata_js_call_app)?(f("ObsoleteBridge---handleCommadn-abridge"),d.sensorsdata_js_call_app(JSON.stringify(e))):void 0}var d,c,u,g,_,p,f,b=window.SensorsData_App_Visual_Bridge,v=b&&b.sensorsdata_visualized_mode,y=b&&b.sensorsdata_visualized_alert_info,m=b&&b.sensorsdata_hover_web_nodes,S={isVerify:function(){return v&&(v===!0||v.call(b))},commands:{app_alert:e,visualized_track:n,page_info:n,sensorsdata_get_app_visual_config:r}},O="1.27.4",B={init:function(e){_=e,p=_&&_._,f=_&&_.log||console&&console.log||function(){},s()},handleCommand:l},w=t(B,"AndroidObsoleteBridge","sdkAfterInitPara");return w}();
--------------------------------------------------------------------------------
/dist/web/plugin/android-obsolete-bridge/readme.md:
--------------------------------------------------------------------------------
1 | # Android 平台旧版本打通
2 | >⚠️ 此插件已自动集成在 SDK 中,禁止手动使用!
3 |
4 | ## 功能
5 | 此插件为历史兼容版本的安卓打通插件。
6 | 安卓 APP 内嵌 H5 打通插件使得内嵌 H5 页面行为数据通过 APP 进行发送,使得 H5页面 和 APP 数据达到用户统一。
7 | 对于嵌入 App 中 H5 页面,如果 App 也集成了神策分析的 SDK ,H5 页面数据可以通过 App 进行上报,会自动添加 App 获取到的预置属性。
8 |
9 | 在使用打通插件后,同时还需要在 App 端进行打通配置,参考[安卓打通](https://manual.sensorsdata.cn/sa/latest/sdk-android-7541696.html#id-%E9%9B%86%E6%88%90%E6%96%87%E6%A1%A3%EF%BC%88Android%EF%BC%89-%E6%89%93%E9%80%9AApp%E4%B8%8EH5)。
10 | 更多关于打通功能说明请查看[官网文档](https://manual.sensorsdata.cn/sa/latest/app-h5-1573914.html)。
11 |
12 | ### 原理
13 | App SDK 暴露桥对象到浏览器控件 `window` 全局对象, JS SDK 通过该对象将上报数据发送给 App SDK。 App SDK 对数据进行处理及上报。
14 |
15 | ## 变动
16 | App 上报数据中会添加 App 端相关的数据例如运营商名称 `$carrier`。浏览器网络请求中不再有数据上报请求。
17 |
18 | ## ⚠️ 注意
19 | - 插件和 SDK 必须在同一个版本中,请勿混合不同版本的 SDK 和插件进行使用。
--------------------------------------------------------------------------------
/dist/web/plugin/batch-sender/index.closure.js:
--------------------------------------------------------------------------------
1 | !function(){"use strict";function n(n,a,e){if(a&&(n.plugin_name=a),e&&n.init){var r=n.init;n.init=function(o,i){function c(){r.call(n,o,i)}return t(o,n,a),o.readyState&&o.readyState.state>=3||!o.on?c():void o.on(e,c)}}return n}function t(n,t,a){function e(t,e){n.logger?n.logger.msg.apply(n.logger,e).module(a+""||"").level(t).log():n.log&&n.log.apply(n,e)}t.log=function(){e("log",arguments)},t.warn=function(){e("warn",arguments)},t.error=function(){e("error",arguments)}}function a(t,a,e){return n(t,a,e),t.plugin_version=l,t}function e(n,t){return!i.para.app_js_bridge&&i.para.batch_send&&c.localStorage.isSupport()&&localStorage.length=3||!r.on)return i();function i(){e.call(n,r,o)}r.on(t,i)}}return n}function wrapLogFn(n,a,t){function e(a,e){n.logger?n.logger.msg.apply(n.logger,e).module(t+""||"").level(a).log():n.log&&n.log.apply(n,e)}a.log=function(){e("log",arguments)},a.warn=function(){e("warn",arguments)},a.error=function(){e("error",arguments)}}function createPlugin(n,a,t){return wrapPluginInitFn(n,a,t),n.plugin_version=sdkversion_placeholder,n}var batchInstance=null;function sendData(n,a){return!sd.para.app_js_bridge&&sd.para.batch_send&&_.localStorage.isSupport()&&localStorage.length=3||!o.on?c():void o.on(e,c)}}return n}function t(n,t,a){function e(t,e){n.logger?n.logger.msg.apply(n.logger,e).module(a+""||"").level(t).log():n.log&&n.log.apply(n,e)}t.log=function(){e("log",arguments)},t.warn=function(){e("warn",arguments)},t.error=function(){e("error",arguments)}}function a(t,a,e){return n(t,a,e),t.plugin_version=l,t}function e(n,t){return!i.para.app_js_bridge&&i.para.batch_send&&c.localStorage.isSupport()&&localStorage.length⚠️ 此插件已自动集成在 SDK 中,禁止手动使用!
3 |
4 | ## 功能
5 | 初始化 Web SDK 配置 `batch_send` 为 `true` 时,页面行为数据先记录到 `localStorage` 中,并每隔 6s (可通过 `batch_send.send_interval` 修改轮询时间)轮询一次发送数据。使用该方式发送数据的浏览器必须支持 `localStorage` 方法,否则自动降级为使用 `send_type` 所设置的发送方式发送数据。[详细文档](https://manual.sensorsdata.cn/sa/latest/tech_sdk_client_web_high-109576411.html#id-%E9%AB%98%E7%BA%A7%E5%8A%9F%E8%83%BD%EF%BC%88Web%EF%BC%89-%E5%BC%80%E5%90%AF%E6%95%B0%E6%8D%AE%E7%9A%84%E6%89%B9%E9%87%8F%E5%8F%91%E9%80%81)
6 | ## ⚠️ 注意
7 | - 插件和 SDK 必须在同一个版本中,请勿混合不同版本的 SDK 和插件进行使用。
--------------------------------------------------------------------------------
/dist/web/plugin/beacon-sender/index.closure.js:
--------------------------------------------------------------------------------
1 | !function(){"use strict";function n(n,r,t){if(r&&(n.plugin_name=r),t&&n.init){var o=n.init;n.init=function(a,i){function c(){o.call(n,a,i)}return e(a,n,r),a.readyState&&a.readyState.state>=3||!a.on?c():void a.on(t,c)}}return n}function e(n,e,r){function t(e,t){n.logger?n.logger.msg.apply(n.logger,t).module(r+""||"").level(e).log():n.log&&n.log.apply(n,t)}e.log=function(){t("log",arguments)},e.warn=function(){t("warn",arguments)},e.error=function(){t("error",arguments)}}function r(e,r,t){return n(e,r,t),e.plugin_version=l,e}function t(n){var e=new u.BeaconSend(n);e.start()}function o(n,e){var r=null,o=null;u.isObject(n.config)&&(r=n.config.send_type,o=u.optimizeServerUrl(n.config.server_url));var a="beacon"===r||!r&&"beacon"===c.para.send_type;if(a&&u.isSupportBeaconSend()){var i=o||n.server_url;n.server_url=i,n.data=c.kit.encodeTrackData(n.data),u.isArray(i)&&i.length?u.each(i,function(e){n.callback=null,n.server_url=e,t(n)}):"string"==typeof i&&""!==i?t(n):c.log("\u5f53\u524d server_url \u4e3a\u7a7a\u6216\u4e0d\u6b63\u786e\uff0c\u53ea\u5728\u63a7\u5236\u53f0\u6253\u5370\u65e5\u5fd7\uff0cnetwork \u4e2d\u4e0d\u4f1a\u53d1\u6570\u636e\uff0c\u8bf7\u914d\u7f6e\u6b63\u786e\u7684 server_url\uff01"),e.cancellationToken.stop()}return n}function a(){"beacon"!==c.para.send_type||u.isSupportBeaconSend()||(c.para.send_type=c.DEFAULT_SEND_TYPE)}function i(){c.on("sdkInitPara",function(){a()}),c.on("sdkAfterInitPara",function(){c.registerInterceptor("sendDataStage",{send:{priority:110,entry:o}})})}var c,u,l="1.27.4",s={plugin_name:"BeaconSender",init:function(n){c=n,u=c._,i()}},f=r(s);return f}();
--------------------------------------------------------------------------------
/dist/web/plugin/beacon-sender/index.es6.js:
--------------------------------------------------------------------------------
1 | var sd,_,sdkversion_placeholder="1.27.4";function wrapPluginInitFn(n,e,r){if(e&&(n.plugin_name=e),r&&n.init){var t=n.init;n.init=function(a,o){if(wrapLogFn(a,n,e),a.readyState&&a.readyState.state>=3||!a.on)return i();function i(){t.call(n,a,o)}a.on(r,i)}}return n}function wrapLogFn(n,e,r){function t(e,t){n.logger?n.logger.msg.apply(n.logger,t).module(r+""||"").level(e).log():n.log&&n.log.apply(n,t)}e.log=function(){t("log",arguments)},e.warn=function(){t("warn",arguments)},e.error=function(){t("error",arguments)}}function createPlugin(n,e,r){return wrapPluginInitFn(n,e,r),n.plugin_version=sdkversion_placeholder,n}function sendData(n){new _.BeaconSend(n).start()}function sendInterceptor(n,e){var r=null,t=null;if(_.isObject(n.config)&&(r=n.config.send_type,t=_.optimizeServerUrl(n.config.server_url)),("beacon"===r||!r&&"beacon"===sd.para.send_type)&&_.isSupportBeaconSend()){var a=t||n.server_url;n.server_url=a,n.data=sd.kit.encodeTrackData(n.data),_.isArray(a)&&a.length?_.each(a,function(e){n.callback=null,n.server_url=e,sendData(n)}):"string"==typeof a&&""!==a?sendData(n):sd.log("\u5f53\u524d server_url \u4e3a\u7a7a\u6216\u4e0d\u6b63\u786e\uff0c\u53ea\u5728\u63a7\u5236\u53f0\u6253\u5370\u65e5\u5fd7\uff0cnetwork \u4e2d\u4e0d\u4f1a\u53d1\u6570\u636e\uff0c\u8bf7\u914d\u7f6e\u6b63\u786e\u7684 server_url\uff01"),e.cancellationToken.stop()}return n}function initPara(){"beacon"!==sd.para.send_type||_.isSupportBeaconSend()||(sd.para.send_type=sd.DEFAULT_SEND_TYPE)}function senderInit(){sd.on("sdkInitPara",function(){initPara()}),sd.on("sdkAfterInitPara",function(){sd.registerInterceptor("sendDataStage",{send:{priority:110,entry:sendInterceptor}})})}var BeaconSender={plugin_name:"BeaconSender",init:function(n){_=(sd=n)._,senderInit()}},index=createPlugin(BeaconSender);export default index;
--------------------------------------------------------------------------------
/dist/web/plugin/beacon-sender/index.js:
--------------------------------------------------------------------------------
1 | (window.SensorsDataWebJSSDKPlugin=window.SensorsDataWebJSSDKPlugin||{}).BeaconSender=function(){"use strict";function n(n,r,t){if(r&&(n.plugin_name=r),t&&n.init){var o=n.init;n.init=function(a,i){function u(){o.call(n,a,i)}return e(a,n,r),a.readyState&&a.readyState.state>=3||!a.on?u():void a.on(t,u)}}return n}function e(n,e,r){function t(e,t){n.logger?n.logger.msg.apply(n.logger,t).module(r+""||"").level(e).log():n.log&&n.log.apply(n,t)}e.log=function(){t("log",arguments)},e.warn=function(){t("warn",arguments)},e.error=function(){t("error",arguments)}}function r(e,r,t){return n(e,r,t),e.plugin_version=l,e}function t(n){var e=new c.BeaconSend(n);e.start()}function o(n,e){var r=null,o=null;c.isObject(n.config)&&(r=n.config.send_type,o=c.optimizeServerUrl(n.config.server_url));var a="beacon"===r||!r&&"beacon"===u.para.send_type;if(a&&c.isSupportBeaconSend()){var i=o||n.server_url;n.server_url=i,n.data=u.kit.encodeTrackData(n.data),c.isArray(i)&&i.length?c.each(i,function(e){n.callback=null,n.server_url=e,t(n)}):"string"==typeof i&&""!==i?t(n):u.log("\u5f53\u524d server_url \u4e3a\u7a7a\u6216\u4e0d\u6b63\u786e\uff0c\u53ea\u5728\u63a7\u5236\u53f0\u6253\u5370\u65e5\u5fd7\uff0cnetwork \u4e2d\u4e0d\u4f1a\u53d1\u6570\u636e\uff0c\u8bf7\u914d\u7f6e\u6b63\u786e\u7684 server_url\uff01"),e.cancellationToken.stop()}return n}function a(){"beacon"!==u.para.send_type||c.isSupportBeaconSend()||(u.para.send_type=u.DEFAULT_SEND_TYPE)}function i(){u.on("sdkInitPara",function(){a()}),u.on("sdkAfterInitPara",function(){u.registerInterceptor("sendDataStage",{send:{priority:110,entry:o}})})}var u,c,l="1.27.4",s={plugin_name:"BeaconSender",init:function(n){u=n,c=u._,i()}},f=r(s);return f}();
--------------------------------------------------------------------------------
/dist/web/plugin/beacon-sender/readme.md:
--------------------------------------------------------------------------------
1 | # beacon 发送数据
2 | >⚠️ 此插件已自动集成在 SDK 中,禁止手动使用!
3 |
4 | ## 功能
5 | 初始化 Web SDK 配置 `send_type` 为 `beacon` 时,页面行为数据通过 `navigator.sendBeacon` 方法发送采集数据。使用该方式发送数据的浏览器必须支持 `navigator.sendBeacon` 方法,否则自动降级为使用 `image` 发送数据。
6 |
7 | ## ⚠️ 注意
8 | - 插件和 SDK 必须在同一个版本中,请勿混合不同版本的 SDK 和插件进行使用。
--------------------------------------------------------------------------------
/dist/web/plugin/channel-utm/index.closure.js:
--------------------------------------------------------------------------------
1 | !function(){"use strict";function n(n,e,r){if(e&&(n.plugin_name=e),r&&n.init){var a=n.init;n.init=function(i,o){function u(){a.call(n,i,o)}return t(i,n,e),i.readyState&&i.readyState.state>=3||!i.on?u():void i.on(r,u)}}return n}function t(n,t,e){function r(t,r){n.logger?n.logger.msg.apply(n.logger,r).module(e+""||"").level(t).log():n.log&&n.log.apply(n,r)}t.log=function(){r("log",arguments)},t.warn=function(){r("warn",arguments)},t.error=function(){r("error",arguments)}}function e(t,e,r){return n(t,e,r),t.plugin_version=a,t}var r,a="1.27.4",i=["channel_utm_source","channel_utm_content","channel_utm_term","channel_utm_medium","channel_utm_campaign"],o={init:function(n){n&&!r&&(r=n,r._.each(i,function(n){r.source_channel_standard=r.source_channel_standard+" "+n,r.para.source_type.utm.push(n)}),r.registerInterceptor("businessStage",{getUtmData:{entry:function(n){var t=!1,e=n||{};return r._.each(i,function(n){var a=r._.getQueryParam(location.href,n);a.length&&(t=!0,e[n.slice(8)]=a)}),t&&r.register&&r.register({link_v:"1"}),e}}}))}},u=e(o,"ChannelUtm","sdkAfterInitPara");return u}();
--------------------------------------------------------------------------------
/dist/web/plugin/channel-utm/index.es6.js:
--------------------------------------------------------------------------------
1 | var sdkversion_placeholder="1.27.4";function wrapPluginInitFn(n,e,t){if(e&&(n.plugin_name=e),t&&n.init){var r=n.init;n.init=function(a,i){if(wrapLogFn(a,n,e),a.readyState&&a.readyState.state>=3||!a.on)return o();function o(){r.call(n,a,i)}a.on(t,o)}}return n}function wrapLogFn(n,e,t){function r(e,r){n.logger?n.logger.msg.apply(n.logger,r).module(t+""||"").level(e).log():n.log&&n.log.apply(n,r)}e.log=function(){r("log",arguments)},e.warn=function(){r("warn",arguments)},e.error=function(){r("error",arguments)}}function createPlugin(n,e,t){return wrapPluginInitFn(n,e,t),n.plugin_version=sdkversion_placeholder,n}var sd,utmKeys=["channel_utm_source","channel_utm_content","channel_utm_term","channel_utm_medium","channel_utm_campaign"],ChannelUtm={init:function(n){n&&!sd&&((sd=n)._.each(utmKeys,function(n){sd.source_channel_standard=sd.source_channel_standard+" "+n,sd.para.source_type.utm.push(n)}),sd.registerInterceptor("businessStage",{getUtmData:{entry:function(n){var e=!1,t=n||{};return sd._.each(utmKeys,function(n){var r=sd._.getQueryParam(location.href,n);r.length&&(e=!0,t[n.slice(8)]=r)}),e&&sd.register&&sd.register({link_v:"1"}),t}}}))}},index=createPlugin(ChannelUtm,"ChannelUtm","sdkAfterInitPara");export default index;
--------------------------------------------------------------------------------
/dist/web/plugin/channel-utm/index.js:
--------------------------------------------------------------------------------
1 | (window.SensorsDataWebJSSDKPlugin=window.SensorsDataWebJSSDKPlugin||{}).ChannelUtm=function(){"use strict";function n(n,t,r){if(t&&(n.plugin_name=t),r&&n.init){var a=n.init;n.init=function(i,o){function u(){a.call(n,i,o)}return e(i,n,t),i.readyState&&i.readyState.state>=3||!i.on?u():void i.on(r,u)}}return n}function e(n,e,t){function r(e,r){n.logger?n.logger.msg.apply(n.logger,r).module(t+""||"").level(e).log():n.log&&n.log.apply(n,r)}e.log=function(){r("log",arguments)},e.warn=function(){r("warn",arguments)},e.error=function(){r("error",arguments)}}function t(e,t,r){return n(e,t,r),e.plugin_version=a,e}var r,a="1.27.4",i=["channel_utm_source","channel_utm_content","channel_utm_term","channel_utm_medium","channel_utm_campaign"],o={init:function(n){n&&!r&&(r=n,r._.each(i,function(n){r.source_channel_standard=r.source_channel_standard+" "+n,r.para.source_type.utm.push(n)}),r.registerInterceptor("businessStage",{getUtmData:{entry:function(n){var e=!1,t=n||{};return r._.each(i,function(n){var a=r._.getQueryParam(location.href,n);a.length&&(e=!0,t[n.slice(8)]=a)}),e&&r.register&&r.register({link_v:"1"}),t}}}))}},u=t(o,"ChannelUtm","sdkAfterInitPara");return u}();
--------------------------------------------------------------------------------
/dist/web/plugin/channel-utm/readme.md:
--------------------------------------------------------------------------------
1 | # SAT - 渠道 utm 参数采集
2 | ## 功能
3 | 该插件用于采集广告渠道推广信息,集成后会自动解析当前页面地址中的
4 | `channel_utm_source`,
5 | `channel_utm_medium`,
6 | `channel_utm_campaign`,
7 | `channel_utm_content`,
8 | `channel_utm_term`,
9 | 查询参数,并添加到上报数据中。
10 | 上报数据中 `utm` 相关属性仍然以 `utm_` 前缀。
11 |
12 | ## 集成
13 | ### ES Module 方式
14 | ```javascript
15 | import channelUtm from '/dist/web/plugin/channel-utm/index.es6.js';
16 | sensors.use(channelUtm);
17 | ```
18 |
19 | ## 变动
20 | 该插件集成后,如果页面地址中既有 `channel_utm_source` 又有 `utm_source`,那么上报数据中的 `utm_source` 会被 `channel_utm_source` 覆盖,其他几个参数同理。
21 |
22 | ## ⚠️ 注意
23 | - 插件和 SDK 必须在同一个版本中,请勿混合不同版本的 SDK 和插件进行使用。
--------------------------------------------------------------------------------
/dist/web/plugin/channel/index.closure.js:
--------------------------------------------------------------------------------
1 | !function(){"use strict";function e(e,t,i){if(t&&(e.plugin_name=t),i&&e.init){var a=e.init;e.init=function(r,s){function l(){a.call(e,r,s)}return n(r,e,t),r.readyState&&r.readyState.state>=3||!r.on?l():void r.on(i,l)}}return e}function n(e,n,t){function i(n,i){e.logger?e.logger.msg.apply(e.logger,i).module(t+""||"").level(n).log():e.log&&e.log.apply(e,i)}n.log=function(){i("log",arguments)},n.warn=function(){i("warn",arguments)},n.error=function(){i("error",arguments)}}function t(n,t,i){return e(n,t,i),n.plugin_version=l,n}var i,a,r,s,l="1.27.4",o={event_list:[],latest_event_initial_time:null,max_save_time:2592e6,init:function(e,n){function t(){return i=a._,r=a.store,!!i.localStorage.isSupport()&&(l.eventList.init(),l.addLatestChannelUrl(),void l.addIsChannelCallbackEvent())}if(a||!e)return!1;n=n||{},s=n.cookie_name||"sensorsdata2015jssdkchannel",a=e;var l=this;t()},addIsChannelCallbackEvent:function(){a.registerPage({$is_channel_callback_event:function(e){if(i.isObject(e)&&e.event&&"$WebClick"!==e.event&&"$pageview"!==e.event&&"$WebStay"!==e.event&&"$SignUp"!==e.event)return!o.eventList.hasEvent(e.event)&&(o.eventList.add(e.event),!0)}})},addLatestChannelUrl:function(){var e=this.getUrlDomain(),n=this.cookie.getChannel();if("url\u89e3\u6790\u5931\u8d25"===e)this.registerAndSave({_sa_channel_landing_url:"",_sa_channel_landing_url_error:"url\u7684domain\u89e3\u6790\u5931\u8d25"});else if(i.isReferralTraffic(document.referrer)){var t=i.getQueryParam(location.href,"sat_cf");i.isString(t)&&t.length>0?(this.registerAndSave({_sa_channel_landing_url:location.href}),o.channelLinkHandler()):this.registerAndSave({_sa_channel_landing_url:""})}else n?a.registerPage(n):a.registerPage({_sa_channel_landing_url:"",_sa_channel_landing_url_error:"\u53d6\u503c\u5f02\u5e38"})},registerAndSave:function(e){a.registerPage(e),this.cookie.saveChannel(e)},cookie:{getChannel:function(){var e=a.kit.userDecryptIfNeeded(i.cookie.get(s));return e=i.safeJSONParse(e),!(!i.isObject(e)||!e.prop)&&e.prop},saveChannel:function(e){var n={prop:e},t=JSON.stringify(n);a.para.encrypt_cookie&&(t=a.kit.userEncrypt(t)),i.cookie.set(s,t)}},channelLinkHandler:function(){this.eventList.reset(),a.track("$ChannelLinkReaching")},getUrlDomain:function(){var e=i.info.pageProp.url_domain;return""===e&&(e="url\u89e3\u6790\u5931\u8d25"),e},eventList:{init:function(){var e=this.get(),n=(new Date).getTime();if(e&&i.isNumber(e.latest_event_initial_time)&&i.isArray(e.eventList)){var t=n-e.latest_event_initial_time;t>0&&t=3||!a.on)return l();function l(){i.call(e,a,r)}a.on(t,l)}}return e}function wrapLogFn(e,n,t){function i(n,i){e.logger?e.logger.msg.apply(e.logger,i).module(t+""||"").level(n).log():e.log&&e.log.apply(e,i)}n.log=function(){i("log",arguments)},n.warn=function(){i("warn",arguments)},n.error=function(){i("error",arguments)}}function createPlugin(e,n,t){return wrapPluginInitFn(e,n,t),e.plugin_version=sdkversion_placeholder,e}var Channel={event_list:[],latest_event_initial_time:null,max_save_time:2592e6,init:function(e,n){if(sd||!e)return!1;cookie_name=(n=n||{}).cookie_name||"sensorsdata2015jssdkchannel",sd=e;var t=this;!function(){if(_=sd._,store=sd.store,!_.localStorage.isSupport())return!1;t.eventList.init(),t.addLatestChannelUrl(),t.addIsChannelCallbackEvent()}()},addIsChannelCallbackEvent:function(){sd.registerPage({$is_channel_callback_event:function(e){if(_.isObject(e)&&e.event&&"$WebClick"!==e.event&&"$pageview"!==e.event&&"$WebStay"!==e.event&&"$SignUp"!==e.event)return!Channel.eventList.hasEvent(e.event)&&(Channel.eventList.add(e.event),!0)}})},addLatestChannelUrl:function(){var e=this.getUrlDomain(),n=this.cookie.getChannel();if("url\u89e3\u6790\u5931\u8d25"===e)this.registerAndSave({_sa_channel_landing_url:"",_sa_channel_landing_url_error:"url\u7684domain\u89e3\u6790\u5931\u8d25"});else if(_.isReferralTraffic(document.referrer)){var t=_.getQueryParam(location.href,"sat_cf");_.isString(t)&&t.length>0?(this.registerAndSave({_sa_channel_landing_url:location.href}),Channel.channelLinkHandler()):this.registerAndSave({_sa_channel_landing_url:""})}else n?sd.registerPage(n):sd.registerPage({_sa_channel_landing_url:"",_sa_channel_landing_url_error:"\u53d6\u503c\u5f02\u5e38"})},registerAndSave:function(e){sd.registerPage(e),this.cookie.saveChannel(e)},cookie:{getChannel:function(){var e=sd.kit.userDecryptIfNeeded(_.cookie.get(cookie_name));return e=_.safeJSONParse(e),!(!_.isObject(e)||!e.prop)&&e.prop},saveChannel:function(e){var n={prop:e},t=JSON.stringify(n);sd.para.encrypt_cookie&&(t=sd.kit.userEncrypt(t)),_.cookie.set(cookie_name,t)}},channelLinkHandler:function(){this.eventList.reset(),sd.track("$ChannelLinkReaching")},getUrlDomain:function(){var e=_.info.pageProp.url_domain;return""===e&&(e="url\u89e3\u6790\u5931\u8d25"),e},eventList:{init:function(){var e=this.get(),n=(new Date).getTime();if(e&&_.isNumber(e.latest_event_initial_time)&&_.isArray(e.eventList)){var t=n-e.latest_event_initial_time;t>0&&t=3||!r.on?l():void r.on(i,l)}}return e}function n(e,n,t){function i(n,i){e.logger?e.logger.msg.apply(e.logger,i).module(t+""||"").level(n).log():e.log&&e.log.apply(e,i)}n.log=function(){i("log",arguments)},n.warn=function(){i("warn",arguments)},n.error=function(){i("error",arguments)}}function t(n,t,i){return e(n,t,i),n.plugin_version=l,n}var i,a,r,s,l="1.27.4",o={event_list:[],latest_event_initial_time:null,max_save_time:2592e6,init:function(e,n){function t(){return i=a._,r=a.store,!!i.localStorage.isSupport()&&(l.eventList.init(),l.addLatestChannelUrl(),void l.addIsChannelCallbackEvent())}if(a||!e)return!1;n=n||{},s=n.cookie_name||"sensorsdata2015jssdkchannel",a=e;var l=this;t()},addIsChannelCallbackEvent:function(){a.registerPage({$is_channel_callback_event:function(e){if(i.isObject(e)&&e.event&&"$WebClick"!==e.event&&"$pageview"!==e.event&&"$WebStay"!==e.event&&"$SignUp"!==e.event)return!o.eventList.hasEvent(e.event)&&(o.eventList.add(e.event),!0)}})},addLatestChannelUrl:function(){var e=this.getUrlDomain(),n=this.cookie.getChannel();if("url\u89e3\u6790\u5931\u8d25"===e)this.registerAndSave({_sa_channel_landing_url:"",_sa_channel_landing_url_error:"url\u7684domain\u89e3\u6790\u5931\u8d25"});else if(i.isReferralTraffic(document.referrer)){var t=i.getQueryParam(location.href,"sat_cf");i.isString(t)&&t.length>0?(this.registerAndSave({_sa_channel_landing_url:location.href}),o.channelLinkHandler()):this.registerAndSave({_sa_channel_landing_url:""})}else n?a.registerPage(n):a.registerPage({_sa_channel_landing_url:"",_sa_channel_landing_url_error:"\u53d6\u503c\u5f02\u5e38"})},registerAndSave:function(e){a.registerPage(e),this.cookie.saveChannel(e)},cookie:{getChannel:function(){var e=a.kit.userDecryptIfNeeded(i.cookie.get(s));return e=i.safeJSONParse(e),!(!i.isObject(e)||!e.prop)&&e.prop},saveChannel:function(e){var n={prop:e},t=JSON.stringify(n);a.para.encrypt_cookie&&(t=a.kit.userEncrypt(t)),i.cookie.set(s,t)}},channelLinkHandler:function(){this.eventList.reset(),a.track("$ChannelLinkReaching")},getUrlDomain:function(){var e=i.info.pageProp.url_domain;return""===e&&(e="url\u89e3\u6790\u5931\u8d25"),e},eventList:{init:function(){var e=this.get(),n=(new Date).getTime();if(e&&i.isNumber(e.latest_event_initial_time)&&i.isArray(e.eventList)){var t=n-e.latest_event_initial_time;t>0&&t- 从站外进入渠道推广落地页、首次触发回传事件,记录事件并进行渠道匹配和回传。
13 | >- 非首次触发回传事件,记录事件但不会进行渠道匹配及回传,直到下一次重新从站外进入渠道推广落地页,重新进行首次计算。
14 |
15 | 示例数据:
16 |
17 | ```js
18 | {
19 | "distinct_id": "17838fda69c577-06233a8ff9a91a-7d7d326e-181760-17838fda69db9c",
20 | "lib": {
21 | "$lib": "js"
22 | "$lib_method": "code"
23 | "$lib_version": "1.16.6"
24 | },
25 | "properties": {
26 | "$timezone_offset": -480,
27 | "$screen_height": 568,
28 | "$screen_width": 320,
29 | "$lib": "js",
30 | "$lib_version": "1.16.6",
31 | "$latest_traffic_source_type":"直接流量",
32 | "$latest_search_keyword":"未取到值_直接打开",
33 | "$latest_referrer":"",
34 | "_sa_channel_landing _url": "http://www.ls.com:8080/sdkCode/intergrated-test/sakchannel/index.html?channel_id=27878&sat_cf=1234",
35 | "$is_channel_callback_event": true,
36 | "$is_first_day":true,
37 | "$url": "http://www.ls.com:8080/sdkCode/intergrated-test/sdkchannel/index.html?channel_id=27878&sat_cf=1234",
38 | "$title": "test channel"
39 | },
40 | "anonymous_id": "17838fda69c577-06233a8f9a91a-7d7d326-181760-17838fda69db9c",
41 | "type": "track",
42 | "event": "ViewProduct",
43 | "_track_id":"435539772"
44 | }
45 | ```
46 |
47 | ## 集成
48 | ### ES Module 方式
49 | ```javascript
50 | import SensorsChannel from '/dist/web/plugin/channel/index.min.js';
51 | sensors.use(SensorsChannel);
52 | ```
53 |
54 | ## 变动
55 | 新增事件:`$ChannelLinkReaching`,该事件表示渠道链接落地。
56 |
57 |
58 | - 新增属性:`_sa_channel_landing_url`,落地页地址。
59 | - 新增属性:`_sa_channel_landing_url_error`,落地页取值异常信息。
60 |
61 | ## ⚠️ 注意
62 |
63 | - 上述规则适用于同名事件,不同事件之间不相互影响。
64 | - 插件和 SDK 必须在同一个版本中,请勿混合不同版本的 SDK 和插件进行使用。
--------------------------------------------------------------------------------
/dist/web/plugin/console-logger/index.closure.js:
--------------------------------------------------------------------------------
1 | !function(){"use strict";function o(o,e,t){if(e&&(o.plugin_name=e),t&&o.init){var r=o.init;o.init=function(l,i){function s(){r.call(o,l,i)}return n(l,o,e),l.readyState&&l.readyState.state>=3||!l.on?s():void l.on(t,s)}}return o}function n(o,n,e){function t(n,t){o.logger?o.logger.msg.apply(o.logger,t).module(e+""||"").level(n).log():o.log&&o.log.apply(o,t)}n.log=function(){t("log",arguments)},n.warn=function(){t("warn",arguments)},n.error=function(){t("error",arguments)}}function e(n,e,t){return o(n,e,t),n.plugin_version=v,n}function t(o){return null===h?void r(o):void h.push(o)}function r(o){try{if("log"===o.level&&l())return void a(o);if("warn"===o.level&&i())return void a(o);if("error"===o.level&&s())return void a(o)}catch(n){}}function l(){return!!f()||(p.para.show_log===!0||d.isObject(p.para.show_log)&&"log"===p.para.show_log.level)}function i(){return!!f()||(l()||d.isObject(p.para.show_log)&&"warn"===p.para.show_log.level)}function s(){return!!f()||(!d.isObject(p.para.show_log)||"none"!==p.para.show_log.level)}function a(o){var n=o.content,e=d.isObject(n[0])?d.formatJsonString(n[0]):n[0],t=u(o);n[0]=t+(t.length>0?": ":"")+e;try{console&&(d.isFunction(console[o.level])?console[o.level].apply(console,n):d.isObject(console[o.level])&&console[o.level](n[0]))}catch(r){}}function u(o){var n="",e="",t=p.para.show_log;return d.isObject(t)&&t.show_brand===!1||(n+=o.brand),d.isObject(t)&&t.show_level===!1||(n+=(n.length>0?"-":"")+o.level),n.length>0&&(n="["+n+"]"),d.isObject(t)&&t.show_module===!1||(e=o.module),n+e}function c(){d.sessionStorage.isSupport()&&sessionStorage.setItem(b,"true")}function g(){d.sessionStorage.isSupport()&&sessionStorage.removeItem(b)}function f(){return d.sessionStorage.isSupport()&&"true"===sessionStorage.getItem(b)}var v="1.27.4",p=null,d=null,h=[],_={init:function(o){o&&(p=o,d=p._,p.logger&&p.logger.appendWriter(t),p.on&&p.on("sdkAfterInitPara",function(){for(var o=0;o=3||!l.on)return t();function t(){r.call(o,l,a)}l.on(n,t)}}return o}function wrapLogFn(o,e,n){function r(e,r){o.logger?o.logger.msg.apply(o.logger,r).module(n+""||"").level(e).log():o.log&&o.log.apply(o,r)}e.log=function(){r("log",arguments)},e.warn=function(){r("warn",arguments)},e.error=function(){r("error",arguments)}}function createPlugin(o,e,n){return wrapPluginInitFn(o,e,n),o.plugin_version=sdkversion_placeholder,o}var _sd=null,_=null,_cacheLogs=[],ConsoleLogger={init:function(o){o&&(_=(_sd=o)._,_sd.logger&&_sd.logger.appendWriter(logWriter),_sd.on&&_sd.on("sdkAfterInitPara",function(){for(var o=0;o<_cacheLogs.length;o++)printLog(_cacheLogs[o]);_cacheLogs=null}),_sd.on&&_sd.on("sdkInitAPI",function(){_sd.enableLocalLog=enableLocalLog,_sd.disableLocalLog=disableLocalLog}))}},index=createPlugin(ConsoleLogger,"ConsoleLogger");function logWriter(o){null!==_cacheLogs?_cacheLogs.push(o):printLog(o)}function printLog(o){try{if("log"===o.level&&canLog())return void writeLog(o);if("warn"===o.level&&canWarn())return void writeLog(o);if("error"===o.level&&canError())return void writeLog(o)}catch(e){}}function canLog(){return!!isLocalLogEnabled()||(!0===_sd.para.show_log||_.isObject(_sd.para.show_log)&&"log"===_sd.para.show_log.level)}function canWarn(){return!!isLocalLogEnabled()||(canLog()||_.isObject(_sd.para.show_log)&&"warn"===_sd.para.show_log.level)}function canError(){return!!isLocalLogEnabled()||(!_.isObject(_sd.para.show_log)||"none"!==_sd.para.show_log.level)}function writeLog(o){var e=o.content,n=_.isObject(e[0])?_.formatJsonString(e[0]):e[0],r=getLogHead(o);e[0]=r+(r.length>0?": ":"")+n;try{console&&(_.isFunction(console[o.level])?console[o.level].apply(console,e):_.isObject(console[o.level])&&console[o.level](e[0]))}catch(l){}}function getLogHead(o){var e="",n="",r=_sd.para.show_log;return _.isObject(r)&&!1===r.show_brand||(e+=o.brand),_.isObject(r)&&!1===r.show_level||(e+=(e.length>0?"-":"")+o.level),e.length>0&&(e="["+e+"]"),_.isObject(r)&&!1===r.show_module||(n=o.module),e+n}var debugTag="sensorsdata_jssdk_debug";function enableLocalLog(){_.sessionStorage.isSupport()&&sessionStorage.setItem(debugTag,"true")}function disableLocalLog(){_.sessionStorage.isSupport()&&sessionStorage.removeItem(debugTag)}function isLocalLogEnabled(){return _.sessionStorage.isSupport()&&"true"===sessionStorage.getItem(debugTag)}export default index;
--------------------------------------------------------------------------------
/dist/web/plugin/console-logger/readme.md:
--------------------------------------------------------------------------------
1 | # 控制台日志输出
2 | ## 功能
3 | 提供控制台日志输出能力,在控制台打印 SDK 及 SDK 插件中的日志。该插件在 SDK 中已默认集成并使用,请勿手动使用!
4 | ## 集成
5 | ### ES Module 方式
6 | ```javascript
7 | import consoleLogger from '/dist/web/plugin/console-logger/index.es6.js';
8 | sensors.use(consoleLogger);
9 | ```
10 | ## ⚠️ 注意
11 | - 插件和 SDK 必须在同一个版本中,请勿混合不同版本的 SDK 和插件进行使用。
--------------------------------------------------------------------------------
/dist/web/plugin/custom-events-sender/index.closure.js:
--------------------------------------------------------------------------------
1 | !function(){"use strict";function n(n,e,a){if(e&&(n.plugin_name=e),a&&n.init){var r=n.init;n.init=function(i,o){function u(){r.call(n,i,o)}return t(i,n,e),i.readyState&&i.readyState.state>=3||!i.on?u():void i.on(a,u)}}return n}function t(n,t,e){function a(t,a){n.logger?n.logger.msg.apply(n.logger,a).module(e+""||"").level(t).log():n.log&&n.log.apply(n,a)}t.log=function(){a("log",arguments)},t.warn=function(){a("warn",arguments)},t.error=function(){a("error",arguments)}}function e(t,e,a){return n(t,e,a),t.plugin_version=l,t}function a(n){var t=[];return u.each(n,function(n){u.isArray(n)?t=t.concat(a(n)):t.push(u.optimizeServerUrl(n))}),t}function r(n,t){t=u.isArray(t)?t:[t];var e=!1;return u.isArray(n)?u.each(n,function(n){u.indexOf(t,n)>-1&&(e=!0)}):u.indexOf(t,n)>-1&&(e=!0),e}function i(n,t){var e=o.kit.encodeTrackData(t);return n.indexOf("?")!==-1?n+"&"+e:n+"?"+e}var o,u,c,l="1.27.4",s={hookFn:null,init:function(n){this.hookFn=n,o.registerInterceptor("sendDataStage",{send:{priority:20,entry:function(n,t){return s.sendData(n,t),n}}})},sendData:function(n,t){var e=n.origin_data,i=e.event,o=n.server_url,c=n.callback,l=this,s=this.hookFn({event_name:i,data:u.extend2Lev({identities:{},lib:{},properties:{}},e),server_url:o});return u.isArray(s)&&s.length?(s=a(s),r(o,s)?c=null:t.cancellationToken.stop(),u.each(s,function(t){if(t&&""!==t&&!r(t,o)){var a=function(t){return function(){l.sendCall({server_url:t,origin_data:e,data:n.data,config:null,callback:c}),c=null,n.callback=null}}(t);setTimeout(a)}}),n):(u.isFunction(c)&&c(),t.cancellationToken.stop(),n)},getInstance:function(n){return"beacon"===o.para.send_type&&u.isSupportBeaconSend()?(n.data=o.kit.encodeTrackData(n.data),new u.BeaconSend(n)):"ajax"===o.para.send_type&&u.isSupportCors()?(n.data=o.kit.encodeTrackData(n.data),new u.AjaxSend(n)):(n.origin_data._flush_time=(new Date).getTime(),n.data=i(n.server_url,n.origin_data),new u.ImageSend(n))},sendCall:function(n){var t=this.getInstance(n);t.start()}},d={plugin_name:"CustomEventsSender",init:function(n,t){if(o=n,u=o._,c=o&&o.log||console&&console.log||function(){},u.isFunction(t)){if(o.readyState&&o.readyState.state>=3||!o.on)return s.init(t);o.on("sdkAfterInitPara",function(){s.init(t)})}else c("CustomEventsSender init failed\uff0chookFn error. hookFn:",t)}},f=e(d);return f}();
--------------------------------------------------------------------------------
/dist/web/plugin/custom-events-sender/index.es6.js:
--------------------------------------------------------------------------------
1 | var sd,_,log,sdkversion_placeholder="1.27.4";function wrapPluginInitFn(n,e,t){if(e&&(n.plugin_name=e),t&&n.init){var r=n.init;n.init=function(a,i){if(wrapLogFn(a,n,e),a.readyState&&a.readyState.state>=3||!a.on)return o();function o(){r.call(n,a,i)}a.on(t,o)}}return n}function wrapLogFn(n,e,t){function r(e,r){n.logger?n.logger.msg.apply(n.logger,r).module(t+""||"").level(e).log():n.log&&n.log.apply(n,r)}e.log=function(){r("log",arguments)},e.warn=function(){r("warn",arguments)},e.error=function(){r("error",arguments)}}function createPlugin(n,e,t){return wrapPluginInitFn(n,e,t),n.plugin_version=sdkversion_placeholder,n}function flattenArray(n){var e=[];return _.each(n,function(n){_.isArray(n)?e=e.concat(flattenArray(n)):e.push(_.optimizeServerUrl(n))}),e}function hasEqualServerUrl(n,e){e=_.isArray(e)?e:[e];var t=!1;return _.isArray(n)?_.each(n,function(n){_.indexOf(e,n)>-1&&(t=!0)}):_.indexOf(e,n)>-1&&(t=!0),t}function getSendUrl(n,e){var t=sd.kit.encodeTrackData(e);return-1!==n.indexOf("?")?n+"&"+t:n+"?"+t}var sender={hookFn:null,init:function(n){this.hookFn=n,sd.registerInterceptor("sendDataStage",{send:{priority:20,entry:function(n,e){return sender.sendData(n,e),n}}})},sendData:function(n,e){var t=n.origin_data,r=t.event,a=n.server_url,i=n.callback,o=this,l=this.hookFn({event_name:r,data:_.extend2Lev({identities:{},lib:{},properties:{}},t),server_url:a});return _.isArray(l)&&l.length?(l=flattenArray(l),hasEqualServerUrl(a,l)?i=null:e.cancellationToken.stop(),_.each(l,function(e){if(e&&""!==e&&!hasEqualServerUrl(e,a)){var r=(l=e,function(){o.sendCall({server_url:l,origin_data:t,data:n.data,config:null,callback:i}),i=null,n.callback=null});setTimeout(r)}var l}),n):(_.isFunction(i)&&i(),e.cancellationToken.stop(),n)},getInstance:function(n){return"beacon"===sd.para.send_type&&_.isSupportBeaconSend()?(n.data=sd.kit.encodeTrackData(n.data),new _.BeaconSend(n)):"ajax"===sd.para.send_type&&_.isSupportCors()?(n.data=sd.kit.encodeTrackData(n.data),new _.AjaxSend(n)):(n.origin_data._flush_time=(new Date).getTime(),n.data=getSendUrl(n.server_url,n.origin_data),new _.ImageSend(n))},sendCall:function(n){this.getInstance(n).start()}},CustomEventsSender={plugin_name:"CustomEventsSender",init:function(n,e){if(_=(sd=n)._,log=sd&&sd.log||console&&console.log||function(){},_.isFunction(e)){if(sd.readyState&&sd.readyState.state>=3||!sd.on)return sender.init(e);sd.on("sdkAfterInitPara",function(){sender.init(e)})}else log("CustomEventsSender init failed\uff0chookFn error. hookFn:",e)}},index=createPlugin(CustomEventsSender);export default index;
--------------------------------------------------------------------------------
/dist/web/plugin/custom-events-sender/index.js:
--------------------------------------------------------------------------------
1 | (window.SensorsDataWebJSSDKPlugin=window.SensorsDataWebJSSDKPlugin||{}).CustomEventsSender=function(){"use strict";function n(n,t,a){if(t&&(n.plugin_name=t),a&&n.init){var r=n.init;n.init=function(i,o){function u(){r.call(n,i,o)}return e(i,n,t),i.readyState&&i.readyState.state>=3||!i.on?u():void i.on(a,u)}}return n}function e(n,e,t){function a(e,a){n.logger?n.logger.msg.apply(n.logger,a).module(t+""||"").level(e).log():n.log&&n.log.apply(n,a)}e.log=function(){a("log",arguments)},e.warn=function(){a("warn",arguments)},e.error=function(){a("error",arguments)}}function t(e,t,a){return n(e,t,a),e.plugin_version=l,e}function a(n){var e=[];return u.each(n,function(n){u.isArray(n)?e=e.concat(a(n)):e.push(u.optimizeServerUrl(n))}),e}function r(n,e){e=u.isArray(e)?e:[e];var t=!1;return u.isArray(n)?u.each(n,function(n){u.indexOf(e,n)>-1&&(t=!0)}):u.indexOf(e,n)>-1&&(t=!0),t}function i(n,e){var t=o.kit.encodeTrackData(e);return n.indexOf("?")!==-1?n+"&"+t:n+"?"+t}var o,u,c,l="1.27.4",s={hookFn:null,init:function(n){this.hookFn=n,o.registerInterceptor("sendDataStage",{send:{priority:20,entry:function(n,e){return s.sendData(n,e),n}}})},sendData:function(n,e){var t=n.origin_data,i=t.event,o=n.server_url,c=n.callback,l=this,s=this.hookFn({event_name:i,data:u.extend2Lev({identities:{},lib:{},properties:{}},t),server_url:o});return u.isArray(s)&&s.length?(s=a(s),r(o,s)?c=null:e.cancellationToken.stop(),u.each(s,function(e){if(e&&""!==e&&!r(e,o)){var a=function(e){return function(){l.sendCall({server_url:e,origin_data:t,data:n.data,config:null,callback:c}),c=null,n.callback=null}}(e);setTimeout(a)}}),n):(u.isFunction(c)&&c(),e.cancellationToken.stop(),n)},getInstance:function(n){return"beacon"===o.para.send_type&&u.isSupportBeaconSend()?(n.data=o.kit.encodeTrackData(n.data),new u.BeaconSend(n)):"ajax"===o.para.send_type&&u.isSupportCors()?(n.data=o.kit.encodeTrackData(n.data),new u.AjaxSend(n)):(n.origin_data._flush_time=(new Date).getTime(),n.data=i(n.server_url,n.origin_data),new u.ImageSend(n))},sendCall:function(n){var e=this.getInstance(n);e.start()}},d={plugin_name:"CustomEventsSender",init:function(n,e){if(o=n,u=o._,c=o&&o.log||console&&console.log||function(){},u.isFunction(e)){if(o.readyState&&o.readyState.state>=3||!o.on)return s.init(e);o.on("sdkAfterInitPara",function(){s.init(e)})}else c("CustomEventsSender init failed\uff0chookFn error. hookFn:",e)}},f=t(d);return f}();
--------------------------------------------------------------------------------
/dist/web/plugin/custom-events-sender/readme.md:
--------------------------------------------------------------------------------
1 | # 自定义数据接收端
2 |
3 | ## 功能
4 | 根据每一条采集数据中的某个属性自定义决定,数据接收端。并可设置同一条数据发送到多个数据接收端。
5 |
6 | ## 集成
7 | ### ES Module 方式
8 | ```javascript
9 | import customEventsSender from '/dist/web/plugin/custom-events-sender/index.es6';
10 | sensors.use(customEventsSender, function(option){
11 | var event_name = option.event_name; // 当前触发采集数据的事件名称
12 | var data = option.data; // 当前触发采集数据的完整数据
13 | var server_url = option.server_url; // 当前触发采集数据的默认发送数据接收端地址
14 | if(event_name === 'test'){
15 | return ['自定义数据接收端 1'] // 仅发送数据到自定义数据接收端 1
16 | }
17 | if(event_name === 'test1'){
18 | return ['自定义数据接收端 1', server_url] // 发送数据到自定义数据接收端 1及默认数据接收端 server_url
19 | }
20 |
21 | if(event_name === 'test2'){
22 | return [] // 任何数据接收端都不发送
23 | }
24 | return [server_url] // 仅发送数据接收端 server_url
25 | });
26 |
27 | ```
28 | ## ⚠️ 注意
29 | - 不能与 sf-instant-event 智能运营即时事件上报插件共用。
30 | - 该插件必须有返回值,若无返回值则不会发送到任何接收端。
31 | - 插件和 SDK 必须在同一个版本中,请勿混合不同版本的DK 和插件进行使用。
--------------------------------------------------------------------------------
/dist/web/plugin/debug-sender/index.closure.js:
--------------------------------------------------------------------------------
1 | !function(){"use strict";function r(r,a,n){if(a&&(r.plugin_name=a),n&&r.init){var t=r.init;r.init=function(u,i){function o(){t.call(r,u,i)}return e(u,r,a),u.readyState&&u.readyState.state>=3||!u.on?o():void u.on(n,o)}}return r}function e(r,e,a){function n(e,n){r.logger?r.logger.msg.apply(r.logger,n).module(a+""||"").level(e).log():r.log&&r.log.apply(r,n)}e.log=function(){n("log",arguments)},e.warn=function(){n("warn",arguments)},e.error=function(){n("error",arguments)}}function a(e,a,n){return r(e,a,n),e.plugin_version=g,e}function n(r){var e=r,a="";a=o.para.debug_mode_url.indexOf("?")!==-1?o.para.debug_mode_url+"&"+o.kit.encodeTrackData(r):o.para.debug_mode_url+"?"+o.kit.encodeTrackData(r),d.ajax({url:a,type:"GET",cors:!0,header:{"Dry-Run":String(o.para.debug_mode_upload)},success:function(r){d.isEmptyObject(r)===!0?alert("debug\u6570\u636e\u53d1\u9001\u6210\u529f"+e):alert("debug\u5931\u8d25 \u9519\u8bef\u539f\u56e0"+JSON.stringify(r))}})}function t(r,e){if(o.para.debug_mode===!0){var a=r.data;r.callback;n(JSON.stringify(a)),e.cancellationToken.stop()}return r}function u(){o.para.debug_mode===!0&&(o.para.debug_mode_upload=o.para.debug_mode_upload||!1,d.isString(o.para.debug_mode_url)||(d.isString(o.para.server_url)?o.para.debug_mode_url=o.para.server_url.replace("sa.gif","debug"):d.isArray(o.para.server_url)&&d.isString(o.para.server_url[0])?o.para.debug_mode_url=o.para.server_url[0].replace("sa.gif","debug"):o.para.debug_mode=!1))}function i(){o.on("sdkInitPara",function(){u()}),o.on("sdkAfterInitPara",function(){o.registerInterceptor("sendDataStage",{send:{priority:30,entry:t}})})}var o,d,g="1.27.4",l={plugin_name:"DebugSender",init:function(r){o=r,d=o._,i()}},c=a(l);return c}();
--------------------------------------------------------------------------------
/dist/web/plugin/debug-sender/index.es6.js:
--------------------------------------------------------------------------------
1 | var sd,_,sdkversion_placeholder="1.27.4";function wrapPluginInitFn(e,r,a){if(r&&(e.plugin_name=r),a&&e.init){var n=e.init;e.init=function(d,t){if(wrapLogFn(d,e,r),d.readyState&&d.readyState.state>=3||!d.on)return i();function i(){n.call(e,d,t)}d.on(a,i)}}return e}function wrapLogFn(e,r,a){function n(r,n){e.logger?e.logger.msg.apply(e.logger,n).module(a+""||"").level(r).log():e.log&&e.log.apply(e,n)}r.log=function(){n("log",arguments)},r.warn=function(){n("warn",arguments)},r.error=function(){n("error",arguments)}}function createPlugin(e,r,a){return wrapPluginInitFn(e,r,a),e.plugin_version=sdkversion_placeholder,e}function debugPath(e){var r=e,a="";a=-1!==sd.para.debug_mode_url.indexOf("?")?sd.para.debug_mode_url+"&"+sd.kit.encodeTrackData(e):sd.para.debug_mode_url+"?"+sd.kit.encodeTrackData(e),_.ajax({url:a,type:"GET",cors:!0,header:{"Dry-Run":String(sd.para.debug_mode_upload)},success:function(e){!0===_.isEmptyObject(e)?alert("debug\u6570\u636e\u53d1\u9001\u6210\u529f"+r):alert("debug\u5931\u8d25 \u9519\u8bef\u539f\u56e0"+JSON.stringify(e))}})}function sendData(e,r){if(!0===sd.para.debug_mode){var a=e.data;e.callback;debugPath(JSON.stringify(a)),r.cancellationToken.stop()}return e}function initPara(){!0===sd.para.debug_mode&&(sd.para.debug_mode_upload=sd.para.debug_mode_upload||!1,_.isString(sd.para.debug_mode_url)||(_.isString(sd.para.server_url)?sd.para.debug_mode_url=sd.para.server_url.replace("sa.gif","debug"):_.isArray(sd.para.server_url)&&_.isString(sd.para.server_url[0])?sd.para.debug_mode_url=sd.para.server_url[0].replace("sa.gif","debug"):sd.para.debug_mode=!1))}function senderInit(){sd.on("sdkInitPara",function(){initPara()}),sd.on("sdkAfterInitPara",function(){sd.registerInterceptor("sendDataStage",{send:{priority:30,entry:sendData}})})}var DebugSender={plugin_name:"DebugSender",init:function(e){_=(sd=e)._,senderInit()}},index=createPlugin(DebugSender);export default index;
--------------------------------------------------------------------------------
/dist/web/plugin/debug-sender/index.js:
--------------------------------------------------------------------------------
1 | (window.SensorsDataWebJSSDKPlugin=window.SensorsDataWebJSSDKPlugin||{}).DebugSender=function(){"use strict";function r(r,a,n){if(a&&(r.plugin_name=a),n&&r.init){var t=r.init;r.init=function(u,i){function o(){t.call(r,u,i)}return e(u,r,a),u.readyState&&u.readyState.state>=3||!u.on?o():void u.on(n,o)}}return r}function e(r,e,a){function n(e,n){r.logger?r.logger.msg.apply(r.logger,n).module(a+""||"").level(e).log():r.log&&r.log.apply(r,n)}e.log=function(){n("log",arguments)},e.warn=function(){n("warn",arguments)},e.error=function(){n("error",arguments)}}function a(e,a,n){return r(e,a,n),e.plugin_version=g,e}function n(r){var e=r,a="";a=o.para.debug_mode_url.indexOf("?")!==-1?o.para.debug_mode_url+"&"+o.kit.encodeTrackData(r):o.para.debug_mode_url+"?"+o.kit.encodeTrackData(r),d.ajax({url:a,type:"GET",cors:!0,header:{"Dry-Run":String(o.para.debug_mode_upload)},success:function(r){d.isEmptyObject(r)===!0?alert("debug\u6570\u636e\u53d1\u9001\u6210\u529f"+e):alert("debug\u5931\u8d25 \u9519\u8bef\u539f\u56e0"+JSON.stringify(r))}})}function t(r,e){if(o.para.debug_mode===!0){var a=r.data;r.callback;n(JSON.stringify(a)),e.cancellationToken.stop()}return r}function u(){o.para.debug_mode===!0&&(o.para.debug_mode_upload=o.para.debug_mode_upload||!1,d.isString(o.para.debug_mode_url)||(d.isString(o.para.server_url)?o.para.debug_mode_url=o.para.server_url.replace("sa.gif","debug"):d.isArray(o.para.server_url)&&d.isString(o.para.server_url[0])?o.para.debug_mode_url=o.para.server_url[0].replace("sa.gif","debug"):o.para.debug_mode=!1))}function i(){o.on("sdkInitPara",function(){u()}),o.on("sdkAfterInitPara",function(){o.registerInterceptor("sendDataStage",{send:{priority:30,entry:t}})})}var o,d,g="1.27.4",l={plugin_name:"DebugSender",init:function(r){o=r,d=o._,i()}},c=a(l);return c}();
--------------------------------------------------------------------------------
/dist/web/plugin/debug-sender/readme.md:
--------------------------------------------------------------------------------
1 | # debug 发送数据
2 | >⚠️ 此插件已自动集成在 SDK 中,禁止手动使用!
3 |
4 | ## 功能
5 | 初始化 Web SDK 配置 `debug_mode` 为 `true` 时,页面行为数据通过 `Ajax` 的 `GET` 方式发送采集数据,并且标记该数据为 `debug` 数据。发送成功后会已页面弹窗的方式提醒用户数据发送成功。发送失败则会打印出发送失败原因。
6 |
7 | ## ⚠️ 注意
8 | - 插件和 SDK 必须在同一个版本中,请勿混合不同版本的 SDK 和插件进行使用。
--------------------------------------------------------------------------------
/dist/web/plugin/deeplink/index.closure.js:
--------------------------------------------------------------------------------
1 | !function(){"use strict";function i(i,t,n){if(t&&(i.plugin_name=t),n&&i.init){var o=i.init;i.init=function(r,s){function a(){o.call(i,r,s)}return e(r,i,t),r.readyState&&r.readyState.state>=3||!r.on?a():void r.on(n,a)}}return i}function e(i,e,t){function n(e,n){i.logger?i.logger.msg.apply(i.logger,n).module(t+""||"").level(e).log():i.log&&i.log.apply(i,n)}e.log=function(){n("log",arguments)},e.warn=function(){n("warn",arguments)},e.error=function(){n("error",arguments)}}function t(e,t,n){return i(e,t,n),e.plugin_version=r,e}function n(){return"undefined"!=typeof o&&document[o]}var o,r="1.27.4",s=(/micromessenger\/([\d.]+)/i.test(navigator.userAgent||""),function(){var i={};return"undefined"!=typeof document.hidden?(i.hidden="hidden",i.visibilityChange="visibilitychange"):"undefined"!=typeof document.msHidden?(i.hidden="msHidden",i.visibilityChange="msvisibilitychange"):"undefined"!=typeof document.webkitHidden&&(i.hidden="webkitHidden",i.visibilityChange="webkitvisibilitychange"),i});o=s().hidden;var a={android:/Android/i,iOS:/iPhone|iPad|iPod/i},d=function(){for(var i in a)if(navigator.userAgent.match(a[i]))return i;return""},l=d(),u=function(){return a.hasOwnProperty(l)},g=function(i){return null!=i&&"[object Object]"==Object.prototype.toString.call(i)},h=function(i){var e=/\/sd\/(\w+)\/(\w+)$/;return i.match(e)},c=function(i){var e=i._.URL(i.para.server_url);return{origin:e.origin,project:e.searchParams.get("project")||"default"}},p=function(i,e,t){i.log("\u5c1d\u8bd5\u5524\u8d77 android app");var r=e;i.log("\u5524\u8d77APP\u7684\u5730\u5740\uff1a"+r),window.location=r,i.timer=setTimeout(function(){var e=n();return i.log("hide:"+o+":"+document[o]),e?(i.log("The page is hidden, stop navigating to download page"),!1):(i.log("App\u53ef\u80fd\u672a\u5b89\u88c5\uff0c\u8df3\u8f6c\u5230\u4e0b\u8f7d\u5730\u5740"),void(window.location=t))},i.timeout)},f=function(i,e,t){i.log("\u5c1d\u8bd5\u5524\u8d77 iOS app:"+e),window.location.href=e,i.timer=setTimeout(function(){var e=n();return e?(i.log("The page is hidden, stop navigating to download page"),!1):(i.log("App\u53ef\u80fd\u672a\u5b89\u88c5\uff0c\u8df3\u8f6c\u5230\u4e0b\u8f7d\u5730\u5740"),void(window.location.href=t))},i.timeout),i.log("new timer:"+i.timer)},m={plugin_name:["deeplink","Deeplink"],key:null,timer:null,sd:null,data:null,timeout:2500,apiURL:"{origin}/sdk/deeplink/param?key={key}&system_type=JS&project={project}",init:function(i){if(this.sd)return this.logger("deeplink\u5df2\u7ecf\u521d\u59cb\u5316"),!1;arguments[0]?g(arguments[0])&&"number"==typeof arguments[0].timeout?this.sd=window.sensorsDataAnalytic201505:this.sd=i:this.sd=window.sensorsDataAnalytic201505;var e={};if(arguments.length>0&&(1===arguments.length&&g(arguments[0])?e=arguments[0]:arguments.length>=2&&g(arguments[1])&&(e=arguments[1])),!u())return this.logger("\u4e0d\u652f\u6301\u5f53\u524d\u7cfb\u7edf\uff0c\u76ee\u524d\u53ea\u652f\u6301Android\u548ciOS"),!1;if(g(e)&&this.sd._.isNumber(e.timeout)&&e.timeout>=2500&&(this.timeout=e.timeout),!this.sd.para.server_url)return this.logger("\u795e\u7b56JS SDK\u914d\u7f6e\u9879server_url\u672a\u6b63\u786e\u914d\u7f6e"),!1;var t=c(this.sd);this.apiURL=this.apiURL.replace("{origin}",t.origin).replace("{project}",t.project);var n=this.sd._.getQueryParam(window.location.href,"deeplink");if(!n)return this.logger("\u5f53\u524d\u9875\u9762\u7f3a\u5c11deeplink\u53c2\u6570"),!1;n=window.decodeURIComponent(n);var o=h(n);return o?(this.key=o[2],this.apiURL=this.apiURL.replace("{key}",window.encodeURIComponent(o[2])),this.sd._.ajax({url:this.apiURL,type:"GET",cors:!0,credentials:!1,success:function(i){return i.errorMsg?(m.logger("API\u62a5\u9519\uff1a"+i.errorMsg),!1):(m.data=i,m.logger("API\u67e5\u8be2\u6210\u529f\uff0c\u6570\u636e\uff1a"+JSON.stringify(i,null," ")),void(this.data.app_key&&(this.data.android_info&&this.data.android_info.url_schemes&&(this.data.android_info.url_schemes+="://sensorsdata/sd/"+this.data.app_key+"/"+this.key),this.data.ios_info&&this.data.ios_info.url_schemes&&(this.data.ios_info.url_schemes+="://sensorsdata/sd/"+this.data.app_key+"/"+this.key))))}.bind(this),error:function(){m.logger("API\u67e5\u8be2\u51fa\u9519")}}),void this.addListeners()):(this.logger("\u5f53\u524d\u9875\u9762\u7684deeplink\u53c2\u6570\u65e0\u6548"),!1)},openDeepLink:function(){if(this.logger("openDeeplink()"),!this.data)return this.logger("\u6ca1\u6709Deep link\u6570\u636e!"),!1;if("iOS"===l){this.logger("\u5f53\u524d\u7cfb\u7edf\u662fiOS");var i=this.sd&&this.sd._&&this.sd._.getIOSVersion()>=9&&this.data.ios_info.ios_wake_url?this.data.ios_info.ios_wake_url:this.data.ios_info.url_schemes;this.logger("\u5524\u8d77APP\u7684\u5730\u5740\uff1a"+i),f(this,i,this.data.ios_info.download_url)}else this.logger("\u5f53\u524d\u7cfb\u7edf\u662f android"),p(this,this.data.android_info.url_schemes,this.data.android_info.download_url)},logger:function(i){this.sd&&this.sd.log(i)},addListeners:function(){var i=s().visibilityChange,e=this;i&&document.addEventListener(i,function(){clearTimeout(e.timer),e.logger("visibilitychange, clear timeout:"+e.timer)},!1),window.addEventListener("pagehide",function(){e.logger("page hide, clear timeout:"+e.timer),clearTimeout(e.timer)},!1)}},v=t(m,null,"sdkReady");return v}();
--------------------------------------------------------------------------------
/dist/web/plugin/deeplink/index.js:
--------------------------------------------------------------------------------
1 | (window.SensorsDataWebJSSDKPlugin=window.SensorsDataWebJSSDKPlugin||{}).Deeplink=(window.SensorsDataWebJSSDKPlugin=window.SensorsDataWebJSSDKPlugin||{}).deeplink=function(){"use strict";function i(i,t,n){if(t&&(i.plugin_name=t),n&&i.init){var o=i.init;i.init=function(r,s){function a(){o.call(i,r,s)}return e(r,i,t),r.readyState&&r.readyState.state>=3||!r.on?a():void r.on(n,a)}}return i}function e(i,e,t){function n(e,n){i.logger?i.logger.msg.apply(i.logger,n).module(t+""||"").level(e).log():i.log&&i.log.apply(i,n)}e.log=function(){n("log",arguments)},e.warn=function(){n("warn",arguments)},e.error=function(){n("error",arguments)}}function t(e,t,n){return i(e,t,n),e.plugin_version=r,e}function n(){return"undefined"!=typeof o&&document[o]}var o,r="1.27.4",s=(/micromessenger\/([\d.]+)/i.test(navigator.userAgent||""),function(){var i={};return"undefined"!=typeof document.hidden?(i.hidden="hidden",i.visibilityChange="visibilitychange"):"undefined"!=typeof document.msHidden?(i.hidden="msHidden",i.visibilityChange="msvisibilitychange"):"undefined"!=typeof document.webkitHidden&&(i.hidden="webkitHidden",i.visibilityChange="webkitvisibilitychange"),i});o=s().hidden;var a={android:/Android/i,iOS:/iPhone|iPad|iPod/i},d=function(){for(var i in a)if(navigator.userAgent.match(a[i]))return i;return""},l=d(),u=function(){return a.hasOwnProperty(l)},g=function(i){return null!=i&&"[object Object]"==Object.prototype.toString.call(i)},h=function(i){var e=/\/sd\/(\w+)\/(\w+)$/;return i.match(e)},c=function(i){var e=i._.URL(i.para.server_url);return{origin:e.origin,project:e.searchParams.get("project")||"default"}},p=function(i,e,t){i.log("\u5c1d\u8bd5\u5524\u8d77 android app");var r=e;i.log("\u5524\u8d77APP\u7684\u5730\u5740\uff1a"+r),window.location=r,i.timer=setTimeout(function(){var e=n();return i.log("hide:"+o+":"+document[o]),e?(i.log("The page is hidden, stop navigating to download page"),!1):(i.log("App\u53ef\u80fd\u672a\u5b89\u88c5\uff0c\u8df3\u8f6c\u5230\u4e0b\u8f7d\u5730\u5740"),void(window.location=t))},i.timeout)},f=function(i,e,t){i.log("\u5c1d\u8bd5\u5524\u8d77 iOS app:"+e),window.location.href=e,i.timer=setTimeout(function(){var e=n();return e?(i.log("The page is hidden, stop navigating to download page"),!1):(i.log("App\u53ef\u80fd\u672a\u5b89\u88c5\uff0c\u8df3\u8f6c\u5230\u4e0b\u8f7d\u5730\u5740"),void(window.location.href=t))},i.timeout),i.log("new timer:"+i.timer)},m={plugin_name:["deeplink","Deeplink"],key:null,timer:null,sd:null,data:null,timeout:2500,apiURL:"{origin}/sdk/deeplink/param?key={key}&system_type=JS&project={project}",init:function(i){if(this.sd)return this.logger("deeplink\u5df2\u7ecf\u521d\u59cb\u5316"),!1;arguments[0]?g(arguments[0])&&"number"==typeof arguments[0].timeout?this.sd=window.sensorsDataAnalytic201505:this.sd=i:this.sd=window.sensorsDataAnalytic201505;var e={};if(arguments.length>0&&(1===arguments.length&&g(arguments[0])?e=arguments[0]:arguments.length>=2&&g(arguments[1])&&(e=arguments[1])),!u())return this.logger("\u4e0d\u652f\u6301\u5f53\u524d\u7cfb\u7edf\uff0c\u76ee\u524d\u53ea\u652f\u6301Android\u548ciOS"),!1;if(g(e)&&this.sd._.isNumber(e.timeout)&&e.timeout>=2500&&(this.timeout=e.timeout),!this.sd.para.server_url)return this.logger("\u795e\u7b56JS SDK\u914d\u7f6e\u9879server_url\u672a\u6b63\u786e\u914d\u7f6e"),!1;var t=c(this.sd);this.apiURL=this.apiURL.replace("{origin}",t.origin).replace("{project}",t.project);var n=this.sd._.getQueryParam(window.location.href,"deeplink");if(!n)return this.logger("\u5f53\u524d\u9875\u9762\u7f3a\u5c11deeplink\u53c2\u6570"),!1;n=window.decodeURIComponent(n);var o=h(n);return o?(this.key=o[2],this.apiURL=this.apiURL.replace("{key}",window.encodeURIComponent(o[2])),this.sd._.ajax({url:this.apiURL,type:"GET",cors:!0,credentials:!1,success:function(i){return i.errorMsg?(m.logger("API\u62a5\u9519\uff1a"+i.errorMsg),!1):(m.data=i,m.logger("API\u67e5\u8be2\u6210\u529f\uff0c\u6570\u636e\uff1a"+JSON.stringify(i,null," ")),void(this.data.app_key&&(this.data.android_info&&this.data.android_info.url_schemes&&(this.data.android_info.url_schemes+="://sensorsdata/sd/"+this.data.app_key+"/"+this.key),this.data.ios_info&&this.data.ios_info.url_schemes&&(this.data.ios_info.url_schemes+="://sensorsdata/sd/"+this.data.app_key+"/"+this.key))))}.bind(this),error:function(){m.logger("API\u67e5\u8be2\u51fa\u9519")}}),void this.addListeners()):(this.logger("\u5f53\u524d\u9875\u9762\u7684deeplink\u53c2\u6570\u65e0\u6548"),!1)},openDeepLink:function(){if(this.logger("openDeeplink()"),!this.data)return this.logger("\u6ca1\u6709Deep link\u6570\u636e!"),!1;if("iOS"===l){this.logger("\u5f53\u524d\u7cfb\u7edf\u662fiOS");var i=this.sd&&this.sd._&&this.sd._.getIOSVersion()>=9&&this.data.ios_info.ios_wake_url?this.data.ios_info.ios_wake_url:this.data.ios_info.url_schemes;this.logger("\u5524\u8d77APP\u7684\u5730\u5740\uff1a"+i),f(this,i,this.data.ios_info.download_url)}else this.logger("\u5f53\u524d\u7cfb\u7edf\u662f android"),p(this,this.data.android_info.url_schemes,this.data.android_info.download_url)},logger:function(i){this.sd&&this.sd.log(i)},addListeners:function(){var i=s().visibilityChange,e=this;i&&document.addEventListener(i,function(){clearTimeout(e.timer),e.logger("visibilitychange, clear timeout:"+e.timer)},!1),window.addEventListener("pagehide",function(){e.logger("page hide, clear timeout:"+e.timer),clearTimeout(e.timer)},!1)}},w=t(m,null,"sdkReady");return w}();
--------------------------------------------------------------------------------
/dist/web/plugin/deeplink/readme.md:
--------------------------------------------------------------------------------
1 | # 深度链接
2 | 通过 H5 将用户引流至移动端 App,借助于深度链接可以提高活动推广的效果。
3 | ## 功能
4 | 参考官网说明 [深度链接](https://manual.sensorsdata.cn/sa/latest/tech_sdk_client_web_deeplink-129827533.html)
5 |
6 | ## ⚠️ 注意
7 | - 插件和 SDK 必须在同一个版本中,请勿混合不同版本的 SDK 和插件进行使用。
8 |
--------------------------------------------------------------------------------
/dist/web/plugin/disable-sdk/index.closure.js:
--------------------------------------------------------------------------------
1 | !function(){"use strict";function n(n,i,o){if(i&&(n.plugin_name=i),o&&n.init){var e=n.init;n.init=function(r,u){function l(){e.call(n,r,u)}return t(r,n,i),r.readyState&&r.readyState.state>=3||!r.on?l():void r.on(o,l)}}return n}function t(n,t,i){function o(t,o){n.logger?n.logger.msg.apply(n.logger,o).module(i+""||"").level(t).log():n.log&&n.log.apply(n,o)}t.log=function(){o("log",arguments)},t.warn=function(){o("warn",arguments)},t.error=function(){o("error",arguments)}}function i(t,i,o){return n(t,i,o),t.plugin_version=u,t}function o(){l=!0}function e(){l=!1}function r(){return l}var u="1.27.4",l=!1,a=null,c={init:function(n){a=n,a.disableSDK=o,a.enableSDK=e,a.getDisabled=r}},f=i(c,"DisableSDK","sdkInitAPI");return f}();
--------------------------------------------------------------------------------
/dist/web/plugin/disable-sdk/index.es6.js:
--------------------------------------------------------------------------------
1 | var sdkversion_placeholder="1.27.4";function wrapPluginInitFn(n,i,e){if(i&&(n.plugin_name=i),e&&n.init){var l=n.init;n.init=function(a,r){if(wrapLogFn(a,n,i),a.readyState&&a.readyState.state>=3||!a.on)return t();function t(){l.call(n,a,r)}a.on(e,t)}}return n}function wrapLogFn(n,i,e){function l(i,l){n.logger?n.logger.msg.apply(n.logger,l).module(e+""||"").level(i).log():n.log&&n.log.apply(n,l)}i.log=function(){l("log",arguments)},i.warn=function(){l("warn",arguments)},i.error=function(){l("error",arguments)}}function createPlugin(n,i,e){return wrapPluginInitFn(n,i,e),n.plugin_version=sdkversion_placeholder,n}var isDisabled=!1,sd=null,disableSDKPlugin={init:function(n){(sd=n).disableSDK=disableSDK,sd.enableSDK=enableSDK,sd.getDisabled=getDisabled}};function disableSDK(){isDisabled=!0}function enableSDK(){isDisabled=!1}function getDisabled(){return isDisabled}var index=createPlugin(disableSDKPlugin,"DisableSDK","sdkInitAPI");export default index;
--------------------------------------------------------------------------------
/dist/web/plugin/disable-sdk/index.js:
--------------------------------------------------------------------------------
1 | (window.SensorsDataWebJSSDKPlugin=window.SensorsDataWebJSSDKPlugin||{}).DisableSDK=function(){"use strict";function n(n,t,o){if(t&&(n.plugin_name=t),o&&n.init){var e=n.init;n.init=function(r,l){function u(){e.call(n,r,l)}return i(r,n,t),r.readyState&&r.readyState.state>=3||!r.on?u():void r.on(o,u)}}return n}function i(n,i,t){function o(i,o){n.logger?n.logger.msg.apply(n.logger,o).module(t+""||"").level(i).log():n.log&&n.log.apply(n,o)}i.log=function(){o("log",arguments)},i.warn=function(){o("warn",arguments)},i.error=function(){o("error",arguments)}}function t(i,t,o){return n(i,t,o),i.plugin_version=l,i}function o(){u=!0}function e(){u=!1}function r(){return u}var l="1.27.4",u=!1,a=null,g={init:function(n){a=n,a.disableSDK=o,a.enableSDK=e,a.getDisabled=r}},c=t(g,"DisableSDK","sdkInitAPI");return c}();
--------------------------------------------------------------------------------
/dist/web/plugin/disable-sdk/readme.md:
--------------------------------------------------------------------------------
1 | # 禁用启用 SDK
2 | >⚠️ 此插件已自动集成在 SDK 中,禁止手动使用!
3 |
4 | ## 功能
5 | 该插件集成后会为 SDK 新增 disableSDK、 enableSDK 和 getDisabled 三个 API。
6 |
7 | 用户可以在任何时候通过这 disableSDK 方法完成对 SDK 数据采集行为的禁用。同样,用户可以在任何时候通过 enableSDK 方法再次启用 SDK 数据采集。
8 |
9 | 在 App 和 内嵌 H5 页面打通成功的情况下,如果 App 禁用了采集,那么内嵌 H5 页面也会禁用采集。
10 |
11 | ### API 说明
12 | - disableSDK: 禁用 SDK,调用后 SDK 不再进行数据采集发送
13 | - enableSDK: 启用 SDK,调用后 SDK 进行数据采集发送
14 | - getDisabled: 获取 SDK 是否禁用的状态
15 |
16 | ## 注意
17 | - 打通成功情况下 App 禁用采集同步禁用内嵌 H5 功能,需要配置支持同步禁用内嵌 H5 的 App SDK 使用。
--------------------------------------------------------------------------------
/dist/web/plugin/exposure/readme.md:
--------------------------------------------------------------------------------
1 | # 元素曝光事件采集
2 |
3 | ## 功能
4 | 某视图元素,由不可见到可见,满足一定的限制条件(可见比例、有效停留时长),该插件上报该视图元素曝光事件。
5 |
6 | 具体使用方法请参考:[曝光采集(Web)](https://manual.sensorsdata.cn/sa/latest/tech_sdk_client_web_expose-123962352.html)
7 |
8 | ## 变动
9 | - 新增事件:通过 HTML 或 API 自定义曝光事件名。
10 | - 新增属性: 通过 HTML 或 API 自定义事件属性。
11 |
12 | ## ⚠️ 注意
13 | - 插件和 SDK 必须在同一个版本中,请勿混合不同版本的 SDK 和插件进行使用。
--------------------------------------------------------------------------------
/dist/web/plugin/ga-forward-sensorsdata/readme.md:
--------------------------------------------------------------------------------
1 | # GA4 数据转发到神策
2 |
3 | ## 功能
4 | 通过监听当前页面的 GA 数据,获取到 GA 请求后,解析出数据 并调用 Web SDK 发送。
5 | ## 集成
6 | ### ES Module 方式
7 | ```html
8 |
19 |
22 | ```
23 |
24 | ### Script 方式
25 | ```html
26 |
27 |
28 |
29 |
39 |
40 |
43 | ```
44 |
45 |
46 | ## ⚠️ 注意
47 | - 注意 SDK 引入顺序,必须按照上述顺序,先引入神策的 SDK,再引入 GA
--------------------------------------------------------------------------------
/dist/web/plugin/general-encryption/index.closure.js:
--------------------------------------------------------------------------------
1 | !function(){"use strict";function n(n,t,e){if(t&&(n.plugin_name=t),e&&n.init){var r=n.init;n.init=function(o,c){function a(){r.call(n,o,c)}return i(o,n,t),o.readyState&&o.readyState.state>=3||!o.on?a():void o.on(e,a)}}return n}function i(n,i,t){function e(i,e){n.logger?n.logger.msg.apply(n.logger,e).module(t+""||"").level(i).log():n.log&&n.log.apply(n,e)}i.log=function(){e("log",arguments)},i.warn=function(){e("warn",arguments)},i.error=function(){e("error",arguments)}}function t(i,t,e){return n(i,t,e),i.plugin_version=o,i}var e,r,o="1.27.4",c={init:function(n,i){e=n,r=e._;var t=i&&i.encrypt_utils,o=window.console&&window.console.log||function(){};o=e&&e.log||o;var c=e.kit.encodeTrackData;return e&&e.kit&&c?r.isObject(t)&&r.isFunction(t.encryptEvent)&&r.isFunction(t.encryptSymmetricKeyWithPublicKey)&&r.isString(i.pub_key)&&r.isNumber(i.pkv)?(e.kit.encodeTrackData=function(n){try{var a=t.encryptEvent,l=t.encryptSymmetricKeyWithPublicKey,u=i.pkv,y=i.pub_key;if(r.isFunction(t.encryptEvent)){var p=a(n),d=e._.base64Encode(p),s={pkv:u,ekey:l(y),payloads:[d]},g=JSON.stringify(s),f=encodeURIComponent(g);return"data="+f}return c.call(e.kit,n)}catch(v){return o("Encrypted data exception."),c.call(e.kit,n)}},void o("GeneralEncryption Plugin initialized successfully.")):void o("GeneralEncryption Plugin initialization failed. parameter error."):void o("Web SDK initialization failed.")}},a=t(c,"GeneralEncryption","sdkReady");return a}();
--------------------------------------------------------------------------------
/dist/web/plugin/general-encryption/index.es6.js:
--------------------------------------------------------------------------------
1 | var sd,_,sdkversion_placeholder="1.27.4";function wrapPluginInitFn(n,e,i){if(e&&(n.plugin_name=e),i&&n.init){var t=n.init;n.init=function(r,o){if(wrapLogFn(r,n,e),r.readyState&&r.readyState.state>=3||!r.on)return a();function a(){t.call(n,r,o)}r.on(i,a)}}return n}function wrapLogFn(n,e,i){function t(e,t){n.logger?n.logger.msg.apply(n.logger,t).module(i+""||"").level(e).log():n.log&&n.log.apply(n,t)}e.log=function(){t("log",arguments)},e.warn=function(){t("warn",arguments)},e.error=function(){t("error",arguments)}}function createPlugin(n,e,i){return wrapPluginInitFn(n,e,i),n.plugin_version=sdkversion_placeholder,n}var GeneralEncryption={init:function(n,e){_=(sd=n)._;var i=e&&e.encrypt_utils,t=window.console&&window.console.log||function(){};t=sd&&sd.log||t;var r=sd.kit.encodeTrackData;sd&&sd.kit&&r?_.isObject(i)&&_.isFunction(i.encryptEvent)&&_.isFunction(i.encryptSymmetricKeyWithPublicKey)&&_.isString(e.pub_key)&&_.isNumber(e.pkv)?(sd.kit.encodeTrackData=function(n){try{var o=i.encryptEvent,a=i.encryptSymmetricKeyWithPublicKey,c=e.pkv,l=e.pub_key;if(_.isFunction(i.encryptEvent)){var u=o(n),d=sd._.base64Encode(u),p={pkv:c,ekey:a(l),payloads:[d]},s=JSON.stringify(p);return"data="+encodeURIComponent(s)}return r.call(sd.kit,n)}catch(y){return t("Encrypted data exception."),r.call(sd.kit,n)}},t("GeneralEncryption Plugin initialized successfully.")):t("GeneralEncryption Plugin initialization failed. parameter error."):t("Web SDK initialization failed.")}},index=createPlugin(GeneralEncryption,"GeneralEncryption","sdkReady");export default index;
--------------------------------------------------------------------------------
/dist/web/plugin/general-encryption/index.js:
--------------------------------------------------------------------------------
1 | (window.SensorsDataWebJSSDKPlugin=window.SensorsDataWebJSSDKPlugin||{}).GeneralEncryption=function(){"use strict";function n(n,e,t){if(e&&(n.plugin_name=e),t&&n.init){var r=n.init;n.init=function(o,a){function c(){r.call(n,o,a)}return i(o,n,e),o.readyState&&o.readyState.state>=3||!o.on?c():void o.on(t,c)}}return n}function i(n,i,e){function t(i,t){n.logger?n.logger.msg.apply(n.logger,t).module(e+""||"").level(i).log():n.log&&n.log.apply(n,t)}i.log=function(){t("log",arguments)},i.warn=function(){t("warn",arguments)},i.error=function(){t("error",arguments)}}function e(i,e,t){return n(i,e,t),i.plugin_version=o,i}var t,r,o="1.27.4",a={init:function(n,i){t=n,r=t._;var e=i&&i.encrypt_utils,o=window.console&&window.console.log||function(){};o=t&&t.log||o;var a=t.kit.encodeTrackData;return t&&t.kit&&a?r.isObject(e)&&r.isFunction(e.encryptEvent)&&r.isFunction(e.encryptSymmetricKeyWithPublicKey)&&r.isString(i.pub_key)&&r.isNumber(i.pkv)?(t.kit.encodeTrackData=function(n){try{var c=e.encryptEvent,l=e.encryptSymmetricKeyWithPublicKey,u=i.pkv,y=i.pub_key;if(r.isFunction(e.encryptEvent)){var p=c(n),s=t._.base64Encode(p),d={pkv:u,ekey:l(y),payloads:[s]},g=JSON.stringify(d),f=encodeURIComponent(g);return"data="+f}return a.call(t.kit,n)}catch(v){return o("Encrypted data exception."),a.call(t.kit,n)}},void o("GeneralEncryption Plugin initialized successfully.")):void o("GeneralEncryption Plugin initialization failed. parameter error."):void o("Web SDK initialization failed.")}},c=e(a,"GeneralEncryption","sdkReady");return c}();
--------------------------------------------------------------------------------
/dist/web/plugin/general-encryption/readme.md:
--------------------------------------------------------------------------------
1 | # 非对称加密上报数据
2 |
3 | ## 功能
4 | 通过自定义加密配置及加密方法,提供对上报数据进行自定义加密。
5 | ## 集成
6 | ### ES Module 方式
7 | ```javascript
8 | import generalEncryption from '/dist/web/plugin/general-encryption/index.es6';
9 | sensors.use(generalEncryption, {
10 | encrypt_utils: {
11 | encryptEvent: function (data) {
12 | return "返回数据经过对称加密后的加密结果";
13 | },
14 | encryptSymmetricKeyWithPublicKey: function (pub_key) {
15 | return "返回使用公钥通过非对称加密方法加密对称加密密钥的结果";
16 | },
17 | },
18 | pkv: 0, // 加密标识 类型:Number
19 | pub_key: "非对称加密公钥",
20 | });
21 |
22 | ```
23 |
24 | `pkv`会原文传输至服务端,作为服务端寻找对应加密方式等必要内容的标识。
25 |
26 | ### 参数配置
27 | 通过初始化参数设置全局统一的非对称加密逻辑的配置。
28 | - `encrypt_utils`:加密方法配置
29 | - `encryptEvent`:对称加密数据方法。类型:`Function`
30 | - `encryptSymmetricKeyWithPublicKey`:加密对称加密密钥的方法。类型:`Function`
31 | - `pkv`: 加密方式标识。类型:`Number`
32 | - `pub_key`: 非对称加密公钥。类型:`String`
33 |
34 | ## 加密逻辑
35 |
36 | 1. 触发上报数据行为
37 | 2. 根据配置判断是否开启自定义加密
38 | 3. 调用自定义加密方法加密上报数据,获取加密后的上报数据
39 | 4. 对上报数据进行 Base64 编码
40 | 5. 使用`pub_key`公钥通过自定义的非对称加密方法,对自定义对称加密的密钥进行加密,返回加密后的密钥
41 | 6. 重新封装数据
42 | 7. 发送数据
43 |
44 | 重新封装后的数据格式为
45 | ```javascript
46 | {
47 | "pkv":"加密方式标识",
48 | "ekey":"使用公钥通过非对称加密方法加密对称加密密钥的结果",
49 | "payloads":["加密后的上报数据"]
50 | }
51 | ```
52 |
53 | ## ⚠️ 注意
54 | - 该插件不支持批量上报
55 | - 该插件加密后,需使用自建服务端进行解密,解密后再同步到神策服务端。
56 | - 插件和 SDK 必须在同一个版本中,请勿混合不同版本的 SDK 和插件进行使用。
--------------------------------------------------------------------------------
/dist/web/plugin/image-sender/index.closure.js:
--------------------------------------------------------------------------------
1 | !function(){"use strict";function n(n,r,t){if(r&&(n.plugin_name=r),t&&n.init){var a=n.init;n.init=function(i,o){function l(){a.call(n,i,o)}return e(i,n,r),i.readyState&&i.readyState.state>=3||!i.on?l():void i.on(t,l)}}return n}function e(n,e,r){function t(e,t){n.logger?n.logger.msg.apply(n.logger,t).module(r+""||"").level(e).log():n.log&&n.log.apply(n,t)}e.log=function(){t("log",arguments)},e.warn=function(){t("warn",arguments)},e.error=function(){t("error",arguments)}}function r(e,r,t){return n(e,r,t),e.plugin_version=g,e}function t(n,e){var r=u.kit.encodeTrackData(e);return n.indexOf("?")!==-1?n+"&"+r:n+"?"+r}function a(n){var e=new c.ImageSend(n);e.start()}function i(n,e){var r=null;c.isObject(n.config)&&(r=c.optimizeServerUrl(n.config.server_url));var i=r||n.server_url,o=n.data;n.server_url=i,c.isArray(i)&&i.length?c.each(i,function(e){e&&(n.data=t(e,o),n.callback=null,n.server_url=e,a(n))}):"string"==typeof i&&""!==i?(n.data=t(i,o),a(n)):u.logger&&u.logger.msg("\u5f53\u524d server_url \u4e3a\u7a7a\u6216\u4e0d\u6b63\u786e\uff0c\u53ea\u5728\u63a7\u5236\u53f0\u6253\u5370\u65e5\u5fd7\uff0cnetwork \u4e2d\u4e0d\u4f1a\u53d1\u6570\u636e\uff0c\u8bf7\u914d\u7f6e\u6b63\u786e\u7684 server_url\uff01").level("warn").log(),e.cancellationToken.stop()}function o(){"image"!==u.para.send_type&&"ajax"!==u.para.send_type&&"beacon"!==u.para.send_type&&(u.para.send_type="image")}function l(){u.on("sdkInitPara",function(){o()}),u.on("sdkAfterInitPara",function(){u.registerInterceptor("sendDataStage",{send:{priority:130,entry:i}})})}var u,c,g="1.27.4",s={plugin_name:"ImageSender",init:function(n){u=n,c=u._,l()}},f=r(s);return f}();
--------------------------------------------------------------------------------
/dist/web/plugin/image-sender/index.es6.js:
--------------------------------------------------------------------------------
1 | var sd,_,sdkversion_placeholder="1.27.4";function wrapPluginInitFn(n,e,r){if(e&&(n.plugin_name=e),r&&n.init){var t=n.init;n.init=function(a,i){if(wrapLogFn(a,n,e),a.readyState&&a.readyState.state>=3||!a.on)return o();function o(){t.call(n,a,i)}a.on(r,o)}}return n}function wrapLogFn(n,e,r){function t(e,t){n.logger?n.logger.msg.apply(n.logger,t).module(r+""||"").level(e).log():n.log&&n.log.apply(n,t)}e.log=function(){t("log",arguments)},e.warn=function(){t("warn",arguments)},e.error=function(){t("error",arguments)}}function createPlugin(n,e,r){return wrapPluginInitFn(n,e,r),n.plugin_version=sdkversion_placeholder,n}function getSendUrl(n,e){var r=sd.kit.encodeTrackData(e);return-1!==n.indexOf("?")?n+"&"+r:n+"?"+r}function sendData(n){new _.ImageSend(n).start()}function sendInterceptor(n,e){var r=null;_.isObject(n.config)&&(r=_.optimizeServerUrl(n.config.server_url));var t=r||n.server_url,a=n.data;n.server_url=t,_.isArray(t)&&t.length?_.each(t,function(e){e&&(n.data=getSendUrl(e,a),n.callback=null,n.server_url=e,sendData(n))}):"string"==typeof t&&""!==t?(n.data=getSendUrl(t,a),sendData(n)):sd.logger&&sd.logger.msg("\u5f53\u524d server_url \u4e3a\u7a7a\u6216\u4e0d\u6b63\u786e\uff0c\u53ea\u5728\u63a7\u5236\u53f0\u6253\u5370\u65e5\u5fd7\uff0cnetwork \u4e2d\u4e0d\u4f1a\u53d1\u6570\u636e\uff0c\u8bf7\u914d\u7f6e\u6b63\u786e\u7684 server_url\uff01").level("warn").log(),e.cancellationToken.stop()}function initPara(){"image"!==sd.para.send_type&&"ajax"!==sd.para.send_type&&"beacon"!==sd.para.send_type&&(sd.para.send_type="image")}function senderInit(){sd.on("sdkInitPara",function(){initPara()}),sd.on("sdkAfterInitPara",function(){sd.registerInterceptor("sendDataStage",{send:{priority:130,entry:sendInterceptor}})})}var ImageSender={plugin_name:"ImageSender",init:function(n){_=(sd=n)._,senderInit()}},index=createPlugin(ImageSender);export default index;
--------------------------------------------------------------------------------
/dist/web/plugin/image-sender/index.js:
--------------------------------------------------------------------------------
1 | (window.SensorsDataWebJSSDKPlugin=window.SensorsDataWebJSSDKPlugin||{}).ImageSender=function(){"use strict";function n(n,r,t){if(r&&(n.plugin_name=r),t&&n.init){var a=n.init;n.init=function(i,o){function l(){a.call(n,i,o)}return e(i,n,r),i.readyState&&i.readyState.state>=3||!i.on?l():void i.on(t,l)}}return n}function e(n,e,r){function t(e,t){n.logger?n.logger.msg.apply(n.logger,t).module(r+""||"").level(e).log():n.log&&n.log.apply(n,t)}e.log=function(){t("log",arguments)},e.warn=function(){t("warn",arguments)},e.error=function(){t("error",arguments)}}function r(e,r,t){return n(e,r,t),e.plugin_version=c,e}function t(n,e){var r=u.kit.encodeTrackData(e);return n.indexOf("?")!==-1?n+"&"+r:n+"?"+r}function a(n){var e=new g.ImageSend(n);e.start()}function i(n,e){var r=null;g.isObject(n.config)&&(r=g.optimizeServerUrl(n.config.server_url));var i=r||n.server_url,o=n.data;n.server_url=i,g.isArray(i)&&i.length?g.each(i,function(e){e&&(n.data=t(e,o),n.callback=null,n.server_url=e,a(n))}):"string"==typeof i&&""!==i?(n.data=t(i,o),a(n)):u.logger&&u.logger.msg("\u5f53\u524d server_url \u4e3a\u7a7a\u6216\u4e0d\u6b63\u786e\uff0c\u53ea\u5728\u63a7\u5236\u53f0\u6253\u5370\u65e5\u5fd7\uff0cnetwork \u4e2d\u4e0d\u4f1a\u53d1\u6570\u636e\uff0c\u8bf7\u914d\u7f6e\u6b63\u786e\u7684 server_url\uff01").level("warn").log(),e.cancellationToken.stop()}function o(){"image"!==u.para.send_type&&"ajax"!==u.para.send_type&&"beacon"!==u.para.send_type&&(u.para.send_type="image")}function l(){u.on("sdkInitPara",function(){o()}),u.on("sdkAfterInitPara",function(){u.registerInterceptor("sendDataStage",{send:{priority:130,entry:i}})})}var u,g,c="1.27.4",s={plugin_name:"ImageSender",init:function(n){u=n,g=u._,l()}},f=r(s);return f}();
--------------------------------------------------------------------------------
/dist/web/plugin/image-sender/readme.md:
--------------------------------------------------------------------------------
1 | # image 发送数据
2 | >⚠️ 此插件已自动集成在 SDK 中,禁止手动使用!
3 |
4 | ## 功能
5 | 初始化 Web SDK 配置 `send_type` 为 `image` 或不设置 `send_type` 时,页面行为数据通过新建 `img` 元素方法发送采集数据。该发送方式为兜底发送方式。
6 |
7 | ## ⚠️ 注意
8 | - 插件和 SDK 必须在同一个版本中,请勿混合不同版本的 SDK 和插件进行使用。
--------------------------------------------------------------------------------
/dist/web/plugin/ios-bridge/index.closure.js:
--------------------------------------------------------------------------------
1 | !function(){"use strict";function e(e,r,a){if(r&&(e.plugin_name=r),a&&e.init){var n=e.init;e.init=function(t,s){function o(){n.call(e,t,s)}return i(t,e,r),t.readyState&&t.readyState.state>=3||!t.on?o():void t.on(a,o)}}return e}function i(e,i,r){function a(i,a){e.logger?e.logger.msg.apply(e.logger,a).module(r+""||"").level(i).log():e.log&&e.log.apply(e,a)}i.log=function(){a("log",arguments)},i.warn=function(){a("warn",arguments)},i.error=function(){a("error",arguments)}}function r(i,r,a){return e(i,r,a),i.plugin_version=g,i}function a(){if(s=window.SensorsData_iOS_JS_Bridge&&window.SensorsData_iOS_JS_Bridge.sensorsdata_app_server_url,o=function(){return window.webkit&&window.webkit.messageHandlers&&window.webkit.messageHandlers.sensorsdataNativeTracker},d&&!d.bridge.activeBridge&&o()&&o().postMessage){if(d.bridge.activeBridge=l,d.para.app_js_bridge&&!d.para.app_js_bridge.is_mui&&(d.bridge.is_verify_success=s&&d.bridge.validateAppUrl(s)),d.bridge.bridge_info={touch_app_bridge:!0,platform:"ios",verify_success:d.bridge.is_verify_success?"success":"fail",support_two_way_call:!0},!d.para.app_js_bridge)return void c("app_js_bridge is not configured, data will not be sent by iOS bridge.");d.registerInterceptor("sendDataStage",{send:{priority:70,entry:n}}),c("IOS bridge inits succeed.")}}function n(e,i){if(d.para.app_js_bridge.is_mui||"item_set"===e.data.type||"item_delete"===e.data.type)return e;var r=e.callback;return d.bridge.is_verify_success?(o()&&o().postMessage(JSON.stringify({callType:"app_h5_track",data:_.extend({server_url:d.para.server_url},e.data)})),_.isFunction(r)&&r(),i.cancellationToken.cancel(),e):d.para.app_js_bridge.is_send?(d.debug.apph5({data:e.data,step:"4.1",output:"all"}),e):(_.isFunction(r)&&r(),i.cancellationToken.cancel(),e)}function t(e){var i=e.callType;return"page_info"!==i&&"visualized_track"!==i||d.bridge.hasVisualModeBridge()?"sensorsdata_get_app_visual_config"===i?_.isObject(window.SensorsData_APP_New_H5_Bridge)&&window.SensorsData_APP_New_H5_Bridge[i]:o()&&o().postMessage(JSON.stringify(e)):null}var s,o,d,_,c,g="1.27.4",l={init:function(e){d=e,_=d&&d._,c=d&&d.log||console&&console.log||function(){},a()},handleCommand:t},u=r(l,"IOSBridge","sdkAfterInitPara");return u}();
--------------------------------------------------------------------------------
/dist/web/plugin/ios-bridge/index.es6.js:
--------------------------------------------------------------------------------
1 | var iosServerUrl,iosTracker,sd,_,log,sdkversion_placeholder="1.27.4";function wrapPluginInitFn(e,r,i){if(r&&(e.plugin_name=r),i&&e.init){var a=e.init;e.init=function(s,n){if(wrapLogFn(s,e,r),s.readyState&&s.readyState.state>=3||!s.on)return t();function t(){a.call(e,s,n)}s.on(i,t)}}return e}function wrapLogFn(e,r,i){function a(r,a){e.logger?e.logger.msg.apply(e.logger,a).module(i+""||"").level(r).log():e.log&&e.log.apply(e,a)}r.log=function(){a("log",arguments)},r.warn=function(){a("warn",arguments)},r.error=function(){a("error",arguments)}}function createPlugin(e,r,i){return wrapPluginInitFn(e,r,i),e.plugin_version=sdkversion_placeholder,e}var IOSBridge={init:function(e){_=(sd=e)&&sd._,log=sd&&sd.log||console&&console.log||function(){},initBridge()},handleCommand:handleCommand};function initBridge(){iosServerUrl=window.SensorsData_iOS_JS_Bridge&&window.SensorsData_iOS_JS_Bridge.sensorsdata_app_server_url,iosTracker=function(){return window.webkit&&window.webkit.messageHandlers&&window.webkit.messageHandlers.sensorsdataNativeTracker},sd&&!sd.bridge.activeBridge&&iosTracker()&&iosTracker().postMessage&&(sd.bridge.activeBridge=IOSBridge,sd.para.app_js_bridge&&!sd.para.app_js_bridge.is_mui&&(sd.bridge.is_verify_success=iosServerUrl&&sd.bridge.validateAppUrl(iosServerUrl)),sd.bridge.bridge_info={touch_app_bridge:!0,platform:"ios",verify_success:sd.bridge.is_verify_success?"success":"fail",support_two_way_call:!0},sd.para.app_js_bridge?(sd.registerInterceptor("sendDataStage",{send:{priority:70,entry:sendData}}),log("IOS bridge inits succeed.")):log("app_js_bridge is not configured, data will not be sent by iOS bridge."))}function sendData(e,r){if(sd.para.app_js_bridge.is_mui||"item_set"===e.data.type||"item_delete"===e.data.type)return e;var i=e.callback;return sd.bridge.is_verify_success?(iosTracker()&&iosTracker().postMessage(JSON.stringify({callType:"app_h5_track",data:_.extend({server_url:sd.para.server_url},e.data)})),_.isFunction(i)&&i(),r.cancellationToken.cancel(),e):sd.para.app_js_bridge.is_send?(sd.debug.apph5({data:e.data,step:"4.1",output:"all"}),e):(_.isFunction(i)&&i(),r.cancellationToken.cancel(),e)}function handleCommand(e){var r=e.callType;return"page_info"!==r&&"visualized_track"!==r||sd.bridge.hasVisualModeBridge()?"sensorsdata_get_app_visual_config"===r?_.isObject(window.SensorsData_APP_New_H5_Bridge)&&window.SensorsData_APP_New_H5_Bridge[r]:iosTracker()&&iosTracker().postMessage(JSON.stringify(e)):null}var index=createPlugin(IOSBridge,"IOSBridge","sdkAfterInitPara");export default index;
--------------------------------------------------------------------------------
/dist/web/plugin/ios-bridge/index.js:
--------------------------------------------------------------------------------
1 | (window.SensorsDataWebJSSDKPlugin=window.SensorsDataWebJSSDKPlugin||{}).IOSBridge=function(){"use strict";function e(e,r,a){if(r&&(e.plugin_name=r),a&&e.init){var n=e.init;e.init=function(t,s){function o(){n.call(e,t,s)}return i(t,e,r),t.readyState&&t.readyState.state>=3||!t.on?o():void t.on(a,o)}}return e}function i(e,i,r){function a(i,a){e.logger?e.logger.msg.apply(e.logger,a).module(r+""||"").level(i).log():e.log&&e.log.apply(e,a)}i.log=function(){a("log",arguments)},i.warn=function(){a("warn",arguments)},i.error=function(){a("error",arguments)}}function r(i,r,a){return e(i,r,a),i.plugin_version=c,i}function a(){if(s=window.SensorsData_iOS_JS_Bridge&&window.SensorsData_iOS_JS_Bridge.sensorsdata_app_server_url,o=function(){return window.webkit&&window.webkit.messageHandlers&&window.webkit.messageHandlers.sensorsdataNativeTracker},d&&!d.bridge.activeBridge&&o()&&o().postMessage){if(d.bridge.activeBridge=l,d.para.app_js_bridge&&!d.para.app_js_bridge.is_mui&&(d.bridge.is_verify_success=s&&d.bridge.validateAppUrl(s)),d.bridge.bridge_info={touch_app_bridge:!0,platform:"ios",verify_success:d.bridge.is_verify_success?"success":"fail",support_two_way_call:!0},!d.para.app_js_bridge)return void g("app_js_bridge is not configured, data will not be sent by iOS bridge.");d.registerInterceptor("sendDataStage",{send:{priority:70,entry:n}}),g("IOS bridge inits succeed.")}}function n(e,i){if(d.para.app_js_bridge.is_mui||"item_set"===e.data.type||"item_delete"===e.data.type)return e;var r=e.callback;return d.bridge.is_verify_success?(o()&&o().postMessage(JSON.stringify({callType:"app_h5_track",data:_.extend({server_url:d.para.server_url},e.data)})),_.isFunction(r)&&r(),i.cancellationToken.cancel(),e):d.para.app_js_bridge.is_send?(d.debug.apph5({data:e.data,step:"4.1",output:"all"}),e):(_.isFunction(r)&&r(),i.cancellationToken.cancel(),e)}function t(e){var i=e.callType;return"page_info"!==i&&"visualized_track"!==i||d.bridge.hasVisualModeBridge()?"sensorsdata_get_app_visual_config"===i?_.isObject(window.SensorsData_APP_New_H5_Bridge)&&window.SensorsData_APP_New_H5_Bridge[i]:o()&&o().postMessage(JSON.stringify(e)):null}var s,o,d,_,g,c="1.27.4",l={init:function(e){d=e,_=d&&d._,g=d&&d.log||console&&console.log||function(){},a()},handleCommand:t},u=r(l,"IOSBridge","sdkAfterInitPara");return u}();
--------------------------------------------------------------------------------
/dist/web/plugin/ios-bridge/readme.md:
--------------------------------------------------------------------------------
1 | # iOS 平台打通
2 | >⚠️ 此插件已自动集成在 SDK 中,禁止手动使用!
3 | ## 功能
4 | iOS APP 内嵌 H5 打通插件使得内嵌 H5 页面行为数据通过 APP 进行发送,使得 H5页面 和 APP 数据达到用户统一。
5 | 对于嵌入 App 中 H5 页面,如果 App 也集成了神策分析的 SDK ,H5 页面数据可以通过 App 进行上报,会自动添加 App 获取到的预置属性。
6 |
7 | 在使用打通插件后,同时还需要在 App 端进行打通配置,参考[iOS打通](https://manual.sensorsdata.cn/sa/latest/tech_sdk_client_ios_use-7538614.html#id-%E9%9B%86%E6%88%90%E6%96%87%E6%A1%A3%EF%BC%88iOS%EF%BC%89-%E6%89%93%E9%80%9AApp%E4%B8%8EH5)。
8 | 更多关于打通功能说明请查看[官网文档](https://manual.sensorsdata.cn/sa/latest/tech_sdk_client_link-1573914.html)。
9 | ### 原理
10 | App SDK 暴露桥对象到浏览器控件 `window` 全局对象, JS SDK 通过该对象将上报数据发送给 App SDK。 App SDK 对数据进行处理及上报。
11 | ## 变动
12 | App 上报数据中会添加 App 端相关的数据例如运营商名称 `$carrier`。浏览器网络请求中不再有数据上报请求。
13 |
14 | ## ⚠️ 注意
15 | - 插件和 SDK 必须在同一个版本中,请勿混合不同版本的 SDK 和插件进行使用。
--------------------------------------------------------------------------------
/dist/web/plugin/ios-obsolete-bridge/index.closure.js:
--------------------------------------------------------------------------------
1 | !function(){"use strict";function e(e,r,n){if(r&&(e.plugin_name=r),n&&e.init){var i=e.init;e.init=function(a,o){function s(){i.call(e,a,o)}return t(a,e,r),a.readyState&&a.readyState.state>=3||!a.on?s():void a.on(n,s)}}return e}function t(e,t,r){function n(t,n){e.logger?e.logger.msg.apply(e.logger,n).module(r+""||"").level(t).log():e.log&&e.log.apply(e,n)}t.log=function(){n("log",arguments)},t.warn=function(){n("warn",arguments)},t.error=function(){n("error",arguments)}}function r(t,r,n){return e(t,r,n),t.plugin_version=l,t}function n(){if(s&&!s.bridge.activeBridge&&i()){if(s.bridge.activeBridge=g,s.bridge.bridge_info={touch_app_bridge:!0,platform:"ios",verify_success:a()?"success":"fail"},!s.para.app_js_bridge)return void c("app_js_bridge is not configured, data will not be sent by iOS obsolete bridge.");s.registerInterceptor("sendDataStage",{send:{priority:90,entry:o}}),c("IOS obsolete bridge inits succeed.")}}function i(){return(/sensors-verify/.test(navigator.userAgent)||/sa-sdk-ios/.test(navigator.userAgent))&&!window.MSStream}function a(){if(/sensors-verify/.test(navigator.userAgent)){var e=navigator.userAgent.match(/sensors-verify\/([^\s]+)/);if(e&&e[0]&&"string"==typeof e[1]&&2===e[1].split("?").length){e=e[1].split("?");var t=null,r=null;try{t=u.URL(s.para.server_url).hostname,r=u.URL(s.para.server_url).searchParams.get("project")||"default"}catch(n){s.log(n)}return!(!t||t!==e[0]||!r||r!==e[1])}return!1}return!!/sa-sdk-ios/.test(navigator.userAgent)}function o(e,t){function r(e){var t=JSON.stringify(u.extend({server_url:s.para.server_url},e));return t=t.replace(/\r\n/g,""),t=encodeURIComponent(t),"sensorsanalytics://trackEvent?event="+t}if(s.para.app_js_bridge.is_mui||"item_set"===e.data.type||"item_delete"===e.data.type)return e;var n=e.callback;if(s.bridge.bridge_info.verify_success){var i=document.createElement("iframe"),a=r(e.data);return i.setAttribute("src",a),document.documentElement.appendChild(i),i.parentNode.removeChild(i),i=null,u.isFunction(n)&&n(),t.cancellationToken.cancel(),!0}return s.para.app_js_bridge.is_send?(s.debug.apph5({data:e.data,step:"3.2",output:"all"}),e):(u.isFunction(n)&&n(),t.cancellationToken.cancel(),e)}var s,u,c,l="1.27.4",g={init:function(e){s=e,u=s&&s._,c=s&&s.log||console&&console.log||function(){},n()}},d=r(g,"IOSObsoleteBridge","sdkAfterInitPara");return d}();
--------------------------------------------------------------------------------
/dist/web/plugin/ios-obsolete-bridge/index.es6.js:
--------------------------------------------------------------------------------
1 | var sd,_,log,sdkversion_placeholder="1.27.4";function wrapPluginInitFn(e,r,t){if(r&&(e.plugin_name=r),t&&e.init){var n=e.init;e.init=function(i,s){if(wrapLogFn(i,e,r),i.readyState&&i.readyState.state>=3||!i.on)return a();function a(){n.call(e,i,s)}i.on(t,a)}}return e}function wrapLogFn(e,r,t){function n(r,n){e.logger?e.logger.msg.apply(e.logger,n).module(t+""||"").level(r).log():e.log&&e.log.apply(e,n)}r.log=function(){n("log",arguments)},r.warn=function(){n("warn",arguments)},r.error=function(){n("error",arguments)}}function createPlugin(e,r,t){return wrapPluginInitFn(e,r,t),e.plugin_version=sdkversion_placeholder,e}var IOSObsoleteBridge={init:function(e){_=(sd=e)&&sd._,log=sd&&sd.log||console&&console.log||function(){},initBridge()}};function initBridge(){sd&&!sd.bridge.activeBridge&&hasBridge()&&(sd.bridge.activeBridge=IOSObsoleteBridge,sd.bridge.bridge_info={touch_app_bridge:!0,platform:"ios",verify_success:verifyIOSObsoleteBridge()?"success":"fail"},sd.para.app_js_bridge?(sd.registerInterceptor("sendDataStage",{send:{priority:90,entry:sendData}}),log("IOS obsolete bridge inits succeed.")):log("app_js_bridge is not configured, data will not be sent by iOS obsolete bridge."))}function hasBridge(){return(/sensors-verify/.test(navigator.userAgent)||/sa-sdk-ios/.test(navigator.userAgent))&&!window.MSStream}function verifyIOSObsoleteBridge(){if(/sensors-verify/.test(navigator.userAgent)){var e=navigator.userAgent.match(/sensors-verify\/([^\s]+)/);if(e&&e[0]&&"string"==typeof e[1]&&2===e[1].split("?").length){e=e[1].split("?");var r=null,t=null;try{r=_.URL(sd.para.server_url).hostname,t=_.URL(sd.para.server_url).searchParams.get("project")||"default"}catch(n){sd.log(n)}return!(!r||r!==e[0]||!t||t!==e[1])}return!1}return!!/sa-sdk-ios/.test(navigator.userAgent)}function sendData(e,r){if(sd.para.app_js_bridge.is_mui||"item_set"===e.data.type||"item_delete"===e.data.type)return e;var t,n,i=e.callback;if(sd.bridge.bridge_info.verify_success){var s=document.createElement("iframe"),a=(t=e.data,n=(n=JSON.stringify(_.extend({server_url:sd.para.server_url},t))).replace(/\r\n/g,""),"sensorsanalytics://trackEvent?event="+(n=encodeURIComponent(n)));return s.setAttribute("src",a),document.documentElement.appendChild(s),s.parentNode.removeChild(s),s=null,_.isFunction(i)&&i(),r.cancellationToken.cancel(),!0}return sd.para.app_js_bridge.is_send?(sd.debug.apph5({data:e.data,step:"3.2",output:"all"}),e):(_.isFunction(i)&&i(),r.cancellationToken.cancel(),e)}var index=createPlugin(IOSObsoleteBridge,"IOSObsoleteBridge","sdkAfterInitPara");export default index;
--------------------------------------------------------------------------------
/dist/web/plugin/ios-obsolete-bridge/index.js:
--------------------------------------------------------------------------------
1 | (window.SensorsDataWebJSSDKPlugin=window.SensorsDataWebJSSDKPlugin||{}).IOSObsoleteBridge=function(){"use strict";function e(e,r,n){if(r&&(e.plugin_name=r),n&&e.init){var i=e.init;e.init=function(a,o){function s(){i.call(e,a,o)}return t(a,e,r),a.readyState&&a.readyState.state>=3||!a.on?s():void a.on(n,s)}}return e}function t(e,t,r){function n(t,n){e.logger?e.logger.msg.apply(e.logger,n).module(r+""||"").level(t).log():e.log&&e.log.apply(e,n)}t.log=function(){n("log",arguments)},t.warn=function(){n("warn",arguments)},t.error=function(){n("error",arguments)}}function r(t,r,n){return e(t,r,n),t.plugin_version=c,t}function n(){if(s&&!s.bridge.activeBridge&&i()){if(s.bridge.activeBridge=g,s.bridge.bridge_info={touch_app_bridge:!0,platform:"ios",verify_success:a()?"success":"fail"},!s.para.app_js_bridge)return void l("app_js_bridge is not configured, data will not be sent by iOS obsolete bridge.");s.registerInterceptor("sendDataStage",{send:{priority:90,entry:o}}),l("IOS obsolete bridge inits succeed.")}}function i(){return(/sensors-verify/.test(navigator.userAgent)||/sa-sdk-ios/.test(navigator.userAgent))&&!window.MSStream}function a(){if(/sensors-verify/.test(navigator.userAgent)){var e=navigator.userAgent.match(/sensors-verify\/([^\s]+)/);if(e&&e[0]&&"string"==typeof e[1]&&2===e[1].split("?").length){e=e[1].split("?");var t=null,r=null;try{t=u.URL(s.para.server_url).hostname,r=u.URL(s.para.server_url).searchParams.get("project")||"default"}catch(n){s.log(n)}return!(!t||t!==e[0]||!r||r!==e[1])}return!1}return!!/sa-sdk-ios/.test(navigator.userAgent)}function o(e,t){function r(e){var t=JSON.stringify(u.extend({server_url:s.para.server_url},e));return t=t.replace(/\r\n/g,""),t=encodeURIComponent(t),"sensorsanalytics://trackEvent?event="+t}if(s.para.app_js_bridge.is_mui||"item_set"===e.data.type||"item_delete"===e.data.type)return e;var n=e.callback;if(s.bridge.bridge_info.verify_success){var i=document.createElement("iframe"),a=r(e.data);return i.setAttribute("src",a),document.documentElement.appendChild(i),i.parentNode.removeChild(i),i=null,u.isFunction(n)&&n(),t.cancellationToken.cancel(),!0}return s.para.app_js_bridge.is_send?(s.debug.apph5({data:e.data,step:"3.2",output:"all"}),e):(u.isFunction(n)&&n(),t.cancellationToken.cancel(),e)}var s,u,l,c="1.27.4",g={init:function(e){s=e,u=s&&s._,l=s&&s.log||console&&console.log||function(){},n()}},d=r(g,"IOSObsoleteBridge","sdkAfterInitPara");return d}();
--------------------------------------------------------------------------------
/dist/web/plugin/ios-obsolete-bridge/readme.md:
--------------------------------------------------------------------------------
1 | # iOS 平台旧版本打通
2 | >⚠️ 此插件已自动集成在 SDK 中,禁止手动使用!
3 | ## 功能
4 | 此插件为历史兼容版本的 iOS 打通插件。
5 | iOS APP 内嵌 H5 打通插件使得内嵌 H5 页面行为数据通过 APP 进行发送,使得 H5页面 和 APP 数据达到用户统一。
6 | 对于嵌入 App 中 H5 页面,如果 App 也集成了神策分析的 SDK ,H5 页面数据可以通过 App 进行上报,会自动添加 App 获取到的预置属性。
7 |
8 | 在使用打通插件后,同时还需要在 App 端进行打通配置,参考[iOS打通](https://manual.sensorsdata.cn/sa/latest/tech_sdk_client_ios_use-7538614.html#id-%E9%9B%86%E6%88%90%E6%96%87%E6%A1%A3%EF%BC%88iOS%EF%BC%89-%E6%89%93%E9%80%9AApp%E4%B8%8EH5)。
9 | 更多关于打通功能说明请查看[官网文档](https://manual.sensorsdata.cn/sa/latest/tech_sdk_client_link-1573914.html)。
10 | ### 原理
11 | App SDK 暴露桥对象到浏览器控件 `window` 全局对象, JS SDK 通过该对象将上报数据发送给 App SDK。 App SDK 对数据进行处理及上报。
12 | ## 变动
13 | App 上报数据中会添加 App 端相关的数据例如运营商名称 `$carrier`。浏览器网络请求中不再有数据上报请求。
14 |
15 | ## ⚠️ 注意
16 | - 插件和 SDK 必须在同一个版本中,请勿混合不同版本的 SDK 和插件进行使用。
--------------------------------------------------------------------------------
/dist/web/plugin/jsapp-sender/index.closure.js:
--------------------------------------------------------------------------------
1 | !function(){"use strict";function n(n,a,e){if(a&&(n.plugin_name=a),e&&n.init){var i=n.init;n.init=function(r,o){function p(){i.call(n,r,o)}return t(r,n,a),r.readyState&&r.readyState.state>=3||!r.on?p():void r.on(e,p)}}return n}function t(n,t,a){function e(t,e){n.logger?n.logger.msg.apply(n.logger,e).module(a+""||"").level(t).log():n.log&&n.log.apply(n,e)}t.log=function(){e("log",arguments)},t.warn=function(){e("warn",arguments)},t.error=function(){e("error",arguments)}}function a(t,a,e){return n(t,a,e),t.plugin_version=s,t}function e(n,t){if(p.isObject(o.para.jsapp)&&!o.para.jsapp.isOnline&&"function"==typeof o.para.jsapp.setData){var a=n;delete a.callback,a=JSON.stringify(a),o.para.jsapp.setData(a),t.cancellationToken.stop()}return n}function i(){o.on("sdkAfterInitAPI",function(){p.isObject(o.commonWays)&&(o.commonWays.setOnlineState=r),o.registerInterceptor("sendDataStage",{send:{priority:40,entry:e}})})}function r(n){if(n===!0&&p.isObject(o.para.jsapp)&&"function"==typeof o.para.jsapp.getData){o.para.jsapp.isOnline=!0;var t=o.para.jsapp.getData();p.isArray(t)&&t.length>0&&p.each(t,function(n){p.isJSONString(n)&&o.kit.sendData(JSON.parse(n))})}else o.para.jsapp.isOnline=!1}var o,p,s="1.27.4",c={plugin_name:"JsappSender",init:function(n){o=n,p=o._,i()}},l=a(c);return l}();
--------------------------------------------------------------------------------
/dist/web/plugin/jsapp-sender/index.es6.js:
--------------------------------------------------------------------------------
1 | var sd,_,sdkversion_placeholder="1.27.4";function wrapPluginInitFn(n,e,a){if(e&&(n.plugin_name=e),a&&n.init){var t=n.init;n.init=function(i,r){if(wrapLogFn(i,n,e),i.readyState&&i.readyState.state>=3||!i.on)return s();function s(){t.call(n,i,r)}i.on(a,s)}}return n}function wrapLogFn(n,e,a){function t(e,t){n.logger?n.logger.msg.apply(n.logger,t).module(a+""||"").level(e).log():n.log&&n.log.apply(n,t)}e.log=function(){t("log",arguments)},e.warn=function(){t("warn",arguments)},e.error=function(){t("error",arguments)}}function createPlugin(n,e,a){return wrapPluginInitFn(n,e,a),n.plugin_version=sdkversion_placeholder,n}function sendData(n,e){if(_.isObject(sd.para.jsapp)&&!sd.para.jsapp.isOnline&&"function"==typeof sd.para.jsapp.setData){var a=n;delete a.callback,a=JSON.stringify(a),sd.para.jsapp.setData(a),e.cancellationToken.stop()}return n}function senderInit(){sd.on("sdkAfterInitAPI",function(){_.isObject(sd.commonWays)&&(sd.commonWays.setOnlineState=setOnlineState),sd.registerInterceptor("sendDataStage",{send:{priority:40,entry:sendData}})})}function setOnlineState(n){if(!0===n&&_.isObject(sd.para.jsapp)&&"function"==typeof sd.para.jsapp.getData){sd.para.jsapp.isOnline=!0;var e=sd.para.jsapp.getData();_.isArray(e)&&e.length>0&&_.each(e,function(n){_.isJSONString(n)&&sd.kit.sendData(JSON.parse(n))})}else sd.para.jsapp.isOnline=!1}var JsappSender={plugin_name:"JsappSender",init:function(n){_=(sd=n)._,senderInit()}},index=createPlugin(JsappSender);export default index;
--------------------------------------------------------------------------------
/dist/web/plugin/jsapp-sender/index.js:
--------------------------------------------------------------------------------
1 | (window.SensorsDataWebJSSDKPlugin=window.SensorsDataWebJSSDKPlugin||{}).JsappSender=function(){"use strict";function n(n,t,e){if(t&&(n.plugin_name=t),e&&n.init){var i=n.init;n.init=function(r,o){function p(){i.call(n,r,o)}return a(r,n,t),r.readyState&&r.readyState.state>=3||!r.on?p():void r.on(e,p)}}return n}function a(n,a,t){function e(a,e){n.logger?n.logger.msg.apply(n.logger,e).module(t+""||"").level(a).log():n.log&&n.log.apply(n,e)}a.log=function(){e("log",arguments)},a.warn=function(){e("warn",arguments)},a.error=function(){e("error",arguments)}}function t(a,t,e){return n(a,t,e),a.plugin_version=s,a}function e(n,a){if(p.isObject(o.para.jsapp)&&!o.para.jsapp.isOnline&&"function"==typeof o.para.jsapp.setData){var t=n;delete t.callback,t=JSON.stringify(t),o.para.jsapp.setData(t),a.cancellationToken.stop()}return n}function i(){o.on("sdkAfterInitAPI",function(){p.isObject(o.commonWays)&&(o.commonWays.setOnlineState=r),o.registerInterceptor("sendDataStage",{send:{priority:40,entry:e}})})}function r(n){if(n===!0&&p.isObject(o.para.jsapp)&&"function"==typeof o.para.jsapp.getData){o.para.jsapp.isOnline=!0;var a=o.para.jsapp.getData();p.isArray(a)&&a.length>0&&p.each(a,function(n){p.isJSONString(n)&&o.kit.sendData(JSON.parse(n))})}else o.para.jsapp.isOnline=!1}var o,p,s="1.27.4",c={plugin_name:"JsappSender",init:function(n){o=n,p=o._,i()}},l=t(c);return l}();
--------------------------------------------------------------------------------
/dist/web/plugin/jsapp-sender/readme.md:
--------------------------------------------------------------------------------
1 | # 自定义存储采集数据并自定义发送时机
2 | >⚠️ 此插件已自动集成在 SDK 中,禁止手动使用!
3 |
4 | ## 功能
5 | 通过初始化 Web SDK 配置 `jsapp` 为参数,通过 `jsapp.setData` 方法获取并存储采集数据。在网络或需要发送数据时, 通过 `quick("setOnlineState", true)` 通知 Web SDK 通过 `jsapp.getData` 方法获取存储的采集数据并发送。
6 |
7 | ## 集成
8 | ### ES Module 方式
9 | ```js
10 | sensors.init({
11 | // ... 其他配置
12 | jsapp:{
13 | setData: function (data){
14 | // 自行存储页面采集数据
15 | },
16 | getData: function (){
17 | // 返回存储的页面采集数据集合
18 | return []
19 | }
20 | }
21 |
22 | });
23 | ```
24 |
25 | ## ⚠️ 注意
26 | - 插件和 SDK 必须在同一个版本中,请勿混合不同版本的 SDK 和插件进行使用。
--------------------------------------------------------------------------------
/dist/web/plugin/other-plugin-readme.md:
--------------------------------------------------------------------------------
1 | # 其他插件使用方式
2 | ## 为什么推荐用 ES Module
3 |
4 | 我们推荐使用 ES Module 的方式来使用插件,因为我们需要让插件实例暴露出来,但是如果直接暴露在 window 全局的话,会存在全局变量冲突的风险,这样会影响客户现有的环境。因此我们推荐 ES Module 匿名模块的形式。
5 |
6 | 除此之外,为了兼容传统的 Script 直接加载的方式,还有如下两种模式。
7 |
8 | ## 插件名字符串
9 | 这是 v1.24.1 之前的就使用插件的模式,这种方式在以后也是可以直接使用的。
10 |
11 | 使用方式:
12 |
13 | - 选择使用插件目录下打包出来的不带后缀的 index.js (如果是内置的插件,不需要引入,是否是内置查看官方插件文档)
14 | - use 传入 “插件名字符串” 既可(插件名字符串下面可查)
15 | ```javascript
16 |