HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

uni-app 在 miui9.6 无法获得定位:uni.getLocation,三星,苹果,美图测试正常。

uni-app 在 miui9.6 无法获得定位:uni.getLocation,三星,苹果,美图测试正常。

H5+ miui9.6 定位 测试正常。

uni-app 在 miui9.6 无法获得定位:uni.getLocation,三星,苹果,美图测试正常。

H5+ miui9.6 定位 测试正常。

分享一个wap2app升级检测-安卓/苹果设备【详细】

升级更新 wap2app

这是一个比较详细的教程
客户端的检测代码+服务端的php代码就可以检测了!

需要注意的是,检测更新在真机调试的情况下是没有效果的,一定要发行原生安装包 安装在手机测试才有效果

1.客户端app.js添加检测代码

  /************升级检测代码开始********** */  
        var ua = navigator.userAgent;  
        //Html5Plus环境,但不是流应用环境  
        if(ua.indexOf('Html5Plus') > -1 && ua.indexOf('StreamApp') == -1) {  
            var server = "http://****.com/c***.php"; //检查更新地址  
            var req = { //升级检测数据  
                "appid": plus.runtime.appid,  
                "version": plus.runtime.version,  
                "imei": plus.device.imei,  
                "plus":plus.os.name  
            };  
            //注释部分是wap2app封装的post请求。示例使用get请求  
            wap2app.ajax.get(server, req, function(rsp) {  
                if(rsp && rsp.status) {  
                    //需要更新,提示用户  
                    plus.nativeUI.confirm(rsp.note, function(event) {  
                        if(0 == event.index) { //用户点击了“立即更新”按钮  
                            plus.runtime.openURL(rsp.url);  
                        }  
                    }, rsp.title, ["立即更新", "取  消"]);  
                }  
            });  
        }  
        /************升级检测代码结束********** */

2.可能刚接触wap2app封装的人不知道把检测代码添加到app.js里的哪个位置,那我就把我已经添加好检测代码的app.js全部代码发出来吧

App({  
    options: {  
        debug: false  
    },  
    /**  
     * 当wap2app初始化完成时,会触发 onLaunch  
     */  
    onLaunch: function() {  
        console.log('launch');  
        /************升级检测代码开始********** */  
        var ua = navigator.userAgent;  
        //Html5Plus环境,但不是流应用环境  
        if(ua.indexOf('Html5Plus') > -1 && ua.indexOf('StreamApp') == -1) {  
            var server = "http://****.com/c***.php"; //检查更新地址  
            var req = { //升级检测数据  
                "appid": plus.runtime.appid,  
                "version": plus.runtime.version,  
                "imei": plus.device.imei,  
                "plus":plus.os.name  
            };  
            //注释部分是wap2app封装的post请求。示例使用get请求  
            wap2app.ajax.get(server, req, function(rsp) {  
                if(rsp && rsp.status) {  
                    //需要更新,提示用户  
                    plus.nativeUI.confirm(rsp.note, function(event) {  
                        if(0 == event.index) { //用户点击了“立即更新”按钮  
                            plus.runtime.openURL(rsp.url);  
                        }  
                    }, rsp.title, ["立即更新", "取  消"]);  
                }  
            });  
        }  
        /************升级检测代码结束********** */  
    },  
    /**  
     * 当wap2app启动,或从后台进入前台显示,会触发 onShow  
     */  
    onShow: function() {  
        console.log('show');  
    },  
    /**  
     * 当wap2app从前台进入后台,会触发 onHide  
     */  
    onHide: function() {  
        console.log('hide');  
    }  
});  
Page('__W2A__www.xxxx.com', { //首页扩展配置  
    onShow: function() {  

    },  
    onClose: function() {  

    }  
});

3.服务端那边是一个PHP文件
官方文档那边有验证客户端appid的,被我去掉了

代码如下:

<?php  
error_reporting(E_ALL^E_NOTICE^E_WARNING);  
header('Content-Type:text/html;charset=utf-8');  
function down(){  
$appid = $_GET['appid'];  
$version = $_GET['version'];  
$os= $_GET['plus'];   
$imei= $_GET['imei'];   
$rsp = array('status' => 0);  
if (isset($appid) && isset($version)) {  
if($version !== "1.1"){ //最新版本号  
$rsp['status'] = 1;  
$rsp['title'] = "Hello 版本更新";  
$rsp['note'] = "本次更新了,此为自定义内容";  
if($os == 'Android'){  
$rsp['url'] = "http://***.com/***.apk"; //安卓安装包地址  
}else{  
$rsp['url'] = "https://itunes.apple.com/cn/app/xxx"; //苹果点击更新后跳转的地址,可以是自己的网页的,也可以是苹果商店的  
}}}exit(json_encode($rsp));}  
$data=down($getdh);    
echo $data;

4.服务端那边php文件里的【最新版本号】要大于之前安装包的版本号才会检测更新

  1. 要改的地方也就客户端app.js里的检测地址、服务器端PHP的版本号、安卓下载地址,苹果点击更新按钮后跳转的地址、更新弹窗提示文字。

继续阅读 »

这是一个比较详细的教程
客户端的检测代码+服务端的php代码就可以检测了!

需要注意的是,检测更新在真机调试的情况下是没有效果的,一定要发行原生安装包 安装在手机测试才有效果

1.客户端app.js添加检测代码

  /************升级检测代码开始********** */  
        var ua = navigator.userAgent;  
        //Html5Plus环境,但不是流应用环境  
        if(ua.indexOf('Html5Plus') > -1 && ua.indexOf('StreamApp') == -1) {  
            var server = "http://****.com/c***.php"; //检查更新地址  
            var req = { //升级检测数据  
                "appid": plus.runtime.appid,  
                "version": plus.runtime.version,  
                "imei": plus.device.imei,  
                "plus":plus.os.name  
            };  
            //注释部分是wap2app封装的post请求。示例使用get请求  
            wap2app.ajax.get(server, req, function(rsp) {  
                if(rsp && rsp.status) {  
                    //需要更新,提示用户  
                    plus.nativeUI.confirm(rsp.note, function(event) {  
                        if(0 == event.index) { //用户点击了“立即更新”按钮  
                            plus.runtime.openURL(rsp.url);  
                        }  
                    }, rsp.title, ["立即更新", "取  消"]);  
                }  
            });  
        }  
        /************升级检测代码结束********** */

2.可能刚接触wap2app封装的人不知道把检测代码添加到app.js里的哪个位置,那我就把我已经添加好检测代码的app.js全部代码发出来吧

App({  
    options: {  
        debug: false  
    },  
    /**  
     * 当wap2app初始化完成时,会触发 onLaunch  
     */  
    onLaunch: function() {  
        console.log('launch');  
        /************升级检测代码开始********** */  
        var ua = navigator.userAgent;  
        //Html5Plus环境,但不是流应用环境  
        if(ua.indexOf('Html5Plus') > -1 && ua.indexOf('StreamApp') == -1) {  
            var server = "http://****.com/c***.php"; //检查更新地址  
            var req = { //升级检测数据  
                "appid": plus.runtime.appid,  
                "version": plus.runtime.version,  
                "imei": plus.device.imei,  
                "plus":plus.os.name  
            };  
            //注释部分是wap2app封装的post请求。示例使用get请求  
            wap2app.ajax.get(server, req, function(rsp) {  
                if(rsp && rsp.status) {  
                    //需要更新,提示用户  
                    plus.nativeUI.confirm(rsp.note, function(event) {  
                        if(0 == event.index) { //用户点击了“立即更新”按钮  
                            plus.runtime.openURL(rsp.url);  
                        }  
                    }, rsp.title, ["立即更新", "取  消"]);  
                }  
            });  
        }  
        /************升级检测代码结束********** */  
    },  
    /**  
     * 当wap2app启动,或从后台进入前台显示,会触发 onShow  
     */  
    onShow: function() {  
        console.log('show');  
    },  
    /**  
     * 当wap2app从前台进入后台,会触发 onHide  
     */  
    onHide: function() {  
        console.log('hide');  
    }  
});  
Page('__W2A__www.xxxx.com', { //首页扩展配置  
    onShow: function() {  

    },  
    onClose: function() {  

    }  
});

3.服务端那边是一个PHP文件
官方文档那边有验证客户端appid的,被我去掉了

代码如下:

<?php  
error_reporting(E_ALL^E_NOTICE^E_WARNING);  
header('Content-Type:text/html;charset=utf-8');  
function down(){  
$appid = $_GET['appid'];  
$version = $_GET['version'];  
$os= $_GET['plus'];   
$imei= $_GET['imei'];   
$rsp = array('status' => 0);  
if (isset($appid) && isset($version)) {  
if($version !== "1.1"){ //最新版本号  
$rsp['status'] = 1;  
$rsp['title'] = "Hello 版本更新";  
$rsp['note'] = "本次更新了,此为自定义内容";  
if($os == 'Android'){  
$rsp['url'] = "http://***.com/***.apk"; //安卓安装包地址  
}else{  
$rsp['url'] = "https://itunes.apple.com/cn/app/xxx"; //苹果点击更新后跳转的地址,可以是自己的网页的,也可以是苹果商店的  
}}}exit(json_encode($rsp));}  
$data=down($getdh);    
echo $data;

4.服务端那边php文件里的【最新版本号】要大于之前安装包的版本号才会检测更新

  1. 要改的地方也就客户端app.js里的检测地址、服务器端PHP的版本号、安卓下载地址,苹果点击更新按钮后跳转的地址、更新弹窗提示文字。

收起阅读 »

没有微信小程序APPID时候,在uni-app中使用测试APPID代替

很多时候微信小程序的正式APPID还没有注册下来,没有APPID小程序开发功能并不完整。这个时候就可以在小程序开发者工具中先获取测试APPID,然后配置到HX项目中。

第一步:先在微信开发者工具里面获取到测试APPID,如图


点击小程序获取测试APPID

第二步:在uni-app配置项中加入APPID即可,如图

再次编译后,微信开发者工具就可以拥有全部的开发功能了

继续阅读 »

很多时候微信小程序的正式APPID还没有注册下来,没有APPID小程序开发功能并不完整。这个时候就可以在小程序开发者工具中先获取测试APPID,然后配置到HX项目中。

第一步:先在微信开发者工具里面获取到测试APPID,如图


点击小程序获取测试APPID

第二步:在uni-app配置项中加入APPID即可,如图

再次编译后,微信开发者工具就可以拥有全部的开发功能了

收起阅读 »

郑州小程序开发比较适合什么行业投资

微信小程序 小程序

  郑州小程序开发认为目前小程序主要的优势就是在流量上的优势,而小程序的出现也让越来越多的人相信,小程序的仍然有很大的发展空间,那么小程序开发有哪些类型呢,对于投资者来说哪些行业适合做小程序呢? 今天就为大家分析解答一下吧。

  1、在线点餐小程序 。对于生意火爆的餐厅来说,最影响服务质量的一个因素之一,就是消费者排队时间长。如果商家开发有自己的小程序,消费者便能自主下单,还能选择座位,结账支付后直接退出页面即可,操作过程简单,也不会占用手机内存。

  2、电商小程序。这是目前最为常见的小程序类型。这类型小程序具有产品展示和支付功能,用户可以直接通过小程序挑选和购买商品,不需要跳转到第三方平台。电商小程序的优势是,缩短了用户的决策路径,降低了用户的决策时间,让交易变得更高效。而且小程序还带有客服功能,消费过程中同样可以实现一对一交流。

  3、酒店预订小程序。网络预定酒店已经成为八零九零后出行的普遍方式,除了优惠力度大以外,网络预订很便捷,也是吸引他们的主要原因。酒店预订类小程序同样具备导航功能和在线支付功能。小程序与官网配合使用,也是提高品牌知名度的有效方法,无论是酒店还是民宿,有个自己的小程序,也是很有必要。

  4、互动功能类。互动类的小程序近期也出现得比较多,不过这类小程序一旦造成刷屏,就很容易被封号,总之,还是要按照微信规则来进行开发和推广。微信小程序开发成本低,技术难度小,用户体验更佳,无论哪种类型的商家,都能在小程序中挖掘到最适合自己的引流方式。

  微信小程序已经成为互联网的一匹黑马,从刚刚发布时的不被看好,到现在的火爆,中间不到两年的时间,虽然经历了一些起伏,但小程序毫无疑问已经成为目前各企业抢占流量的主要入口。即便是不太关注互联网行业的普通用户,也能充分感受到小程序的发展速度。所以对于企业投资者来说,现在要做的就是抓住机遇,开发一款适合自己行业的小程序来盈利。
本文由专业的郑州小程序开发燚轩科技整理发布,如需转载请注明出处。

继续阅读 »

  郑州小程序开发认为目前小程序主要的优势就是在流量上的优势,而小程序的出现也让越来越多的人相信,小程序的仍然有很大的发展空间,那么小程序开发有哪些类型呢,对于投资者来说哪些行业适合做小程序呢? 今天就为大家分析解答一下吧。

  1、在线点餐小程序 。对于生意火爆的餐厅来说,最影响服务质量的一个因素之一,就是消费者排队时间长。如果商家开发有自己的小程序,消费者便能自主下单,还能选择座位,结账支付后直接退出页面即可,操作过程简单,也不会占用手机内存。

  2、电商小程序。这是目前最为常见的小程序类型。这类型小程序具有产品展示和支付功能,用户可以直接通过小程序挑选和购买商品,不需要跳转到第三方平台。电商小程序的优势是,缩短了用户的决策路径,降低了用户的决策时间,让交易变得更高效。而且小程序还带有客服功能,消费过程中同样可以实现一对一交流。

  3、酒店预订小程序。网络预定酒店已经成为八零九零后出行的普遍方式,除了优惠力度大以外,网络预订很便捷,也是吸引他们的主要原因。酒店预订类小程序同样具备导航功能和在线支付功能。小程序与官网配合使用,也是提高品牌知名度的有效方法,无论是酒店还是民宿,有个自己的小程序,也是很有必要。

  4、互动功能类。互动类的小程序近期也出现得比较多,不过这类小程序一旦造成刷屏,就很容易被封号,总之,还是要按照微信规则来进行开发和推广。微信小程序开发成本低,技术难度小,用户体验更佳,无论哪种类型的商家,都能在小程序中挖掘到最适合自己的引流方式。

  微信小程序已经成为互联网的一匹黑马,从刚刚发布时的不被看好,到现在的火爆,中间不到两年的时间,虽然经历了一些起伏,但小程序毫无疑问已经成为目前各企业抢占流量的主要入口。即便是不太关注互联网行业的普通用户,也能充分感受到小程序的发展速度。所以对于企业投资者来说,现在要做的就是抓住机遇,开发一款适合自己行业的小程序来盈利。
本文由专业的郑州小程序开发燚轩科技整理发布,如需转载请注明出处。

收起阅读 »

安卓微信支付-100 (-1)错误排除指导

微信支付

微信支付报错信息:

{"code":-100,"message":"[payment微信:-1]General errors"}

以上错误码-100是5+SDK的错误码,而-1为微信支付SDK的错误码,对应的微信的错误类型为:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。
根据错误提示我们逐步排除。

登记的包名或签名错误

核对微信后台登记的应用包名以及应用签名是否有误,登记的签名需要和签名工具获取到的一致,更新这些信息并非马上生效,可以等一段时间再测试。另外需要确保应用已经通过审核,并获得支付权限。
如果核对均无误,尝试重新登陆或者重装微信。

APPID错误

核对项目中manifest.json文件中填写的微信支付的AppID是否和平台上的一致。

付款信息计算错误

核对后端代码,查验统一下单调起支付接口的逻辑是否有误,并确保两次签名生成算法一致。

H5+接口调用错误

接口plus.payment.request调用时传入的支付信息是字符串类型,如:

'{"appid":"wx0411fa6a39d61297","noncestr":"71maVjWiEAvU85Wk","package":"Sign=WXPay","partnerid":"1230636401","prepayid":"wx03141004900988e2c281e3170042244847","timestamp":1535955004,"sign":"2AE06EF08E54B47659C79149CD9C284C"}'
继续阅读 »

微信支付报错信息:

{"code":-100,"message":"[payment微信:-1]General errors"}

以上错误码-100是5+SDK的错误码,而-1为微信支付SDK的错误码,对应的微信的错误类型为:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。
根据错误提示我们逐步排除。

登记的包名或签名错误

核对微信后台登记的应用包名以及应用签名是否有误,登记的签名需要和签名工具获取到的一致,更新这些信息并非马上生效,可以等一段时间再测试。另外需要确保应用已经通过审核,并获得支付权限。
如果核对均无误,尝试重新登陆或者重装微信。

APPID错误

核对项目中manifest.json文件中填写的微信支付的AppID是否和平台上的一致。

付款信息计算错误

核对后端代码,查验统一下单调起支付接口的逻辑是否有误,并确保两次签名生成算法一致。

H5+接口调用错误

接口plus.payment.request调用时传入的支付信息是字符串类型,如:

'{"appid":"wx0411fa6a39d61297","noncestr":"71maVjWiEAvU85Wk","package":"Sign=WXPay","partnerid":"1230636401","prepayid":"wx03141004900988e2c281e3170042244847","timestamp":1535955004,"sign":"2AE06EF08E54B47659C79149CD9C284C"}'
收起阅读 »

9.1.19.201808300739Hbuilder更新后微信分享而发起的质问与建议

微信分享 HBuilder

DCloud在8月30号更新hbuilder,我在今天更新内容后我难得一次地迫不及待点击更新了Hbuilder,在以往的更新中我通常会等到新版本更新一个月后才进行更新,因为众所皆知,新版本的HBuilder必定会出现一些影响APP的bug。

但这次Hbuilder更新了微信能够分享小程序这一功能让我迫不及待想尝一下这块蛋糕,即使我知道应该会碰到bug的。

新版本的HBuilder更新完毕,运行APP基座毫无问题,APP看起来似乎没有任何问题。于是开始尝试微信分享小程序这一功能,更新内容并没有提示任何新功能代码如何编写的文档,于是,有经验的dcloud开发者会自行前往HTML5+API文档中心寻找。

很顺利的,根据文档说明以及示例,安卓版本的微信分享小程序测试成功,唯一的瑕疵就是小程序缩略图即使尺寸、文件大小按照文档说明设置了,还是会出现模糊。该问题查阅社区,发现有许多开发者一起反馈过,问题下面并没有给出解决方案。如果只是这个小瑕疵,其实可以将就。

后来,测试IOS版本的微信分享小程序,无法成功分享,显示不支持的分享类型,如附件图。查询社区同样发现许多开发者反馈这个问题,也就是说新版本的微信分享小程序在iOS版本上根本就是没有成功的,那么为何版本更新说明不说清楚,让开发者自己蒙头瞎测试

另外,我顺带测试了原本已有的微信分享,安卓版本的微信分享图文链接消息没有问题,而IOS版本的图文链接则是变成了文字消息,起初以为只是我的苹果测试机版本太老引发的,后面用了多部测试机测试发现确实是有这个问题,才上来社区搜索相关问题,发现这个问题是有一大堆开发者遇到了!

之后特地去回头查看文档,文档是已经更改。

微信分享平台,可取值: "web"-分享网页类型,title(必填)、content(必填)、thumbs(必填)、href(网页url,必填)属性值有效; "text"-分享文字类型,content(必填)属性值有效; "image"-分享图片类型,pictures(必填)属性值有效; "music"-分享音乐类型,title(必填)、content(必填)、thumbs(必填)、media(音乐url,必填)属性值有效; "video"-分享视频类型,title(必填)、content(必填)、thumbs(必填)、media(视频url,必填)属性值有效; "miniProgram"-分享小程序类型(仅支持分享到好友),title(必填)、content(必填)、thumbs(图片小于128K,宽高比为5:4,必填)、miniProgram(小程序参数,必填)属性值有效; 没有设置type时,如果href值有效则默认值为"web"

首先值得一提的是,文档说明中“如果href值有效则默认值为"web”是错误的,我程序的href是有效的,但分享出来还是text类型,其二,软件更新新功能无法完美向下兼容,所有开发者都可以理解,但是为什么DCloud的更新提示,对于这一点为什么提都不愿意提一下呢?因为如果开发者不能及时发现问题,更改代码,那么开发者使用新版本hbuilder打包的APP的分享将会出现瘫痪,这种bug在有些公司是会直接导致开发者丢掉饭碗!也就是说,只要在更新提示中加以提醒标注一下,就能让开发者自发解决问题,那为什么不怎么做呢?

对于DCloud这种匠心公司,我总是抱着莫大的敬意的,以及经常会推荐身边的开发者去使用它。我相信dcloud的这种开发模式是适合国情的,适合中国广大的中低级开发者的,但是,请您,不辜负开发者对您的信任,可以嘛?

继续阅读 »

DCloud在8月30号更新hbuilder,我在今天更新内容后我难得一次地迫不及待点击更新了Hbuilder,在以往的更新中我通常会等到新版本更新一个月后才进行更新,因为众所皆知,新版本的HBuilder必定会出现一些影响APP的bug。

但这次Hbuilder更新了微信能够分享小程序这一功能让我迫不及待想尝一下这块蛋糕,即使我知道应该会碰到bug的。

新版本的HBuilder更新完毕,运行APP基座毫无问题,APP看起来似乎没有任何问题。于是开始尝试微信分享小程序这一功能,更新内容并没有提示任何新功能代码如何编写的文档,于是,有经验的dcloud开发者会自行前往HTML5+API文档中心寻找。

很顺利的,根据文档说明以及示例,安卓版本的微信分享小程序测试成功,唯一的瑕疵就是小程序缩略图即使尺寸、文件大小按照文档说明设置了,还是会出现模糊。该问题查阅社区,发现有许多开发者一起反馈过,问题下面并没有给出解决方案。如果只是这个小瑕疵,其实可以将就。

后来,测试IOS版本的微信分享小程序,无法成功分享,显示不支持的分享类型,如附件图。查询社区同样发现许多开发者反馈这个问题,也就是说新版本的微信分享小程序在iOS版本上根本就是没有成功的,那么为何版本更新说明不说清楚,让开发者自己蒙头瞎测试

另外,我顺带测试了原本已有的微信分享,安卓版本的微信分享图文链接消息没有问题,而IOS版本的图文链接则是变成了文字消息,起初以为只是我的苹果测试机版本太老引发的,后面用了多部测试机测试发现确实是有这个问题,才上来社区搜索相关问题,发现这个问题是有一大堆开发者遇到了!

之后特地去回头查看文档,文档是已经更改。

微信分享平台,可取值: "web"-分享网页类型,title(必填)、content(必填)、thumbs(必填)、href(网页url,必填)属性值有效; "text"-分享文字类型,content(必填)属性值有效; "image"-分享图片类型,pictures(必填)属性值有效; "music"-分享音乐类型,title(必填)、content(必填)、thumbs(必填)、media(音乐url,必填)属性值有效; "video"-分享视频类型,title(必填)、content(必填)、thumbs(必填)、media(视频url,必填)属性值有效; "miniProgram"-分享小程序类型(仅支持分享到好友),title(必填)、content(必填)、thumbs(图片小于128K,宽高比为5:4,必填)、miniProgram(小程序参数,必填)属性值有效; 没有设置type时,如果href值有效则默认值为"web"

首先值得一提的是,文档说明中“如果href值有效则默认值为"web”是错误的,我程序的href是有效的,但分享出来还是text类型,其二,软件更新新功能无法完美向下兼容,所有开发者都可以理解,但是为什么DCloud的更新提示,对于这一点为什么提都不愿意提一下呢?因为如果开发者不能及时发现问题,更改代码,那么开发者使用新版本hbuilder打包的APP的分享将会出现瘫痪,这种bug在有些公司是会直接导致开发者丢掉饭碗!也就是说,只要在更新提示中加以提醒标注一下,就能让开发者自发解决问题,那为什么不怎么做呢?

对于DCloud这种匠心公司,我总是抱着莫大的敬意的,以及经常会推荐身边的开发者去使用它。我相信dcloud的这种开发模式是适合国情的,适合中国广大的中低级开发者的,但是,请您,不辜负开发者对您的信任,可以嘛?

收起阅读 »

uniapp嵌入百度地图,android定位无法用。IOS正常。

Webview

请官方花30秒,用uni-app测试以下代码。不要再拖了。

<web-view src="https://map.baidu.com/mobile/webapp/index/index/foo=bar/vt=map"></web-view>

按下图左下角的定位按钮。

继续阅读 »

请官方花30秒,用uni-app测试以下代码。不要再拖了。

<web-view src="https://map.baidu.com/mobile/webapp/index/index/foo=bar/vt=map"></web-view>

按下图左下角的定位按钮。

收起阅读 »

如何选择合适的郑州小程序开发设计方式呢

微信小程序

  郑州小程序开发的价格其实和投资者所选择的开发方式是有关系的,而且不同的小程序开发方式所需要的开发报价是不一样的,开发一款小程序主要有三种方式,接下来分别列一下每种方式的大概费用:

  1、自己组技术团队自己开发,需要的人员有产品经理、框架工程师、JAVA、PHP、前端、后端、测试工程师,开发周期在1-2个月。人员成本5-8万,后期维护成本没算。(推荐企业选择,不推荐个体商家选择)

  2、购买别人的小程序源码,用自己的服务器,找个技术人员专职维护。源码费用一般8000-10000,服务器一年3000,维护成本每月6000。(不推荐企业和商家选择)

  3、使用类似速成应用这样的第三方小程序开发小程序,根据功能、框架、定位、交互、UI常见的小程序开发价格在1000-5000之间,特殊定制类价格在5000-20000直接不用担心技术维护、不用建服务器,拿过来就可以使用,还可以根据自己的搭建要求设计店铺和绑定公众号。(推荐个体商家选择,不推荐企业选择)

  至于如何找到一家口碑及实力信誉都比较好的微信小程序开发公司,这里建议大家分两步来找。首先,看其有无负面消息。在各大搜素引擎中搜索该公司的名字,如果出现“骗子”、“骗人”等负面性词汇时,则表明该公司对外的口碑并不好。反之,如果没有任何负面消息出现,该公司则可以列入你的选择范围内。

  其次,看其合作案例多少。如果该公司连一个案例都没有,则说明公司刚处于起步阶段或是技术实力不行。反之,你可以看其现有的合作案例,亲自进行体验操作,来判断其设计是否符合你的要求。考察的过程中,关于对方的规模、服务态度以及技术实力你都可以形成一个大致的轮廓,以此再进一步判断其是否符合你的标准。
本文由专业的郑州小程序开发公司燚轩科技整理发布,如需转载请注明出处!

继续阅读 »

  郑州小程序开发的价格其实和投资者所选择的开发方式是有关系的,而且不同的小程序开发方式所需要的开发报价是不一样的,开发一款小程序主要有三种方式,接下来分别列一下每种方式的大概费用:

  1、自己组技术团队自己开发,需要的人员有产品经理、框架工程师、JAVA、PHP、前端、后端、测试工程师,开发周期在1-2个月。人员成本5-8万,后期维护成本没算。(推荐企业选择,不推荐个体商家选择)

  2、购买别人的小程序源码,用自己的服务器,找个技术人员专职维护。源码费用一般8000-10000,服务器一年3000,维护成本每月6000。(不推荐企业和商家选择)

  3、使用类似速成应用这样的第三方小程序开发小程序,根据功能、框架、定位、交互、UI常见的小程序开发价格在1000-5000之间,特殊定制类价格在5000-20000直接不用担心技术维护、不用建服务器,拿过来就可以使用,还可以根据自己的搭建要求设计店铺和绑定公众号。(推荐个体商家选择,不推荐企业选择)

  至于如何找到一家口碑及实力信誉都比较好的微信小程序开发公司,这里建议大家分两步来找。首先,看其有无负面消息。在各大搜素引擎中搜索该公司的名字,如果出现“骗子”、“骗人”等负面性词汇时,则表明该公司对外的口碑并不好。反之,如果没有任何负面消息出现,该公司则可以列入你的选择范围内。

  其次,看其合作案例多少。如果该公司连一个案例都没有,则说明公司刚处于起步阶段或是技术实力不行。反之,你可以看其现有的合作案例,亲自进行体验操作,来判断其设计是否符合你的要求。考察的过程中,关于对方的规模、服务态度以及技术实力你都可以形成一个大致的轮廓,以此再进一步判断其是否符合你的标准。
本文由专业的郑州小程序开发公司燚轩科技整理发布,如需转载请注明出处!

收起阅读 »

点击下载图片

mui.init({
gestureConfig: {
longtap: true
}
});
mui.plusReady(function() {
document.addEventListener("longtap", function(event) {
/**

  • 获取目标节点的tagName
    */
    var name = event.target.tagName;
    name = name.toLowerCase();
    /**
  • 如果是图片,则弹出选择框决定是否下载;
    */
    if(name === "img") {
    var imgUrl = event.target.src;
    console.log('图片地址:' + imgUrl);
    var suffix = cutImageSuffix(imgUrl);
    /**

    • http://dev.dcloud.net.cn/mui/ui/#dialog
      */
      mui.confirm("是否下载此图片", "确认下载?", ["下载", "不下"], function(event) {
      /**

      • index从0开始
        */
        var index = event.index;
        if(index == 0) {
        /**

        • 创建下载任务
        • http://www.html5plus.org/doc/zh_cn/downloader.html#plus.downloader.createDownload
          */
          var downLoader = plus.downloader.createDownload(imgUrl, {
          method: 'GET',
          filename: '_downloads/image' + suffix
          }, function(download, status) {
          var fileName = download.filename;
          console.log('文件名:' + fileName);
          console.log('下载状态:' + status);
          /**

          • 保存至本地相册
          • http://www.html5plus.org/doc/zh_cn/gallery.html#plus.gallery.save
            */
            plus.gallery.save(fileName, function() {
            /**

            • 保存后,弹出对话框是否查看;
            • http://dev.dcloud.net.cn/mui/ui/#dialog
              */
              mui.confirm("打开相册", "打开相册?", ["打开", "不看"], function(event) {
              var gindex = event.index;
              if(gindex == 0) {
              /**

              • 选择图片
              • http://www.html5plus.org/doc/zh_cn/gallery.html#plus.gallery.pick
                */
                plus.gallery.pick(function(file) {
                mui.toast("你选择了图片:" + file);
                }, function(error) {
                console.log(error);
                }, {

                    });  
                }  

                });
                });
                });
                /**

        • 开始下载任务
        • http://www.html5plus.org/doc/zh_cn/downloader.html#plus.downloader.Download.start
          */
          downLoader.start();
          }
          });
          }
          });
          });

// 截取图片后缀用于重命名图片,防止%E5%85%89%E6%98%8E%E8%A1%8C编码的文件不被系统相册识别;
function cutImageSuffix(imageUrl) {
var index = imageUrl.lastIndexOf('.');
return imageUrl.substring(index);
}

继续阅读 »

mui.init({
gestureConfig: {
longtap: true
}
});
mui.plusReady(function() {
document.addEventListener("longtap", function(event) {
/**

  • 获取目标节点的tagName
    */
    var name = event.target.tagName;
    name = name.toLowerCase();
    /**
  • 如果是图片,则弹出选择框决定是否下载;
    */
    if(name === "img") {
    var imgUrl = event.target.src;
    console.log('图片地址:' + imgUrl);
    var suffix = cutImageSuffix(imgUrl);
    /**

    • http://dev.dcloud.net.cn/mui/ui/#dialog
      */
      mui.confirm("是否下载此图片", "确认下载?", ["下载", "不下"], function(event) {
      /**

      • index从0开始
        */
        var index = event.index;
        if(index == 0) {
        /**

        • 创建下载任务
        • http://www.html5plus.org/doc/zh_cn/downloader.html#plus.downloader.createDownload
          */
          var downLoader = plus.downloader.createDownload(imgUrl, {
          method: 'GET',
          filename: '_downloads/image' + suffix
          }, function(download, status) {
          var fileName = download.filename;
          console.log('文件名:' + fileName);
          console.log('下载状态:' + status);
          /**

          • 保存至本地相册
          • http://www.html5plus.org/doc/zh_cn/gallery.html#plus.gallery.save
            */
            plus.gallery.save(fileName, function() {
            /**

            • 保存后,弹出对话框是否查看;
            • http://dev.dcloud.net.cn/mui/ui/#dialog
              */
              mui.confirm("打开相册", "打开相册?", ["打开", "不看"], function(event) {
              var gindex = event.index;
              if(gindex == 0) {
              /**

              • 选择图片
              • http://www.html5plus.org/doc/zh_cn/gallery.html#plus.gallery.pick
                */
                plus.gallery.pick(function(file) {
                mui.toast("你选择了图片:" + file);
                }, function(error) {
                console.log(error);
                }, {

                    });  
                }  

                });
                });
                });
                /**

        • 开始下载任务
        • http://www.html5plus.org/doc/zh_cn/downloader.html#plus.downloader.Download.start
          */
          downLoader.start();
          }
          });
          }
          });
          });

// 截取图片后缀用于重命名图片,防止%E5%85%89%E6%98%8E%E8%A1%8C编码的文件不被系统相册识别;
function cutImageSuffix(imageUrl) {
var index = imageUrl.lastIndexOf('.');
return imageUrl.substring(index);
}

收起阅读 »

记录在uni-app中style的绑定与生命周期钩子create

uni-app内置的vue与vue.js有一些不同地方,有一些他只支持的语法。
class与style的绑定
需要渲染的方法用create,在实例创建完后,数据和事件配置后调用。一开始用的mounted,整个视图都渲染完毕,我想再渲染ddom是不行的了,后来用了beforeMount,因为打了断点,偶尔能获取到this.height,偶尔不能,so,这里的情况应该使用create,渲染前,事件配置后。

继续阅读 »

uni-app内置的vue与vue.js有一些不同地方,有一些他只支持的语法。
class与style的绑定
需要渲染的方法用create,在实例创建完后,数据和事件配置后调用。一开始用的mounted,整个视图都渲染完毕,我想再渲染ddom是不行的了,后来用了beforeMount,因为打了断点,偶尔能获取到this.height,偶尔不能,so,这里的情况应该使用create,渲染前,事件配置后。

收起阅读 »

uni-app中类似mui中的chat、im(聊天窗口)实现

chat IM

用uni-app实现了一个类似于mui中有chat(聊天窗口),源代码在git上
https://github.com/felony/uniapp-chat
实现中用到了<scroll-view>组件,有些坑需要注意

继续阅读 »

用uni-app实现了一个类似于mui中有chat(聊天窗口),源代码在git上
https://github.com/felony/uniapp-chat
实现中用到了<scroll-view>组件,有些坑需要注意

收起阅读 »

分享一个cache方案,可以指定缓存时间

缓存

具体使用方法 看代码。

/**  
 * 缓存数据优化  
 * var cache = require('utils/cache.js');  
 * import cache from '../cache'  
 * 使用方法 【  
 *     一、设置缓存  
 *         string    cache.put('k', 'string你好啊');  
 *         json      cache.put('k', { "b": "3" }, 2);  
 *         array     cache.put('k', [1, 2, 3]);  
 *         boolean   cache.put('k', true);  
 *     二、读取缓存  
 *         默认值    cache.get('k')  
 *         string    cache.get('k', '你好')  
 *         json      cache.get('k', { "a": "1" })  
 *     三、移除/清理    
 *         移除: cache.remove('k');  
 *         清理:cache.clear();   
 * 】  
 * @type {String}  
 */  
var postfix = '_aszapp'; // 缓存前缀   
/**  
 * 设置缓存   
 * @param  {[type]} k [键名]  
 * @param  {[type]} v [键值]  
 * @param  {[type]} t [时间、单位秒]  
 */  
function put(k, v, t) {  
    uni.setStorageSync(k, v)   
    var seconds = parseInt(t);  
    if (seconds > 0) {  
        var timestamp = Date.parse(new Date());  
        timestamp = timestamp / 1000 + seconds;  
        uni.setStorageSync(k + postfix, timestamp + "")  
    } else {  
        uni.removeStorageSync(k + postfix)  
    }  
}  

/**  
 * 获取缓存   
 * @param  {[type]} k   [键名]  
 * @param  {[type]} def [获取为空时默认]  
 */  
function get(k, def) {  
    var deadtime = parseInt(uni.getStorageSync(k + postfix))   
    if (deadtime) {  
        if (parseInt(deadtime) < Date.parse(new Date()) / 1000) {  
            if (def) {  
                return def;  
            } else {  
                return false;  
            }  
        }  
    }  
    var res = uni.getStorageSync(k);  
    if (res) {  
        return res;  
    } else {  
        if (def == undefined  || def == "") {  
            def = false;   
        }  
        return def;  
    }  
}  

function remove(k) {  
    uni.removeStorageSync(k);  
    uni.removeStorageSync(k + postfix);  
}  

/**  
 * 清理所有缓存  
 * @return {[type]} [description]  
 */  
function clear() {  
    uni.clearStorageSync();  
}  

module.exports = {  
    put: put,  
    get: get,  
    remove: remove,  
    clear: clear,  
}
继续阅读 »

具体使用方法 看代码。

/**  
 * 缓存数据优化  
 * var cache = require('utils/cache.js');  
 * import cache from '../cache'  
 * 使用方法 【  
 *     一、设置缓存  
 *         string    cache.put('k', 'string你好啊');  
 *         json      cache.put('k', { "b": "3" }, 2);  
 *         array     cache.put('k', [1, 2, 3]);  
 *         boolean   cache.put('k', true);  
 *     二、读取缓存  
 *         默认值    cache.get('k')  
 *         string    cache.get('k', '你好')  
 *         json      cache.get('k', { "a": "1" })  
 *     三、移除/清理    
 *         移除: cache.remove('k');  
 *         清理:cache.clear();   
 * 】  
 * @type {String}  
 */  
var postfix = '_aszapp'; // 缓存前缀   
/**  
 * 设置缓存   
 * @param  {[type]} k [键名]  
 * @param  {[type]} v [键值]  
 * @param  {[type]} t [时间、单位秒]  
 */  
function put(k, v, t) {  
    uni.setStorageSync(k, v)   
    var seconds = parseInt(t);  
    if (seconds > 0) {  
        var timestamp = Date.parse(new Date());  
        timestamp = timestamp / 1000 + seconds;  
        uni.setStorageSync(k + postfix, timestamp + "")  
    } else {  
        uni.removeStorageSync(k + postfix)  
    }  
}  

/**  
 * 获取缓存   
 * @param  {[type]} k   [键名]  
 * @param  {[type]} def [获取为空时默认]  
 */  
function get(k, def) {  
    var deadtime = parseInt(uni.getStorageSync(k + postfix))   
    if (deadtime) {  
        if (parseInt(deadtime) < Date.parse(new Date()) / 1000) {  
            if (def) {  
                return def;  
            } else {  
                return false;  
            }  
        }  
    }  
    var res = uni.getStorageSync(k);  
    if (res) {  
        return res;  
    } else {  
        if (def == undefined  || def == "") {  
            def = false;   
        }  
        return def;  
    }  
}  

function remove(k) {  
    uni.removeStorageSync(k);  
    uni.removeStorageSync(k + postfix);  
}  

/**  
 * 清理所有缓存  
 * @return {[type]} [description]  
 */  
function clear() {  
    uni.clearStorageSync();  
}  

module.exports = {  
    put: put,  
    get: get,  
    remove: remove,  
    clear: clear,  
}
收起阅读 »