
uni-app下微信小程序自动埋点
由于公司运营需求,需要给代码埋点,而埋点并不是一个和业务强相关的代码,各个页面的埋点工作量也非常的大,一直琢磨能不能自动埋点呢,于是就有了下面的探索
公司通过uni-app开发的主要是微信小程序,所以本文主要是以开发微信小程序的自动化埋点为主
诸如市面上各种统计代码,需要上报埋点事件时,以百度移动统计为例
getApp().mtj.trackEvent(event, args);就可以上报事件和参数
代码虽然很简单,但每个页面统计的点少的三四个,多的上十个,各个地方的统计代码加起来,数量比较大,而且不方便统一管理。
于是,我想到了方案一
- 在main.js中加入方法

2.在每一个page和component最外层的<view>标签中加入click方法,此时点击页面中的所有任意元素,都会有事件传输到elementTracker方法中,通过判断clickInfo.target是不是目标统计元素,从而决定是否上报,数据也可以从dataset中取到
但这个方法有个不好的地方就是
在这种嵌套结构的view当中时,只有target只会有你点击的对象,也就是你点的是image就只能取image的dataset,点击的是外层的view取外层view的dataset,情况往往是点击view和点击image触发的是同一事件,可能在这里你需要重复写两遍
有没有更好的解决方案呢,答案是有的,利用的是微信的wx.createSelectorQuery,通过点击时计算点击的x,y计算是否落在需要统计的元素上,于是就产生了下面这段代码
通过计算点击区域是否落在需要统计的元素上,这样解决了点击父组件需要统计,点击子组件统计不到的问题
这时,我们的统计代码合元素可以写到一个统一的配置文件里
但是这个方法也不是完美的,有两个bug,一是触发wx.createSelectorQuery返回的异步的结果需要时间,可能页面跳走,元素隐藏或不渲染导致找不到需要统计的元素了,二就是如果元素有重叠,如何知道哪个是在上面的元素
第二个问题我用了一个stop参数标识只要这个元素上报了,那这次点击接下来就停止上报。
参考项目 https://github.com/zhengguorong/xbosstrack-wechat
由于公司运营需求,需要给代码埋点,而埋点并不是一个和业务强相关的代码,各个页面的埋点工作量也非常的大,一直琢磨能不能自动埋点呢,于是就有了下面的探索
公司通过uni-app开发的主要是微信小程序,所以本文主要是以开发微信小程序的自动化埋点为主
诸如市面上各种统计代码,需要上报埋点事件时,以百度移动统计为例
getApp().mtj.trackEvent(event, args);就可以上报事件和参数
代码虽然很简单,但每个页面统计的点少的三四个,多的上十个,各个地方的统计代码加起来,数量比较大,而且不方便统一管理。
于是,我想到了方案一
- 在main.js中加入方法
2.在每一个page和component最外层的<view>标签中加入click方法,此时点击页面中的所有任意元素,都会有事件传输到elementTracker方法中,通过判断clickInfo.target是不是目标统计元素,从而决定是否上报,数据也可以从dataset中取到
但这个方法有个不好的地方就是
在这种嵌套结构的view当中时,只有target只会有你点击的对象,也就是你点的是image就只能取image的dataset,点击的是外层的view取外层view的dataset,情况往往是点击view和点击image触发的是同一事件,可能在这里你需要重复写两遍
有没有更好的解决方案呢,答案是有的,利用的是微信的wx.createSelectorQuery,通过点击时计算点击的x,y计算是否落在需要统计的元素上,于是就产生了下面这段代码
通过计算点击区域是否落在需要统计的元素上,这样解决了点击父组件需要统计,点击子组件统计不到的问题
这时,我们的统计代码合元素可以写到一个统一的配置文件里
但是这个方法也不是完美的,有两个bug,一是触发wx.createSelectorQuery返回的异步的结果需要时间,可能页面跳走,元素隐藏或不渲染导致找不到需要统计的元素了,二就是如果元素有重叠,如何知道哪个是在上面的元素
第二个问题我用了一个stop参数标识只要这个元素上报了,那这次点击接下来就停止上报。
参考项目 https://github.com/zhengguorong/xbosstrack-wechat
收起阅读 »
打安卓包,打包失败,包错误日志https://service.dcloud.net.cn/build/errorLog/f1452b50-92b2-11eb-a333-d744a281b21a
首先,更新 manifest.json 中的版本号。
比如之前是 1.0.0,那么新版本应该是 1.0.1 或 1.1.0 这样。
你要的解决打包失败原因来了:
然后,在 HBuilderX 中生成升级包(wgt)。
菜单->发行->原生App-制作移动App资源升级包
生成结束会在控制台告知升级包的输出位置。
就成功了!希望能帮助到你。
首先,更新 manifest.json 中的版本号。
比如之前是 1.0.0,那么新版本应该是 1.0.1 或 1.1.0 这样。
你要的解决打包失败原因来了:
然后,在 HBuilderX 中生成升级包(wgt)。
菜单->发行->原生App-制作移动App资源升级包
生成结束会在控制台告知升级包的输出位置。
就成功了!希望能帮助到你。
收起阅读 »
关于个推getui,服务端发送推送,在线可以收到,离线永远收不到的问题解决。
1.检查参数是否正确。
- 可以先不要使用透传方式。
- 是否设置了厂商通道消息内容
- 设置为打开应用内特定页面就是intent参数。
- intent参数是否正确
intent:#Intent;component=包名/io.dcloud.PandoraEntry;S.UP-OL-SU=true;S.title=".urlencode(标题).";S.content=".urlencode($内容).";S.payload=".json_encode(你的自定义参数).";end
6.PHP端参考代码。
$api = new \GTClient("https://restapi.getui.com/","", "","");
$stt = ['default'=>1];
//设置推送参数
$push = new \GTPushRequest();
$push->setRequestId(time());
$message = new \GTPushMessage();
$notify = new \GTNotification();
$channel = new \GTPushChannel();
//配置推送条件
$str = new \GTStrategy();
$str->setDefault(1);
$str->setHw(1);
$setting = new \GTSettings(); //定时推送暂无
$setting->setStrategy($str);
$push->setSettings($setting);
$setting->setTtl(3600000); ////消息有效期,走厂商消息需要设置该值
//推送苹果离线通知标题内容
$alert = new \GTAlert();
$alert->setTitle($title);
$alert->setBody($content);
$aps = new \GTAps();
//1表示静默推送(无通知栏消息),静默推送时不需要填写其他参数。
//苹果建议1小时最多推送3条静默消息
$aps->setContentAvailable(0);
$aps->setSound("default");
$aps->setAlert($alert);
$iosDto = new \GTIos();
$iosDto->setAps($aps);
$iosDto->setType("notify");
$pushChannel = new \GTPushChannel();
$pushChannel->setIos($iosDto);
//安卓离线厂商通道推送消息体
$pushChannel = new \GTPushChannel();
$androidDTO = new \GTAndroid();
$ups = new \GTUps();
$notification1 = new \GTThirdNotification();;
$notification1->setTitle($title);
$notification1->setBody($content);
$ups->setNotification($notification1);
if($clickType == 'none') //设置推送类型
{
$notification1->setClickType($clickType);
}else if($clickType == 'payload' || $clickType == 'payload_custom'){ //自定义消息 打开APP和不打开APP
$notification1->setClickType($clickType);
$notification1->setPayload(json_encode($data));
}else if($clickType == 'url'){ //打开URL
$notification1->setClickType($clickType);
$notification1->setUrl($url);
}else if($clickType == 'intent'){ //打开特定页面
$notification1->setClickType($clickType);
$notification1->setIntent("intent:#Intent;component=com.hqtwtq.y8/io.dcloud.PandoraEntry;S.UP-OL-SU=true;S.title=".urlencode($title).";S.content=".urlencode($content).";S.payload=".json_encode($data).";end");
}else{
$notification1->setClickType($clickType);
}
//各厂商自有功能单项设置
if($time){
$message->setDuration($time); //设置推送时间
$data = json_encode(array('title'=>$title,'content'=>$content,'duration'=>$time,'importance'=>'HIGH','payload'=>json_encode($data)));
}else{
$data = json_encode(array('title'=>$title,'content'=>$content,'payload'=>json_encode($data)));
}
//$ups->setTransmission($data);
$androidDTO->setUps($ups);
$pushChannel->setAndroid($androidDTO);
$push->setPushChannel($pushChannel);
//个推在线通道
$notify->setTitle($title);
$notify->setBody($content);
if($img) $notify->setBigImage($img); //推送图片
//1、intent:打开应用内特定页面 2、url:打开网页地址。3、payload:自定义消息内容启动应用。4、payload_custom:自定义消息内容不启动应用。5、startapp:打开应用首页。6、none:纯通知,无后续动作
if($clickType == 'none') //设置推送类型
{
$notify->setClickType($clickType);
}else if($clickType == 'payload' || $clickType == 'payload_custom'){ //自定义消息 打开APP和不打开APP
$notify->setClickType($clickType);
$notify->setPayload(json_encode($data));
}else if($clickType == 'url'){ //打开URL
$notify->setClickType($clickType);
$notify->setUrl($url);
}else if($clickType == 'intent'){ //打开特定页面
$notify->setClickType($clickType);
$notify->setIntent("intent:#Intent;component=com.hqtwtq.y8/io.dcloud.PandoraEntry;S.UP-OL-SU=true;S.title=".urlencode($title).";S.content=".urlencode($content).";S.payload=".json_encode($data).";end");
}else{
$notify->setClickType($clickType);
}
$message->setNotification($notify);
$push->setPushMessage($message);
/* if($time){
$message->setDuration($time); //设置推送时间
$data = json_encode(array('title'=>$title,'body'=>$content,'duration'=>$time,'importance'=>'HIGH','payload'=>json_encode($data)));
}else{
$data = json_encode(array('title'=>$title,'body'=>$content,'payload'=>json_encode($data)));
}
$ups->setTransmission($data); //
$android->setUps($ups);
$channel->setAndroid($android);
$push->setPushChannel($channel);
$push->setPushMessage($message);*/
if($cid) //推送给某个用户
{
$push->setCid($cid);
//处理返回结果
$result = $api->pushApi()->pushToSingleByCid($push);
}else{
$result = $api->pushApi()->pushAll($push);
}
Log::info('推送数据:【推送】'.json_encode($result)); //写入日志
return $result;
1.检查参数是否正确。
- 可以先不要使用透传方式。
- 是否设置了厂商通道消息内容
- 设置为打开应用内特定页面就是intent参数。
- intent参数是否正确
intent:#Intent;component=包名/io.dcloud.PandoraEntry;S.UP-OL-SU=true;S.title=".urlencode(标题).";S.content=".urlencode($内容).";S.payload=".json_encode(你的自定义参数).";end
6.PHP端参考代码。
$api = new \GTClient("https://restapi.getui.com/","", "","");
$stt = ['default'=>1];
//设置推送参数
$push = new \GTPushRequest();
$push->setRequestId(time());
$message = new \GTPushMessage();
$notify = new \GTNotification();
$channel = new \GTPushChannel();
//配置推送条件
$str = new \GTStrategy();
$str->setDefault(1);
$str->setHw(1);
$setting = new \GTSettings(); //定时推送暂无
$setting->setStrategy($str);
$push->setSettings($setting);
$setting->setTtl(3600000); ////消息有效期,走厂商消息需要设置该值
//推送苹果离线通知标题内容
$alert = new \GTAlert();
$alert->setTitle($title);
$alert->setBody($content);
$aps = new \GTAps();
//1表示静默推送(无通知栏消息),静默推送时不需要填写其他参数。
//苹果建议1小时最多推送3条静默消息
$aps->setContentAvailable(0);
$aps->setSound("default");
$aps->setAlert($alert);
$iosDto = new \GTIos();
$iosDto->setAps($aps);
$iosDto->setType("notify");
$pushChannel = new \GTPushChannel();
$pushChannel->setIos($iosDto);
//安卓离线厂商通道推送消息体
$pushChannel = new \GTPushChannel();
$androidDTO = new \GTAndroid();
$ups = new \GTUps();
$notification1 = new \GTThirdNotification();;
$notification1->setTitle($title);
$notification1->setBody($content);
$ups->setNotification($notification1);
if($clickType == 'none') //设置推送类型
{
$notification1->setClickType($clickType);
}else if($clickType == 'payload' || $clickType == 'payload_custom'){ //自定义消息 打开APP和不打开APP
$notification1->setClickType($clickType);
$notification1->setPayload(json_encode($data));
}else if($clickType == 'url'){ //打开URL
$notification1->setClickType($clickType);
$notification1->setUrl($url);
}else if($clickType == 'intent'){ //打开特定页面
$notification1->setClickType($clickType);
$notification1->setIntent("intent:#Intent;component=com.hqtwtq.y8/io.dcloud.PandoraEntry;S.UP-OL-SU=true;S.title=".urlencode($title).";S.content=".urlencode($content).";S.payload=".json_encode($data).";end");
}else{
$notification1->setClickType($clickType);
}
//各厂商自有功能单项设置
if($time){
$message->setDuration($time); //设置推送时间
$data = json_encode(array('title'=>$title,'content'=>$content,'duration'=>$time,'importance'=>'HIGH','payload'=>json_encode($data)));
}else{
$data = json_encode(array('title'=>$title,'content'=>$content,'payload'=>json_encode($data)));
}
//$ups->setTransmission($data);
$androidDTO->setUps($ups);
$pushChannel->setAndroid($androidDTO);
$push->setPushChannel($pushChannel);
//个推在线通道
$notify->setTitle($title);
$notify->setBody($content);
if($img) $notify->setBigImage($img); //推送图片
//1、intent:打开应用内特定页面 2、url:打开网页地址。3、payload:自定义消息内容启动应用。4、payload_custom:自定义消息内容不启动应用。5、startapp:打开应用首页。6、none:纯通知,无后续动作
if($clickType == 'none') //设置推送类型
{
$notify->setClickType($clickType);
}else if($clickType == 'payload' || $clickType == 'payload_custom'){ //自定义消息 打开APP和不打开APP
$notify->setClickType($clickType);
$notify->setPayload(json_encode($data));
}else if($clickType == 'url'){ //打开URL
$notify->setClickType($clickType);
$notify->setUrl($url);
}else if($clickType == 'intent'){ //打开特定页面
$notify->setClickType($clickType);
$notify->setIntent("intent:#Intent;component=com.hqtwtq.y8/io.dcloud.PandoraEntry;S.UP-OL-SU=true;S.title=".urlencode($title).";S.content=".urlencode($content).";S.payload=".json_encode($data).";end");
}else{
$notify->setClickType($clickType);
}
$message->setNotification($notify);
$push->setPushMessage($message);
/* if($time){
$message->setDuration($time); //设置推送时间
$data = json_encode(array('title'=>$title,'body'=>$content,'duration'=>$time,'importance'=>'HIGH','payload'=>json_encode($data)));
}else{
$data = json_encode(array('title'=>$title,'body'=>$content,'payload'=>json_encode($data)));
}
$ups->setTransmission($data); //
$android->setUps($ups);
$channel->setAndroid($android);
$push->setPushChannel($channel);
$push->setPushMessage($message);*/
if($cid) //推送给某个用户
{
$push->setCid($cid);
//处理返回结果
$result = $api->pushApi()->pushToSingleByCid($push);
}else{
$result = $api->pushApi()->pushAll($push);
}
Log::info('推送数据:【推送】'.json_encode($result)); //写入日志
return $result;
收起阅读 »

unipush,APP离线推送,无法触发click问题原因。
原因:厂商通道的intent配置遗漏导致。
错误示例(按?号提示上写的格式):intent:#Intent;component=你的包名/io.dcloud.PandoraEntry;S.title=标题10;S.content=内容10;S.payload=%7B%22type%22%3A%222%22%2C%22url%22%3A%22pages%2Factivity%2Ftakeaway%2Findex%22%7D;end
正确示例:intent:#Intent;component=你的包名/io.dcloud.PandoraEntry;S.UP-OL-SU=true;S.title=标题10;S.content=内容10;S.payload=%7B%22type%22%3A%222%22%2C%22url%22%3A%22pages%2Factivity%2Ftakeaway%2Findex%22%7D;end
总结:S.UP-OL-SU=true; 是必须要写的,不写会无法触发click的监听。
原因:厂商通道的intent配置遗漏导致。
错误示例(按?号提示上写的格式):intent:#Intent;component=你的包名/io.dcloud.PandoraEntry;S.title=标题10;S.content=内容10;S.payload=%7B%22type%22%3A%222%22%2C%22url%22%3A%22pages%2Factivity%2Ftakeaway%2Findex%22%7D;end
正确示例:intent:#Intent;component=你的包名/io.dcloud.PandoraEntry;S.UP-OL-SU=true;S.title=标题10;S.content=内容10;S.payload=%7B%22type%22%3A%222%22%2C%22url%22%3A%22pages%2Factivity%2Ftakeaway%2Findex%22%7D;end
总结:S.UP-OL-SU=true; 是必须要写的,不写会无法触发click的监听。
收起阅读 »
uni-app App打包(基础配置)
线上案例
1,模块配置
打开项目点击 manifest.json
模块配置勾选 支付、登录、分享、 ViderPlayer和自己需要用的模块填写相关配置 Ctrl+s 保存
APP自动生成图标选择一个1024x1024的图片传上去,生成一下就好了
2,权限配置
安卓的已经配置好了,ios的必须开发者填写相关的描述信息,需要用那些就填写哪些,ios必须填写详细,不然上架容易被拒
安卓的权限中文说明地址:http://www.kjson.com/files/androidmanifest
3,模块配置
1.定位选择高德地图,App端只支持高德地图,所以尽量选择高德地图,key在高德开发平台就可以申请到
2.OAuth 授权登录
一键登录是uni-app官方自带的,详情请看官方文档
地址:https://uniapp.dcloud.io/univerify
3.自定义第三方登录比如:微信登录
请填写相关的配置就可以了
4注意:
ios端如果包含了任何第三方登录,那必须也得把苹果登录也带上,不然苹果上架审核不通过
根据苹果审核指南要求,如果 app 使用第三方或社交登录服务 (例如,Facebook 登录、Google 登录、通过 Twitter 登录、通过 LinkedIn 登录、通过 Amazon 登录或微信登录) 来对其进行设置或验证这个 app 的用户主帐户,则该 app 必须同时提供“通过 Apple 登录”作为同等选项。详情参考:App Store 审核指南 - 通过 Apple 登录
说明:https://ask.dcloud.net.cn/article/36651
5. 支付、分享填写相关的配置就可以了
6. 如果有视频,需要勾选VideoPlayer(视频播放)
4,App常用其它设置
为了方便测试选择了全部支持,测试的时候由于各种模拟器支持的不一样所以都勾选了,打包上线的时候选择第一个就可以,不然ios容易出现以下问题
具体说明可以看dcloud的文档
https://ask.dcloud.net.cn/article/36195
线上案例
1,模块配置
打开项目点击 manifest.json
模块配置勾选 支付、登录、分享、 ViderPlayer和自己需要用的模块填写相关配置 Ctrl+s 保存
APP自动生成图标选择一个1024x1024的图片传上去,生成一下就好了
2,权限配置
安卓的已经配置好了,ios的必须开发者填写相关的描述信息,需要用那些就填写哪些,ios必须填写详细,不然上架容易被拒
安卓的权限中文说明地址:http://www.kjson.com/files/androidmanifest
3,模块配置
1.定位选择高德地图,App端只支持高德地图,所以尽量选择高德地图,key在高德开发平台就可以申请到
2.OAuth 授权登录
一键登录是uni-app官方自带的,详情请看官方文档
地址:https://uniapp.dcloud.io/univerify
3.自定义第三方登录比如:微信登录
请填写相关的配置就可以了
4注意:
ios端如果包含了任何第三方登录,那必须也得把苹果登录也带上,不然苹果上架审核不通过
根据苹果审核指南要求,如果 app 使用第三方或社交登录服务 (例如,Facebook 登录、Google 登录、通过 Twitter 登录、通过 LinkedIn 登录、通过 Amazon 登录或微信登录) 来对其进行设置或验证这个 app 的用户主帐户,则该 app 必须同时提供“通过 Apple 登录”作为同等选项。详情参考:App Store 审核指南 - 通过 Apple 登录
说明:https://ask.dcloud.net.cn/article/36651
5. 支付、分享填写相关的配置就可以了
6. 如果有视频,需要勾选VideoPlayer(视频播放)
4,App常用其它设置
为了方便测试选择了全部支持,测试的时候由于各种模拟器支持的不一样所以都勾选了,打包上线的时候选择第一个就可以,不然ios容易出现以下问题
具体说明可以看dcloud的文档
https://ask.dcloud.net.cn/article/36195

uni-app商城源码 h5+小程序+公众号+app
1:有详细的代码注释,有完整系统手册。
2:基于 SpringBoot 框架开发业界主流。
3:【前端】Web PC 管理端 vue + element UI。
4:【前端】移动端使用 UniApp 框架,前后端分离开发。
5:标准RESTful 接口、标准数据传输,逻辑层次更明确,更多的提高api复用。
6:支持Redis队列,降低流量高峰,解除耦合,高可用。
7:无缝事件机制,行为扩展更方便,方便二次开发。
8:数据导出,方便个性化分析。
9:数据统计分析,使用ECharts图表统计,实现用户、产品、订单、资金等统计分析。
10:权限管理,后台多种角色,多重身份权限管理,权限可以控制到按钮级别的操作。
11:Vue表单生成控件,拖拽配置表单,减少前端重复表单工作量,提高前端开发效率。
1:有详细的代码注释,有完整系统手册。
2:基于 SpringBoot 框架开发业界主流。
3:【前端】Web PC 管理端 vue + element UI。
4:【前端】移动端使用 UniApp 框架,前后端分离开发。
5:标准RESTful 接口、标准数据传输,逻辑层次更明确,更多的提高api复用。
6:支持Redis队列,降低流量高峰,解除耦合,高可用。
7:无缝事件机制,行为扩展更方便,方便二次开发。
8:数据导出,方便个性化分析。
9:数据统计分析,使用ECharts图表统计,实现用户、产品、订单、资金等统计分析。
10:权限管理,后台多种角色,多重身份权限管理,权限可以控制到按钮级别的操作。
11:Vue表单生成控件,拖拽配置表单,减少前端重复表单工作量,提高前端开发效率。

微信小程序顶部导航栏自定义组件
navHeader.vue,已经计算好高度,调用: <navHeader></navHeader>
<template>
<view>
<view class="bg-orange" :style="'height:'+statusBarHeight+'px'"></view>
<view class="bg-orange flex align-center justify-center" :style="'height:'+navBarHeight+'px'">
<view class="text-lg">
{{title}}
</view>
</view>
</view>
</template>
<script>
export default {
name:"navHeader",
data() {
return {
statusBarHeight: 0,
navBarHeight: 0,
title:'测试'
};
},
created() {
this.statusBarHeight = uni.getSystemInfoSync().statusBarHeight;
let plat = uni.getSystemInfoSync().platform;
this.navBarHeight = 44;
if(plat=='android'){
this.navBarHeight = 48;
}
}
}
</script>
<style>
</style>
navHeader.vue,已经计算好高度,调用: <navHeader></navHeader>
<template>
<view>
<view class="bg-orange" :style="'height:'+statusBarHeight+'px'"></view>
<view class="bg-orange flex align-center justify-center" :style="'height:'+navBarHeight+'px'">
<view class="text-lg">
{{title}}
</view>
</view>
</view>
</template>
<script>
export default {
name:"navHeader",
data() {
return {
statusBarHeight: 0,
navBarHeight: 0,
title:'测试'
};
},
created() {
this.statusBarHeight = uni.getSystemInfoSync().statusBarHeight;
let plat = uni.getSystemInfoSync().platform;
this.navBarHeight = 44;
if(plat=='android'){
this.navBarHeight = 48;
}
}
}
</script>
<style>
</style>
收起阅读 »

老开发的心声: 官方何时能真正的去解决BUG,留给UNI的时间不多了。一个bug 反应了,永远是等待,那生态做来干什么
uni其实很适合新手入门,但是,一旦永久了,总是有很多的bug,而有些bug 就是致命性的, u 软件开发了很久,才发现是官方系统性bug, excase me 我怎么修? 反馈问题,提交BUG,运气不好,毛人都找不到一个。运气好,有个官方的人跟你说上几句,然后,说上几句就是让你等,等等,我T吗都工作都要等掉了,还等,一个BUG几个月不修复,我也是醉了, 这样的生态,有什么意思,,
uni 本是国产之光,如今,感觉越来越混, 社区生态不维护好,搞什么 都是暖用。
BUGS:
1 .uni各种闪退(代码正确)
2 录音限制10分钟, 期间,一旦APP进入后台模式隐藏超过60秒,录音就听不到了。。。神bug。。
3.官方蓝牙链接,获取链接上时好时坏, 代码都没问题哈,
- 关键 这些Bug,不是轻易复现的,都是软件开发后了,实际使用才能发现,然后怎么办??找官方?? 官方除了让你等,就是让你等。。。玩鸡毛哦
准备弃坑去RN了。。。
一位使用hubildx 4年的老开发了,真的伤心。
uni其实很适合新手入门,但是,一旦永久了,总是有很多的bug,而有些bug 就是致命性的, u 软件开发了很久,才发现是官方系统性bug, excase me 我怎么修? 反馈问题,提交BUG,运气不好,毛人都找不到一个。运气好,有个官方的人跟你说上几句,然后,说上几句就是让你等,等等,我T吗都工作都要等掉了,还等,一个BUG几个月不修复,我也是醉了, 这样的生态,有什么意思,,
uni 本是国产之光,如今,感觉越来越混, 社区生态不维护好,搞什么 都是暖用。
BUGS:
1 .uni各种闪退(代码正确)
2 录音限制10分钟, 期间,一旦APP进入后台模式隐藏超过60秒,录音就听不到了。。。神bug。。
3.官方蓝牙链接,获取链接上时好时坏, 代码都没问题哈,
- 关键 这些Bug,不是轻易复现的,都是软件开发后了,实际使用才能发现,然后怎么办??找官方?? 官方除了让你等,就是让你等。。。玩鸡毛哦
准备弃坑去RN了。。。
一位使用hubildx 4年的老开发了,真的伤心。

JS 和 Native 互相调用方式
一、网页JS调用Native中java代码
哥斯拉大战金刚下载地址:duan.kim
网页和本地代码的交互主要是通过webview这个桥梁来进行的,webview中的如下接口:
接口中的第一个参数object,为注入webview的java对象
第二个参数name,为暴露给javaScript使用的名字。
即通过该接口给webview注入一个object对象,然后javaScript可以通过name来引用object对象。
Webview的设置如下,打开javaScript功能,加载本地网页,注入对象:
//启用javascript
mWebView.getSettings().setJavaScriptEnabled(true);
//从assets目录下面的加载html
mWebView.loadUrl("file:///android_asset/wx.html");
mWebView.addJavascriptInterface(this,"wx");
native本地定义的java接口:
分别定义了带有参数和不带参数的两个接口,当JS调用的时候,本地会弹出Toast显示文本,并且更新native界面中的textview内容。
网页端调用Native端代码方式如下:
调用方式主要是通过window来引用webview中注入的对象。
需要注意的是在Android4.2之前addJavascriptInterface接口存在注入漏洞,即JS可以通过反射获取到native端的其他接口,进行其他非法操作,所以4.2之后升级增加了JS只能访问带有JavascriptInterface注解的Java函数的限制,在本地定义的提供给JS调用的接口都需要增加android.webkit.JavascriptInterface声明。
二、Native端java调用网页JS方法
网页JS端提供给Java端的代码定义如下,主要用来改变标签内容:
Java端的调用方法如下:
Webview对象通过loadUrl接口来加载以javascript协议头的方式就可以调用JS中定义的接口了。
一、网页JS调用Native中java代码
哥斯拉大战金刚下载地址:duan.kim
网页和本地代码的交互主要是通过webview这个桥梁来进行的,webview中的如下接口:
接口中的第一个参数object,为注入webview的java对象
第二个参数name,为暴露给javaScript使用的名字。
即通过该接口给webview注入一个object对象,然后javaScript可以通过name来引用object对象。
Webview的设置如下,打开javaScript功能,加载本地网页,注入对象:
//启用javascript
mWebView.getSettings().setJavaScriptEnabled(true);
//从assets目录下面的加载html
mWebView.loadUrl("file:///android_asset/wx.html");
mWebView.addJavascriptInterface(this,"wx");
native本地定义的java接口:
分别定义了带有参数和不带参数的两个接口,当JS调用的时候,本地会弹出Toast显示文本,并且更新native界面中的textview内容。
网页端调用Native端代码方式如下:
调用方式主要是通过window来引用webview中注入的对象。
需要注意的是在Android4.2之前addJavascriptInterface接口存在注入漏洞,即JS可以通过反射获取到native端的其他接口,进行其他非法操作,所以4.2之后升级增加了JS只能访问带有JavascriptInterface注解的Java函数的限制,在本地定义的提供给JS调用的接口都需要增加android.webkit.JavascriptInterface声明。
二、Native端java调用网页JS方法
网页JS端提供给Java端的代码定义如下,主要用来改变标签内容:
Java端的调用方法如下:
Webview对象通过loadUrl接口来加载以javascript协议头的方式就可以调用JS中定义的接口了。
收起阅读 »
html5 5+sdk启动白屏
目前两个项目是html加原生一起开发,主要是html,html运用的是hbulider,里面有一个套成型的mui,原生这边主要是做一些插件之类的,html不能满足的功能,不知道是这个sdk适配的不怎么完美还是什么原因,总有一些问题,下面是我遇到的问题:
标题
==启动白屏
这个应该是android原生的问题,原生好处理,加载html,利用这个5+sdk的框架,就会有一些问题,
处理:添加一个启动界面,用原生,设置背景为透明,设置一个主题
<style name="Login" parent="DCloudTheme" >
<!--<item name="android:windowIsTranslucent">true</item>-->
<item name="android:windowBackground">@drawable/splash</item>
<item name="android:windowNoTitle">true</item>
</style>
进来不做任何处理,直接跳转sdkWebApp,我是用这个方式直接
加载的项目。这个sdkwebapp的主题必须设置为dcloud,
加载地图会出现黑屏
这个项目里面有一个考勤界面,需要百度地图
,目前
ios的不会出现跳转时黑屏的问题,android的不行,不知道后期更新会不会解决这个问题
目前两个项目是html加原生一起开发,主要是html,html运用的是hbulider,里面有一个套成型的mui,原生这边主要是做一些插件之类的,html不能满足的功能,不知道是这个sdk适配的不怎么完美还是什么原因,总有一些问题,下面是我遇到的问题:
标题
==启动白屏
这个应该是android原生的问题,原生好处理,加载html,利用这个5+sdk的框架,就会有一些问题,
处理:添加一个启动界面,用原生,设置背景为透明,设置一个主题
<style name="Login" parent="DCloudTheme" >
<!--<item name="android:windowIsTranslucent">true</item>-->
<item name="android:windowBackground">@drawable/splash</item>
<item name="android:windowNoTitle">true</item>
</style>
进来不做任何处理,直接跳转sdkWebApp,我是用这个方式直接
加载的项目。这个sdkwebapp的主题必须设置为dcloud,
加载地图会出现黑屏
这个项目里面有一个考勤界面,需要百度地图
,目前
ios的不会出现跳转时黑屏的问题,android的不行,不知道后期更新会不会解决这个问题