HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

输入法遮挡输入框问题

输入框 软键盘

PC连接手机端测试时并没有出现这个问题,但是在打包后,安装到手机端,出现了输入法遮挡输入框这个问题。
起初在考虑利用软键盘弹出的监听,监听弹出后计算软键盘高度,使输入域的高度距离底部增加出一个软键盘的高度即可。
但在实现的过程中,又觉得是滚动条影响了这个输入框的显示,所以想利用刷新滚动条的方式解决一下试试,结果是可以的。
将这段代码放在index.html下的js方法中。
代码如下:

mui('.mui-scroll-wrapper').scroll({  
bounce: true,  
indicators: true, //是否显示滚动条  
deceleration: 0.0003  
});  
mui(".mui-scroll-wrapper").scroll().refresh();

参考的实例是这个问题:http://ask.dcloud.net.cn/question/15866

继续阅读 »

PC连接手机端测试时并没有出现这个问题,但是在打包后,安装到手机端,出现了输入法遮挡输入框这个问题。
起初在考虑利用软键盘弹出的监听,监听弹出后计算软键盘高度,使输入域的高度距离底部增加出一个软键盘的高度即可。
但在实现的过程中,又觉得是滚动条影响了这个输入框的显示,所以想利用刷新滚动条的方式解决一下试试,结果是可以的。
将这段代码放在index.html下的js方法中。
代码如下:

mui('.mui-scroll-wrapper').scroll({  
bounce: true,  
indicators: true, //是否显示滚动条  
deceleration: 0.0003  
});  
mui(".mui-scroll-wrapper").scroll().refresh();

参考的实例是这个问题:http://ask.dcloud.net.cn/question/15866

收起阅读 »

compressImage, 原图2.4m 压缩后 3.5m

plus.zip.compressImage({  
    src: src,  
    dst: '_doc/avatar-tmp.png',  
    quality: '20%'  
 }, function (e) {  
    console.log(e)  
    var target = e.target;  
    createImg(target);  
 }, function (err) {  
    console.log(err)  
 });
继续阅读 »
plus.zip.compressImage({  
    src: src,  
    dst: '_doc/avatar-tmp.png',  
    quality: '20%'  
 }, function (e) {  
    console.log(e)  
    var target = e.target;  
    createImg(target);  
 }, function (err) {  
    console.log(err)  
 });
收起阅读 »

DCloud招人啦,快快投简历

招聘

作为熟悉DCloud产品的开发者,其实我们也需要你们加入。
简历投递至hr2013@dcloud.io。
如果开发过App注明自己开发过的App下载地址。

  • 前端工程师
    熟悉5+App开发,有体验良好的App案例
    3年以上工作经验 年薪:20-30w
    应届毕业生 年薪:8-10w

  • 前端实习生
    熟悉5+App开发,有良好的表达沟通能力,有充足的学习热情
    实习生 年薪:5w-8w左右

  • PHP工程师
    熟悉前端者优先,熟悉开发云服务者优先。
    4年以上经验 年薪:25-35w
    应届毕业生 年薪:10-15w

  • Android工程师
    专职Android开发经验,精通JS者优先。
    3年以上经验 年薪:30w左右
    应届毕业生 年薪:10-15w

  • iOS工程师
    专职iOS开发经验,精通JS者优先。
    3年以上经验 年薪:30w左右
    应届毕业生 年薪:10-15w

  • 软件测试工程师
    精通黑盒、白盒测试,精通自动化测试,有大型项目工作经验者优先。
    年薪:20-30w

  • 增长黑客或数据科学家
    精通数据分析和用户增长
    年薪:不限

  • 产品运营
    熟悉和喜爱产品运营,有编程经验,1年以上运营工作经验。
    年薪:20-25w

  • 销售
    与各大App厂商市场部有广泛合作关系,负责帮助App厂商推量。
    年薪:25-35w

更多福利介绍,见 http://dcloud.io/hr/

工作地点北京北三环大钟寺。

重要的事情说两遍,简历投递至hr2013@dcloud.io。

继续阅读 »

作为熟悉DCloud产品的开发者,其实我们也需要你们加入。
简历投递至hr2013@dcloud.io。
如果开发过App注明自己开发过的App下载地址。

  • 前端工程师
    熟悉5+App开发,有体验良好的App案例
    3年以上工作经验 年薪:20-30w
    应届毕业生 年薪:8-10w

  • 前端实习生
    熟悉5+App开发,有良好的表达沟通能力,有充足的学习热情
    实习生 年薪:5w-8w左右

  • PHP工程师
    熟悉前端者优先,熟悉开发云服务者优先。
    4年以上经验 年薪:25-35w
    应届毕业生 年薪:10-15w

  • Android工程师
    专职Android开发经验,精通JS者优先。
    3年以上经验 年薪:30w左右
    应届毕业生 年薪:10-15w

  • iOS工程师
    专职iOS开发经验,精通JS者优先。
    3年以上经验 年薪:30w左右
    应届毕业生 年薪:10-15w

  • 软件测试工程师
    精通黑盒、白盒测试,精通自动化测试,有大型项目工作经验者优先。
    年薪:20-30w

  • 增长黑客或数据科学家
    精通数据分析和用户增长
    年薪:不限

  • 产品运营
    熟悉和喜爱产品运营,有编程经验,1年以上运营工作经验。
    年薪:20-25w

  • 销售
    与各大App厂商市场部有广泛合作关系,负责帮助App厂商推量。
    年薪:25-35w

更多福利介绍,见 http://dcloud.io/hr/

工作地点北京北三环大钟寺。

重要的事情说两遍,简历投递至hr2013@dcloud.io。

收起阅读 »

mui等待雪花修改

有时候为了配套我们的应用颜色,使App看起来风格一致,我们需要修改等待wating样式,具体怎么做呢其实很简单。
<script>
mui.plusReady(function(){
plus.nativeUI.showWaiting( "", {background:"rgba(0,255,0,0.8)",style:"black"} );
})
</script>
这样就搞定了,参数都有哪些呢?我列举如下:
width: (String 类型 )等待框背景区域的宽度
值支持像素值("500px")或百分比("50%"),百分比相对于屏幕的宽计算,如果不设置则根据内容自动计算合适的宽度。

height: (String 类型 )等待框背景区域的高度
值支持像素绝对值("500px")或百分比("50%"),如果不设置则根据内容自动计算合适的高度。

color: (String 类型 )等待框中文字的颜色
颜色值支持(参考CSS颜色规范):颜色名称(参考CSS Color Names)/十六进制值/rgb值/rgba值,默认值为白色。

textalign: (String 类型 )等待对话框中标题文字的水平对齐方式
对齐方式可选值包括:"left":水平居左对齐显示,"center":水平居中对齐显示,"right":水平居右对齐显示。默认值为水平居中对齐显示,即"center"。

padding: (String 类型 )等待对话框的内边距
值支持像素值("10px")和百分比("5%"),百分比相对于屏幕的宽计算,默认值为"3%"。

background: (String 类型 )等待对话框显示区域的背景色
背景色的值支持(参考CSS颜色规范):颜色名称(参考CSS Color Names)/十六进制值/rgb值/rgba值,默认值为rgba(0,0,0,0.8)。

style: (String 类型 )等待对话框样式
可取值"black"、"white",black表示等待框为黑色雪花样式,通常在背景主色为浅色时使用;white表示等待框为白色雪花样式,通常在背景主色为深色时使用。 仅在iOS平台有效,其它平台忽略此值,未设置时默认值为white。

平台支持
Android - 2.3 (不支持): 忽略此属性值。
iOS - 4.5 (支持): 支持"black"、"white"两种样式。
modal: (Boolen 类型 )等待框是否模态显示
模态显示时用户不可操作直到等待对话框关闭,否则用户在等待对话框显示时也可操作下面的内容,未设置时默认为true。

round: (Number 类型 )等待框显示区域的圆角
值支持像素值("10px"),未设置时使用默认值"10px"。

padlock: (Boolen 类型 )点击等待显示区域是否自动关闭
true表示点击等待对话框显示区域时自动关闭,false则不关闭,未设置时默认值为false。

继续阅读 »

有时候为了配套我们的应用颜色,使App看起来风格一致,我们需要修改等待wating样式,具体怎么做呢其实很简单。
<script>
mui.plusReady(function(){
plus.nativeUI.showWaiting( "", {background:"rgba(0,255,0,0.8)",style:"black"} );
})
</script>
这样就搞定了,参数都有哪些呢?我列举如下:
width: (String 类型 )等待框背景区域的宽度
值支持像素值("500px")或百分比("50%"),百分比相对于屏幕的宽计算,如果不设置则根据内容自动计算合适的宽度。

height: (String 类型 )等待框背景区域的高度
值支持像素绝对值("500px")或百分比("50%"),如果不设置则根据内容自动计算合适的高度。

color: (String 类型 )等待框中文字的颜色
颜色值支持(参考CSS颜色规范):颜色名称(参考CSS Color Names)/十六进制值/rgb值/rgba值,默认值为白色。

textalign: (String 类型 )等待对话框中标题文字的水平对齐方式
对齐方式可选值包括:"left":水平居左对齐显示,"center":水平居中对齐显示,"right":水平居右对齐显示。默认值为水平居中对齐显示,即"center"。

padding: (String 类型 )等待对话框的内边距
值支持像素值("10px")和百分比("5%"),百分比相对于屏幕的宽计算,默认值为"3%"。

background: (String 类型 )等待对话框显示区域的背景色
背景色的值支持(参考CSS颜色规范):颜色名称(参考CSS Color Names)/十六进制值/rgb值/rgba值,默认值为rgba(0,0,0,0.8)。

style: (String 类型 )等待对话框样式
可取值"black"、"white",black表示等待框为黑色雪花样式,通常在背景主色为浅色时使用;white表示等待框为白色雪花样式,通常在背景主色为深色时使用。 仅在iOS平台有效,其它平台忽略此值,未设置时默认值为white。

平台支持
Android - 2.3 (不支持): 忽略此属性值。
iOS - 4.5 (支持): 支持"black"、"white"两种样式。
modal: (Boolen 类型 )等待框是否模态显示
模态显示时用户不可操作直到等待对话框关闭,否则用户在等待对话框显示时也可操作下面的内容,未设置时默认为true。

round: (Number 类型 )等待框显示区域的圆角
值支持像素值("10px"),未设置时使用默认值"10px"。

padlock: (Boolen 类型 )点击等待显示区域是否自动关闭
true表示点击等待对话框显示区域时自动关闭,false则不关闭,未设置时默认值为false。

收起阅读 »

【新手探索】 - 导入Github上的项目

Git

Git小小白,试了试Hbuilder的git共享和import项目。

有错请放开指☞!

总体步骤如下:

1. Copy URL From Github

2. 工具栏 - 文件 - 导入,或空白处右键

3. 选择 【Projects form git】

4. 选择 【URI】

5. 【Location】 这一栏应该会自动填充Copy的URL, 继续下一步

6. 【Branch Selection】 默认即可

7. 选择目录,或者默认即可。

8. 选择第一项 【Import existing projects】 , 下一步

9. 选择要导入的项目, 点击【完成】

10. 【当当当当】, ok咯

引用@DCloud_heavensoft 的补充:

导入app项目时,默认git下来的还是普通web项目,此时需要对工程点右键,在项目属性界面里把项目类型从web项目改为app项目。

即如下图(Hbuilder版本号6.9.2):

属性设置:

正在看:

继续阅读 »

Git小小白,试了试Hbuilder的git共享和import项目。

有错请放开指☞!

总体步骤如下:

1. Copy URL From Github

2. 工具栏 - 文件 - 导入,或空白处右键

3. 选择 【Projects form git】

4. 选择 【URI】

5. 【Location】 这一栏应该会自动填充Copy的URL, 继续下一步

6. 【Branch Selection】 默认即可

7. 选择目录,或者默认即可。

8. 选择第一项 【Import existing projects】 , 下一步

9. 选择要导入的项目, 点击【完成】

10. 【当当当当】, ok咯

引用@DCloud_heavensoft 的补充:

导入app项目时,默认git下来的还是普通web项目,此时需要对工程点右键,在项目属性界面里把项目类型从web项目改为app项目。

即如下图(Hbuilder版本号6.9.2):

属性设置:

正在看:

收起阅读 »

基于plus.downloader的图片懒加载功能,支持本地缓存

基于plus.downloader的图片懒加载功能,支持本地缓存

如果有样式问题的话,请移步至http://www.cnblogs.com/phillyx/p/4649128.html

简单说一下

在app中,对一些变动不频繁的图片数据(如个人头像等),是需要存储在本地的。我相信这对大多数的app都是强需求的。  

怎么使用呢

img标签默认都有data-src属性,用来存放网络链接,src属性初始是最好给一个默认本地图片链接,下载好会自动替换掉

<img data-src="远程链接" src="默认图片">
  1. 如果在列表中,通过下拉刷新、上拉刷新加载数据,加载下一页的时候可以如下做:
    一次新增多条数据时,为避免重复渲染页面及重新下载正在下载中的图片等问题,新增的img要设置data-pageno属性,如下使用arttemplate写的模板

    <script id="tmpl" type="text/html">  
    {{each items as item i}}  
            <li class="mui-table-view-cell" data-id='{{item.id}}'>  
              <img data-src="{{item.url}}" data-pageno="{{item.pageno}}" src="img/default.png">  
            </li>  
    {{/each}}  
    </script>

    在js中怎么用呢

    var html = template('tmpl', data);  
    document.querySelector("#pullrefresh").innerHTML  = html;  
    lazyImg.pageno=data.pageno;  
    lazyImg.lazyLoad();
  2. 如果不需要分页或者零散的数据,直接添加lazy类就可以了

    <img data-src="远程链接" src="默认图片" class="lazy">

    然后直接调用lazyImg.lazyLoad()就可以了

注意

lazyimg.js是结合cache.js一齐使用的,代码都已提交至github
地址在https://github.com/phillyx/MUIDemos/tree/master/js/lazyimg.js
也可直接使用合并后的代码https://github.com/phillyx/MUIDemos/tree/master/dist/common.js

继续阅读 »

基于plus.downloader的图片懒加载功能,支持本地缓存

如果有样式问题的话,请移步至http://www.cnblogs.com/phillyx/p/4649128.html

简单说一下

在app中,对一些变动不频繁的图片数据(如个人头像等),是需要存储在本地的。我相信这对大多数的app都是强需求的。  

怎么使用呢

img标签默认都有data-src属性,用来存放网络链接,src属性初始是最好给一个默认本地图片链接,下载好会自动替换掉

<img data-src="远程链接" src="默认图片">
  1. 如果在列表中,通过下拉刷新、上拉刷新加载数据,加载下一页的时候可以如下做:
    一次新增多条数据时,为避免重复渲染页面及重新下载正在下载中的图片等问题,新增的img要设置data-pageno属性,如下使用arttemplate写的模板

    <script id="tmpl" type="text/html">  
    {{each items as item i}}  
            <li class="mui-table-view-cell" data-id='{{item.id}}'>  
              <img data-src="{{item.url}}" data-pageno="{{item.pageno}}" src="img/default.png">  
            </li>  
    {{/each}}  
    </script>

    在js中怎么用呢

    var html = template('tmpl', data);  
    document.querySelector("#pullrefresh").innerHTML  = html;  
    lazyImg.pageno=data.pageno;  
    lazyImg.lazyLoad();
  2. 如果不需要分页或者零散的数据,直接添加lazy类就可以了

    <img data-src="远程链接" src="默认图片" class="lazy">

    然后直接调用lazyImg.lazyLoad()就可以了

注意

lazyimg.js是结合cache.js一齐使用的,代码都已提交至github
地址在https://github.com/phillyx/MUIDemos/tree/master/js/lazyimg.js
也可直接使用合并后的代码https://github.com/phillyx/MUIDemos/tree/master/dist/common.js

收起阅读 »

MUI - 封装localStorage与plus.storage

Storage

更好的预览效果看这http://www.cnblogs.com/phillyx/p/4761364.html
在使用plus.storage频繁地存取数据时,可以感觉到明显的卡顿,而且很耗内存,
在切换到localstorage时虽然效率很高,页面渲染速度明显变快了,且手机发热不明显,不过又遇到了存储瓶颈(一般<=5M),
因此折中采取了plus.storage与localStorage混合的方案:
当localStorage达到存储瓶颈时切换到plus.storage

封装的方法基本上和plus.storage没区别。关于plus.storage参考http://www.html5plus.org/doc/zh_cn/storage.html

接口

  1. getItem
    通过键key检索获取应用存储的值

    var item=myStorage.getItem(key);
    • 参数key: DOMString必选
      存储的键值
    • 返回值DOMString : 键key对应应用存储的值,如果没有则返回null
    • 说明:方法内部默认先从localStorage取值,没有再从plus.Storage取值
  2. setItem
    修改或添加键值(key-value)对数据到应用数据存储中

    void myStorage.setItem(key, value);
    • 说明:方法默认将数据存储在localStorage中,超出localStorage容量限制则存到plus.storage
  3. getLength
    获取localStorage中保存的键值对的个数

    var len=myStorage.getLength();
  4. getLengthPlus
    获取plus.storage中保存的键值对的个数

  5. removeItem
    通过key值删除键值对存储的数据

    void myStorage.removeItem();
  6. clear
    清除应用所有的键值对存储数据

    void myStorage.clear();
  7. key
    获取localStorage键值对中指定索引值的key值

    var foo = myStorage.key(index);
  8. keyPlus
    获取plus.storage键值对中指定索引值的key值

    var foo = myStorage.keyPlus(index);
  9. getItemByIndex
    通过键key检索获取应用存储localStorage的值

    var item=myStorage.getItemByIndex(index);
    • 参数index: Number必选 存储键值的索引
    • 返回值DOMString : 键key对应应用存储的值,如果没有则返回null
  10. getItemByIndexPlus
    通过键key检索获取应用存储的值

    var item=myStorage.getItemByIndexPlus(index);
    • 参数index: Number必选 存储键值的索引
    • 返回值DOMString : 键key对应应用存储的值,如果没有则返回null
  11. getItems
    通过键key检索获取应用存储的值

    var items=myStorage.getItems(key)
    • 参数 key: Number可选 存储键值的索引
    • 返回值Array:不传key参则返回所有对象,否则返回含有该key的对象
  12. removeItemByKeys
    清除指定前缀的存储对象

    void myStorage.removeItemBykeys(keys,cb)
    • 参数keysDOMStringArray, 必选 keysString,方法内部自动转换为Array
    • 参数cbFunction 可选 回调函数

说明

以上方法经常用到的还是getItem setItem
getItems在测试或控制台查看时倒是偶尔用得到
removeItemBykeys是结合本地文件common.cache.clear缓存清除时一齐使用的


代码已分享到github
地址在https://github.com/phillyx/MUIDemos/tree/master/js/myStorage.js
也可直接使用压缩后的代码https://github.com/phillyx/MUIDemos/tree/master/dist/common.js

继续阅读 »

更好的预览效果看这http://www.cnblogs.com/phillyx/p/4761364.html
在使用plus.storage频繁地存取数据时,可以感觉到明显的卡顿,而且很耗内存,
在切换到localstorage时虽然效率很高,页面渲染速度明显变快了,且手机发热不明显,不过又遇到了存储瓶颈(一般<=5M),
因此折中采取了plus.storage与localStorage混合的方案:
当localStorage达到存储瓶颈时切换到plus.storage

封装的方法基本上和plus.storage没区别。关于plus.storage参考http://www.html5plus.org/doc/zh_cn/storage.html

接口

  1. getItem
    通过键key检索获取应用存储的值

    var item=myStorage.getItem(key);
    • 参数key: DOMString必选
      存储的键值
    • 返回值DOMString : 键key对应应用存储的值,如果没有则返回null
    • 说明:方法内部默认先从localStorage取值,没有再从plus.Storage取值
  2. setItem
    修改或添加键值(key-value)对数据到应用数据存储中

    void myStorage.setItem(key, value);
    • 说明:方法默认将数据存储在localStorage中,超出localStorage容量限制则存到plus.storage
  3. getLength
    获取localStorage中保存的键值对的个数

    var len=myStorage.getLength();
  4. getLengthPlus
    获取plus.storage中保存的键值对的个数

  5. removeItem
    通过key值删除键值对存储的数据

    void myStorage.removeItem();
  6. clear
    清除应用所有的键值对存储数据

    void myStorage.clear();
  7. key
    获取localStorage键值对中指定索引值的key值

    var foo = myStorage.key(index);
  8. keyPlus
    获取plus.storage键值对中指定索引值的key值

    var foo = myStorage.keyPlus(index);
  9. getItemByIndex
    通过键key检索获取应用存储localStorage的值

    var item=myStorage.getItemByIndex(index);
    • 参数index: Number必选 存储键值的索引
    • 返回值DOMString : 键key对应应用存储的值,如果没有则返回null
  10. getItemByIndexPlus
    通过键key检索获取应用存储的值

    var item=myStorage.getItemByIndexPlus(index);
    • 参数index: Number必选 存储键值的索引
    • 返回值DOMString : 键key对应应用存储的值,如果没有则返回null
  11. getItems
    通过键key检索获取应用存储的值

    var items=myStorage.getItems(key)
    • 参数 key: Number可选 存储键值的索引
    • 返回值Array:不传key参则返回所有对象,否则返回含有该key的对象
  12. removeItemByKeys
    清除指定前缀的存储对象

    void myStorage.removeItemBykeys(keys,cb)
    • 参数keysDOMStringArray, 必选 keysString,方法内部自动转换为Array
    • 参数cbFunction 可选 回调函数

说明

以上方法经常用到的还是getItem setItem
getItems在测试或控制台查看时倒是偶尔用得到
removeItemBykeys是结合本地文件common.cache.clear缓存清除时一齐使用的


代码已分享到github
地址在https://github.com/phillyx/MUIDemos/tree/master/js/myStorage.js
也可直接使用压缩后的代码https://github.com/phillyx/MUIDemos/tree/master/dist/common.js

收起阅读 »

用js打开android 原生activity方法及本地打包

里面实现一个小功能,播放视频;因为在android5.1以后播放视频有点卡,所以用到原生下面是步骤
1.新建一个移动项目,然后 发行->生成本地打包app资源,注意我打的是android,ios差不多

  1. 下载一个app打包工具
  2. 把app打包工具导入到eclipse中
  3. 把assets->apps->项目名->www替换成你自己的www
  4. 把项目名修改成你的项目名
  5. 在src中的io.dcloud这个包中新建一个activity,并加到AndroidManifest.xml
  6. 打开activity的js的关键代码如下:
    function aa (){
    var mainActivity= plus.android.runtimeMainActivity();
    Intent = plus.android.importClass('android.content.Intent');
    var intent = new Intent();
    intent.setClassName('io.dcloud.HBuilder.Hello','io.dcloud.MyActity');//我试了其它的好像就这个能打开
    mainActivity.startActivity(intent);//打开activity
    }

打完收工,代码上传不鸟!!!!!!!!!!!!

继续阅读 »

里面实现一个小功能,播放视频;因为在android5.1以后播放视频有点卡,所以用到原生下面是步骤
1.新建一个移动项目,然后 发行->生成本地打包app资源,注意我打的是android,ios差不多

  1. 下载一个app打包工具
  2. 把app打包工具导入到eclipse中
  3. 把assets->apps->项目名->www替换成你自己的www
  4. 把项目名修改成你的项目名
  5. 在src中的io.dcloud这个包中新建一个activity,并加到AndroidManifest.xml
  6. 打开activity的js的关键代码如下:
    function aa (){
    var mainActivity= plus.android.runtimeMainActivity();
    Intent = plus.android.importClass('android.content.Intent');
    var intent = new Intent();
    intent.setClassName('io.dcloud.HBuilder.Hello','io.dcloud.MyActity');//我试了其它的好像就这个能打开
    mainActivity.startActivity(intent);//打开activity
    }

打完收工,代码上传不鸟!!!!!!!!!!!!

收起阅读 »

流应用更新方式说明

更新 流应用

传统原生App的更新是要经历较长时间的下载和安装过程的。
所以很多用户干脆不更新app,任由更新角标放着。

流应用下没有这些问题,用户无需触发更新操作,总能使用到最新版。
流应用不需要平时在后台处理更新,而是在启动流应用时进行更新检查。

流应用除了能流式下载,自然也能流式更新,并且这种更新是差量更新。
如果你的app工程里有100个文件,其中5个文件变化了,那么流应用平台会自动识别并只更新这5个文件。

当流应用启动时,会向流应用服务器发起更新检测请求,如果服务器版本有更新则会下载更新包(使用差量更新技术),更新包下载完成后则执行更新操作。

流应用有多种更新模式可选。
开发者在HBuilder里提交流应用时,可以配置更新模式,不同的更新模式有不同的效果。

HBuilder里更新流应用时,可以选择更新模式:

默认模式(Android平台提示用户是否重启升级,iOS平台不提示,下次启动升级)

应用升级时弹出提示框,5秒后自动关闭,效果如下:

顶部“重启”、“忽略”按钮点击后的作用如下:

  • 重启:立即更新应用并重启生效。
  • 忽略:不立即更新应用(此时仍然使用老版本),下次启动应用时自动更新。

实时更新当前应用

启动时检查到需要更新,立即更新应用,但是已经打开的html页面不会更新。
采用此模式应该注意以下问题:

  1. 应用已经打开页面不会更新,由于更新文件从网络下载,从而导致更新时机的不确定性,此时无法确定当前用户操作到具体的页面;
  2. 应用已经加载过的资源存在缓存,更新后无法立即生效,如js/css等,此时还是使用更新前内容;
  3. 新版本应用更新需删除老版本文件,可能导致老版本业务逻辑无法继续运行;
  4. 新版本应用更新中JS业务逻辑包含重大调整,可能会出现应用无法预期的状态(如新版本某些页面的js逻辑是认为首页一定会做某些操作,而旧版本首页如果没有这些操作,从而会进入不可预期的状态)。
    这种更新模式虽然注意事项很多,但有2个适应场景:
  5. 静态资源更新,即文字图片等非js逻辑,可以立即生效的体验要比重启生效更好。
  6. 追究极致的高级开发者在经过仔细测试后,也可更新js等逻辑。

继续阅读 »

传统原生App的更新是要经历较长时间的下载和安装过程的。
所以很多用户干脆不更新app,任由更新角标放着。

流应用下没有这些问题,用户无需触发更新操作,总能使用到最新版。
流应用不需要平时在后台处理更新,而是在启动流应用时进行更新检查。

流应用除了能流式下载,自然也能流式更新,并且这种更新是差量更新。
如果你的app工程里有100个文件,其中5个文件变化了,那么流应用平台会自动识别并只更新这5个文件。

当流应用启动时,会向流应用服务器发起更新检测请求,如果服务器版本有更新则会下载更新包(使用差量更新技术),更新包下载完成后则执行更新操作。

流应用有多种更新模式可选。
开发者在HBuilder里提交流应用时,可以配置更新模式,不同的更新模式有不同的效果。

HBuilder里更新流应用时,可以选择更新模式:

默认模式(Android平台提示用户是否重启升级,iOS平台不提示,下次启动升级)

应用升级时弹出提示框,5秒后自动关闭,效果如下:

顶部“重启”、“忽略”按钮点击后的作用如下:

  • 重启:立即更新应用并重启生效。
  • 忽略:不立即更新应用(此时仍然使用老版本),下次启动应用时自动更新。

实时更新当前应用

启动时检查到需要更新,立即更新应用,但是已经打开的html页面不会更新。
采用此模式应该注意以下问题:

  1. 应用已经打开页面不会更新,由于更新文件从网络下载,从而导致更新时机的不确定性,此时无法确定当前用户操作到具体的页面;
  2. 应用已经加载过的资源存在缓存,更新后无法立即生效,如js/css等,此时还是使用更新前内容;
  3. 新版本应用更新需删除老版本文件,可能导致老版本业务逻辑无法继续运行;
  4. 新版本应用更新中JS业务逻辑包含重大调整,可能会出现应用无法预期的状态(如新版本某些页面的js逻辑是认为首页一定会做某些操作,而旧版本首页如果没有这些操作,从而会进入不可预期的状态)。
    这种更新模式虽然注意事项很多,但有2个适应场景:
  5. 静态资源更新,即文字图片等非js逻辑,可以立即生效的体验要比重启生效更好。
  6. 追究极致的高级开发者在经过仔细测试后,也可更新js等逻辑。

收起阅读 »

[android端] 用百度推送替换个推推送,js端继续使用官方api。

推送 推送插件配置指南 离线打包

项目github地址、jar包下载地址

  1. 介绍
    ===

    • 这是一个dcloud集成百度推送的教程(android端)。
    • 这是一个离线打包配置的教程。
    • 本项目用百度推送去替换dcloud默认集成的个推推送,使修改对于web层是完全透明的,也就是说js端的推送逻辑基本不用做修改。
  2. 使用
    ===

    • 按照dcloud官方教程集成个推推送。
    • 下载百度推送sdk,导入sdk中的jar包和so文件,so文件只需导入armeabi、armeabi-v7a、x86文件夹下的。
    • 删除个推jar包GetuiSdk2.5.0.0.jar、GetuiExt-2.0.3.jar、aps-igexin.jar,导入本项目libs目录中的baidu-gexing.jar。
    • 在AndroidManifest.xml中注释掉个推推送的所有配置,添加以下配置:
      
      <!-- baidu push开始 -->  

<!-- 用于操作本地创建的通知 -->
<receiver android:name="io.dcloud.feature.aps.NotificationReceiver" >
<!-- 如下配置用于处理推送消息 -->
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="cn.tomygo.app.v2.CREATE_NOTIFICATION" />
<action android:name="cn.tomygo.app.v2.__REMOVE_NOTIFICATION" />
<action android:name="cn.tomygo.app.v2.
CLEAR_NOTIFICATION" />
<action android:name="cn.tomygo.app.v2.__CLILK_NOTIFICATION" />
</intent-filter>
</receiver>

<!-- 原本用于个推的配置,同样用于百度推送 -->
<meta-data
android:name="PUSH_APPID"
android:value="填写你的appid" />
<meta-data
android:name="PUSH_APPKEY"
android:value="填写你的appkey" />
<meta-data
android:name="PUSH_APPSECRET"
android:value="填写你的appsecret" />

<!-- Push service 运行需要的权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_DOWNLOAD_MANAGER"/>
<uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />

<!-- 4.6版本新增的Activity声明,提升Push后台存活率 -->  
<activity  
    android:name="com.baidu.android.pushservice.PushKeepAlive"  
    android:theme="@android:style/Theme.Translucent.NoTitleBar"/>  

<!-- push service start -->  
<!-- 用于接收系统消息以保证PushService正常运行 -->  
<receiver android:name="com.baidu.android.pushservice.PushServiceReceiver"  
    android:process=":bdservice_v1" >  
    <intent-filter>  
    <action android:name="android.intent.action.BOOT_COMPLETED" />  
    <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />  
    <action android:name="com.baidu.android.pushservice.action.notification.SHOW" />  
    <action android:name="com.baidu.android.pushservice.action.media.CLICK" />  
    <!-- 以下四项为可选的action声明,可大大提高service存活率和消息到达速度 -->  
    <action android:name="android.intent.action.MEDIA_MOUNTED" />  
    <action android:name="android.intent.action.USER_PRESENT" />  
    <action android:name="android.intent.action.ACTION_POWER_CONNECTED" />  
    <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" />  
    </intent-filter>  
</receiver>  
<!-- Push服务接收客户端发送的各种请求-->  
<receiver android:name="com.baidu.android.pushservice.RegistrationReceiver"  
    android:process=":bdservice_v1" >  
    <intent-filter>  
    <action android:name="com.baidu.android.pushservice.action.METHOD" />  
    <action android:name="com.baidu.android.pushservice.action.BIND_SYNC" />  
    </intent-filter>  
    <intent-filter>  
    <action android:name="android.intent.action.PACKAGE_REMOVED" />  
    <data android:scheme="package" />  
    </intent-filter>                     
</receiver>  
<service android:name="com.baidu.android.pushservice.PushService" android:exported="true"   
    android:process=":bdservice_v1" >  
    <intent-filter >  
        <action android:name="com.baidu.android.pushservice.action.PUSH_SERVICE" />  
    </intent-filter>  
</service>  
<!-- 4.4版本新增的CommandService声明,提升小米和魅族手机上的实际推送到达率 -->  
<service android:name="com.baidu.android.pushservice.CommandService"  
    android:exported="true" />  

<!-- 此处Receiver名字修改为当前包名路径 -->  
<receiver android:name="io.dcloud.feature.apsGt.MyPushMessageReceiver">  
    <intent-filter>  
    <!-- 接收push消息 -->   
    <action android:name="com.baidu.android.pushservice.action.MESSAGE" />  
    <!-- 接收bind、setTags等method的返回结果-->   
    <action android:name="com.baidu.android.pushservice.action.RECEIVE" />  
    <!-- 接收通知点击事件,和通知自定义内容 -->   
    <action android:name="com.baidu.android.pushservice.action.notification.CLICK" />  
    </intent-filter>  
</receiver>  
<!-- baidu push结束 -->
*  配置完成。  

3.说明  
===  
* 百度中推送的附加字段的内容放在消息对象的payload字段中:
```javascript  
//js打印附加字段  
plus.push.addEventListener( "click", function( msg ) {  
    console.log("附加字段:"+msg.payload);  
}, false );
继续阅读 »

项目github地址、jar包下载地址

  1. 介绍
    ===

    • 这是一个dcloud集成百度推送的教程(android端)。
    • 这是一个离线打包配置的教程。
    • 本项目用百度推送去替换dcloud默认集成的个推推送,使修改对于web层是完全透明的,也就是说js端的推送逻辑基本不用做修改。
  2. 使用
    ===

    • 按照dcloud官方教程集成个推推送。
    • 下载百度推送sdk,导入sdk中的jar包和so文件,so文件只需导入armeabi、armeabi-v7a、x86文件夹下的。
    • 删除个推jar包GetuiSdk2.5.0.0.jar、GetuiExt-2.0.3.jar、aps-igexin.jar,导入本项目libs目录中的baidu-gexing.jar。
    • 在AndroidManifest.xml中注释掉个推推送的所有配置,添加以下配置:
      
      <!-- baidu push开始 -->  

<!-- 用于操作本地创建的通知 -->
<receiver android:name="io.dcloud.feature.aps.NotificationReceiver" >
<!-- 如下配置用于处理推送消息 -->
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="cn.tomygo.app.v2.CREATE_NOTIFICATION" />
<action android:name="cn.tomygo.app.v2.__REMOVE_NOTIFICATION" />
<action android:name="cn.tomygo.app.v2.
CLEAR_NOTIFICATION" />
<action android:name="cn.tomygo.app.v2.__CLILK_NOTIFICATION" />
</intent-filter>
</receiver>

<!-- 原本用于个推的配置,同样用于百度推送 -->
<meta-data
android:name="PUSH_APPID"
android:value="填写你的appid" />
<meta-data
android:name="PUSH_APPKEY"
android:value="填写你的appkey" />
<meta-data
android:name="PUSH_APPSECRET"
android:value="填写你的appsecret" />

<!-- Push service 运行需要的权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_DOWNLOAD_MANAGER"/>
<uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />

<!-- 4.6版本新增的Activity声明,提升Push后台存活率 -->  
<activity  
    android:name="com.baidu.android.pushservice.PushKeepAlive"  
    android:theme="@android:style/Theme.Translucent.NoTitleBar"/>  

<!-- push service start -->  
<!-- 用于接收系统消息以保证PushService正常运行 -->  
<receiver android:name="com.baidu.android.pushservice.PushServiceReceiver"  
    android:process=":bdservice_v1" >  
    <intent-filter>  
    <action android:name="android.intent.action.BOOT_COMPLETED" />  
    <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />  
    <action android:name="com.baidu.android.pushservice.action.notification.SHOW" />  
    <action android:name="com.baidu.android.pushservice.action.media.CLICK" />  
    <!-- 以下四项为可选的action声明,可大大提高service存活率和消息到达速度 -->  
    <action android:name="android.intent.action.MEDIA_MOUNTED" />  
    <action android:name="android.intent.action.USER_PRESENT" />  
    <action android:name="android.intent.action.ACTION_POWER_CONNECTED" />  
    <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" />  
    </intent-filter>  
</receiver>  
<!-- Push服务接收客户端发送的各种请求-->  
<receiver android:name="com.baidu.android.pushservice.RegistrationReceiver"  
    android:process=":bdservice_v1" >  
    <intent-filter>  
    <action android:name="com.baidu.android.pushservice.action.METHOD" />  
    <action android:name="com.baidu.android.pushservice.action.BIND_SYNC" />  
    </intent-filter>  
    <intent-filter>  
    <action android:name="android.intent.action.PACKAGE_REMOVED" />  
    <data android:scheme="package" />  
    </intent-filter>                     
</receiver>  
<service android:name="com.baidu.android.pushservice.PushService" android:exported="true"   
    android:process=":bdservice_v1" >  
    <intent-filter >  
        <action android:name="com.baidu.android.pushservice.action.PUSH_SERVICE" />  
    </intent-filter>  
</service>  
<!-- 4.4版本新增的CommandService声明,提升小米和魅族手机上的实际推送到达率 -->  
<service android:name="com.baidu.android.pushservice.CommandService"  
    android:exported="true" />  

<!-- 此处Receiver名字修改为当前包名路径 -->  
<receiver android:name="io.dcloud.feature.apsGt.MyPushMessageReceiver">  
    <intent-filter>  
    <!-- 接收push消息 -->   
    <action android:name="com.baidu.android.pushservice.action.MESSAGE" />  
    <!-- 接收bind、setTags等method的返回结果-->   
    <action android:name="com.baidu.android.pushservice.action.RECEIVE" />  
    <!-- 接收通知点击事件,和通知自定义内容 -->   
    <action android:name="com.baidu.android.pushservice.action.notification.CLICK" />  
    </intent-filter>  
</receiver>  
<!-- baidu push结束 -->
*  配置完成。  

3.说明  
===  
* 百度中推送的附加字段的内容放在消息对象的payload字段中:
```javascript  
//js打印附加字段  
plus.push.addEventListener( "click", function( msg ) {  
    console.log("附加字段:"+msg.payload);  
}, false );
收起阅读 »

承接HTML5+ MUI外包或纯前端界面

HTML5+ mui 外包

前端经验两年,北京工作,现承接HTML5+ MUI外包或者纯前端界面,有意详谈 扣扣80883080

前端经验两年,北京工作,现承接HTML5+ MUI外包或者纯前端界面,有意详谈 扣扣80883080

[BUG?] plus.storage.removeItem删不干净

Storage

plus.storage.removeItem 删除某个键值对的时候好像删不干净,再去取删除掉的键时有时候还可以取到. 有没有人遇到同样的问题?

plus.storage.removeItem 删除某个键值对的时候好像删不干净,再去取删除掉的键时有时候还可以取到. 有没有人遇到同样的问题?