关于闪屏问题的一些总结
最近一周都在和闪屏作斗争,由于只能从html和js的层面进行分析和解决,所以到目前为止仍有一些型号的手机存在闪屏或其他体验问题,
但也发现了一些线索,剩下的实在是无能为力了,只能望着官方了;
1、部分低端机上的闪屏问题;
原因又两种,一种是dom结构复杂,另外一种是加载了过多的css样式,前者好解决,后者的话如果用了mui.css就比较麻烦了,我现在是尽量少用mui.css,要用到一些mui的控件时,就把依赖的样式从css中拷贝出来,不过那个依赖关系我就不说了,各种乱,之前有建议官方把css拆成 base.css+各种控件.css,后来我发现还真不好拆,前期没设计好,后期越来越臃肿;
2、部分手机头部闪白的问题;
为什么是闪白而不是闪黑、闪黄,闪绿? 因为闪的是document.body的颜色,此处使用障眼法解决,将body的背景色设置为和header一样的颜色(比如蓝色),这样即使闪了也看不出来,当然这样做了后有极少数手机上会出现底部或中间出现闪蓝的情况,出现该情况的手机下面会说,一定是显示时有各种问题的手机;
3、android4.4以下的手机(几乎是所有)出现一级界面滚动流程,二级界面滚动时抖动厉害的问题;以及在二级界面中显示/隐藏虚拟按键导致界面花的问题;
这个问题之前有发帖问http://ask.dcloud.net.cn/question/8829;当时官方说专门买了一台华为P6时还是蛮感动的,但后来qq上给我说抖动的问题影响不大(说实话影响非常大的,有图片的话就更不用说了),然后P6上没有花屏的问题;我问了一下他们P6的系统版本号,一直没有回,当时心里一横,就开始自己研究闪屏的问题了,因为我坚信同一款手机上,只要有一个界面(一级界面)没问题,那么其他界面也一定是可以没问题的;
没花两个小时的时间,还真被我找到原因了:
如果页面“a”的底层存在未隐藏的的webview,就会出现该问题;
所以解决方案应运而生,重构了一下webview的调度和管理的js(庆幸当时没有用mui的那一套),打开一个界面时把当前界面(存在parent时把parent)隐藏掉,返回时再显示出来(当然细节还是蛮多的,实现起来还是有点复杂,特别是涉及到打开第三方界面时);OK 完美解决;目前还未遇到不适用的机型;
4、andorid 5.0.2上的各种问题,也不知道是系统的原因还是手机的原因,反正我这边有一部努比亚小牛,5.0.2的系统,会有这样的情况;
屏幕抖动的问题,和上一个问题类似,只是抖得更严重,排查了一下,原因和上一个问题的原因也差不多,只是更苛刻,只有某个界面的底层没有显示的webview,并且这个界面没有parent,并且这个界面有设置scrollIndicator:"none"时才不会出现抖屏现象,解决方案我已经有了,但是代价太大了,又得重构webview调度和管理的那套js,实在是不想改了,期待官方能创造奇迹吧;
5、部分手机在创建了过多的webview后会出现上述第三个问题,比如三星Note4的瓶颈大概是30个,华为p6大概是18个,不过这个肯定不仅仅和数量有关系,和页面的内容肯定也有关系的,由于我这边的app功能点比较多,又想提升体验,所以用了不少的预加载,再加上大量使用了template的结构,所以很容易就二十多个webview了;
解决方案是复用webview,因为发现加载一个页面时,从页面加载完毕(body.loaded事件)到plusReay需要的时间稍微有点长,甚至比loadURL到body.loaded花的时间还要长,然而我们取参数通常是在plusready里面取,取完参数再根据参数画界面(静态页面就不考虑了),所以不使用预加载的话确实会出现白屏(huo)等现象;
所以复用webview+通过localStorage传参数可以在在减少webview数量的同时提高用户体验(当然体验赶预加载还是要差点);
具体的做法是写一个js服务,提供两个方法,borrowView和backView,用于控制webveiw的创建、调度和销毁;当然里面有很多细节,比如可以指定某个webview借了不还(等同于预加载),也可以指定某个webview在还的时候销毁(比如使用了百度地图的webview)还是清除(webview.clear());
6、所有手机的转场时闪屏的问题(非预加载模式或者 预加载模式+动态页面内容(通过evalJS刷新)),如果是使用pop-in,转场时是不会出现闪屏的,因为pop-in的过程中是不会去渲染界面的,所以转场的时候界面会是白的,或者会是之前的内容(这个取决于业务逻辑)
但是如果是用的slide-in的话,由于在动画的过程中会去渲染界面,比如动画刚开始时你的界面是空的,转场到一半时,界面上有内容了,视觉上当然会闪,所以遇到这个问题是正常了;解决方案是转场的时候显示一个静态的dom(如加载中),在webview显示完毕后再显示业务内容(最好有渐变效果);
目前就这些,希望对大家有所帮助
最近一周都在和闪屏作斗争,由于只能从html和js的层面进行分析和解决,所以到目前为止仍有一些型号的手机存在闪屏或其他体验问题,
但也发现了一些线索,剩下的实在是无能为力了,只能望着官方了;
1、部分低端机上的闪屏问题;
原因又两种,一种是dom结构复杂,另外一种是加载了过多的css样式,前者好解决,后者的话如果用了mui.css就比较麻烦了,我现在是尽量少用mui.css,要用到一些mui的控件时,就把依赖的样式从css中拷贝出来,不过那个依赖关系我就不说了,各种乱,之前有建议官方把css拆成 base.css+各种控件.css,后来我发现还真不好拆,前期没设计好,后期越来越臃肿;
2、部分手机头部闪白的问题;
为什么是闪白而不是闪黑、闪黄,闪绿? 因为闪的是document.body的颜色,此处使用障眼法解决,将body的背景色设置为和header一样的颜色(比如蓝色),这样即使闪了也看不出来,当然这样做了后有极少数手机上会出现底部或中间出现闪蓝的情况,出现该情况的手机下面会说,一定是显示时有各种问题的手机;
3、android4.4以下的手机(几乎是所有)出现一级界面滚动流程,二级界面滚动时抖动厉害的问题;以及在二级界面中显示/隐藏虚拟按键导致界面花的问题;
这个问题之前有发帖问http://ask.dcloud.net.cn/question/8829;当时官方说专门买了一台华为P6时还是蛮感动的,但后来qq上给我说抖动的问题影响不大(说实话影响非常大的,有图片的话就更不用说了),然后P6上没有花屏的问题;我问了一下他们P6的系统版本号,一直没有回,当时心里一横,就开始自己研究闪屏的问题了,因为我坚信同一款手机上,只要有一个界面(一级界面)没问题,那么其他界面也一定是可以没问题的;
没花两个小时的时间,还真被我找到原因了:
如果页面“a”的底层存在未隐藏的的webview,就会出现该问题;
所以解决方案应运而生,重构了一下webview的调度和管理的js(庆幸当时没有用mui的那一套),打开一个界面时把当前界面(存在parent时把parent)隐藏掉,返回时再显示出来(当然细节还是蛮多的,实现起来还是有点复杂,特别是涉及到打开第三方界面时);OK 完美解决;目前还未遇到不适用的机型;
4、andorid 5.0.2上的各种问题,也不知道是系统的原因还是手机的原因,反正我这边有一部努比亚小牛,5.0.2的系统,会有这样的情况;
屏幕抖动的问题,和上一个问题类似,只是抖得更严重,排查了一下,原因和上一个问题的原因也差不多,只是更苛刻,只有某个界面的底层没有显示的webview,并且这个界面没有parent,并且这个界面有设置scrollIndicator:"none"时才不会出现抖屏现象,解决方案我已经有了,但是代价太大了,又得重构webview调度和管理的那套js,实在是不想改了,期待官方能创造奇迹吧;
5、部分手机在创建了过多的webview后会出现上述第三个问题,比如三星Note4的瓶颈大概是30个,华为p6大概是18个,不过这个肯定不仅仅和数量有关系,和页面的内容肯定也有关系的,由于我这边的app功能点比较多,又想提升体验,所以用了不少的预加载,再加上大量使用了template的结构,所以很容易就二十多个webview了;
解决方案是复用webview,因为发现加载一个页面时,从页面加载完毕(body.loaded事件)到plusReay需要的时间稍微有点长,甚至比loadURL到body.loaded花的时间还要长,然而我们取参数通常是在plusready里面取,取完参数再根据参数画界面(静态页面就不考虑了),所以不使用预加载的话确实会出现白屏(huo)等现象;
所以复用webview+通过localStorage传参数可以在在减少webview数量的同时提高用户体验(当然体验赶预加载还是要差点);
具体的做法是写一个js服务,提供两个方法,borrowView和backView,用于控制webveiw的创建、调度和销毁;当然里面有很多细节,比如可以指定某个webview借了不还(等同于预加载),也可以指定某个webview在还的时候销毁(比如使用了百度地图的webview)还是清除(webview.clear());
6、所有手机的转场时闪屏的问题(非预加载模式或者 预加载模式+动态页面内容(通过evalJS刷新)),如果是使用pop-in,转场时是不会出现闪屏的,因为pop-in的过程中是不会去渲染界面的,所以转场的时候界面会是白的,或者会是之前的内容(这个取决于业务逻辑)
但是如果是用的slide-in的话,由于在动画的过程中会去渲染界面,比如动画刚开始时你的界面是空的,转场到一半时,界面上有内容了,视觉上当然会闪,所以遇到这个问题是正常了;解决方案是转场的时候显示一个静态的dom(如加载中),在webview显示完毕后再显示业务内容(最好有渐变效果);
目前就这些,希望对大家有所帮助
收起阅读 »关于添加下拉刷新以后,文本框无法点击的解决方案
在添加下拉刷新以后,文本框无法点击,没办法只能自己解决了
修改mui.js,将select,input,textarea排除在外
> _start: function(e) {
if (!this.loading) {
this.pulldown = this.pullPocket = this.pullCaption = this.pullLoading = false
}
var target = e.target;
while (target.nodeType != 1) {
target = target.parentNode;
}
if (target.tagName != 'SELECT' && target.tagName != 'INPUT' && target.tagName != 'TEXTAREA') {
e.preventDefault();
}
this._super(e);
},
在添加下拉刷新以后,文本框无法点击,没办法只能自己解决了
修改mui.js,将select,input,textarea排除在外
> _start: function(e) {
if (!this.loading) {
this.pulldown = this.pullPocket = this.pullCaption = this.pullLoading = false
}
var target = e.target;
while (target.nodeType != 1) {
target = target.parentNode;
}
if (target.tagName != 'SELECT' && target.tagName != 'INPUT' && target.tagName != 'TEXTAREA') {
e.preventDefault();
}
this._super(e);
},
利用soapclient.js调取WebService(soap)
官方DEMO,及各种问答测试未果后我尝试了soapclient.js
我的服务端使用了JAVA AXIS1.4编写
APP方面使用了soapclient.js
其实关键的就是JS针对各种版本类型的XML文件的解析是不尽相同的,所以我针对我服务端返回的XML对soapclient.js做了微调,在JS文件的顶端有关键描述(其实最要命的就是一个返回名)。
这个JS在很多方面,尤其是异常处理方面做到不周到,很多错误都不做提示,这也是由于各种WEBSERVICE报错的格式不同很难周全,所以大家日常使用中可以针对自己的WS细微调整JS,来优化报错,返回值等方面。
服务器不一定需要使用AXIS1.4,只需要根据自己的XML格式对JS进行调整,下面送上APP源码,及XML的关键截图 官方DEMO,及各种问答测试未果后我尝试了soapclient.js
我的服务端使用了JAVA AXIS1.4编写
APP方面使用了soapclient.js
其实关键的就是JS针对各种版本类型的XML文件的解析是不尽相同的,所以我针对我服务端返回的XML对soapclient.js做了微调,在JS文件的顶端有关键描述(其实最要命的就是一个返回名)。
这个JS在很多方面,尤其是异常处理方面做到不周到,很多错误都不做提示,这也是由于各种WEBSERVICE报错的格式不同很难周全,所以大家日常使用中可以针对自己的WS细微调整JS,来优化报错,返回值等方面。
服务器不一定需要使用AXIS1.4,只需要根据自己的XML格式对JS进行调整,下面送上APP源码,及XML的关键截图 收起阅读 »
关于HB的一些功能建议
以下属于个人之见,勿见笑,望大家指教。
建议一、双屏或多屏显示器的布局
周遭平时参与工作的开发平台硬件大多为多屏幕,希望对多屏幕的布局有一些针对性的设计。比如我可以在三个屏幕分别布放资源管理器、代码工作区、WEB显示区,这样来扩展显示面积,显示更多信息更加方便快捷的操作。
建议二、强化CSS编辑器,比如加入可视化样式编辑(如DW类似功能),加入一些常见模板(去A标签样式之类的)。
建议三、整合一些代码或者JS库之类的来实现可视化或快捷的动画编辑让网页达到一些想要的效果,常用的基本的就够用(移动、淡入淡出、翻页之类的)
感谢HB开发人员 你们辛苦了!一万个赞!
以下属于个人之见,勿见笑,望大家指教。
建议一、双屏或多屏显示器的布局
周遭平时参与工作的开发平台硬件大多为多屏幕,希望对多屏幕的布局有一些针对性的设计。比如我可以在三个屏幕分别布放资源管理器、代码工作区、WEB显示区,这样来扩展显示面积,显示更多信息更加方便快捷的操作。
建议二、强化CSS编辑器,比如加入可视化样式编辑(如DW类似功能),加入一些常见模板(去A标签样式之类的)。
建议三、整合一些代码或者JS库之类的来实现可视化或快捷的动画编辑让网页达到一些想要的效果,常用的基本的就够用(移动、淡入淡出、翻页之类的)
感谢HB开发人员 你们辛苦了!一万个赞!
安卓源码总体结构(2)基础知识汇总
packages/ |– apps (各种应用程序,如联系人、浏览器等)
|– experimental (一些实验性的项目,如错误报告)
|– inputmethods (输入法相关)
|– providers (各种数据源实现,如联系人数据、媒体库等信息)
|– wallpapers (各种壁纸程序) Android Framework功能介绍

android.app :提供**的程序模型和基本的运行环境。
android.content :包含对各种设备上的数据进行访问和发布。
android.database :通过内容提供者浏览和操作数据库。
android.graphics :底层图形库,包含画布、点、矩形等,可以将其直接绘制到屏幕上。
android.location :定位和相关服务的类。
android.media :提供一些类管理多种音频、视频的媒体接口。
android.net :提供帮助网络访问的类,超过通常的 java.net.* 接口。
android.os :提供了系统服务、消息传输和 IPC 机制。
android.opengl :提供 OpenGL 的工具。
android.provider :提供访问 Android 内容提供者的类。
android.telephony :提供与拨打电话相关的 API 交互。
android.view :提供基础的用户界面接口框架。
android.util :涉及工具性的方法,例如时间日期的操作。
android.webkit :默认浏览器操作接口。
android.widget :包含各种 UI 元素(大部分是可见的)在应用程序的布局中使用 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
build/ |– buildspec.mk.default |– cleanspec.mk |– core (各种以mk为结尾的文件,它门是编译所需要的Makefile)
|– envsetup.sh |– libs |– target (包含board和product两个目录,为目标所需要文件)
|– tools (编译过程中主机所需要的工具,一些需要经过编译生成) 其中,core中的Makefile是整个Android编译所需要的真正的Makefile,它被顶层目录的Makefile引用
知识点小结,DEX (class.dex) 文件是Android系统中可以在Dalvik虚拟机上直接运行的文件格式。
Java源码通过ADT编译成smali语言这是一个优化的过程,
相对 于.class文件它体积小、运行效率高、被编译后可读性低;smali再到class.dex本身就是一个加壳保护的过程。
DEX文件如果未做好保护, 黑客通过反编译可让源码完全暴露,可利用阅读源码来找到APP的设计流程,
通过对程序流程的了解将很容易对程序进行盗版、恶意篡改、恶意代码注入等危险行 为。
在此特别感谢爱加密提供的加密服务给我应用加固提供了保护。
[](http://www.ijiami.cn/AppProtect)
packages/ |– apps (各种应用程序,如联系人、浏览器等)
|– experimental (一些实验性的项目,如错误报告)
|– inputmethods (输入法相关)
|– providers (各种数据源实现,如联系人数据、媒体库等信息)
|– wallpapers (各种壁纸程序) Android Framework功能介绍

android.app :提供**的程序模型和基本的运行环境。
android.content :包含对各种设备上的数据进行访问和发布。
android.database :通过内容提供者浏览和操作数据库。
android.graphics :底层图形库,包含画布、点、矩形等,可以将其直接绘制到屏幕上。
android.location :定位和相关服务的类。
android.media :提供一些类管理多种音频、视频的媒体接口。
android.net :提供帮助网络访问的类,超过通常的 java.net.* 接口。
android.os :提供了系统服务、消息传输和 IPC 机制。
android.opengl :提供 OpenGL 的工具。
android.provider :提供访问 Android 内容提供者的类。
android.telephony :提供与拨打电话相关的 API 交互。
android.view :提供基础的用户界面接口框架。
android.util :涉及工具性的方法,例如时间日期的操作。
android.webkit :默认浏览器操作接口。
android.widget :包含各种 UI 元素(大部分是可见的)在应用程序的布局中使用 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
build/ |– buildspec.mk.default |– cleanspec.mk |– core (各种以mk为结尾的文件,它门是编译所需要的Makefile)
|– envsetup.sh |– libs |– target (包含board和product两个目录,为目标所需要文件)
|– tools (编译过程中主机所需要的工具,一些需要经过编译生成) 其中,core中的Makefile是整个Android编译所需要的真正的Makefile,它被顶层目录的Makefile引用
知识点小结,DEX (class.dex) 文件是Android系统中可以在Dalvik虚拟机上直接运行的文件格式。
Java源码通过ADT编译成smali语言这是一个优化的过程,
相对 于.class文件它体积小、运行效率高、被编译后可读性低;smali再到class.dex本身就是一个加壳保护的过程。
DEX文件如果未做好保护, 黑客通过反编译可让源码完全暴露,可利用阅读源码来找到APP的设计流程,
通过对程序流程的了解将很容易对程序进行盗版、恶意篡改、恶意代码注入等危险行 为。
在此特别感谢爱加密提供的加密服务给我应用加固提供了保护。
[](http://www.ijiami.cn/AppProtect) 收起阅读 »
分享一个IM源码,基于Mui + Leancloud +个推
最近研究了一下即时通讯模块,做了一个IM模板。
比较了融云等三方IM模块,最终选择了Leancloud,主要是灵活强大,可以任意定制。
有一个棘手的问题是Android 4.4以下不支持WebSocket,不想用长轮询的方式workaround。
于是放弃了Leancloud的推送模块,把官方的个推集成进来替换推送模块。
发布V1.0.1版本,目前仅支持发送文本,还在不断完善中。
安卓APK安装包
最近研究了一下即时通讯模块,做了一个IM模板。
比较了融云等三方IM模块,最终选择了Leancloud,主要是灵活强大,可以任意定制。
有一个棘手的问题是Android 4.4以下不支持WebSocket,不想用长轮询的方式workaround。
于是放弃了Leancloud的推送模块,把官方的个推集成进来替换推送模块。
发布V1.0.1版本,目前仅支持发送文本,还在不断完善中。
安卓APK安装包
收起阅读 »使用ajax能获取数据? 已经测试过mui、jq、js
mui.init();
mui.plusReady(function(){
console.log('beginTest');
muitest();
jqtest();
JStest();
});
function muitest(){
console.log('mui test begin');
mui.ajax('http://192.168.220.48/api/item',{
type:'get',
success:function(data){
console.log('mui test success');
console.log(data);
},
error:function(xhr,typestr,e){
console.log('mui test error');
console.log('mui test error: type='+typestr);
}
});
console.log('mui test end ');
}
function jqtest(){
console.log('jq test begin');
$.ajax({
url:'http://192.168.220.48/api/item',
type:'get',
success:function(data){
console.log('jq test success');
console.log(data);
},
error:function(xhr,state,e){
console.log('jq test error');
console.log('jq test error: state='+state);
}
});
console.log('jq test end ');
}
function JStest(){
console.log('js test begin');
var xhr=new XMLHttpRequest();
console.log('js test XMLHttpRequest init end');
xhr.onreadystatechange=function()
{
console.log('js test stateChanged '+xhr.readyState+' '+xhr.status);
if (xhr.readyState==4 && xhr.status==200)
{
console.log('success '+xhr.responseText);
}
}
console.log('js test set event end');
xhr.open('GET','http://192.168.220.48/api/item',true);
console.log('js test open end');
xhr.send();
console.log('js test send end');
console.log('js test end ');
}
[LOG] : beginTest
[LOG] : mui test begin
[LOG] : mui test end
[LOG] : jq test begin
[LOG] : jq test end
[LOG] : js test begin
[LOG] : js test XMLHttpRequest init end
[LOG] : js test set event end
[LOG] : js test stateChanged 1 0
[LOG] : js test open end
[LOG] : js test send end
[LOG] : js test end
--------等待超时后
[LOG] : mui test error
[LOG] : mui test error: type=abort
[LOG] : js test stateChanged 4 0
疑惑点
1/为什么onreadystatechange 事件只触发了两次
2/为什么第二次触发时 readyState=4 而status却是0
mui.init();
mui.plusReady(function(){
console.log('beginTest');
muitest();
jqtest();
JStest();
});
function muitest(){
console.log('mui test begin');
mui.ajax('http://192.168.220.48/api/item',{
type:'get',
success:function(data){
console.log('mui test success');
console.log(data);
},
error:function(xhr,typestr,e){
console.log('mui test error');
console.log('mui test error: type='+typestr);
}
});
console.log('mui test end ');
}
function jqtest(){
console.log('jq test begin');
$.ajax({
url:'http://192.168.220.48/api/item',
type:'get',
success:function(data){
console.log('jq test success');
console.log(data);
},
error:function(xhr,state,e){
console.log('jq test error');
console.log('jq test error: state='+state);
}
});
console.log('jq test end ');
}
function JStest(){
console.log('js test begin');
var xhr=new XMLHttpRequest();
console.log('js test XMLHttpRequest init end');
xhr.onreadystatechange=function()
{
console.log('js test stateChanged '+xhr.readyState+' '+xhr.status);
if (xhr.readyState==4 && xhr.status==200)
{
console.log('success '+xhr.responseText);
}
}
console.log('js test set event end');
xhr.open('GET','http://192.168.220.48/api/item',true);
console.log('js test open end');
xhr.send();
console.log('js test send end');
console.log('js test end ');
}
[LOG] : beginTest
[LOG] : mui test begin
[LOG] : mui test end
[LOG] : jq test begin
[LOG] : jq test end
[LOG] : js test begin
[LOG] : js test XMLHttpRequest init end
[LOG] : js test set event end
[LOG] : js test stateChanged 1 0
[LOG] : js test open end
[LOG] : js test send end
[LOG] : js test end
--------等待超时后
[LOG] : mui test error
[LOG] : mui test error: type=abort
[LOG] : js test stateChanged 4 0
疑惑点
1/为什么onreadystatechange 事件只触发了两次
2/为什么第二次触发时 readyState=4 而status却是0
网页中调起app并传递参数
最近因为项目需要 要在网页中调起app并传递参数 ios请参考http://ask.dcloud.net.cn/article/64 Android官方并没有提示 但是我在本地打包的时候发现官方有配置 : <data android:scheme="hbuilder" /> 所以在网页中通过: <a class="button-download" href="hbuilder://你的参数"><span>启动app</span></a> 就可以启动app 在app中通过:mui.alert(plus.runtime.arguments,"参数","确定",function(){}); 获取 我折腾一早上 希望对大家有用
最近因为项目需要 要在网页中调起app并传递参数 ios请参考http://ask.dcloud.net.cn/article/64 Android官方并没有提示 但是我在本地打包的时候发现官方有配置 : <data android:scheme="hbuilder" /> 所以在网页中通过: <a class="button-download" href="hbuilder://你的参数"><span>启动app</span></a> 就可以启动app 在app中通过:mui.alert(plus.runtime.arguments,"参数","确定",function(){}); 获取 我折腾一早上 希望对大家有用
收起阅读 »关于HBuilder6.3.1 插件安装找不到less插件的解决办法
由于我们的失误,导致less等插件在插件安装列表中看不到,如果需要这些插件,可按如下步骤进行安装
1.依次点击工具-插件安装-手动安装eclipse插件如下图
2.在插件地址中选择Hbuilder Update Plugins,勾掉group item by category,选择Less pro Compile Feature如下图
3.点击下一步进行安装,安装完毕后重启即可
由于我们的失误,导致less等插件在插件安装列表中看不到,如果需要这些插件,可按如下步骤进行安装
1.依次点击工具-插件安装-手动安装eclipse插件如下图
2.在插件地址中选择Hbuilder Update Plugins,勾掉group item by category,选择Less pro Compile Feature如下图
3.点击下一步进行安装,安装完毕后重启即可 收起阅读 »
iOS离线打包-第三方登录插件配置
目前登录插件支持新浪微博登录、QQ登录、微信登录
登录插件首先需要到各开放平台申请帐号,申请查看该文档
注: Linker Flags、framework等添加方法参考该文档
新浪登录插件配置
1.添加以下Linker Flags: -llibOauth、-lSinaWBOauth、-lWeiboSDK
2.添加下列文件:WeiboSDK.bundle
3.打开info.plist,找到sinweibo项,填入自己帐号的信息,如果没有该项,按照图中的格式创建
4.找到URL types ,打开URL identifier为com.weibo的项目,修改item0值为wb[这个是你的appkey] ,如果没有该项按照图中的格式创建
5.iOS9.0以上版本需要在info.plist增加以下配置
6.UIApplicationDelegate实现类中增加下列实现
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication
annotation:(id)annotation {
[PDRCore handleSysEvent:PDRCoreSysEventOpenURL withObject:url];
return YES;
}
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
[PDRCore handleSysEvent:PDRCoreSysEventOpenURL withObject:url];
return YES;
}
QQ登录插件配置
1.添加以下Linker Flags: -llibOauth、-lQQOauth
2.添加以下framwork: TencentOpenAPI.framework
3.添加下列文件: TencentOpenApi_IOS_Bundle.bundle
4.找到URL types,打开URL identifier为tencentopenapi的项目, 修改item0值为tencent[这个是你的appkey] ,如果没有该项按照图中的格式创建
5.iOS9.0以上版本需要在info.plist增加以下配置
或者直接拷贝以下内容:
<key>LSApplicationQueriesSchemes</key>
<array>
<string>mqq</string>
<string>mqqapi</string>
<string>mqzone</string>
<string>wtloginmqq2</string>
<string>mqqopensdkapiV3</string>
<string>mqqwpa</string>
<string>mqqopensdkapiV2</string>
<string>mqqOpensdkSSoLogin</string>
</array>
6.UIApplicationDelegate实现类中增加下列实现
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication
annotation:(id)annotation {
[PDRCore handleSysEvent:PDRCoreSysEventOpenURL withObject:url];
return YES;
}
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
[PDRCore handleSysEvent:PDRCoreSysEventOpenURL withObject:url];
return YES;
}
微信登录插件配置
1.添加以下Linker Flags: -llibOauth、 -lWXOauth、-lWeChatSDK
2.添加以下framwork: Social.framework、Accounts.framework
3.找到URL types ,打开URL identifier为weixin的项目,修改item0值为wx[这个是你的appid] ,这个应该和下步weixinaouth中appid一致,如果没有该项按照图中的格式创建
4.打开info.plist,找到weixinoauth项,填入自己帐号的信息,如果没有该项,按照图中的格式创建
5.iOS9.0以上版本需要在info.plist增加以下配置
6.UIApplicationDelegate实现类中增加下列实现
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication
annotation:(id)annotation {
[PDRCore handleSysEvent:PDRCoreSysEventOpenURL withObject:url];
return YES;
}
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
[PDRCore handleSysEvent:PDRCoreSysEventOpenURL withObject:url];
return YES;
}
<a id="ulink"/>
7.HBuilderX2.3.4+版本需要配置 Universal Link
一 .启用通用链接请参考:https://ask.dcloud.net.cn/article/36393#unilink
二 .在info.plist root 节点添加UniversalLinks项,值和微信开放平台配置的一致,参考如下:
查看工程里的AppDelegate.m文件里是否有下面的方法:
//@Summary:通用链接
-(BOOL)application:(UIApplication )application continueUserActivity:(NSUserActivity )userActivity restorationHandler:(void(^)(NSArray<id<UIUserActivityRestoring>> * __nullable restorableObjects))restorationHandler {
[PDRCore handleSysEvent:PDRCoreSysEventContinueUserActivity withObject:userActivity];
restorationHandler(nil);
return YES;
}
苹果登录插件配置
目前登录插件支持新浪微博登录、QQ登录、微信登录
登录插件首先需要到各开放平台申请帐号,申请查看该文档
注: Linker Flags、framework等添加方法参考该文档
新浪登录插件配置
1.添加以下Linker Flags: -llibOauth、-lSinaWBOauth、-lWeiboSDK
2.添加下列文件:WeiboSDK.bundle
3.打开info.plist,找到sinweibo项,填入自己帐号的信息,如果没有该项,按照图中的格式创建
4.找到URL types ,打开URL identifier为com.weibo的项目,修改item0值为wb[这个是你的appkey] ,如果没有该项按照图中的格式创建
5.iOS9.0以上版本需要在info.plist增加以下配置
6.UIApplicationDelegate实现类中增加下列实现
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication
annotation:(id)annotation {
[PDRCore handleSysEvent:PDRCoreSysEventOpenURL withObject:url];
return YES;
}
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
[PDRCore handleSysEvent:PDRCoreSysEventOpenURL withObject:url];
return YES;
}
QQ登录插件配置
1.添加以下Linker Flags: -llibOauth、-lQQOauth
2.添加以下framwork: TencentOpenAPI.framework
3.添加下列文件: TencentOpenApi_IOS_Bundle.bundle
4.找到URL types,打开URL identifier为tencentopenapi的项目, 修改item0值为tencent[这个是你的appkey] ,如果没有该项按照图中的格式创建
5.iOS9.0以上版本需要在info.plist增加以下配置
或者直接拷贝以下内容:
<key>LSApplicationQueriesSchemes</key>
<array>
<string>mqq</string>
<string>mqqapi</string>
<string>mqzone</string>
<string>wtloginmqq2</string>
<string>mqqopensdkapiV3</string>
<string>mqqwpa</string>
<string>mqqopensdkapiV2</string>
<string>mqqOpensdkSSoLogin</string>
</array>
6.UIApplicationDelegate实现类中增加下列实现
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication
annotation:(id)annotation {
[PDRCore handleSysEvent:PDRCoreSysEventOpenURL withObject:url];
return YES;
}
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
[PDRCore handleSysEvent:PDRCoreSysEventOpenURL withObject:url];
return YES;
}
微信登录插件配置
1.添加以下Linker Flags: -llibOauth、 -lWXOauth、-lWeChatSDK
2.添加以下framwork: Social.framework、Accounts.framework
3.找到URL types ,打开URL identifier为weixin的项目,修改item0值为wx[这个是你的appid] ,这个应该和下步weixinaouth中appid一致,如果没有该项按照图中的格式创建
4.打开info.plist,找到weixinoauth项,填入自己帐号的信息,如果没有该项,按照图中的格式创建
5.iOS9.0以上版本需要在info.plist增加以下配置
6.UIApplicationDelegate实现类中增加下列实现
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication
annotation:(id)annotation {
[PDRCore handleSysEvent:PDRCoreSysEventOpenURL withObject:url];
return YES;
}
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
[PDRCore handleSysEvent:PDRCoreSysEventOpenURL withObject:url];
return YES;
}
<a id="ulink"/>
7.HBuilderX2.3.4+版本需要配置 Universal Link
一 .启用通用链接请参考:https://ask.dcloud.net.cn/article/36393#unilink
二 .在info.plist root 节点添加UniversalLinks项,值和微信开放平台配置的一致,参考如下:
查看工程里的AppDelegate.m文件里是否有下面的方法:
//@Summary:通用链接
-(BOOL)application:(UIApplication )application continueUserActivity:(NSUserActivity )userActivity restorationHandler:(void(^)(NSArray<id<UIUserActivityRestoring>> * __nullable restorableObjects))restorationHandler {
[PDRCore handleSysEvent:PDRCoreSysEventContinueUserActivity withObject:userActivity];
restorationHandler(nil);
return YES;
}
苹果登录插件配置
收起阅读 »百度地图密匙申请
百度密匙申请
一、生成keystore
1.F:\Java\bin\keytool.exe配置到path里面(注:这里的路径要用自己的)。也可以cd到java\bin目录下;
- 生成keystore的命令
keytool -genkey -alias test.keystore -keyalg RSA -validity 20000 -keystore test.keystore
下面是我的命令:
/***/
/*/
keytool -list -v -keystore debug.keystore
二、获取sha1值
命令:
keytool -list -v -keystore test.keystore
下面是我的命令了
/***/
/****/
我们需要的是这一段
SHA1: D0:84:C4:68:86:F3:E6:02:9F:DF:C4:0B:56:31:60:C0:01:4D:3D:B3
三。在线打包方面如下图
包名按照规范定义这里报名很重要要记住 如:com.lipin
证书别名的话上面获取sha1值的时候已经有了 我的是test.keystore 其实就是文件名
密码:就是生成keystore的时候这只的密码
证书文件的话选中生成的那个证书文件就可以了
四、百度方面的配置
1.有一个百度帐号
- 登录到http://developer.baidu.com/map/
- 然后选择右上角的API控制台。
- 创建应用我就不说了
- 然后安全码就是我们的 SHA1 + 包名;
- 我的是这样的:D0:84:C4:68:86:F3:E6:02:9F:DF:C4:0B:56:31:60:C0:01:4D:3D:B3;com.lipin
- 然后设置完成应用就不会有密匙不匹配的问题出现了。
谢谢大家
alongSefl
2015年8月15日 23:49:42
百度密匙申请
一、生成keystore
1.F:\Java\bin\keytool.exe配置到path里面(注:这里的路径要用自己的)。也可以cd到java\bin目录下;
- 生成keystore的命令
keytool -genkey -alias test.keystore -keyalg RSA -validity 20000 -keystore test.keystore
下面是我的命令:
/***/
/*/
keytool -list -v -keystore debug.keystore
二、获取sha1值
命令:
keytool -list -v -keystore test.keystore
下面是我的命令了
/***/
/****/
我们需要的是这一段
SHA1: D0:84:C4:68:86:F3:E6:02:9F:DF:C4:0B:56:31:60:C0:01:4D:3D:B3
三。在线打包方面如下图
包名按照规范定义这里报名很重要要记住 如:com.lipin
证书别名的话上面获取sha1值的时候已经有了 我的是test.keystore 其实就是文件名
密码:就是生成keystore的时候这只的密码
证书文件的话选中生成的那个证书文件就可以了
四、百度方面的配置
1.有一个百度帐号
- 登录到http://developer.baidu.com/map/
- 然后选择右上角的API控制台。
- 创建应用我就不说了
- 然后安全码就是我们的 SHA1 + 包名;
- 我的是这样的:D0:84:C4:68:86:F3:E6:02:9F:DF:C4:0B:56:31:60:C0:01:4D:3D:B3;com.lipin
- 然后设置完成应用就不会有密匙不匹配的问题出现了。
谢谢大家
alongSefl
2015年8月15日 23:49:42



















