HBuilder苹果APP推送通知之ios推送证书申请和配置使用
很多人初次接触推送通知,不知道怎么去申请ios推送证书和配置推送。
很多人犯的错误就是用推送证书p12去打包ipa,推送不是用来打包的,下面详细介绍ios推证书的申请和配置使用。
ios推送证书分为测试调试用的iOS推送证书(开发环境)和上架到App Store的ios 推送证书!(生产环境)
APP要推送通知首先要在创建APPID时勾选推送服务。
推送证书是配置上传到推送平台的,如极光推送、个推、小米推送等,不是用来打包ipa的,下面会有介绍。
一、创建唯一标示符App IDs
首先打开开发者中心https://developer.apple.com/account,进入证书页面。
如果之前创建过appid,进去修改添加下推送服务就行了,不用重新创建。
1.1点击证书、ID及配件文件,进入设置。
1.2选择App IDs –>点击+创建一个新的App ID
其中有两项需要你自己填:
第一项Name,用来描述你的App ID,这个随便填,没有什么限制,最好是项目名称,这样方便自己辨识(不允许中文)
第二项Bundle ID (App ID Suffix),这是你App ID的后缀,需要仔细填写。用来标示我们的 app,使它有一个固定的身份,和你的程序直接相关。填写 Explicit App ID 的格式为:com.company.appName(要有两个点.)照着格式写,写个方便记的,后面很多地方要用到。
第三项配置服务权限,默认会选择2项,不能修改,其它常用的苹果支付,APP推送通知,这里要推送通知就勾选上,然后点击Continue确认,下一步。
Register后点击Done完成App ID的创建。
推送通知那项服务现在还是黄色的,因为还没创建ios推送证书,等下用Appuploader创建了ios推送证书,就会变成绿色,说明生效了。
二、iOS开发推送证书、开发真机调试用(开发环境、配合开发证书使用,用开发证书打包就能用开发环境ios推送证书测试推送通知iOS开发证书申请教程)
Appuploader可以实现是Windows电脑申请ios证书和上架APP。很方便的辅助ios上架工具!
1、打开Appuploader,用苹果开发者账号登录。
2、选择证书选项
3、点击+ADD\选择Apple Push Notification service SSL(Sandbox) —iOS开发环境推送证书
输入证书名称(随意)、邮箱(随意)、密码,选择你的APP对于的应用id,点击ok创建。
4、下载保存好.p12 iOS证书文件
推送证书是没描述文件的,只有一个p12,不用申请描述文件。
三、iOS发布推送证书、上架App Store用(生产环境、配合发布证书使用,开发环境推送证书测试好了推送,用发布证书上架成功了,就到推送后台切换为生成环境推送证书)
1、打开Appuploader,用苹果开发者账号登录。
2、选择证书选项
3、点击+ADD\选择Push Notification service SLL(Sandbox & Producyion)—iOS生产环境推送证书
输入证书名称(随意)、邮箱(随意)、密码,选择你的APP对于的appids,点击ok创建。
3、下载保存好.p12 iOS证书文件
四、配置ios推送证书p12
1、注册个推平台登录
http://www.getui.com/
点击左侧个推-消息推送,进入页面再点击右侧上方的登记应用
2、配置APP的基本信息
APP名称:你的APP名字
应用平台:安卓和苹果,ios开发环境(测试用的,配合开发证书使用)ios生产环境(上架用的,配合上架App Store使用)
如果你现在是测试选择ios开发环境,上传ios开发环境推送证书p12,输入证书密码确定。
应用标识:就是appid、应用id
3、配置好确定会生成推送接口参数,等下要配置到开发工具打包。
4、打开manifest.json配置文件,选择模块权限配置,选择消息推送模块。
5、然后再选择SDK配置,把刚才在个推生成的几个接口参数一一对应填上去。
6、用对应的开发证书打包APP安装到手机就能测试推送了
描述:随便写
消息内容:{title:"通知标题",content:"通知内容",payload:"通知去干嘛这里可以自定义"} 一定要用这个格式文字可以改
title:推送通知标题
body:推送内容
其他选项默认就行,
7、然后点击发送预览,再点击确定,推送通知就发送出去了,然后看手机系统栏有没有收到通知。接受到就说明测试成功了,推送正常使用,如没收到检查各项配置是否正确。
很多人初次接触推送通知,不知道怎么去申请ios推送证书和配置推送。
很多人犯的错误就是用推送证书p12去打包ipa,推送不是用来打包的,下面详细介绍ios推证书的申请和配置使用。
ios推送证书分为测试调试用的iOS推送证书(开发环境)和上架到App Store的ios 推送证书!(生产环境)
APP要推送通知首先要在创建APPID时勾选推送服务。
推送证书是配置上传到推送平台的,如极光推送、个推、小米推送等,不是用来打包ipa的,下面会有介绍。
一、创建唯一标示符App IDs
首先打开开发者中心https://developer.apple.com/account,进入证书页面。
如果之前创建过appid,进去修改添加下推送服务就行了,不用重新创建。
1.1点击证书、ID及配件文件,进入设置。
1.2选择App IDs –>点击+创建一个新的App ID
其中有两项需要你自己填:
第一项Name,用来描述你的App ID,这个随便填,没有什么限制,最好是项目名称,这样方便自己辨识(不允许中文)
第二项Bundle ID (App ID Suffix),这是你App ID的后缀,需要仔细填写。用来标示我们的 app,使它有一个固定的身份,和你的程序直接相关。填写 Explicit App ID 的格式为:com.company.appName(要有两个点.)照着格式写,写个方便记的,后面很多地方要用到。
第三项配置服务权限,默认会选择2项,不能修改,其它常用的苹果支付,APP推送通知,这里要推送通知就勾选上,然后点击Continue确认,下一步。
Register后点击Done完成App ID的创建。
推送通知那项服务现在还是黄色的,因为还没创建ios推送证书,等下用Appuploader创建了ios推送证书,就会变成绿色,说明生效了。
二、iOS开发推送证书、开发真机调试用(开发环境、配合开发证书使用,用开发证书打包就能用开发环境ios推送证书测试推送通知iOS开发证书申请教程)
Appuploader可以实现是Windows电脑申请ios证书和上架APP。很方便的辅助ios上架工具!
1、打开Appuploader,用苹果开发者账号登录。
2、选择证书选项
3、点击+ADD\选择Apple Push Notification service SSL(Sandbox) —iOS开发环境推送证书
输入证书名称(随意)、邮箱(随意)、密码,选择你的APP对于的应用id,点击ok创建。
4、下载保存好.p12 iOS证书文件
推送证书是没描述文件的,只有一个p12,不用申请描述文件。
三、iOS发布推送证书、上架App Store用(生产环境、配合发布证书使用,开发环境推送证书测试好了推送,用发布证书上架成功了,就到推送后台切换为生成环境推送证书)
1、打开Appuploader,用苹果开发者账号登录。
2、选择证书选项
3、点击+ADD\选择Push Notification service SLL(Sandbox & Producyion)—iOS生产环境推送证书
输入证书名称(随意)、邮箱(随意)、密码,选择你的APP对于的appids,点击ok创建。
3、下载保存好.p12 iOS证书文件
四、配置ios推送证书p12
1、注册个推平台登录
http://www.getui.com/
点击左侧个推-消息推送,进入页面再点击右侧上方的登记应用
2、配置APP的基本信息
APP名称:你的APP名字
应用平台:安卓和苹果,ios开发环境(测试用的,配合开发证书使用)ios生产环境(上架用的,配合上架App Store使用)
如果你现在是测试选择ios开发环境,上传ios开发环境推送证书p12,输入证书密码确定。
应用标识:就是appid、应用id
3、配置好确定会生成推送接口参数,等下要配置到开发工具打包。
4、打开manifest.json配置文件,选择模块权限配置,选择消息推送模块。
5、然后再选择SDK配置,把刚才在个推生成的几个接口参数一一对应填上去。
6、用对应的开发证书打包APP安装到手机就能测试推送了
描述:随便写
消息内容:{title:"通知标题",content:"通知内容",payload:"通知去干嘛这里可以自定义"} 一定要用这个格式文字可以改
title:推送通知标题
body:推送内容
其他选项默认就行,
7、然后点击发送预览,再点击确定,推送通知就发送出去了,然后看手机系统栏有没有收到通知。接受到就说明测试成功了,推送正常使用,如没收到检查各项配置是否正确。
mongoDB数据库基础操作命令分享
对于创建数据库可以说是大多数后端程序员都会的,但是其中的一些基本的操作命令很多人还是需要查看的,那么下面专业的app开发报价燚轩科技就来为大家分享一下mongoDB数据库基础操作命令:
创建数据库
> use runoob --->创建数据库runoob
> db ---> 查看当前数据库
> show dbs --> 查看所有数据库, 这时是看不见runoob这个数据库的,我们必须插入一点数据才能够给看见
admin (empty)
local 0.078GB
> db.runoob.insert({"name":"菜鸟教程"})
WriteResult({ "nInserted" : 1 }) ---> 成功
> show dbs --> 这时就能看见runoob这个数据库了
admin (empty)
local 0.078GB
runoob 0.078GB
删除数据库
> use runoob --> 切换到要删除的数据库
switched to db runoob
> db.dropDatabase() --> 删除数据库
{ "dropped" : "runoob", "ok" : 1 }
创建集合
> db.createCollection('runoob') -->创建集合runoob
{ "ok" : 1 }
> show collections --> 查看所有集合
runoob
system.indexes
创建固定集合 mycol,整个集合空间大小 6142800 KB, 文档最大个数为 10000 个。
> db.createCollection('runoob1', {capped:true,autoIndexID:true,size:6142800,max:10000})
{ "ok" : 1 }
在 MongoDB 中,你不需要创建集合。当你插入一些文档时,MongoDB 会自动创建集合。
> db.runoob2.insert({'name':'弱鸡'})
WriteResult({ "nInserted" : 1 })
> show collections
runoob
runoob1
runoob2
system.indexes
> db.runoob2.drop() --->删除runoob2集合
true
向runoob2集合中插入文档, 他会自动生成id列
> db.runoob1.insert({'name':'lucy','age':18,'sex':'woman'})
WriteResult({ "nInserted" : 1 })
查看runoob2集合中的文档
> db.runoob1.find()
{ "_id" : ObjectId("5b0d4c0f81322a46cfc77208"), "name" : "lucy", "age" : 18, "sex" : "woman" }
更新runoob2中文档,将名字lucy该为tom
> db.runoob1.update({'name':'lucy'},{$set:{'name':'tom'}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.runoob.insert({'xx':12})
WriteResult({ "nInserted" : 1 })
> db.runoob.remove({'xx':12})
WriteResult({ "nRemoved" : 1 })
如果大家想要了解更多的话,可以留言咨询我们。
对于创建数据库可以说是大多数后端程序员都会的,但是其中的一些基本的操作命令很多人还是需要查看的,那么下面专业的app开发报价燚轩科技就来为大家分享一下mongoDB数据库基础操作命令:
创建数据库
> use runoob --->创建数据库runoob
> db ---> 查看当前数据库
> show dbs --> 查看所有数据库, 这时是看不见runoob这个数据库的,我们必须插入一点数据才能够给看见
admin (empty)
local 0.078GB
> db.runoob.insert({"name":"菜鸟教程"})
WriteResult({ "nInserted" : 1 }) ---> 成功
> show dbs --> 这时就能看见runoob这个数据库了
admin (empty)
local 0.078GB
runoob 0.078GB
删除数据库
> use runoob --> 切换到要删除的数据库
switched to db runoob
> db.dropDatabase() --> 删除数据库
{ "dropped" : "runoob", "ok" : 1 }
创建集合
> db.createCollection('runoob') -->创建集合runoob
{ "ok" : 1 }
> show collections --> 查看所有集合
runoob
system.indexes
创建固定集合 mycol,整个集合空间大小 6142800 KB, 文档最大个数为 10000 个。
> db.createCollection('runoob1', {capped:true,autoIndexID:true,size:6142800,max:10000})
{ "ok" : 1 }
在 MongoDB 中,你不需要创建集合。当你插入一些文档时,MongoDB 会自动创建集合。
> db.runoob2.insert({'name':'弱鸡'})
WriteResult({ "nInserted" : 1 })
> show collections
runoob
runoob1
runoob2
system.indexes
> db.runoob2.drop() --->删除runoob2集合
true
向runoob2集合中插入文档, 他会自动生成id列
> db.runoob1.insert({'name':'lucy','age':18,'sex':'woman'})
WriteResult({ "nInserted" : 1 })
查看runoob2集合中的文档
> db.runoob1.find()
{ "_id" : ObjectId("5b0d4c0f81322a46cfc77208"), "name" : "lucy", "age" : 18, "sex" : "woman" }
更新runoob2中文档,将名字lucy该为tom
> db.runoob1.update({'name':'lucy'},{$set:{'name':'tom'}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.runoob.insert({'xx':12})
WriteResult({ "nInserted" : 1 })
> db.runoob.remove({'xx':12})
WriteResult({ "nRemoved" : 1 })
如果大家想要了解更多的话,可以留言咨询我们。
支付开发,高德地图,下拉刷新,申请打包证书
从菜鸟到新手,遇见问题解决问题是家常便饭,今天记录一下遇到的一些问题,希望能对同样被困扰过的同学的一些帮助。
一、修改状态栏背景色,在入口页面加这句代码
plus.navigator.setStatusBarBackground('#000'); //修改状态栏背景色
二、申请私有安卓打包证书
1.下载dcloud公有证书http://download.dcloud.net.cn/HBuilder.keystore
参考这篇文章http://ask.dcloud.net.cn/article/12718
2.使用第三方软件uploader,可以快速申请
三.调用微信和支付宝功能
1.先在demo里找到beecloud.html,把页面做出来
2.去蚂蚁金服和微信开放平台注册开发者账号,并进行开发者资质认证,然后在各自平台创建APP应用,进行各自开发配置,比如回调地址,可以得到返回的订单信息。然后你还要去beecloud官网去注册企业账号,注册完了之后创建支付应用,这里会得到一个APP ID,这个APP ID是需要在hbuilder填写的,然后在这个支付应用里进行交易渠道参数设置,支付宝APP支付和微信APP支付都需要配置,填写的信息就来自你之前在各自开放平台创建的应用。缺少什么就申请什么,比如收款商户。Beecloud的东西都配置好了,支付功能就可以使用了,注意一下,微信支付只有打包之后才行,真机运行会报错。
3.以上的账号申请和各种配置,比较繁琐,但是都有教程,不要急躁,按步骤一步步来,把重要信息保存好。建议在做支付功能之前就开始申请注册,全程需要半个月的审核时间。
四、高德地图定位不准确
细心的同学会发现,在APP开发的时候调用高德地图api进行定位时,会有几百米的偏差,相当蛋疼。查阅资料之后发现是坐标系的问题,需要自己加一个纠偏算法。这里我详细的说一下怎么用。
这是纠偏之前的代码,使用浏览器定位
map = new AMap.Map('container', {
resizeEnable: true
});
//获取定位
map.plugin('AMap.Geolocation', function() {
geolocation = new AMap.Geolocation({
enableHighAccuracy: true,//是否使用高精度定位,默认:true
timeout: 10000, //超过10秒后停止定位,默认:无穷大
buttonOffset: new AMap.Pixel(10, 20),//定位按钮与设置的停靠位置的偏移量,默认:Pixel(10, 20)
zoomToAccuracy: true, //定位成功后调整地图视野范围使定位位置及精度范围视野内可见,默认:false
buttonPosition:'RB'
});
map.addControl(geolocation);
geolocation.getCurrentPosition();
AMap.event.addListener(geolocation, 'complete', onComplete);//返回定位信息
AMap.event.addListener(geolocation, 'error', onError); //返回定位出错信息
});
然后开始纠偏,首先把下面代码复制进来,放在获取定位之前
//纠偏算法
var a = 6378245.0;
var ee = 0.00669342162296594323;
var lnglat = new Array(2);
function transform(wgLon, wgLat) {
console.log(Math.PI);
if(outOfChina(wgLat, wgLon)) {
console.log("outOfChina");
lnglat[0] = wgLon;
lnglat[1] = wgLat;
console.log(lnglat[0] + "|" + lnglat[1]);
return lnglat;
}
var dLat = transformLat(wgLon - 105.0, wgLat - 35.0);
var dLon = transformLon(wgLon - 105.0, wgLat - 35.0);
var radLat = wgLat / 180.0 * Math.PI;
var magic = Math.sin(radLat);
magic = 1 - ee * magic * magic;
var sqrtMagic = Math.sqrt(magic);
dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * Math.PI);
dLon = (dLon * 180.0) / (a / sqrtMagic * Math.cos(radLat) * Math.PI);
lnglat[0] = wgLon + dLon;
lnglat[1] = wgLat + dLat;
console.log(lnglat[0] + "|" + lnglat[1] + "|" + dLon + "|" + dLat);
return lnglat;
}
function outOfChina(lat, lon) {
if(lon < 72.004 || lon > 137.8347)
return true;
if(lat < 0.8293 || lat > 55.8271)
return true;
return false;
}
function transformLat(x, y) {
ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * Math.sqrt(Math.abs(x));
ret += (20.0 * Math.sin(6.0 * x * Math.PI) + 20.0 * Math.sin(2.0 * x * Math.PI)) * 2.0 / 3.0;
ret += (20.0 * Math.sin(y * Math.PI) + 40.0 * Math.sin(y / 3.0 * Math.PI)) * 2.0 / 3.0;
ret += (160.0 * Math.sin(y / 12.0 * Math.PI) + 320 * Math.sin(y * Math.PI / 30.0)) * 2.0 / 3.0;
return ret;
}
function transformLon(x, y) {
ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * Math.sqrt(Math.abs(x));
ret += (20.0 * Math.sin(6.0 * x * Math.PI) + 20.0 * Math.sin(2.0 * x * Math.PI)) * 2.0 / 3.0;
ret += (20.0 * Math.sin(x * Math.PI) + 40.0 * Math.sin(x / 3.0 * Math.PI)) * 2.0 / 3.0;
ret += (150.0 * Math.sin(x / 12.0 * Math.PI) + 300.0 * Math.sin(x / 30.0 * Math.PI)) * 2.0 / 3.0;
return ret;
}
然后,把之前获取定位的代码修改一下,把打点都false掉,纠偏之后重新打点。
/获取定位
map.plugin('AMap.Geolocation', function() {
geolocation = new AMap.Geolocation({
enableHighAccuracy: true, //是否使用高精度定位,默认:true
timeout: 10000, //超过10秒后停止定位,默认:无穷大
showMarker: false,
showCircle: false,
panToLocation: true,
buttonPosition: 'RB', //定位按钮停靠位置,默认:'LB',左下角
});
map.addControl(geolocation); // 把定位插件加入地图实例
geolocation.getCurrentPosition(function(status, result) {
if(status == "complete") {
var pos = result.position;
var newPos = transform(pos.lng, pos.lat);
var marker = new AMap.Marker({
position: newPos
});
marker.setMap(map);
}
}); // 调用定位
这样定位就比较准确了,目测还会有十米的偏差,但是已经在可接受范围了,基本达到我们的要求。
五、禁用下拉刷新
这个就比较简单了,把这段代码注释掉就可以了,然后重新运行一下,敲重点,要重新运行,否则看不到效果。
down: {
style: 'circle',
callback: function() {
}
},
重写mui.back()这个更简单了
mui.back = function(){
//需要执行的代码
};
还有一些比较常用的代码
plus.webview.currentWebview().close();//关闭当前页面
window.localStorage.removeItem("orderId")//清除本地缓存
暂时想起来这么多,希望能对大家有所帮助
从菜鸟到新手,遇见问题解决问题是家常便饭,今天记录一下遇到的一些问题,希望能对同样被困扰过的同学的一些帮助。
一、修改状态栏背景色,在入口页面加这句代码
plus.navigator.setStatusBarBackground('#000'); //修改状态栏背景色
二、申请私有安卓打包证书
1.下载dcloud公有证书http://download.dcloud.net.cn/HBuilder.keystore
参考这篇文章http://ask.dcloud.net.cn/article/12718
2.使用第三方软件uploader,可以快速申请
三.调用微信和支付宝功能
1.先在demo里找到beecloud.html,把页面做出来
2.去蚂蚁金服和微信开放平台注册开发者账号,并进行开发者资质认证,然后在各自平台创建APP应用,进行各自开发配置,比如回调地址,可以得到返回的订单信息。然后你还要去beecloud官网去注册企业账号,注册完了之后创建支付应用,这里会得到一个APP ID,这个APP ID是需要在hbuilder填写的,然后在这个支付应用里进行交易渠道参数设置,支付宝APP支付和微信APP支付都需要配置,填写的信息就来自你之前在各自开放平台创建的应用。缺少什么就申请什么,比如收款商户。Beecloud的东西都配置好了,支付功能就可以使用了,注意一下,微信支付只有打包之后才行,真机运行会报错。
3.以上的账号申请和各种配置,比较繁琐,但是都有教程,不要急躁,按步骤一步步来,把重要信息保存好。建议在做支付功能之前就开始申请注册,全程需要半个月的审核时间。
四、高德地图定位不准确
细心的同学会发现,在APP开发的时候调用高德地图api进行定位时,会有几百米的偏差,相当蛋疼。查阅资料之后发现是坐标系的问题,需要自己加一个纠偏算法。这里我详细的说一下怎么用。
这是纠偏之前的代码,使用浏览器定位
map = new AMap.Map('container', {
resizeEnable: true
});
//获取定位
map.plugin('AMap.Geolocation', function() {
geolocation = new AMap.Geolocation({
enableHighAccuracy: true,//是否使用高精度定位,默认:true
timeout: 10000, //超过10秒后停止定位,默认:无穷大
buttonOffset: new AMap.Pixel(10, 20),//定位按钮与设置的停靠位置的偏移量,默认:Pixel(10, 20)
zoomToAccuracy: true, //定位成功后调整地图视野范围使定位位置及精度范围视野内可见,默认:false
buttonPosition:'RB'
});
map.addControl(geolocation);
geolocation.getCurrentPosition();
AMap.event.addListener(geolocation, 'complete', onComplete);//返回定位信息
AMap.event.addListener(geolocation, 'error', onError); //返回定位出错信息
});
然后开始纠偏,首先把下面代码复制进来,放在获取定位之前
//纠偏算法
var a = 6378245.0;
var ee = 0.00669342162296594323;
var lnglat = new Array(2);
function transform(wgLon, wgLat) {
console.log(Math.PI);
if(outOfChina(wgLat, wgLon)) {
console.log("outOfChina");
lnglat[0] = wgLon;
lnglat[1] = wgLat;
console.log(lnglat[0] + "|" + lnglat[1]);
return lnglat;
}
var dLat = transformLat(wgLon - 105.0, wgLat - 35.0);
var dLon = transformLon(wgLon - 105.0, wgLat - 35.0);
var radLat = wgLat / 180.0 * Math.PI;
var magic = Math.sin(radLat);
magic = 1 - ee * magic * magic;
var sqrtMagic = Math.sqrt(magic);
dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * Math.PI);
dLon = (dLon * 180.0) / (a / sqrtMagic * Math.cos(radLat) * Math.PI);
lnglat[0] = wgLon + dLon;
lnglat[1] = wgLat + dLat;
console.log(lnglat[0] + "|" + lnglat[1] + "|" + dLon + "|" + dLat);
return lnglat;
}
function outOfChina(lat, lon) {
if(lon < 72.004 || lon > 137.8347)
return true;
if(lat < 0.8293 || lat > 55.8271)
return true;
return false;
}
function transformLat(x, y) {
ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * Math.sqrt(Math.abs(x));
ret += (20.0 * Math.sin(6.0 * x * Math.PI) + 20.0 * Math.sin(2.0 * x * Math.PI)) * 2.0 / 3.0;
ret += (20.0 * Math.sin(y * Math.PI) + 40.0 * Math.sin(y / 3.0 * Math.PI)) * 2.0 / 3.0;
ret += (160.0 * Math.sin(y / 12.0 * Math.PI) + 320 * Math.sin(y * Math.PI / 30.0)) * 2.0 / 3.0;
return ret;
}
function transformLon(x, y) {
ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * Math.sqrt(Math.abs(x));
ret += (20.0 * Math.sin(6.0 * x * Math.PI) + 20.0 * Math.sin(2.0 * x * Math.PI)) * 2.0 / 3.0;
ret += (20.0 * Math.sin(x * Math.PI) + 40.0 * Math.sin(x / 3.0 * Math.PI)) * 2.0 / 3.0;
ret += (150.0 * Math.sin(x / 12.0 * Math.PI) + 300.0 * Math.sin(x / 30.0 * Math.PI)) * 2.0 / 3.0;
return ret;
}
然后,把之前获取定位的代码修改一下,把打点都false掉,纠偏之后重新打点。
/获取定位
map.plugin('AMap.Geolocation', function() {
geolocation = new AMap.Geolocation({
enableHighAccuracy: true, //是否使用高精度定位,默认:true
timeout: 10000, //超过10秒后停止定位,默认:无穷大
showMarker: false,
showCircle: false,
panToLocation: true,
buttonPosition: 'RB', //定位按钮停靠位置,默认:'LB',左下角
});
map.addControl(geolocation); // 把定位插件加入地图实例
geolocation.getCurrentPosition(function(status, result) {
if(status == "complete") {
var pos = result.position;
var newPos = transform(pos.lng, pos.lat);
var marker = new AMap.Marker({
position: newPos
});
marker.setMap(map);
}
}); // 调用定位
这样定位就比较准确了,目测还会有十米的偏差,但是已经在可接受范围了,基本达到我们的要求。
五、禁用下拉刷新
这个就比较简单了,把这段代码注释掉就可以了,然后重新运行一下,敲重点,要重新运行,否则看不到效果。
down: {
style: 'circle',
callback: function() {
}
},
重写mui.back()这个更简单了
mui.back = function(){
//需要执行的代码
};
还有一些比较常用的代码
plus.webview.currentWebview().close();//关闭当前页面
window.localStorage.removeItem("orderId")//清除本地缓存
暂时想起来这么多,希望能对大家有所帮助
收起阅读 »区分escape、encodeURI和encodeURIComponent
1.简单来说,escape是对字符串(string)进行编码(而另外两种是对URL),作用是让它们在所有电脑上可读。
编码之后的效果是%XX或者%uXXXX这种形式。
其中 ASCII字母、数、@/ ,这几个字符不会被编码,其余的都会。
最关键的是,当你需要对URL编码时,请忘记这个方法,这个方法是针对字符串使用的,不适用于URL。*****
2.最常用的encodeURI和encodeURIComponent
对URL编码是常见的事,所以这两个方法应该是实际中要特别注意的。
它们都是编码URL,唯一区别就是编码的字符范围,其中
encodeURI方法不会对下列字符编码 ASCII字母、数字、~!@#$&()=:/,;?+'
encodeURIComponent方法不会对下列字符编码 ASCII字母、数字、~!()'
所以encodeURIComponent比encodeURI编码的范围更大。
实际例子来说,encodeURIComponent会把 http:// 编码成 http%3A%2F%2F 而encodeURI却不会。
3.使用
(1)如果只是编码字符串,不和URL有半毛钱关系,那么用escape。
(2)如果你需要编码整个URL,然后需要使用这个URL,那么用encodeURI。
(3)当你需要编码URL中的参数的时候,那么encodeURIComponent是最好方法。
参考: https://stackoverflow.com/questions/11294107/how-can-i-send-the-ampersand-character-via-ajax
https://www.zhihu.com/question/21861899
可以读一下 《HTTP 权威指南》的第二章第 4 节——各种令人头疼的字符
http://www.ituring.com.cn/book/844
1.简单来说,escape是对字符串(string)进行编码(而另外两种是对URL),作用是让它们在所有电脑上可读。
编码之后的效果是%XX或者%uXXXX这种形式。
其中 ASCII字母、数、@/ ,这几个字符不会被编码,其余的都会。
最关键的是,当你需要对URL编码时,请忘记这个方法,这个方法是针对字符串使用的,不适用于URL。*****
2.最常用的encodeURI和encodeURIComponent
对URL编码是常见的事,所以这两个方法应该是实际中要特别注意的。
它们都是编码URL,唯一区别就是编码的字符范围,其中
encodeURI方法不会对下列字符编码 ASCII字母、数字、~!@#$&()=:/,;?+'
encodeURIComponent方法不会对下列字符编码 ASCII字母、数字、~!()'
所以encodeURIComponent比encodeURI编码的范围更大。
实际例子来说,encodeURIComponent会把 http:// 编码成 http%3A%2F%2F 而encodeURI却不会。
3.使用
(1)如果只是编码字符串,不和URL有半毛钱关系,那么用escape。
(2)如果你需要编码整个URL,然后需要使用这个URL,那么用encodeURI。
(3)当你需要编码URL中的参数的时候,那么encodeURIComponent是最好方法。
参考: https://stackoverflow.com/questions/11294107/how-can-i-send-the-ampersand-character-via-ajax
https://www.zhihu.com/question/21861899
可以读一下 《HTTP 权威指南》的第二章第 4 节——各种令人头疼的字符
http://www.ituring.com.cn/book/844
uploader又拍云上传文件集成
项目中用到又拍云文件存储,找了一遍没找到关于又拍云上传的方法,只能自己造了
首先我封装到一个文件了
(function($, request, upyun){
upyun.bucket = '您的服务名称'
upyun.upload = function (path, success, fail) {
var self = this
success = success || mui.noop
fail = fail || mui.noop
var name = path.substr(path.lastIndexOf('/') + 1)
this.getSignature({name: name}, function(err, res){
if (err) {
fail && fail(err)
return
}
var task = plus.uploader.createUpload(
'https://v0.api.upyun.com/'+ self.bucket,
{method:'POST'},
function ( t, status ) {
if ( status == 200 ) {
var data = JSON.parse(t.responseText)
if(data.code == 200){
success(data)
}else{
fail(data.message)
}
} else {
fail({err:status,message:'上传文件出错'+ JSON.stringify(t)})
}
})
task.addFile(path, {key:"file"})
task.addData("authorization", res.signature || '')
task.addData("policy", res.policy || '')
task.start()
})
}
upyun.getSignature = function (data, cb) {
request.post(api.upsign, data).then(function(data){
cb(null, data)
}).catch(function(err){
cb(err)
})
}
})(mui, request, window.upyun={})
后端采用php签名
$key = 'upyun.operator‘;
$secret = md5('upyun.password');
$method = "POST";
$uri = "/".‘upyun.bucket';
$date = gmdate('D, d M Y H:i:s \G\M\T');
$name = $_POST['name'];
$ext = substr($name, strrpos($name, '.') + 1);
$name =str_replace('.','', microtime(true)).".".$ext;
$path = '/test/'.$name; //远程文件路径
$policy = base64_encode(json_encode([
'save-key' => $path,
'bucket' => 'upyun.bucket',
'expiration' => time() + 3600,
'date' => gmdate('D, d M Y H:i:s \G\M\T')
]));
$elems = array();
foreach (array($method, $uri, $date, $policy) as $v)
{
if ($v)
{
$elems[] = $v;
}
}
$value = implode('&', $elems);
$sign = base64_encode(hash_hmac('sha1', $value, $secret, true));
$sign = 'UPYUN ' . $key . ':' . $sign;
$data = ['policy' => $policy, 'signature' => $sign];
echo json_encode($data);
使用方法很简单
upyun.upload(path, function(data){
console.log(JSON.stringify(data))
},function(err){
console.log(JSON.stringify(err))
}) 项目中用到又拍云文件存储,找了一遍没找到关于又拍云上传的方法,只能自己造了
首先我封装到一个文件了
(function($, request, upyun){
upyun.bucket = '您的服务名称'
upyun.upload = function (path, success, fail) {
var self = this
success = success || mui.noop
fail = fail || mui.noop
var name = path.substr(path.lastIndexOf('/') + 1)
this.getSignature({name: name}, function(err, res){
if (err) {
fail && fail(err)
return
}
var task = plus.uploader.createUpload(
'https://v0.api.upyun.com/'+ self.bucket,
{method:'POST'},
function ( t, status ) {
if ( status == 200 ) {
var data = JSON.parse(t.responseText)
if(data.code == 200){
success(data)
}else{
fail(data.message)
}
} else {
fail({err:status,message:'上传文件出错'+ JSON.stringify(t)})
}
})
task.addFile(path, {key:"file"})
task.addData("authorization", res.signature || '')
task.addData("policy", res.policy || '')
task.start()
})
}
upyun.getSignature = function (data, cb) {
request.post(api.upsign, data).then(function(data){
cb(null, data)
}).catch(function(err){
cb(err)
})
}
})(mui, request, window.upyun={})
后端采用php签名
$key = 'upyun.operator‘;
$secret = md5('upyun.password');
$method = "POST";
$uri = "/".‘upyun.bucket';
$date = gmdate('D, d M Y H:i:s \G\M\T');
$name = $_POST['name'];
$ext = substr($name, strrpos($name, '.') + 1);
$name =str_replace('.','', microtime(true)).".".$ext;
$path = '/test/'.$name; //远程文件路径
$policy = base64_encode(json_encode([
'save-key' => $path,
'bucket' => 'upyun.bucket',
'expiration' => time() + 3600,
'date' => gmdate('D, d M Y H:i:s \G\M\T')
]));
$elems = array();
foreach (array($method, $uri, $date, $policy) as $v)
{
if ($v)
{
$elems[] = $v;
}
}
$value = implode('&', $elems);
$sign = base64_encode(hash_hmac('sha1', $value, $secret, true));
$sign = 'UPYUN ' . $key . ':' . $sign;
$data = ['policy' => $policy, 'signature' => $sign];
echo json_encode($data);
使用方法很简单
upyun.upload(path, function(data){
console.log(JSON.stringify(data))
},function(err){
console.log(JSON.stringify(err))
}) 收起阅读 »
微信小程序如何解析HTML富文本
对于开发一款微信小程序来说,很多程序人员已经知道如何去做了,但是对于在小程序中添加解析HTML富文本这个问题其实很多程序人员还是一知半解,那么下面就由专业的微信小程序开发公司燚轩科技来为大家分析解答一下吧。
1.把wxParse文件全部放入项目。
2.在wxml中import wxParse.wxml,并把template插入到到对应的位置上
<!--wxml-->
<import src="../../../wxParse/wxParse.wxml"/>
<view class="view-title">{{title}}</view>
<view class="view-time-box">
<text class="view-date">{{date}}</text>
<text class="view-time">{{time}}</text>
</view>
<template is="wxParse" data="{{wxParseData:article.nodes}}"/>
3.在wxss中import wxParse.wxss,并设置样式;比如‘wxParse-image’是富文本图片转化成image组件之后的类名,‘wxParse-p’是p标签转化成view组件后设置的类名
<!--wxss-->
@import "../../../wxParse/wxParse.wxss";
page{
background: #fff;
}
.view-title{
line-height: 80rpx;
font-size: 48rpx;
color:#0C0C0C;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
max-height: 190rpx;
min-height: 80rpx;
width:690rpx;
padding:30rpx 30rpx 0;
}
.view-time-box{
height: 66rpx;
line-height: 66rpx;
font-size: 30rpx;
color:#999999;
margin-bottom: 40rpx;
padding:0 30rpx;
}
.view-date{
margin-right: 20rpx;
}
.wxParse-img{
margin-top:20rpx;
display: block;
position:relative;
top:0;
left:50%;
transform: translateX(-50%);
}
.wxParse-p{
text-indent: 2em;
margin-top:20rpx;
color:#0C0C0C;
line-height:50rpx;
font-size:34rpx;
padding:0 30rpx 30rpx;
text-align: justify;
}
关于如何在微信小程序中解析HTML这个问题就为大家解答到这里了,如果还存在不理解的地方可以留言咨询。
对于开发一款微信小程序来说,很多程序人员已经知道如何去做了,但是对于在小程序中添加解析HTML富文本这个问题其实很多程序人员还是一知半解,那么下面就由专业的微信小程序开发公司燚轩科技来为大家分析解答一下吧。
1.把wxParse文件全部放入项目。
2.在wxml中import wxParse.wxml,并把template插入到到对应的位置上
<!--wxml-->
<import src="../../../wxParse/wxParse.wxml"/>
<view class="view-title">{{title}}</view>
<view class="view-time-box">
<text class="view-date">{{date}}</text>
<text class="view-time">{{time}}</text>
</view>
<template is="wxParse" data="{{wxParseData:article.nodes}}"/>
3.在wxss中import wxParse.wxss,并设置样式;比如‘wxParse-image’是富文本图片转化成image组件之后的类名,‘wxParse-p’是p标签转化成view组件后设置的类名
<!--wxss-->
@import "../../../wxParse/wxParse.wxss";
page{
background: #fff;
}
.view-title{
line-height: 80rpx;
font-size: 48rpx;
color:#0C0C0C;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
max-height: 190rpx;
min-height: 80rpx;
width:690rpx;
padding:30rpx 30rpx 0;
}
.view-time-box{
height: 66rpx;
line-height: 66rpx;
font-size: 30rpx;
color:#999999;
margin-bottom: 40rpx;
padding:0 30rpx;
}
.view-date{
margin-right: 20rpx;
}
.wxParse-img{
margin-top:20rpx;
display: block;
position:relative;
top:0;
left:50%;
transform: translateX(-50%);
}
.wxParse-p{
text-indent: 2em;
margin-top:20rpx;
color:#0C0C0C;
line-height:50rpx;
font-size:34rpx;
padding:0 30rpx 30rpx;
text-align: justify;
}
关于如何在微信小程序中解析HTML这个问题就为大家解答到这里了,如果还存在不理解的地方可以留言咨询。
收起阅读 »名片全能王识别名片
1.名片全能王开发网址https://dev.camcard.com/developers/status
-
要申请一个账号,自己完善资料后,申请apikey,申请一般要审核两三天吧,我当时是三天。申请成功会邮箱通知,看下图
下载附件下来,uploadurl改成自己的邮箱和apikey即可测试<!doctype html> <html> <head> <meta charset="UTF-8"> <title></title> <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" /> <link href="../css/mui.min.css" rel="stylesheet" /> </head> <body> <ul class="mui-table-view"> <li class="mui-table-view-cell"> <a class="camera" onclick="scanCard()">Take a picture </a> </li> <li class="mui-table-view-cell"> <a class="picture" onclick="galleryImg()">Choose from your phone album</a> </li> </ul> <script src="../js/mui.min.js"></script> <script type="text/javascript"> mui.init() var uploadurl="http://bcr2.intsig.net/BCRService/BCR_VCF2?PIN=**&json=1&user=6@qq.com&pass=&lang=2&size="; // 扫描名片--拍照 function scanCard() { var cmr = plus.camera.getCamera(); var res = cmr.supportedImageResolutions[0]; var fmt = cmr.supportedImageFormats[0]; cmr.captureImage(function(path) { plus.io.resolveLocalFileSystemURL(path, function(entry) { var localUrl = entry.toLocalURL(); //压缩照片 plus.zip.compressImage({ src: localUrl, dst: localUrl, overwrite: true, //覆盖你拍照的图片 format: "jpg", //对方只接受JPG quality: 70, //对方建议质量 width: "1024", height: "auto" }, function(e) { uploadCardImg(e.target, e.size) }, function(req) { mui.toast('压缩失败~') }) }) }, function(err) { console.error("拍照失败:" + err.message); }, { index: 1, }); } // 扫描名片--选择相册 function galleryImg() { plus.gallery.pick(function(path) { plus.io.resolveLocalFileSystemURL(path, function(entry) { var localUrl = entry.toLocalURL(); //压缩照片 plus.zip.compressImage({ src: localUrl, dst: localUrl, overwrite: true, //覆盖你拍照的图片 format: "jpg", //对方只接受JPG quality: 70, //对方建议质量 width: "1024", height: "auto" }, function(e) { uploadCardImg(e.target, e.size) }, function(req) { mui.toast('压缩失败~') }) }) }, function(e) { //outSet("取消选择图片"); }, { filter: "image" }) } // 扫描名片--上传图片到指定的api接口 function uploadCardImg(fileUrl, ImgSize) { //上传照片对象 var uploadimg = plus.uploader.createUpload(uploadurl + ImgSize, { method: "POST" }, function(t, status) { // 上传完成 if (status == 200) { //alert(t.responseText); console.log(t.responseText) } else { } }); uploadimg.addFile(fileUrl, { key: "imgcark" }); uploadimg.start(); } </script> </body>
</html>
1.名片全能王开发网址https://dev.camcard.com/developers/status
-
要申请一个账号,自己完善资料后,申请apikey,申请一般要审核两三天吧,我当时是三天。申请成功会邮箱通知,看下图
下载附件下来,uploadurl改成自己的邮箱和apikey即可测试<!doctype html> <html> <head> <meta charset="UTF-8"> <title></title> <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" /> <link href="../css/mui.min.css" rel="stylesheet" /> </head> <body> <ul class="mui-table-view"> <li class="mui-table-view-cell"> <a class="camera" onclick="scanCard()">Take a picture </a> </li> <li class="mui-table-view-cell"> <a class="picture" onclick="galleryImg()">Choose from your phone album</a> </li> </ul> <script src="../js/mui.min.js"></script> <script type="text/javascript"> mui.init() var uploadurl="http://bcr2.intsig.net/BCRService/BCR_VCF2?PIN=**&json=1&user=6@qq.com&pass=&lang=2&size="; // 扫描名片--拍照 function scanCard() { var cmr = plus.camera.getCamera(); var res = cmr.supportedImageResolutions[0]; var fmt = cmr.supportedImageFormats[0]; cmr.captureImage(function(path) { plus.io.resolveLocalFileSystemURL(path, function(entry) { var localUrl = entry.toLocalURL(); //压缩照片 plus.zip.compressImage({ src: localUrl, dst: localUrl, overwrite: true, //覆盖你拍照的图片 format: "jpg", //对方只接受JPG quality: 70, //对方建议质量 width: "1024", height: "auto" }, function(e) { uploadCardImg(e.target, e.size) }, function(req) { mui.toast('压缩失败~') }) }) }, function(err) { console.error("拍照失败:" + err.message); }, { index: 1, }); } // 扫描名片--选择相册 function galleryImg() { plus.gallery.pick(function(path) { plus.io.resolveLocalFileSystemURL(path, function(entry) { var localUrl = entry.toLocalURL(); //压缩照片 plus.zip.compressImage({ src: localUrl, dst: localUrl, overwrite: true, //覆盖你拍照的图片 format: "jpg", //对方只接受JPG quality: 70, //对方建议质量 width: "1024", height: "auto" }, function(e) { uploadCardImg(e.target, e.size) }, function(req) { mui.toast('压缩失败~') }) }) }, function(e) { //outSet("取消选择图片"); }, { filter: "image" }) } // 扫描名片--上传图片到指定的api接口 function uploadCardImg(fileUrl, ImgSize) { //上传照片对象 var uploadimg = plus.uploader.createUpload(uploadurl + ImgSize, { method: "POST" }, function(t, status) { // 上传完成 if (status == 200) { //alert(t.responseText); console.log(t.responseText) } else { } }); uploadimg.addFile(fileUrl, { key: "imgcark" }); uploadimg.start(); } </script> </body>
</html>
收起阅读 »
分享app后台运行的问题
1.手机是华为手机,
- 需求是app常驻后台运行,即使清理了还在后台运行
- 只需要如下设置即可,使app常驻后台运行,
- 这种只能针对用户量较少的app,可以教他怎么做,
- 用户量大的app不可能这么做,如qq和微信,他们并非是手机上设置的
1.手机是华为手机,
- 需求是app常驻后台运行,即使清理了还在后台运行
- 只需要如下设置即可,使app常驻后台运行,
- 这种只能针对用户量较少的app,可以教他怎么做,
- 用户量大的app不可能这么做,如qq和微信,他们并非是手机上设置的
MUI、微信小程序、Vue实战项目项目及源代码分享(含源码)
MUI 及 vue学习资料免费赠送,其中包含一系列实战项目以及项目的源码;
资源领取地址:MUI MUI实战项目及源码
VUE VUE2.0实战项目及源码
传智播客-黑马程序员 轻松玩转微信小程序视频
资源领取地址:微信小程序视频
MUI 及 vue学习资料免费赠送,其中包含一系列实战项目以及项目的源码;
资源领取地址:MUI MUI实战项目及源码
VUE VUE2.0实战项目及源码
传智播客-黑马程序员 轻松玩转微信小程序视频
资源领取地址:微信小程序视频




