HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

那些年绕不过的苹果上架审核

iOS

这个分类。。。。不太恰当
在分享我和苹果审核纠葛史前,还是有必要铺垫一下的。
我,大城市里平民阶层,工作时间是再不能更标准的朝九晚五,公司距离租的房子乘以6倍差不多才一站地铁的路,不刻意改变一下出门时间,甚至每天早上在路上看到的脸都是那几张。日复一日的两点一线,反倒是把心挠的痒痒。众所周知,豆瓣里人才济济,幽默风趣,针砭时事,侃侃而谈之士大有所在,头脑不太简单但生活太过简单的我极其轻易地被几篇打着“专治无聊”帖子吸引了去。最终,用一句话描述——我个人做起了APP。
非技术出身,没经验,海阔天空畅想后还是老实巴交照着豆瓣经验贴讲的去做了。挑了某某免费在线制作APP平台,研究了大半个月,搞清了平台APP制作逻辑,用了大半年去搭建界面,填充数据。因为APP没有涉及电商、医疗等特殊行业类别,所以没有选择代上架服务,而是自己花点钱申请了苹果个人开发者账号走了自助上架流程。
那么,激动人心又饱含心酸的旅程就此开始。
APP制作完备,资料准备充分,先是过了平台的自助上架审核然后自行上架到App Store。
由于关闭了启动图,我的第一次申请,就这么被App Store拒绝了。百度一下相似情况还真不少——为了增强应用程序启动时的用户体验,您应该提供一个启动图像。启动图像并不是为您提供机会进行艺术展示;它完全是为了增强用户对应用程序能够快速启动并立即投入使用的感知度,巴拉巴拉的。在制作台开启启动页后,重新打包,满腔自信再次提交上架申请。由于是社区类型App,版块还挺多,其中一个版块我加了不少链接,我的上架申请如愿以偿又被驳回了。苹果告诉我有链接堆砌的嫌疑,这种界面不适宜放在APP里,居然中肯建议我使用H5制作。足足用了两天改好了问题板块,对自己APP的内容审视再三,希望的火苗又一次点燃。
两天过后,我拿起了好几个月前放在枕头下的《金刚经》。我以为拥护苹果是一种美德,实则不然,APP中某一tab栏的图标风格带有浓郁ios icon风情,又一次,被拒绝了。第四次,也是最后一次。事实证明苹果审核人员真的十分认真负责,最后一次被拒绝也确实是我制作过程中疏忽了一个页面的顶栏返回按钮,点击过后的背景色被设置成了和白色页面背景形成强烈明暗对比的黑色,用户体验不友好,这个我完全认同。被苹果的火眼金睛发现了这一漏洞,调整好心态,改正,重新打包,提交,漫长而又让人心焦的等待......
最终,我的APP通过了苹果的审核。绿色的圆点+可供销售四个大字,对于每一位苹果开发者来说,视觉快感约等于通关游戏后的醒目弹窗。
一刹那,我很爽。
四次交手,内心吐槽苹果多次,更多却是欣赏它的严谨和求实,对每一位苹果开发者负责,更是对每一位ios用户负责。这一过程即便繁琐,也确实丰富了一名普通群众的业余生活,接触了曾经未曾涉及的领域。上架App Store是第一步,如何运营好自己的App是下一阶段该着重思考的问题了。
以上这些文字,能提炼出被App Store打回的原因有:启动页黑屏、APP制作不完善、链接堆砌、涉及苹果专有图标或文字。也可以总结出一条通用的“通过苹果ios上架审核的诀窍”——耐心。将心比心,你是iOS用户希望在App Store下载到什么样的应用,那就请以什么样的标准去制作和改进自己的App。制作App过程中遇到问题求助所用平台的专员或求助万能的搜索引擎,上架过程遇到阻碍,首选求助搜索引擎,其次是找不到根据的一些可以试着和苹果联系,他们的审核人员一般都会给出非常周到和中肯的建议。

最后附上: 2017 年最新Appstore审核条款

继续阅读 »

这个分类。。。。不太恰当
在分享我和苹果审核纠葛史前,还是有必要铺垫一下的。
我,大城市里平民阶层,工作时间是再不能更标准的朝九晚五,公司距离租的房子乘以6倍差不多才一站地铁的路,不刻意改变一下出门时间,甚至每天早上在路上看到的脸都是那几张。日复一日的两点一线,反倒是把心挠的痒痒。众所周知,豆瓣里人才济济,幽默风趣,针砭时事,侃侃而谈之士大有所在,头脑不太简单但生活太过简单的我极其轻易地被几篇打着“专治无聊”帖子吸引了去。最终,用一句话描述——我个人做起了APP。
非技术出身,没经验,海阔天空畅想后还是老实巴交照着豆瓣经验贴讲的去做了。挑了某某免费在线制作APP平台,研究了大半个月,搞清了平台APP制作逻辑,用了大半年去搭建界面,填充数据。因为APP没有涉及电商、医疗等特殊行业类别,所以没有选择代上架服务,而是自己花点钱申请了苹果个人开发者账号走了自助上架流程。
那么,激动人心又饱含心酸的旅程就此开始。
APP制作完备,资料准备充分,先是过了平台的自助上架审核然后自行上架到App Store。
由于关闭了启动图,我的第一次申请,就这么被App Store拒绝了。百度一下相似情况还真不少——为了增强应用程序启动时的用户体验,您应该提供一个启动图像。启动图像并不是为您提供机会进行艺术展示;它完全是为了增强用户对应用程序能够快速启动并立即投入使用的感知度,巴拉巴拉的。在制作台开启启动页后,重新打包,满腔自信再次提交上架申请。由于是社区类型App,版块还挺多,其中一个版块我加了不少链接,我的上架申请如愿以偿又被驳回了。苹果告诉我有链接堆砌的嫌疑,这种界面不适宜放在APP里,居然中肯建议我使用H5制作。足足用了两天改好了问题板块,对自己APP的内容审视再三,希望的火苗又一次点燃。
两天过后,我拿起了好几个月前放在枕头下的《金刚经》。我以为拥护苹果是一种美德,实则不然,APP中某一tab栏的图标风格带有浓郁ios icon风情,又一次,被拒绝了。第四次,也是最后一次。事实证明苹果审核人员真的十分认真负责,最后一次被拒绝也确实是我制作过程中疏忽了一个页面的顶栏返回按钮,点击过后的背景色被设置成了和白色页面背景形成强烈明暗对比的黑色,用户体验不友好,这个我完全认同。被苹果的火眼金睛发现了这一漏洞,调整好心态,改正,重新打包,提交,漫长而又让人心焦的等待......
最终,我的APP通过了苹果的审核。绿色的圆点+可供销售四个大字,对于每一位苹果开发者来说,视觉快感约等于通关游戏后的醒目弹窗。
一刹那,我很爽。
四次交手,内心吐槽苹果多次,更多却是欣赏它的严谨和求实,对每一位苹果开发者负责,更是对每一位ios用户负责。这一过程即便繁琐,也确实丰富了一名普通群众的业余生活,接触了曾经未曾涉及的领域。上架App Store是第一步,如何运营好自己的App是下一阶段该着重思考的问题了。
以上这些文字,能提炼出被App Store打回的原因有:启动页黑屏、APP制作不完善、链接堆砌、涉及苹果专有图标或文字。也可以总结出一条通用的“通过苹果ios上架审核的诀窍”——耐心。将心比心,你是iOS用户希望在App Store下载到什么样的应用,那就请以什么样的标准去制作和改进自己的App。制作App过程中遇到问题求助所用平台的专员或求助万能的搜索引擎,上架过程遇到阻碍,首选求助搜索引擎,其次是找不到根据的一些可以试着和苹果联系,他们的审核人员一般都会给出非常周到和中肯的建议。

最后附上: 2017 年最新Appstore审核条款

收起阅读 »

用ui.openWindow添加链接跳转,只能跳一次,再跳就显示上一个页面

用ui.openWindow添加链接跳转,只能跳一次,再跳就显示上一个页面,并且没有了跳转的动画效果。
解决办法:只要添加createNew:true,即可,即新建页面。每次跳转都新建页面,就完美解决了跳转白屏的问题。
注意,此处没有用a链接,用的是mui.openWindow。

继续阅读 »

用ui.openWindow添加链接跳转,只能跳一次,再跳就显示上一个页面,并且没有了跳转的动画效果。
解决办法:只要添加createNew:true,即可,即新建页面。每次跳转都新建页面,就完美解决了跳转白屏的问题。
注意,此处没有用a链接,用的是mui.openWindow。

收起阅读 »

Android平台以WebView方式集成HTML5+SDK 播放视频全屏时白屏

Android平台以WebView方式集成HTML5+SDK 播放视频全屏时白屏,视频播放有声音.
这个问题困扰了好久.后面跟踪代码发现在WebJsEvent.java文件中655行有问题,取不到IActivityHandler对象,导致代码不往下执行了

解决办法:在activity中实现IActivityHandler接口,并且在obtainActivityContentView方法中返回你当前的布局对象就可以了!
PS:官方的文档没说要实现这个接口

@Override  
    public FrameLayout obtainActivityContentView() {  
        return obtainActivityContentView;  
    }
继续阅读 »

Android平台以WebView方式集成HTML5+SDK 播放视频全屏时白屏,视频播放有声音.
这个问题困扰了好久.后面跟踪代码发现在WebJsEvent.java文件中655行有问题,取不到IActivityHandler对象,导致代码不往下执行了

解决办法:在activity中实现IActivityHandler接口,并且在obtainActivityContentView方法中返回你当前的布局对象就可以了!
PS:官方的文档没说要实现这个接口

@Override  
    public FrameLayout obtainActivityContentView() {  
        return obtainActivityContentView;  
    }
收起阅读 »

升级检测 - wap2app教程

升级 wap2app

wap2app项目的发行方式及对应的升级模式:

  • 发行成原生安装包,类似5+ App安装包,需开发者自己处理升级更新;
  • 发行到流应用平台,,流应用有内置的升级逻辑,开发者只需要将最新版本提交到流应用平台即可,无需单独开发.

本文主要讲解发行成原生安装包的升级检测实现,给出一种实现示例(仅供参考,开发者可以自定义逻辑实现),主要分为两个部分:

  • 客户端:App启动时,向服务器上报当前版本号,根据服务器响应结果决定是否提醒用户升级
  • 服务端:保存App最新版本号,根据客户端上报的版本号,比对后决定是否需要升级,若需升级则返回升级信息(rease notes、更新包地址等);

接口约定

如下数据接口约定仅为示例,开发者可以自定义接口参数。

请求地址:http://www.example.com/check/update

请求方法:GET

请求数据:

{  
    "appid": plus.runtime.appid,  
    "version": plus.runtime.version  
}

响应数据:

{  
    "status":1,//升级标志,1:需要升级;0:无需升级  
    "title": "wap2app版本更新",  
    "note": "修复bug1;\n修复bug2;",//release notes  
    "url": "http://www.example.com/wap2app.apk" //更新包下载地址  
}  

Tips:若应用已经是最新版本,无需升级,则服务端仅需返回status字段(并将值设为0),其它字段无需返回;

客户端实现

在app.js的onLaunch事件中,发起升级检测请求,如下:

/**  
* 当wap2app初始化完成时,会触发 onLaunch(全局只触发一次)  
* @param {Object} options  
*/  
onLaunch: function(options) {  
    //TODO wap2app其它初始化代码  

    /************升级检测代码开始********** */  
    var ua = navigator.userAgent;  
    //Html5Plus环境,但不是流应用环境  
    if(ua.indexOf('Html5Plus')>-1 && ua.indexOf('StreamApp')==-1){  
        var url = "http://www.example.com/check/update";//检查更新地址  
        var req = {//升级检测数据  
            "appid": plus.runtime.appid,  
            "version": plus.runtime.version  
        };  

        wap2app.ajax.get(url, 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, ["立即更新", "取  消"]);  
            }              
        });  
    }  
    /************升级检测代码结束********** */  
}

服务端实现

推荐使用通过uniCloud的云函数模板,快速实现升级检查逻辑,详情参考:https://ext.dcloud.net.cn/plugin?id=2226

开发者也可以根据根据M站的开发语言,自己实现升级检测逻辑,如下是一个php示例代码:

$appid = $_GET['appid'];  
$version = $_GET['version'];//客户端版本号  
$rsp = array('status' => 0);//默认返回值,不需要升级  
if (isset($appid) && isset($version)) {  
    if($appid=="__W2A__m.example.com"){//校验appid  
        //这里是示例代码,真实业务上,最新版本号及relase notes可以存储在数据库或文件中  
        if($version !== "1.0.1"){  
            $rsp['status'] = 1;  
            $rsp['title'] = "应用更新";  
            $rsp['note'] = "修复bug1;\n修复bug2;";//release notes,支持换行  
            $rsp['url'] = "http://www.example.com/wap2app.apk";//应用升级包下载地址  
        }  
    }  
}   
exit(json_encode($rsp));
继续阅读 »

wap2app项目的发行方式及对应的升级模式:

  • 发行成原生安装包,类似5+ App安装包,需开发者自己处理升级更新;
  • 发行到流应用平台,,流应用有内置的升级逻辑,开发者只需要将最新版本提交到流应用平台即可,无需单独开发.

本文主要讲解发行成原生安装包的升级检测实现,给出一种实现示例(仅供参考,开发者可以自定义逻辑实现),主要分为两个部分:

  • 客户端:App启动时,向服务器上报当前版本号,根据服务器响应结果决定是否提醒用户升级
  • 服务端:保存App最新版本号,根据客户端上报的版本号,比对后决定是否需要升级,若需升级则返回升级信息(rease notes、更新包地址等);

接口约定

如下数据接口约定仅为示例,开发者可以自定义接口参数。

请求地址:http://www.example.com/check/update

请求方法:GET

请求数据:

{  
    "appid": plus.runtime.appid,  
    "version": plus.runtime.version  
}

响应数据:

{  
    "status":1,//升级标志,1:需要升级;0:无需升级  
    "title": "wap2app版本更新",  
    "note": "修复bug1;\n修复bug2;",//release notes  
    "url": "http://www.example.com/wap2app.apk" //更新包下载地址  
}  

Tips:若应用已经是最新版本,无需升级,则服务端仅需返回status字段(并将值设为0),其它字段无需返回;

客户端实现

在app.js的onLaunch事件中,发起升级检测请求,如下:

/**  
* 当wap2app初始化完成时,会触发 onLaunch(全局只触发一次)  
* @param {Object} options  
*/  
onLaunch: function(options) {  
    //TODO wap2app其它初始化代码  

    /************升级检测代码开始********** */  
    var ua = navigator.userAgent;  
    //Html5Plus环境,但不是流应用环境  
    if(ua.indexOf('Html5Plus')>-1 && ua.indexOf('StreamApp')==-1){  
        var url = "http://www.example.com/check/update";//检查更新地址  
        var req = {//升级检测数据  
            "appid": plus.runtime.appid,  
            "version": plus.runtime.version  
        };  

        wap2app.ajax.get(url, 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, ["立即更新", "取  消"]);  
            }              
        });  
    }  
    /************升级检测代码结束********** */  
}

服务端实现

推荐使用通过uniCloud的云函数模板,快速实现升级检查逻辑,详情参考:https://ext.dcloud.net.cn/plugin?id=2226

开发者也可以根据根据M站的开发语言,自己实现升级检测逻辑,如下是一个php示例代码:

$appid = $_GET['appid'];  
$version = $_GET['version'];//客户端版本号  
$rsp = array('status' => 0);//默认返回值,不需要升级  
if (isset($appid) && isset($version)) {  
    if($appid=="__W2A__m.example.com"){//校验appid  
        //这里是示例代码,真实业务上,最新版本号及relase notes可以存储在数据库或文件中  
        if($version !== "1.0.1"){  
            $rsp['status'] = 1;  
            $rsp['title'] = "应用更新";  
            $rsp['note'] = "修复bug1;\n修复bug2;";//release notes,支持换行  
            $rsp['url'] = "http://www.example.com/wap2app.apk";//应用升级包下载地址  
        }  
    }  
}   
exit(json_encode($rsp));
收起阅读 »

mui 初学者开发视频

mui

mui 初学者开发视频 有需要的练习我 QQ 2748181236

mui 初学者开发视频 有需要的练习我 QQ 2748181236

新上一套MUI框架app界面模板

mui

新上一套MUI框架app界面模板,高性能MUI框架模板,分享给大家
http://www.sucaihuo.com/templates/3694.html

mui

继续阅读 »

新上一套MUI框架app界面模板,高性能MUI框架模板,分享给大家
http://www.sucaihuo.com/templates/3694.html

mui

收起阅读 »

British Type Hose Clamp Made in China

1.Our History
Weifang haihon International Co., Ltd has focused on top quality hose clamps for over 8 years in China. We started as a small operation, but now have become one of the leading suppliers in the fastener industry in China.
Today, Weifang haihon has been one of the top suppliers of quality hose clamps, such as: German type hose clamps, American type hose clamps. British type hose clamp and Heavy duty clamps.

2.Our Factory
We produce various of hose clamps and pipe coupling with different material. The annual production capacity reaches 100 million pieces or sets

3.Our Product
Weifang Haihon Products includes the following:
1, German type hose clamp
2, American type hose clamp
3, British type hose clamp
4, Heavy duty clamp
5, Mini Hose clamp
We supply our hose clamps to many countries, such as Germany, USA, Canada, Italy, Spain, Poland, Russia and so on. They are well received these years.

4.Product Application
Hose clamps are widely used for water, oil, steam and dust in automobile, gasoline engine, diesel engine, machine equipment, boat, mine, petroleum, chemical industry and agriculture. It is an ideal connection fastening.

5.Our Certificate
We always feel that all success of our company is directly related to the quality of the products we offer. We have got certificate of ISO9001, ISO/TS16949, SGS.

6.Production Equipment
We have modernized manufacture facilities, quality control systems and assemble lines.

7.Production Market
Our main export market:
Europe 45%
North America 20%
Asia 20%
South America 10%

8.Our service
We control the product quality critically for every step from material purchasing to production process.Our products are made by excellent steel material with advantages as skillful technique, strict test, strong fastening force and excellent endurance.
We trust your benefit is top important, so we will try to improve quality and control cost to meet your requirements.British Type Hose Clamp Made in China
website:http://www.haihonclamp.com/
website2:http://www.h-hoseclamp.com/

继续阅读 »

1.Our History
Weifang haihon International Co., Ltd has focused on top quality hose clamps for over 8 years in China. We started as a small operation, but now have become one of the leading suppliers in the fastener industry in China.
Today, Weifang haihon has been one of the top suppliers of quality hose clamps, such as: German type hose clamps, American type hose clamps. British type hose clamp and Heavy duty clamps.

2.Our Factory
We produce various of hose clamps and pipe coupling with different material. The annual production capacity reaches 100 million pieces or sets

3.Our Product
Weifang Haihon Products includes the following:
1, German type hose clamp
2, American type hose clamp
3, British type hose clamp
4, Heavy duty clamp
5, Mini Hose clamp
We supply our hose clamps to many countries, such as Germany, USA, Canada, Italy, Spain, Poland, Russia and so on. They are well received these years.

4.Product Application
Hose clamps are widely used for water, oil, steam and dust in automobile, gasoline engine, diesel engine, machine equipment, boat, mine, petroleum, chemical industry and agriculture. It is an ideal connection fastening.

5.Our Certificate
We always feel that all success of our company is directly related to the quality of the products we offer. We have got certificate of ISO9001, ISO/TS16949, SGS.

6.Production Equipment
We have modernized manufacture facilities, quality control systems and assemble lines.

7.Production Market
Our main export market:
Europe 45%
North America 20%
Asia 20%
South America 10%

8.Our service
We control the product quality critically for every step from material purchasing to production process.Our products are made by excellent steel material with advantages as skillful technique, strict test, strong fastening force and excellent endurance.
We trust your benefit is top important, so we will try to improve quality and control cost to meet your requirements.British Type Hose Clamp Made in China
website:http://www.haihonclamp.com/
website2:http://www.h-hoseclamp.com/

收起阅读 »

德艺网络科技-长期承接外包业务,欢迎各位中介、个人咨询!

外包 HTML5+ 移动APP PHP

德艺网络科技DES专案组多年活跃于服务产业,专注于企业品牌形象包装 ,网络营销 ,形象包装以及活动策划等各个领域.现拥有1000余家客户。
提供PC、wap、app建站,7年网络营销建站经验。

技能: 全新开发 手机网站 IOS开发 Android开发 微信开发

继续阅读 »

德艺网络科技DES专案组多年活跃于服务产业,专注于企业品牌形象包装 ,网络营销 ,形象包装以及活动策划等各个领域.现拥有1000余家客户。
提供PC、wap、app建站,7年网络营销建站经验。

技能: 全新开发 手机网站 IOS开发 Android开发 微信开发

收起阅读 »

接APP 前端工作

开发过一个完整的电商类项目了 关于供应方面的后台管理系统也开发过
有感兴趣的可以++280916522

开发过一个完整的电商类项目了 关于供应方面的后台管理系统也开发过
有感兴趣的可以++280916522

Barcod二维码扫描及其结果在webview中的信息的传递

mui

图1为二维码效果图,图二是扫码后返回结果并关闭扫码页面。
直接上代码
<!doctype html>
<html>

<head>  
    <meta charset="utf-8">  
    <meta http-equiv="Access-Control-Allow-Origin" content="*">  
    <meta http-equiv="content-security-policy">  
    <meta name="viewport" content="width=device-width, initial-scale=1,maximum-scale=1, user-scalable=no">  
    <meta name="apple-mobile-web-app-capable" content="yes">  
    <meta name="apple-mobile-web-app-status-bar-style" content="black">  
    <link href="../../WEB-INF/plug/mui/css/mui.min.css" rel="stylesheet" />  
    <script src="../../WEB-INF/plug/mui/js/mui.min.js"></script>  
    <script type="text/javascript" src="../../WEB-INF/plug/js/security.js"></script>  
    <script type="text/javascript" src="../../WEB-INF/plug/js/common.js"></script>  
    <style type="text/css">  
        #bcid {  
            width: 100%;  
            height: 100%;  
            position: absolute;  
            background: #000000;  
        }  

        html,  
        body,  
        div {  
            height: 100%;  
            width: 100%;  
        }  

        .fbt {  
            color: #ffffff;  
            width: 50%;  
            float: left;  
            line-height: 44px;  
            text-align: center;  
        }  
    </style>  
</head>  

<body>  
    <header class="mui-bar mui-bar-nav" style="background-color: rgba(221, 221, 221, 0);z-index: 99999;">  

        <h1 class="mui-title" style="color: #ffffff;">二维码扫描</h1>  
        <span class="mui-icon mui-icon-spinner-cycle mui-spin mui-pull-right" id="turnTheLight"></span>  
    </header>  

    <div id="bcid">  
        <!--盛放扫描控件的div-->  
    </div>  

    <div style="background-color: rgba(221, 221, 221, 0);z-index: 99999" class="mui-bar mui-bar-footer" style="padding: 0px;">  
        <div class="fbt" onclick="scanPicture();">从相册选择二维码</div>  
        <div class="fbt mui-action-back">取  消</div>  
    </div>  

    <script type="text/javascript">  
        var height = window.innerHeight + 'px'; //获取页面实际高度    
        var width = window.innerWidth + 'px';  
        document.getElementById("bcid").style.height = height;  
        document.getElementById("bcid").style.width = width;  

        scan = null; //扫描对象    
        mui.plusReady(function() { //通过mui初始化扫描  
            mui.init();  
            setTimeout("startRecognize()", 300)  

        });  

        function startRecognize() { //开启扫描  
            try {  
                var filter;  
                //自定义的扫描控件样式    
                var styles = {  
                    frameColor: "#29E52C",  
                    scanbarColor: "#29E52C",  
                    background: "rgba(255,255,255,-20)"  
                }  
                //扫描控件构造    
                scan = new plus.barcode.Barcode('bcid', filter, styles);  
                scan.onmarked = onmarked;  
                scan.onerror = onerror; //扫描错误  
                scan.start();  
                //打开关闭闪光灯处理    
                var flag = false;  
                document.getElementById("turnTheLight").addEventListener('tap', function() {  
                    if(flag == false) {  
                        scan.setFlash(true);  
                        flag = true;  
                    } else {  
                        scan.setFlash(false);  
                        flag = false;  
                    }  
                });  
            } catch(e) {  
                mui.toast("出现错误啦:\n" + e)  
            }  
        };  

        function onerror(e) { //错误弹框  
            alert(e);  
        };  

        function onmarked(type, result) { //这个是扫描二维码的回调函数,type是扫描二维码回调的类型  
            var text = '';  
            switch(type) { //QR,EAN13,EAN8都是二维码的一种编码格式,result是返回的结果  
                case plus.barcode.QR:  
                    text = 'QR: ';  
                    break;  
                case plus.barcode.EAN13:  
                    text = 'EAN13: ';  
                    break;  
                case plus.barcode.EAN8:  
                    text = 'EAN8: ';  
                    break;  
            }   
            smresult(result);  
        };  

        // 从相册中选择二维码图片     
        function scanPicture() { //可以直接识别二维码图片  
            plus.gallery.pick(function(path) {  
                plus.barcode.scan(path, onmarked, function(error) {  
                    //plus.nativeUI.alert("无法识别此图片");  
                    mui.toast("无法识别此图片");  
                });  
            }, function(err) {  
                plus.nativeUI.alert("Failed: " + err.message);  
            });  
        }  
        //关闭扫码页面  
        function closeSm() {  
            scan.close();  
            plus.webview.currentWebview().close('none');  
        }  
        //结果处理  
        function smresult(result) {  
            var bType = getBarcodeType(result);//二维吗类型  
            var type = localStorage.getItem("type");  
            if(type == "addfile") {  
                //添加档案扫码处理  

                if(bType==TMLX_JDCDA||bType==TMLX_JSZDA) {  
                    var tmnr = result;  
                    tmnr = getUrlp(tmnr);  
                    var params = "{" + "'method':'getTmxx'," + "'tmnr':" + "'" + tmnr + "'" + "}"  
                    var datajson = eval('(' + getData(params) + ')');  
                    var str = '<li><input class="file-num" value="' + datajson.obj.FILE_NUMBER + '" type="text"   /><i onclick="remove(this)">╳</i></li>'  
                    var wn = plus.webview.currentWebview(); //获取当前窗口的WebviewObject对象,即B   
                    var wvA = wn.opener(); //获取当前窗口的创建者,即A    
                    wvA.evalJS("addNew('" + str + "')"); //执行父窗口中的方法  A中的addNew方法    
                    plus.webview.currentWebview().close(); //扫码成功,关闭当前webview  
                } else {  
                    mui.toast("请扫描档案二维码")  
                    scan.start();  
                }  
            } else if(type == "getgezi") {  
                //扫码格子获取格子信息  
                if(bType==TMLX_JDCDA||bType==TMLX_JSZDA) {  
                gezism(result);  
                var wn = plus.webview.currentWebview(); //获取当前窗口的WebviewObject对象,即B   
                var wvA = wn.opener(); //获取当前窗口的创建者,即A    
                wvA.evalJS("addGeZi('" + str + "')"); //执行父窗口中的方法  A中的addNew方法    
                plus.webview.currentWebview().close(); //扫码成功,关闭当前webview  
                localStorage.setItem("ifFrist", "none"); //设置不是首次调用  
                }else{  
                    mui.toast("请扫描格子二维码")  
                    scan.start();  
                }  
            } else if(type == "sys") {  

                if(bType == TMLX_GEZI) {  
                    /**条码类型:格子*/  
                    var btnArray = ['取消', '确认'];  
                    mui.confirm("是否进行入库操作?", "提示", btnArray, function(e) {  
                        if(e.index == 1) {  

                            localStorage.setItem("ifFrist", "none"); //设置不是首次调用避免重复扫码  
                            localStorage.setItem("sysSign", "true");  
                            var str =gezism(result);  
                            localStorage.setItem("str", str);  
                            var webview = mui.openWindow({  
                                url: "../rk/rk.html",  
                                id: "rk.html",  
                                waiting: {  
                                    autoShow: false //自动显示等待框,默认为true  
                                },  
                                createNew: true  
                            });  
                            setTimeout("plus.webview.currentWebview().close()", 300)//扫码成功,关闭当前webview  

                        } else {  
                            scan.start();  
                        }  
                    });  
                } else if(bType == TMLX_JDCDA) {  
                    /**条码类型:机动车档案*/  
                    alert("条码类型:机动车档案");  
                    scan.start();  
                } else if(bType == TMLX_JSZDA) {  
                    /**条码类型:驾驶证档案*/  
                    alert("条码类型:驾驶证档案");  
                    scan.start();  
                } else if(bType == TMLX_DAG) {  
                    /**条码类型:档案柜*/  
                    alert("条码类型:档案柜");  
                    scan.start();  
                }  

            }  

        }  
        //格子扫码操作  
        function gezism(result) {  
            var tmnr = result;  
            tmnr = getUrlp(tmnr);  
            var params = "{" + "'method':'getTmxx'," + "'tmnr':" + "'" + tmnr + "'" + "}"  
            var datajson = eval('(' + getData(params) + ')');  
            //获取格子最大序号  
            var param2 = "{" + "'method':'getDaccxh'," + "'gzcode':" + "'" + datajson.obj.GZCODE + "'" + "}"  
            var dataxh = eval('(' + getData(param2) + ')');  
            var str = '<li><i>编码:' + datajson.obj.GZCODE + '</i><i>已存数:' + dataxh.obj.xh + '</i></li>';  
            str += '<li><i>行:' + datajson.obj.ROS + '</i><i>列:' + datajson.obj.COLS + '</i><i>面:' + datajson.obj.ASPECT + '</i></li>'  
            localStorage.setItem("gzcode", datajson.obj.GZCODE); //gz保存code  
            return str;  
        }  
    </script>  
</body>  

</html>

继续阅读 »

图1为二维码效果图,图二是扫码后返回结果并关闭扫码页面。
直接上代码
<!doctype html>
<html>

<head>  
    <meta charset="utf-8">  
    <meta http-equiv="Access-Control-Allow-Origin" content="*">  
    <meta http-equiv="content-security-policy">  
    <meta name="viewport" content="width=device-width, initial-scale=1,maximum-scale=1, user-scalable=no">  
    <meta name="apple-mobile-web-app-capable" content="yes">  
    <meta name="apple-mobile-web-app-status-bar-style" content="black">  
    <link href="../../WEB-INF/plug/mui/css/mui.min.css" rel="stylesheet" />  
    <script src="../../WEB-INF/plug/mui/js/mui.min.js"></script>  
    <script type="text/javascript" src="../../WEB-INF/plug/js/security.js"></script>  
    <script type="text/javascript" src="../../WEB-INF/plug/js/common.js"></script>  
    <style type="text/css">  
        #bcid {  
            width: 100%;  
            height: 100%;  
            position: absolute;  
            background: #000000;  
        }  

        html,  
        body,  
        div {  
            height: 100%;  
            width: 100%;  
        }  

        .fbt {  
            color: #ffffff;  
            width: 50%;  
            float: left;  
            line-height: 44px;  
            text-align: center;  
        }  
    </style>  
</head>  

<body>  
    <header class="mui-bar mui-bar-nav" style="background-color: rgba(221, 221, 221, 0);z-index: 99999;">  

        <h1 class="mui-title" style="color: #ffffff;">二维码扫描</h1>  
        <span class="mui-icon mui-icon-spinner-cycle mui-spin mui-pull-right" id="turnTheLight"></span>  
    </header>  

    <div id="bcid">  
        <!--盛放扫描控件的div-->  
    </div>  

    <div style="background-color: rgba(221, 221, 221, 0);z-index: 99999" class="mui-bar mui-bar-footer" style="padding: 0px;">  
        <div class="fbt" onclick="scanPicture();">从相册选择二维码</div>  
        <div class="fbt mui-action-back">取  消</div>  
    </div>  

    <script type="text/javascript">  
        var height = window.innerHeight + 'px'; //获取页面实际高度    
        var width = window.innerWidth + 'px';  
        document.getElementById("bcid").style.height = height;  
        document.getElementById("bcid").style.width = width;  

        scan = null; //扫描对象    
        mui.plusReady(function() { //通过mui初始化扫描  
            mui.init();  
            setTimeout("startRecognize()", 300)  

        });  

        function startRecognize() { //开启扫描  
            try {  
                var filter;  
                //自定义的扫描控件样式    
                var styles = {  
                    frameColor: "#29E52C",  
                    scanbarColor: "#29E52C",  
                    background: "rgba(255,255,255,-20)"  
                }  
                //扫描控件构造    
                scan = new plus.barcode.Barcode('bcid', filter, styles);  
                scan.onmarked = onmarked;  
                scan.onerror = onerror; //扫描错误  
                scan.start();  
                //打开关闭闪光灯处理    
                var flag = false;  
                document.getElementById("turnTheLight").addEventListener('tap', function() {  
                    if(flag == false) {  
                        scan.setFlash(true);  
                        flag = true;  
                    } else {  
                        scan.setFlash(false);  
                        flag = false;  
                    }  
                });  
            } catch(e) {  
                mui.toast("出现错误啦:\n" + e)  
            }  
        };  

        function onerror(e) { //错误弹框  
            alert(e);  
        };  

        function onmarked(type, result) { //这个是扫描二维码的回调函数,type是扫描二维码回调的类型  
            var text = '';  
            switch(type) { //QR,EAN13,EAN8都是二维码的一种编码格式,result是返回的结果  
                case plus.barcode.QR:  
                    text = 'QR: ';  
                    break;  
                case plus.barcode.EAN13:  
                    text = 'EAN13: ';  
                    break;  
                case plus.barcode.EAN8:  
                    text = 'EAN8: ';  
                    break;  
            }   
            smresult(result);  
        };  

        // 从相册中选择二维码图片     
        function scanPicture() { //可以直接识别二维码图片  
            plus.gallery.pick(function(path) {  
                plus.barcode.scan(path, onmarked, function(error) {  
                    //plus.nativeUI.alert("无法识别此图片");  
                    mui.toast("无法识别此图片");  
                });  
            }, function(err) {  
                plus.nativeUI.alert("Failed: " + err.message);  
            });  
        }  
        //关闭扫码页面  
        function closeSm() {  
            scan.close();  
            plus.webview.currentWebview().close('none');  
        }  
        //结果处理  
        function smresult(result) {  
            var bType = getBarcodeType(result);//二维吗类型  
            var type = localStorage.getItem("type");  
            if(type == "addfile") {  
                //添加档案扫码处理  

                if(bType==TMLX_JDCDA||bType==TMLX_JSZDA) {  
                    var tmnr = result;  
                    tmnr = getUrlp(tmnr);  
                    var params = "{" + "'method':'getTmxx'," + "'tmnr':" + "'" + tmnr + "'" + "}"  
                    var datajson = eval('(' + getData(params) + ')');  
                    var str = '<li><input class="file-num" value="' + datajson.obj.FILE_NUMBER + '" type="text"   /><i onclick="remove(this)">╳</i></li>'  
                    var wn = plus.webview.currentWebview(); //获取当前窗口的WebviewObject对象,即B   
                    var wvA = wn.opener(); //获取当前窗口的创建者,即A    
                    wvA.evalJS("addNew('" + str + "')"); //执行父窗口中的方法  A中的addNew方法    
                    plus.webview.currentWebview().close(); //扫码成功,关闭当前webview  
                } else {  
                    mui.toast("请扫描档案二维码")  
                    scan.start();  
                }  
            } else if(type == "getgezi") {  
                //扫码格子获取格子信息  
                if(bType==TMLX_JDCDA||bType==TMLX_JSZDA) {  
                gezism(result);  
                var wn = plus.webview.currentWebview(); //获取当前窗口的WebviewObject对象,即B   
                var wvA = wn.opener(); //获取当前窗口的创建者,即A    
                wvA.evalJS("addGeZi('" + str + "')"); //执行父窗口中的方法  A中的addNew方法    
                plus.webview.currentWebview().close(); //扫码成功,关闭当前webview  
                localStorage.setItem("ifFrist", "none"); //设置不是首次调用  
                }else{  
                    mui.toast("请扫描格子二维码")  
                    scan.start();  
                }  
            } else if(type == "sys") {  

                if(bType == TMLX_GEZI) {  
                    /**条码类型:格子*/  
                    var btnArray = ['取消', '确认'];  
                    mui.confirm("是否进行入库操作?", "提示", btnArray, function(e) {  
                        if(e.index == 1) {  

                            localStorage.setItem("ifFrist", "none"); //设置不是首次调用避免重复扫码  
                            localStorage.setItem("sysSign", "true");  
                            var str =gezism(result);  
                            localStorage.setItem("str", str);  
                            var webview = mui.openWindow({  
                                url: "../rk/rk.html",  
                                id: "rk.html",  
                                waiting: {  
                                    autoShow: false //自动显示等待框,默认为true  
                                },  
                                createNew: true  
                            });  
                            setTimeout("plus.webview.currentWebview().close()", 300)//扫码成功,关闭当前webview  

                        } else {  
                            scan.start();  
                        }  
                    });  
                } else if(bType == TMLX_JDCDA) {  
                    /**条码类型:机动车档案*/  
                    alert("条码类型:机动车档案");  
                    scan.start();  
                } else if(bType == TMLX_JSZDA) {  
                    /**条码类型:驾驶证档案*/  
                    alert("条码类型:驾驶证档案");  
                    scan.start();  
                } else if(bType == TMLX_DAG) {  
                    /**条码类型:档案柜*/  
                    alert("条码类型:档案柜");  
                    scan.start();  
                }  

            }  

        }  
        //格子扫码操作  
        function gezism(result) {  
            var tmnr = result;  
            tmnr = getUrlp(tmnr);  
            var params = "{" + "'method':'getTmxx'," + "'tmnr':" + "'" + tmnr + "'" + "}"  
            var datajson = eval('(' + getData(params) + ')');  
            //获取格子最大序号  
            var param2 = "{" + "'method':'getDaccxh'," + "'gzcode':" + "'" + datajson.obj.GZCODE + "'" + "}"  
            var dataxh = eval('(' + getData(param2) + ')');  
            var str = '<li><i>编码:' + datajson.obj.GZCODE + '</i><i>已存数:' + dataxh.obj.xh + '</i></li>';  
            str += '<li><i>行:' + datajson.obj.ROS + '</i><i>列:' + datajson.obj.COLS + '</i><i>面:' + datajson.obj.ASPECT + '</i></li>'  
            localStorage.setItem("gzcode", datajson.obj.GZCODE); //gz保存code  
            return str;  
        }  
    </script>  
</body>  

</html>

收起阅读 »

友盟统计

统计 友盟

1.集成
1) 注册友盟账号获取appkey,因为android和ios不建议使用同一个appkey,所以添加两个应用,一个android一个ios。
2) 设置manifest.json文件。
SDK配置:将两appkey填写到对应的appkey输入框。channel是统计app安装渠道的,可以先暂时随便书一些字符串。
ios一般是appStore,android可以先暂时unknow
模块权限配置:添加统计模块
3)友盟注册自定义事件。设置->事件->添加事件。事件分计数事件和计算事件,具体区别查看友盟
4)app中调用统计的api。
计数事件:plus.statistic.eventTrig()
计算事件:plus.statistic.eventDuration()
5)统计有可能不是实时统计的,所以有可能需要隔天才能看到数据
6)友盟统计分为两种方式,一种是启动时发送,一种是按间隔发送,具体使用哪种按情况而定。我选择的是按间隔发送
7)友盟的集成测试不知道应该如何测试。不知到是否支持,没测试成功

继续阅读 »

1.集成
1) 注册友盟账号获取appkey,因为android和ios不建议使用同一个appkey,所以添加两个应用,一个android一个ios。
2) 设置manifest.json文件。
SDK配置:将两appkey填写到对应的appkey输入框。channel是统计app安装渠道的,可以先暂时随便书一些字符串。
ios一般是appStore,android可以先暂时unknow
模块权限配置:添加统计模块
3)友盟注册自定义事件。设置->事件->添加事件。事件分计数事件和计算事件,具体区别查看友盟
4)app中调用统计的api。
计数事件:plus.statistic.eventTrig()
计算事件:plus.statistic.eventDuration()
5)统计有可能不是实时统计的,所以有可能需要隔天才能看到数据
6)友盟统计分为两种方式,一种是启动时发送,一种是按间隔发送,具体使用哪种按情况而定。我选择的是按间隔发送
7)友盟的集成测试不知道应该如何测试。不知到是否支持,没测试成功

收起阅读 »

MUI中获取Json节点内容

json
 1.将json数据转化为字符串:用json.stringify函数,如:  
  responsex = JSON.stringify(response);  
  responseEl.innerHTML = responsex;  

  2.要获取其他节点:直接如下:  
  someitemEl.innerHTML = response["result"];
继续阅读 »
 1.将json数据转化为字符串:用json.stringify函数,如:  
  responsex = JSON.stringify(response);  
  responseEl.innerHTML = responsex;  

  2.要获取其他节点:直接如下:  
  someitemEl.innerHTML = response["result"];
收起阅读 »