跳转至

UniApp 应用接入


前置条件

注意:若您开通了 RUM Headless 服务,前置条件已自动帮您配置完成,直接接入应用即可。

应用接入

当前 UniApp 版本支持 Android 和 iOS 平台。登录观测云控制台,进入用户访问监测页面,点击左上角 新建应用,即可开始创建一个新的应用。

安装

本地使用

源码地址https://github.com/GuanceCloud/datakit-uniapp-native-plugin

Demo 地址https://github.com/GuanceCloud/datakit-uniapp-native-plugin/Hbuilder_Example

下载的 SDK 包结构说明

|--datakit-uniapp-native-plugin
    |-- Hbuilder_Example                // GCUniPlugin 插件的示例工程
        |-- nativeplugins          // 示例工程的本地插件文件夹
            |-- GCUniPlugin           // ⭐️ GCUniPlugin 原生插件包 ⭐️
                |-- android              // 存放 android 插件所需要的依赖库及资源文件
                |-- ios                  // 存放 ios 插件所需要的依赖库及资源文件
                |-- package.json         // 插件配置文件
    |-- UniPlugin-Android           // 插件开发 Android 主工程 
    |-- UniPlugin-iOS                     // 插件开发 iOS 主工程 

GCUniPlugin 文件夹配置到您的 uni_app 项目的 “nativeplugins” 下,还需要在 manifest.json 文件的 “App原生插件配置” 项下点击“选择本地插件”,在列表中选择 GCUniPlugin 插件:

img

注意:保存后,需要提交云端打包,(制作 自定义基座 也属于云端打包)后插件才会生效。

更多详情,可参考:HBuilderX中使用本地插件自定义基座

市场插件方式

(未提供)

SDK 初始化

基础配置

// 在 App.vue 配置
<script>
    var guanceModule = uni.requireNativePlugin("GCUniPlugin-MobileAgent");
    export default {
        onLaunch: function() {
            console.log('App Launch')
            guanceModule.sdkConfig({
                'serverUrl': 'your severurl',
                'debug': true,
                'env': 'common',
                'globalContext': {
                    'custom_key': 'custom value'
                }
            })
        },
        onShow: function() {
            console.log('App Show')
        },
        onHide: function() {
            console.log('App Hide')
        }
    }
</script>
<style>
</style>
参数名称 参数类型 必须 参数说明
serverUrl string datakit 访问 URL 地址,例子:http://10.0.0.1:9529,端口默认 9529。注意:安装 SDK 设备需能访问这地址
debug boolean 设置是否允许打印 Debug 日志,默认false
env string 环境,默认prod,任意字符,建议使用单个单词,例如 test
service string 设置所属业务或服务的名称 默认:df_rum_iosdf_rum_android
globalContext object 添加自定义标签
offlinePakcage boolean 仅 Android 支持,是否使用离线打包,默认为 false,详细说明见Android 云打包与离线打包区别

RUM 配置

var rum = uni.requireNativePlugin("GCUniPlugin-RUM");
rum.setConfig({
        'androidAppId':'YOUR_ANDROID_APP_ID',
                'iOSAppId':'YOUR_IOS_APP_ID',
                'errorMonitorType':'all', // or 'errorMonitorType':['battery','memory']
                'deviceMonitorType':['cpu','memory']// or  'deviceMonitorType':'all'
            })
参数名称 参数类型 必须 说明
androidAppId string appId,监测中申请
iOSAppId string appId,监测中申请
samplerate number 采样率,取值范围 [0,1],0 表示不采集,1 表示全采集,默认值为 1。作用域为同一 session_id 下所有 View,Action,LongTask,Error 数据
enableNativeUserAction boolean 是否进行 Native Action 追踪,Button 点击事件,纯 uni-app 应用建议关闭,默认为 false,Android 云打包不支持
enableNativeUserResource boolean 是否进行 Native Resource 自动追踪,纯 uni-app 应用建议关闭,默认为 false ,Android 云打包不支持
enableNativeUserView boolean 是否进行 Native View 自动追踪,纯 uni-app 应用建议关闭,,默认为 false
errorMonitorType string/array 错误监控补充类型:allbatterymemorycpu
deviceMonitorType string/array 页面监控补充类型: allbattery(仅Android支持)、 memorycpufps
detectFrequency string 页面监控频率:normal(默认)、 frequentrare
globalContext object 自定义全局参数,特殊 key :track_id (用于追踪功能)

Log 配置

var logger = uni.requireNativePlugin("GCUniPlugin-Logger");
logger.setConfig({
  'enableLinkRumData':true,
  'enableCustomLog':true,
  'discardStrategy':'discardOldest'
})
参数名称 参数类型 必须 参数说明
samplerate number 采样率,取值范围 [0,1],0 表示不采集,1 表示全采集,默认值为 1。
enableLinkRumData boolean 是否与 RUM 关联
enableCustomLog boolean 是否开启自定义日志
discardStrategy string 日志丢弃策略:discard丢弃新数据(默认)、discardOldest丢弃旧数据
logLevelFilters array 日志等级过滤,数组中需填写 日志等级info提示、warning警告、error错误、criticalok恢复
globalContext object 自定义全局参数

Trace 配置

var tracer = uni.requireNativePlugin("GCUniPlugin-Tracer");
tracer.setConfig({
                'traceType': 'ddTrace'
            })
参数名称 参数类型 必须 参数说明
samplerate number 采样率,取值范围 [0,1],0 表示不采集,1 表示全采集,默认值为 1。
traceType string 链路类型:ddTrace(默认)、zipkinMultiHeaderzipkinSingleHeadertraceparentskywalkingjaeger
enableLinkRUMData boolean 是否与 RUM 数据关联,默认false
enableNativeAutoTrace boolean 是否开启原生网络自动追踪 iOS NSURLSession ,Android OKhttp,默认false, 纯 uni-app 应用建议关闭, Android 云打包不支持

RUM 用户数据追踪

var rum = uni.requireNativePlugin("GCUniPlugin-RUM");

Action

API - startAction

添加 Action 事件:

rum.startAction({
                    'actionName': 'action name',
                    'actionType': 'action type'
                })
参数名称 参数类型 必须 参数说明
actionName string 事件名称
actionType string 事件类型
property object 事件上下文(可选)

View

  • 自动采集
// 自动采集,可参考 SDK 包内 GCUniPlugin 插件的示例工程
// step 1. 在 SDK 包内找到 GCWatchRouter.js、GCPageMixin.js 文件,添加到您的工程
// step 2. 在 App.vue 添加 Router 监控,如下:
<script>
    import WatchRouter from '@/GCWatchRouter.js'
    export default {
    mixins:[WatchRouter],
    }
</script>
// step 3. 在应用显示的第一个 page 页面添加 pageMixin 如下
<script>
    import GCPageMixin from '../../GCPageMixin.js';
    export default {
        data() {
            return {}
        },
        mixins:[GCPageMixin],
    }
</script>
  • 手动采集
// 手动采集 View 的生命周期
// step 1(可选)
rum.onCreateView({
                    'viewName': 'Current Page Name',
                    'loadTime': 100000000,
                })
// step 2
rum.startView('Current Page Name')
// step 3  
rum.stopView()         

API - onCreateView

创建页面时长记录

参数名称 参数类型 必须 参数说明
viewName string 页面名称
loadTime number 页面加载时间(纳秒级别时间戳)

API - startView

进入页面

参数名称 参数类型 必须 参数说明
viewName string 页面名称
property object 事件上下文(可选)

API - stopView

离开页面

参数名称 参数类型 必须 参数说明
property object 事件上下文(可选)

Error

  • 自动采集
/// 使用 uniapp 错误监听函数 发生脚本错误或 API 调用报错时触发
<script>
  var rum = uni.requireNativePlugin("GCUniPlugin-MobileAgent");
  var appState = 'startup';
    // 只能在App.vue里监听
    export default {
        onLaunch: function() {
            console.log('App Launch')
        },
        onShow: function() {
      appState = 'run'
            console.log('App Show')
        },
        onHide: function() {
            console.log('App Hide')
        },
    onError:function(err){   
            if (err instanceof Error){
                console.log('Error name:', err.name);
                console.log('Error message:', err.message);
                console.log('Error stack:',err.stack);
                rum.addError({
                    'message': err.message,
                    'stack': err.stack,
          'state': appState,
                })
            }else if(err instanceof String){
                console.log('Error:', err);
                rum.addError({
                    'message': err,
                    'stack': err,
          'state': appState,
                })
            }
    }
</script>
  • 手动采集
// 手动添加
rum.addError({
                    'message': 'Error message',
                    'stack': 'Error stack',
                })

API - addError

添加 Error 事件

参数名称 参数类型 必须 参数说明
message string 错误信息
stack string 堆栈信息
state string App 运行状态 (unknownstartuprun)
property object 事件上下文(可选)

Resource

//示例使用 uni.request 进行网络请求,
      let key = Utils.getUUID();//可参考 example utils.js
      // 1. startResource
            rum.startResource({
        'key':key
      });
            var responseHeader;
            var responseBody;
            var resourceStatus;
            uni.request({
                url: requestUrl,
                method: method,
                header: header,
                success: (res) => {
                    responseHeader = res.responseHeader;
                    responseBody = res.data;
                    resourceStatus = res.statusCode;
                },
                fail: (err) =>{
                    responseBody = err.message;
                },
                complete() {
          // 2. stopResource
                    rum.stopResource({
            'key':key
          })
          // 3. addResource
                    rum.addResource({
                        'key': key,
                        'content': {
                            'url': requestUrl,
                            'httpMethod': method,
                            'requestHeader': header,
                            'responseHeader': responseHeader,
                            'responseBody': responseBody,
                            'resourceStatus': resourceStatus,
                        }
                    })
                }
            }); 

API - startResource

HTTP 请求开始

参数名称 参数类型 必须 参数说明
key string 请求唯一标识
property object 事件上下文(可选)

API - stopResource

HTTP 请求结束

参数名称 参数类型 必须 参数说明
key string 请求唯一标识
property object 事件上下文(可选)

API - addResource

参数名称 参数类型 必须 参数说明
key string 请求唯一标识
content content object 请求相关数据

content object

prototype 参数类型 参数说明
url string 请求 url
httpMethod string http 方法
requestHeader object 请求头
responseHeader object 响应头
responseBody string 响应结果
resourceStatus string 请求结果状态码

Logger 日志打印

var logger = uni.requireNativePlugin("GCUniPlugin-Logger");
logger.logging({
                    'content':`Log content`,
                    'status':status
                })

API - logging

参数名称 参数类型 必须 参数说明
content string 日志内容,可为json字符串
status string 日志等级
property object 事件上下文(可选)

日志等级

字符串 含义
info 提示
warning 警告
error 错误
critical 严重
ok 恢复

Tracer 网络链路追踪

//示例使用 uni.request 进行网络请求
var tracer = uni.requireNativePlugin("GCUniPlugin-Tracer");
let key = Utils.getUUID();//可参考 example utils.js
var header = tracer.getTraceHeader({
                    'key': key,
                    'url': requestUrl,
                })
uni.request({
          url: requestUrl,
          header: header,
          success() {
            console.log('success');
          },
          complete() {
            console.log('complete');
          }
        });

API - getTraceHeader

获取 trace 需要添加的请求头,获取后添加到 HTTP 请求的请求头中。

参数名称 参数类型 必须 参数说明
key string 请求唯一标识
url string 请求 URL

返回值类型: object

用户信息绑定与解绑

var guanceModule = uni.requireNativePlugin("GCUniPlugin-MobileAgent");

guanceModule.bindRUMUserData({
                'userId':'Test userId',
                'userName':'Test name',
                'userEmail':'test@123.com',
                'extra':{
                    'age':'20'
                }
            })

guanceModule.unbindRUMUserData()

API - bindRUMUserData

绑定用户信息:

参数名称 参数类型 必须 参数说明
userId string 用户Id
userName string 用户名称
userEmail string 用户邮箱
extra object 用户的额外信息

API - unbindRUMUserData

解绑当前用户

常见问题

插件开发 iOS 主工程 UniPlugin-iOS 使用

下载 UniApp 离线开发 SDK

根据 uni-app 开发工具 HBuilderX 的版本号,下载开发插件需要的 SDK包

SDK 包结构说明

|--iOSSDK   
    |-- HBuilder-Hello              // uni-app 离线打包工程
    |-- HBuilder-uniPluginDemo      // uni-app 插件开发主工程 (本文档需要使用的工程)
    |-- SDK                         // 依赖库及依赖资源文件

将依赖库及依赖资源文件 SDK 文件夹拖到 UniPlugin-iOS 文件夹内,拖拽后目录结构应如下。

|-- UniPlugin-iOS
    |-- HBuilder-uniPluginDemo      // uni-app 插件开发主工程 (本文档需要使用的工程)
    |-- SDK                         // 依赖库及依赖资源文件

更多详情,可参考 iOS 插件开发环境配置

工程配置

1.Architectures 设置

因为 Xcode 12 提供的模拟器支持 arm64 架构,uni_app 提供的 framework 支持的是 arm64 的真机,x86_64 的模拟器。所以

Excluded Architectures 设置 Any iOS Simulator SDK : arm64

2.Other Linker Flags

$(inherited) -ObjC -framework "FTMobileSDK" -framework "Guance_UniPlugin_App"

3.Framework Search Paths

$(inherited)
"${PODS_CONFIGURATION_BUILD_DIR}/FTMobileSDK"
"${PODS_CONFIGURATION_BUILD_DIR}/Guance-UniPlugin-App"
$(DEVELOPER_FRAMEWORKS_DIR)
$(PROJECT_DIR)/../SDK/libs
$(PROJECT_DIR)

插件开发 Android 主工程 UniPlugin-Android 使用

工程配置

详细依赖配置,可参考 Demo

|-- UniPlugin-Android
    |-- app
        |--build.gradle
        //配置 ft-plugin

    |-- uniplugin_module
        |-- src
            |-- main
                |-- java
                    |-- com.ft.sdk.uniapp
        |-- build.gradle 
        //  配置依赖 dependencies
        //implementation 'com.cloudcare.ft.mobile.sdk.tracker.agent:ft-sdk:xxxx'
        //implementation 'com.google.code.gson:gson:xxxx'
        //implementation 'com.cloudcare.ft.mobile.sdk.tracker.agent:ft-native:xxxx'

    |-- build.gradle
        //  配置 repo
        //  maven {
        //          url 'https://mvnrepo.jiagouyun.com/repository/maven-releases'
        //  }
        //
        //  配置 buildScrpit
        //  classpath 'com.cloudcare.ft.mobile.sdk.tracker.plugin:ft-plugin:xxxx'

Android 云打包与离线打包区别

Android 云打包与离线打包使用了两种不同的集成逻辑。离线打包集成方式与观测云 Android SDK 集成方式相同,使用 Android Studio Gradle Plugin 的方式,云打包无法使用 Android Studio Gradle Plugin ,所以只能通过观测云 UniApp Native Plugin 中内部代码实现部分功能。所以离线打包版本配置可选项要比云打包版本更多,SDK 配置中 offlinePakcage参数就是为了区分两种情况。

其他

文档评价

文档内容是否对您有帮助? ×