mui h5支付
在做mui项目的时候遇到h5支付一个比较奇葩的问题,在跳转页面的时候需要构造头部referer
,不够构造头部就会一直提示商家参数错误,所以这里给大家分享一下如何构造头部referer
如下所示代码
var fp = new Fingerprint2();
fp.get(function(result) {
//alert(payurl);
mui.openWindow({
url:payurl,
id: 'payurl',
styles:{
additionalHttpHeaders: {
referer:""
}
},
waiting: {
autoShow: true, //自动显示等待框,默认为true
title: '正在加载支付页面......', //等待对话框上显示的提示内容
},
});
});
注意 其中referer 设置是比较有讲究的 需要设置成在申请h5支付的时候的域名才可成功
在做mui项目的时候遇到h5支付一个比较奇葩的问题,在跳转页面的时候需要构造头部referer
,不够构造头部就会一直提示商家参数错误,所以这里给大家分享一下如何构造头部referer
如下所示代码
var fp = new Fingerprint2();
fp.get(function(result) {
//alert(payurl);
mui.openWindow({
url:payurl,
id: 'payurl',
styles:{
additionalHttpHeaders: {
referer:""
}
},
waiting: {
autoShow: true, //自动显示等待框,默认为true
title: '正在加载支付页面......', //等待对话框上显示的提示内容
},
});
});
注意 其中referer 设置是比较有讲究的 需要设置成在申请h5支付的时候的域名才可成功
收起阅读 »HBuilder8.8.5,重磅新品wap2app上线,支持云端打包,原生nview加持,体验快到震惊!
HBuilder 8.8.5发布,重磅新品wap2app上线,支持云端打包,原生nview加持,体验快到震惊!
手机wap站,能不能快速转换成app,并且达到app的功能体验?
这个问题已经提出好久好久了。
好久到,现在大多数人已经不对这个问题抱有希望了。
但,如果真能做到呢?
wap2app,是DCloud公司的重磅新产品。
它是一个开发框架,更接近mui,底层封装了HTML5Plus的各种能力。
也就是从现在起,DCloud给开发者提供了2种开发模式:
- 从头开发,使用mui框架,开发一次,app和wap站都有了;
- 已有wap站,则使用wap2app框架,把wap站强化为app。
wap2app这个项目DCloud其实已经开发数年,在HBuilder alpha版中也早已存在。
经历过很多项目实践、打磨,现在我们终于把它正式推出。
真实效果到底怎么样?我们来看段视频。
看看基于wap2app转换的应用,和原生应用相比到底有多大体验差别。
-
实验环境说明:
手机设备相同(华为荣耀8青春版,2016年上市,千元机代表)、网络环境相同、使用前均清理了内存,原生应用使用最新版。 -
实验视频:唯品会、大众点评流应用与原生应用对比
-
实验结论:
新页面渲染速度和原生不相上下,在300毫秒的动画期间即可渲染,而且动画平顺。
为什么加载这么快呢?因为wap2app封装了5+引擎里的原生渲染能力和原生动画能力。
在新页面加载时,是由plus.nativeObj.view来渲染的页面。
那么强化一个wap站要多久呢?
嗯,中等规模的wap站大约4天左右。
这里有详细的开发文档:http://ask.dcloud.net.cn/docs/#//ask.dcloud.net.cn/article/1244,快来试试吧。
与DCloud的所有开发者产品一样,这也是一个纯免费的工具。
产业发展的车轮一直在滚滚向前,无人能阻挡。
或许,你又见证了一次重大改变。
附,HBuilder 8.8.4的release note
IDE
- 【重要】新增wap2app项目类型,将现有M站快速发布成App的增强方案。[详情>>>]http://ask.dcloud.net.cn/docs/#http://ask.dcloud.net.cn/article/1244)
- 【重要】新增调试Android/iOS设备应用的功能(无需翻墙!!!运行时会自动切换右上角webview调试视图)
- 【重要】真机运行添加自定义基座运行,使用方法同真机运行。教程参考:https://ask.dcloud.net.cn/article/12723
- 优化设置默认编辑器的体验(可直接右键【打开方式】-【选择默认编辑器...】)
- 修复创建web项目时在某些机器上输入项目名称会卡的问题
- 修复html标签带“-”号时的高亮问题
- 新建移动App时,增加原生tab选项卡项目模板,教程参考:http://ask.dcloud.net.cn/article/12602
- 新建HTML页面时,支持选择单webview模式下拉刷新页面组模板
- 新建HTML页面时,支持选择列表到详情最佳实践页面组模板
App
- 新增原生View控件绘制富文本内容(richtext)及文本编辑框(input)
- 新增Webview窗口的titleNView支持设置初始化绘制内容(WebviewTitleNViewStyles.tags)
- 新增Webview窗口支持控制是否可选择页面文本内容,即是否弹出系统复制粘贴菜单(WebviewStyles.userSelect)
- 新增确认对话框(plus.nativeUI.confirm)支持设置垂直方向对齐方式(ConfirmOptions.verticalAlign)
- 新增自动消失提示框(plus.nativeUI.toast)支持显示富文本内容(richtext)
- 新增图片保存到相册后返回路径,在图片选择时可设置为默认选择此图片
- Android平台调整硬件加速和截屏策略。详情
- Android平台更新第三方SDK:个推(2.10.3.5),新浪微博(4.1)
- Android平台新增预载网络页面代码但不渲染的功能(plus.webview.prefetchURL/plus.webview.prefetchURLs)
- Android平台修复横竖屏切换可能导致获取屏幕宽度(plus.screen.resolutionWidth)不对的问题
- Android平台修复Webview窗口快速拖拽(drag)操作可能导致页面显示白屏的问题
- Android平台修复图片轮播控件控件(ImageSlider)显示两张图时循环控制逻辑错误的问题
- Android平台修复操作图片选择控件后缓存到应用私有目录可能导致应用空间占用过大的问题
- Android平台修复在7.0上调用拍照或录像时可能出现异常的问题
- Android平台修复下载模块可能出现下载失败的问题
- iOS平台修复使用原生混淆可能会概率出现启动白屏的问题
- iOS平台修复调用plus.nativeUI.confirm后再调用plus.nativeUI.alert可能导致回调函数无法触发的问题
- iOS平台修复原生View控件以dock方式添加到Webview窗口隐藏后显示显示不正确的问题
- 新增Map地图控件对象支持关闭(close)操作
- Android平台修复压缩图片在部分设备上可能出现崩溃的问题
- Android平台修复百度地图在部分设备上可能无法正常显示标点图片的问题
- iOS平台修复应用中存在侧滑菜单通过wgt升级更新后重启应用侧滑菜单显示不正常的问题
MUI
- 修复picker选择器控件的潜在bug,issues #348
- 修复Hello MUI在iOS平台无法跳转appstore进行评分的bug
- 解决DIV模式的时间选择器,点击遮罩或取消按钮,反复关闭/显示,重复创建picker控件的bug
- 优化subNView模式的底部选项卡实现
wap2app
HBuilder 8.8.5发布,重磅新品wap2app上线,支持云端打包,原生nview加持,体验快到震惊!
手机wap站,能不能快速转换成app,并且达到app的功能体验?
这个问题已经提出好久好久了。
好久到,现在大多数人已经不对这个问题抱有希望了。
但,如果真能做到呢?
wap2app,是DCloud公司的重磅新产品。
它是一个开发框架,更接近mui,底层封装了HTML5Plus的各种能力。
也就是从现在起,DCloud给开发者提供了2种开发模式:
- 从头开发,使用mui框架,开发一次,app和wap站都有了;
- 已有wap站,则使用wap2app框架,把wap站强化为app。
wap2app这个项目DCloud其实已经开发数年,在HBuilder alpha版中也早已存在。
经历过很多项目实践、打磨,现在我们终于把它正式推出。
真实效果到底怎么样?我们来看段视频。
看看基于wap2app转换的应用,和原生应用相比到底有多大体验差别。
-
实验环境说明:
手机设备相同(华为荣耀8青春版,2016年上市,千元机代表)、网络环境相同、使用前均清理了内存,原生应用使用最新版。 -
实验视频:唯品会、大众点评流应用与原生应用对比
-
实验结论:
新页面渲染速度和原生不相上下,在300毫秒的动画期间即可渲染,而且动画平顺。
为什么加载这么快呢?因为wap2app封装了5+引擎里的原生渲染能力和原生动画能力。
在新页面加载时,是由plus.nativeObj.view来渲染的页面。
那么强化一个wap站要多久呢?
嗯,中等规模的wap站大约4天左右。
这里有详细的开发文档:http://ask.dcloud.net.cn/docs/#//ask.dcloud.net.cn/article/1244,快来试试吧。
与DCloud的所有开发者产品一样,这也是一个纯免费的工具。
产业发展的车轮一直在滚滚向前,无人能阻挡。
或许,你又见证了一次重大改变。
附,HBuilder 8.8.4的release note
IDE
- 【重要】新增wap2app项目类型,将现有M站快速发布成App的增强方案。[详情>>>]http://ask.dcloud.net.cn/docs/#http://ask.dcloud.net.cn/article/1244)
- 【重要】新增调试Android/iOS设备应用的功能(无需翻墙!!!运行时会自动切换右上角webview调试视图)
- 【重要】真机运行添加自定义基座运行,使用方法同真机运行。教程参考:https://ask.dcloud.net.cn/article/12723
- 优化设置默认编辑器的体验(可直接右键【打开方式】-【选择默认编辑器...】)
- 修复创建web项目时在某些机器上输入项目名称会卡的问题
- 修复html标签带“-”号时的高亮问题
- 新建移动App时,增加原生tab选项卡项目模板,教程参考:http://ask.dcloud.net.cn/article/12602
- 新建HTML页面时,支持选择单webview模式下拉刷新页面组模板
- 新建HTML页面时,支持选择列表到详情最佳实践页面组模板
App
- 新增原生View控件绘制富文本内容(richtext)及文本编辑框(input)
- 新增Webview窗口的titleNView支持设置初始化绘制内容(WebviewTitleNViewStyles.tags)
- 新增Webview窗口支持控制是否可选择页面文本内容,即是否弹出系统复制粘贴菜单(WebviewStyles.userSelect)
- 新增确认对话框(plus.nativeUI.confirm)支持设置垂直方向对齐方式(ConfirmOptions.verticalAlign)
- 新增自动消失提示框(plus.nativeUI.toast)支持显示富文本内容(richtext)
- 新增图片保存到相册后返回路径,在图片选择时可设置为默认选择此图片
- Android平台调整硬件加速和截屏策略。详情
- Android平台更新第三方SDK:个推(2.10.3.5),新浪微博(4.1)
- Android平台新增预载网络页面代码但不渲染的功能(plus.webview.prefetchURL/plus.webview.prefetchURLs)
- Android平台修复横竖屏切换可能导致获取屏幕宽度(plus.screen.resolutionWidth)不对的问题
- Android平台修复Webview窗口快速拖拽(drag)操作可能导致页面显示白屏的问题
- Android平台修复图片轮播控件控件(ImageSlider)显示两张图时循环控制逻辑错误的问题
- Android平台修复操作图片选择控件后缓存到应用私有目录可能导致应用空间占用过大的问题
- Android平台修复在7.0上调用拍照或录像时可能出现异常的问题
- Android平台修复下载模块可能出现下载失败的问题
- iOS平台修复使用原生混淆可能会概率出现启动白屏的问题
- iOS平台修复调用plus.nativeUI.confirm后再调用plus.nativeUI.alert可能导致回调函数无法触发的问题
- iOS平台修复原生View控件以dock方式添加到Webview窗口隐藏后显示显示不正确的问题
- 新增Map地图控件对象支持关闭(close)操作
- Android平台修复压缩图片在部分设备上可能出现崩溃的问题
- Android平台修复百度地图在部分设备上可能无法正常显示标点图片的问题
- iOS平台修复应用中存在侧滑菜单通过wgt升级更新后重启应用侧滑菜单显示不正常的问题
MUI
- 修复picker选择器控件的潜在bug,issues #348
- 修复Hello MUI在iOS平台无法跳转appstore进行评分的bug
- 解决DIV模式的时间选择器,点击遮罩或取消按钮,反复关闭/显示,重复创建picker控件的bug
- 优化subNView模式的底部选项卡实现
wap2app
收起阅读 »cookie
cookie的构成
Name:一个唯一确定cookie的名称。cookie名称是不区分大小写的,所以myCookie和MyCookie被认为是同一个cookie。然而,实践中最好见cookie看做是区分大小写的,因为某些服务器会这样处理cookie。cookie的名称必须经过URL编码。
Value:存储在cookie中的字符串值。值必须被URL编码。
Domain:cookie对于哪个域是有效的。所有向改域发送的请求中都会包含着个cookie信息。这个值可以包含子域名(subdomain)。如果没有明确设定,这个域会被认作来自设置cookie的那个域。
Path:对于指定域中的路径,应该向服务器发送cookie。例如,你可以指定cookie只有从http://www.XXX.com/books中才能访问,那么http://www.XXX.com的页面就不会发送cookie信息,即使请求都是来自同一个域的。
Expires:标识cookie何时应该被删除的时间戳。默认情况下,浏览器会话结束时即将所有cookie删除;也可以自己设置删除时间。这个值是GMT格式的日期,用于指定应该删除cookie的准确时间。因此,cookie可在浏览器关闭后依然保存在用户的机器上。如果设置的是之前的时间,则cookie会被立刻删除。
Size:cookie的大小。
Secure:指定后,cookie只有在使用ssl链接的时候才会发送到服务器。例如:cookie信息只能发送给https://www.xxx.com,而http://www.xxx.com的请求则不能发送cookie。
每一段信息都作为Set-Cookie头的一部分,使用分号加空格分隔每一段,如下:
Set-Cookie:name=value;expires=XXX GMT;domain=.wrox.com
cookie的构成
Name:一个唯一确定cookie的名称。cookie名称是不区分大小写的,所以myCookie和MyCookie被认为是同一个cookie。然而,实践中最好见cookie看做是区分大小写的,因为某些服务器会这样处理cookie。cookie的名称必须经过URL编码。
Value:存储在cookie中的字符串值。值必须被URL编码。
Domain:cookie对于哪个域是有效的。所有向改域发送的请求中都会包含着个cookie信息。这个值可以包含子域名(subdomain)。如果没有明确设定,这个域会被认作来自设置cookie的那个域。
Path:对于指定域中的路径,应该向服务器发送cookie。例如,你可以指定cookie只有从http://www.XXX.com/books中才能访问,那么http://www.XXX.com的页面就不会发送cookie信息,即使请求都是来自同一个域的。
Expires:标识cookie何时应该被删除的时间戳。默认情况下,浏览器会话结束时即将所有cookie删除;也可以自己设置删除时间。这个值是GMT格式的日期,用于指定应该删除cookie的准确时间。因此,cookie可在浏览器关闭后依然保存在用户的机器上。如果设置的是之前的时间,则cookie会被立刻删除。
Size:cookie的大小。
Secure:指定后,cookie只有在使用ssl链接的时候才会发送到服务器。例如:cookie信息只能发送给https://www.xxx.com,而http://www.xxx.com的请求则不能发送cookie。
每一段信息都作为Set-Cookie头的一部分,使用分号加空格分隔每一段,如下:
Set-Cookie:name=value;expires=XXX GMT;domain=.wrox.com
mui通过native.js调用安卓原生类库,通过广播方式实现扫码结果的接收
这几天通过mui来做PDA扫码接收,想通过广播的方式进行扫描结果的接收。所以通过native.js使用原生安卓类库,要实现广播必须使用安卓BroadcastReceiver类库;但是这个类库是抽象类,没法实例化;通过查询,发现mui对这个类库进行了映射;这样就可以轻松使用这个类库操作进行功能实现了;
function plusReady() {
var main = plus.android.runtimeMainActivity(); //获取activity
var context = plus.android.importClass('android.content.Context'); //上下文
var receiver = plus.android.implements('io.dcloud.feature.internal.reflect.BroadcastReceiver', {
onReceive: getReceive //实现onReceiver回调函数
});
var IntentFilter = plus.android.importClass('android.content.IntentFilter');//引入过滤器
var Intent = plus.android.importClass('android.content.Intent');
var filter = new IntentFilter();
filter.addAction("lachesis_barcode_value_notice_broadcast"); //监听扫码广播
main.registerReceiver(receiver, filter); //注册监听
}
function getReceive (context, intent) {
alert(intent.getStringExtra("lachesis_barcode_value_notice_broadcast_data_string"));//获取到的值,根据需要自行处理结果
}
因为确实资料很少,费了不少时间;所以,分享给大家,希望对大家有用,谢谢;
这几天通过mui来做PDA扫码接收,想通过广播的方式进行扫描结果的接收。所以通过native.js使用原生安卓类库,要实现广播必须使用安卓BroadcastReceiver类库;但是这个类库是抽象类,没法实例化;通过查询,发现mui对这个类库进行了映射;这样就可以轻松使用这个类库操作进行功能实现了;
function plusReady() {
var main = plus.android.runtimeMainActivity(); //获取activity
var context = plus.android.importClass('android.content.Context'); //上下文
var receiver = plus.android.implements('io.dcloud.feature.internal.reflect.BroadcastReceiver', {
onReceive: getReceive //实现onReceiver回调函数
});
var IntentFilter = plus.android.importClass('android.content.IntentFilter');//引入过滤器
var Intent = plus.android.importClass('android.content.Intent');
var filter = new IntentFilter();
filter.addAction("lachesis_barcode_value_notice_broadcast"); //监听扫码广播
main.registerReceiver(receiver, filter); //注册监听
}
function getReceive (context, intent) {
alert(intent.getStringExtra("lachesis_barcode_value_notice_broadcast_data_string"));//获取到的值,根据需要自行处理结果
}
因为确实资料很少,费了不少时间;所以,分享给大家,希望对大家有用,谢谢;
收起阅读 »别升级到8.8.3
别升级到8.8.3
- 在线增量升级会出现真机运行处问题
- nativeOBJ在IOS下的行为会有问题(真机和ios模拟器都测试过有问题)
- webview的动画有问题,比如show() (目前看估计macos的ios模拟器也存在一些异常)
- ……
期望
- 给出上个稳定正式版,不是Alpha
- 解决一些社区非常关心的问题,比如不开gps情况下的geolocation抛出错误
- nativeOBJ和webview还有很多可以做的,比如手指跟随,现在只能左右,没有上下。我试过用drag来实现,相信我,那玩意跟tap没有区别,根本体现不出drag的特殊性。又比如view的click和touch,基本上触动click也会触动touch
- nativeOBJ现在可以加input了,这不错,不过还有需要借助原生view而不通过webview来渲染的需求。比如view和bitmap的动画效果,虽然有,但满足开发需求几乎很难。
- ……
谢谢
别升级到8.8.3
- 在线增量升级会出现真机运行处问题
- nativeOBJ在IOS下的行为会有问题(真机和ios模拟器都测试过有问题)
- webview的动画有问题,比如show() (目前看估计macos的ios模拟器也存在一些异常)
- ……
期望
- 给出上个稳定正式版,不是Alpha
- 解决一些社区非常关心的问题,比如不开gps情况下的geolocation抛出错误
- nativeOBJ和webview还有很多可以做的,比如手指跟随,现在只能左右,没有上下。我试过用drag来实现,相信我,那玩意跟tap没有区别,根本体现不出drag的特殊性。又比如view的click和touch,基本上触动click也会触动touch
- nativeOBJ现在可以加input了,这不错,不过还有需要借助原生view而不通过webview来渲染的需求。比如view和bitmap的动画效果,虽然有,但满足开发需求几乎很难。
- ……
谢谢
收起阅读 »ios 自定义消息提示音, 当APP处于离线模式的时候,为了满足我们的需求通常需要自定义消息提示音
自己做项目,通常会遇到各种需求。现在项目就需要自定义消息提示音。
于是来了官方文档里面搜索,发现大家解决自定义消息提示音的方案都是这样解决的 我直接上代码:
这个我只是说一下,重要的代码在后面。
//------------------------------个推消息接收------------------------------------------------------------
document.addEventListener("plusready", function() {
//message = document.getElementById("message");
//mui.alert("来了");
// 监听点击消息事件
plus.push.addEventListener("click", function(msg) {
// 判断是从本地创建还是离线推送的消息
switch(msg.payload) {
case "LocalMSG":
break;
default:
player();
//清空当前消息
plus.push.clear();
break;
}
// 提示点击的内容
//plus.ui.alert(JSON.stringify(msg));
// 处理其它数据
//logoutPushMsg(msg);
}, false);
// 监听在线消息事件
plus.push.addEventListener("receive", function(msg) {
plus.push.createMessage("消息推送来了",null,{
sound:'none',
delay:3
})
setTimeout(function(){
player();
},3000);
if(msg.aps) {
// Apple APNS message
} else {
//alert("接收到在线透传消息:");
var messageContent=JSON.parse(msg.content);
var type=messageContent.type;
}
//logoutPushMsg(msg);
}, false);
}, false);
简单来说,就是通过个推透传,APP 监听receive 事件,然后来控制消息中心。
plus.push.setAutoNotification( false ); 通过这段代码来自行定义系统消息中心,目前来说 官方文档给出的解释就是Android 支持,而ios不支持。
所以这很坑啊 ,如果通过监听receive 事件,创建本地消息,然后播放声音,这种方式在Android APP 不管出于什么模式都可以,但是如果ios 出于离线模式就行不通了。
那么ios 的自定义消息提示音该如何解决呢?
我们从hbuilder 打包,那么官方返回的是一个ipa 的苹果APP安装包,实际上也是一个压缩文件。
和Hbuilder技术沟通,得到明确的答复是云端打包不支持添加自定义的声音资源到ipa包里去,只能离线打包。看来Hbuilder还是任重而道远啊,有很多技术细节还要不断完善。
下面是ios 自定义消息提示音的解决方案
第一 首先你的有MAC OSX系统,因为以下操作都是在MAC OSX系统里面完成的,如果有苹果电脑那自然好。 如果没有苹果电脑那么怎么办,只能自己安装虚拟机(如果虚拟机不懂,自己百度 )
好人做到底我送上 虚拟机 os 系统的链接:Yosemite Install(14A389).cdr
第二安装好系统后执行如下操作。
正确的解锁姿势来啦:
1、解压
unzip xxx.ipa
得到Payload文件夹,里面有xxx.app包,右键显示包内容,可以增删改里面的资源文件,这里我们就增加几个音频文件,比如 message1.caf、message2.caf、message3.caf 等。
2、删除签名文件夹 _CodeSignature
rm -rf Payload/xxx.app/_CodeSignature/
3、替换证书描述文件(可选,如果是自己的app,描述文件没有改变可以不替换):
cp embedded.mobileprovision Payload/xxx.app
4、重新签名(关键一步):
codesign -f -s "iPhone Distribution: company name (5BF53xxxxx)" --entitlements entitlements.plist Payload/xxx.app
注意,发布证书需要替换成自己的,company name 和 5BF53xxxxx 改成自己的证书信息;entitlements.plist这个文件怎么来的,飘易下面讲。
验证签名后的.app文件
codesign --verify xxx.app
如果没有任何输出信息,代表没有问题。
5、重新打包:
zip -r new.ipa Payload
好了,到这里我们就得到新的.ipa包了,可以拿这个包去app store 重新上架了。
剩下的事情就是服务器端发送消息推送的时候,指明用哪个声音文件即可:
<?php
public function iOS_message($msg_title, $msg_content, $badge=''){
//消息对象
$message = new IOSBuilder();
$message->title($msg_title);//标题
$message->description($msg_content);//内容
$message->body($msg_content);//内容,会覆盖description
$message->soundUrl('shaking.caf');
if(!empty($badge)) $message->badge($badge);//自定义通知数字角标
$message->build();
//返回
return $message;
}
上面重新签名的过程中可能涉及到的几个知识点:
1、查看.app的相关信息
codesign -vv -d Test.app
2、调用xcode查看或修改info.plist:
open Payload/xxx.app/info.plist
注意修改Bundle identifier后的弊端是第三方sdk失效,比如不能进行微博登录,不能收到推送等等。
3、查看.mobileprovision文件内部信息:
security cms -D -i example.mobileprovision
或者从.app包里查看:
codesign -d --entitlements - Test.app
4、从.mobileprovision文件里面直接导出entitlements.plist:
/usr/libexec/PlistBuddy -x -c "print:Entitlements" /dev/stdin <<< $(security cms -D -i embedded.mobileprovision) > entitlements.plist
entitlements.plist文件里面的内容参考:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>application-identifier</key>
<string>Prefix.bundleID</string>
<key>aps-environment</key>
<string>production</string>
<key>beta-reports-active</key>
<true/>
<key>com.apple.developer.team-identifier</key>
<string>Prefix</string>
<key>get-task-allow</key>
<false/>
<key>keychain-access-groups</key>
<array>
<string>Prefix.*</string>
</array>
</dict>
</plist>
注意,Prefix 替换成你自己app的。
5、早期的签名codesign有一个参数叫:--resource-rules Payload/xxx.app/ResourceRules.plist
在OSX 10.10的版本及更高的版本上会提示你已弃用:
Warning: --resource-rules has been deprecated in Mac OS X >= 10.10!
6、如何导出iOS支持的音频格式 .aiff 、.wav 、.caf
MAC提供了一个工具 :afconvert
比如, 把16位的PCM 格式的音频sub.aiff 转换成数据类型为 IMA4的后缀为.caf的文件,终端里执行下面的命令即可:
afconvert sub.aiff sub.caf -d ima4 -f caff -v
mp3转成caf:
afconvert sub.mp3 sub.caf -d ima4 -f caff -v
根据飘易的测试,caf后缀的音频文件比wav和aiff的都要小一点。
更多的帮助,查看支持的格式:
afconvert -hf
Android的我就不说了,简单得不要不要的。
效果就是推送 ios 锁屏的时候自定义消息提示音
自己做项目,通常会遇到各种需求。现在项目就需要自定义消息提示音。
于是来了官方文档里面搜索,发现大家解决自定义消息提示音的方案都是这样解决的 我直接上代码:
这个我只是说一下,重要的代码在后面。
//------------------------------个推消息接收------------------------------------------------------------
document.addEventListener("plusready", function() {
//message = document.getElementById("message");
//mui.alert("来了");
// 监听点击消息事件
plus.push.addEventListener("click", function(msg) {
// 判断是从本地创建还是离线推送的消息
switch(msg.payload) {
case "LocalMSG":
break;
default:
player();
//清空当前消息
plus.push.clear();
break;
}
// 提示点击的内容
//plus.ui.alert(JSON.stringify(msg));
// 处理其它数据
//logoutPushMsg(msg);
}, false);
// 监听在线消息事件
plus.push.addEventListener("receive", function(msg) {
plus.push.createMessage("消息推送来了",null,{
sound:'none',
delay:3
})
setTimeout(function(){
player();
},3000);
if(msg.aps) {
// Apple APNS message
} else {
//alert("接收到在线透传消息:");
var messageContent=JSON.parse(msg.content);
var type=messageContent.type;
}
//logoutPushMsg(msg);
}, false);
}, false);
简单来说,就是通过个推透传,APP 监听receive 事件,然后来控制消息中心。
plus.push.setAutoNotification( false ); 通过这段代码来自行定义系统消息中心,目前来说 官方文档给出的解释就是Android 支持,而ios不支持。
所以这很坑啊 ,如果通过监听receive 事件,创建本地消息,然后播放声音,这种方式在Android APP 不管出于什么模式都可以,但是如果ios 出于离线模式就行不通了。
那么ios 的自定义消息提示音该如何解决呢?
我们从hbuilder 打包,那么官方返回的是一个ipa 的苹果APP安装包,实际上也是一个压缩文件。
和Hbuilder技术沟通,得到明确的答复是云端打包不支持添加自定义的声音资源到ipa包里去,只能离线打包。看来Hbuilder还是任重而道远啊,有很多技术细节还要不断完善。
下面是ios 自定义消息提示音的解决方案
第一 首先你的有MAC OSX系统,因为以下操作都是在MAC OSX系统里面完成的,如果有苹果电脑那自然好。 如果没有苹果电脑那么怎么办,只能自己安装虚拟机(如果虚拟机不懂,自己百度 )
好人做到底我送上 虚拟机 os 系统的链接:Yosemite Install(14A389).cdr
第二安装好系统后执行如下操作。
正确的解锁姿势来啦:
1、解压
unzip xxx.ipa
得到Payload文件夹,里面有xxx.app包,右键显示包内容,可以增删改里面的资源文件,这里我们就增加几个音频文件,比如 message1.caf、message2.caf、message3.caf 等。
2、删除签名文件夹 _CodeSignature
rm -rf Payload/xxx.app/_CodeSignature/
3、替换证书描述文件(可选,如果是自己的app,描述文件没有改变可以不替换):
cp embedded.mobileprovision Payload/xxx.app
4、重新签名(关键一步):
codesign -f -s "iPhone Distribution: company name (5BF53xxxxx)" --entitlements entitlements.plist Payload/xxx.app
注意,发布证书需要替换成自己的,company name 和 5BF53xxxxx 改成自己的证书信息;entitlements.plist这个文件怎么来的,飘易下面讲。
验证签名后的.app文件
codesign --verify xxx.app
如果没有任何输出信息,代表没有问题。
5、重新打包:
zip -r new.ipa Payload
好了,到这里我们就得到新的.ipa包了,可以拿这个包去app store 重新上架了。
剩下的事情就是服务器端发送消息推送的时候,指明用哪个声音文件即可:
<?php
public function iOS_message($msg_title, $msg_content, $badge=''){
//消息对象
$message = new IOSBuilder();
$message->title($msg_title);//标题
$message->description($msg_content);//内容
$message->body($msg_content);//内容,会覆盖description
$message->soundUrl('shaking.caf');
if(!empty($badge)) $message->badge($badge);//自定义通知数字角标
$message->build();
//返回
return $message;
}
上面重新签名的过程中可能涉及到的几个知识点:
1、查看.app的相关信息
codesign -vv -d Test.app
2、调用xcode查看或修改info.plist:
open Payload/xxx.app/info.plist
注意修改Bundle identifier后的弊端是第三方sdk失效,比如不能进行微博登录,不能收到推送等等。
3、查看.mobileprovision文件内部信息:
security cms -D -i example.mobileprovision
或者从.app包里查看:
codesign -d --entitlements - Test.app
4、从.mobileprovision文件里面直接导出entitlements.plist:
/usr/libexec/PlistBuddy -x -c "print:Entitlements" /dev/stdin <<< $(security cms -D -i embedded.mobileprovision) > entitlements.plist
entitlements.plist文件里面的内容参考:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>application-identifier</key>
<string>Prefix.bundleID</string>
<key>aps-environment</key>
<string>production</string>
<key>beta-reports-active</key>
<true/>
<key>com.apple.developer.team-identifier</key>
<string>Prefix</string>
<key>get-task-allow</key>
<false/>
<key>keychain-access-groups</key>
<array>
<string>Prefix.*</string>
</array>
</dict>
</plist>
注意,Prefix 替换成你自己app的。
5、早期的签名codesign有一个参数叫:--resource-rules Payload/xxx.app/ResourceRules.plist
在OSX 10.10的版本及更高的版本上会提示你已弃用:
Warning: --resource-rules has been deprecated in Mac OS X >= 10.10!
6、如何导出iOS支持的音频格式 .aiff 、.wav 、.caf
MAC提供了一个工具 :afconvert
比如, 把16位的PCM 格式的音频sub.aiff 转换成数据类型为 IMA4的后缀为.caf的文件,终端里执行下面的命令即可:
afconvert sub.aiff sub.caf -d ima4 -f caff -v
mp3转成caf:
afconvert sub.mp3 sub.caf -d ima4 -f caff -v
根据飘易的测试,caf后缀的音频文件比wav和aiff的都要小一点。
更多的帮助,查看支持的格式:
afconvert -hf
Android的我就不说了,简单得不要不要的。
效果就是推送 ios 锁屏的时候自定义消息提示音
收起阅读 »h5+ 跨平台 app开发学习路线【附教程】
《JavaScript 快速提高视频教程》 js基础快速提高课程 【免费】
http://www.hcoder.net/course/info_229.html
《MUI 视频教程》【免费】
http://www.hcoder.net/course/info_211.html
《h.js 视频教程》【免费】
http://www.hcoder.net/tutorials/info_147.html
《HTML 5 开发教程》【免费】
http://www.hcoder.net/course/info_212.html
《APP开发实例教程 - 窗口切换 》【免费】
http://www.hcoder.net/course/info_218.html
《HBuilder 8.0.1 APP开发 - 新功能全接触》【免费】
http://www.hcoder.net/course/info_227.html
--------- 实战收费教程 ------------------------
MUI、H5 APP 实战教程 - 仿《有道词典》
https://ke.qq.com/course/194834
H5 跨平台APP开发电商项目实战教程 -《仿京东优选商城》
https://ke.qq.com/course/225830
更多课程中心
http://www.hcoder.net/course
《JavaScript 快速提高视频教程》 js基础快速提高课程 【免费】
http://www.hcoder.net/course/info_229.html
《MUI 视频教程》【免费】
http://www.hcoder.net/course/info_211.html
《h.js 视频教程》【免费】
http://www.hcoder.net/tutorials/info_147.html
《HTML 5 开发教程》【免费】
http://www.hcoder.net/course/info_212.html
《APP开发实例教程 - 窗口切换 》【免费】
http://www.hcoder.net/course/info_218.html
《HBuilder 8.0.1 APP开发 - 新功能全接触》【免费】
http://www.hcoder.net/course/info_227.html
--------- 实战收费教程 ------------------------
MUI、H5 APP 实战教程 - 仿《有道词典》
https://ke.qq.com/course/194834
H5 跨平台APP开发电商项目实战教程 -《仿京东优选商城》
https://ke.qq.com/course/225830
更多课程中心
http://www.hcoder.net/course
TypeScript 直接编译方法
编译单个文件:
运行》外部工具》外部工具配置》新建》要执行的命令和文件》
输入(若没有改变nmp默认包安装路径):C:\Users\Administrator\AppData\Roaming\npm\tsc.cmd
参数:${resource_loc}
名称:(输入一个自己想要的名字如:TypeScript编译)
点击应用。关闭。
在.ts文件空白处 右键单击 》外部工具》点击“TypeScript编译”。
编译整个工程:
一样的设置,参数处设置:${project_loc}
取个名字如:TypeScript编译项目
并在工程目录里包含:tsconfig.json
在工程名 或 文件上 点击右键》外部工具,然后。。。
编译单个文件:
运行》外部工具》外部工具配置》新建》要执行的命令和文件》
输入(若没有改变nmp默认包安装路径):C:\Users\Administrator\AppData\Roaming\npm\tsc.cmd
参数:${resource_loc}
名称:(输入一个自己想要的名字如:TypeScript编译)
点击应用。关闭。
在.ts文件空白处 右键单击 》外部工具》点击“TypeScript编译”。
编译整个工程:
一样的设置,参数处设置:${project_loc}
取个名字如:TypeScript编译项目
并在工程目录里包含:tsconfig.json
在工程名 或 文件上 点击右键》外部工具,然后。。。
收起阅读 »关于APP自动更新的问题
一般在我们的开发运用中,我们会需要不断的发行版本来更新迭代我们的APP,那么我们能不能通过mui来下载替换我们要更新的页面呢?应用场景:
- 比如我们的程序出现一个小BUG,比如就是一个字写错了,一个连接不对,这时候需要发布新版本才能更新
- 比如活动,我们想更新几个小图标(其实可以做成AJAX动态修改的,不过我这里是加入)
- 不发布版本自动修复
希望大家提供一下自己的方法和方案我们一起讨论下呗!感谢
一般在我们的开发运用中,我们会需要不断的发行版本来更新迭代我们的APP,那么我们能不能通过mui来下载替换我们要更新的页面呢?应用场景:
- 比如我们的程序出现一个小BUG,比如就是一个字写错了,一个连接不对,这时候需要发布新版本才能更新
- 比如活动,我们想更新几个小图标(其实可以做成AJAX动态修改的,不过我这里是加入)
- 不发布版本自动修复
希望大家提供一下自己的方法和方案我们一起讨论下呗!感谢
收起阅读 »拍照后照片转base64位
拍照后的照片获取本地存储地址后进行压缩,压缩成一定大小以及像素画质,然后在转为base64位图片,可以用于部分接口需要base64图片上传,网上有部分源码只转地址没转base64,现在来分享下干货了。
function getImage() {
var c = plus.camera.getCamera();
c.captureImage(function(e) {
plus.io.resolveLocalFileSystemURL(e, function(entry) {
var src = entry.toLocalURL();
resizeImage(src)//进行压缩
}, function(e) {
});
}, function(s) {
}, {
filename: "_doc/head.jpg"
})
}
//再对图片进行压缩为270*270,再上传到服务器
function resizeImage(src) {
plus.zip.compressImage(
{
src: src,
dst: "_doc/a.jpg",
overwrite: true,
width: '270px',
height:'270px',
format: 'jpg',
quality: 100
},
function(e) {
var reader = new plus.io.FileReader();
reader.onloadend = function (e) {
var speech = e.target.result;//base64图片
};
reader.readAsDataURL(e.target);
},
function(err) {
plus.nativeUI.alert('未知错误!',function() {
});
}
);
} 拍照后的照片获取本地存储地址后进行压缩,压缩成一定大小以及像素画质,然后在转为base64位图片,可以用于部分接口需要base64图片上传,网上有部分源码只转地址没转base64,现在来分享下干货了。
function getImage() {
var c = plus.camera.getCamera();
c.captureImage(function(e) {
plus.io.resolveLocalFileSystemURL(e, function(entry) {
var src = entry.toLocalURL();
resizeImage(src)//进行压缩
}, function(e) {
});
}, function(s) {
}, {
filename: "_doc/head.jpg"
})
}
//再对图片进行压缩为270*270,再上传到服务器
function resizeImage(src) {
plus.zip.compressImage(
{
src: src,
dst: "_doc/a.jpg",
overwrite: true,
width: '270px',
height:'270px',
format: 'jpg',
quality: 100
},
function(e) {
var reader = new plus.io.FileReader();
reader.onloadend = function (e) {
var speech = e.target.result;//base64图片
};
reader.readAsDataURL(e.target);
},
function(err) {
plus.nativeUI.alert('未知错误!',function() {
});
}
);
} 收起阅读 »




