HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

app开发实战 - 《用户注册、登录》视频教程发布!

5+App开发

app开发实战视频教程 - 《用户注册、登录》视频教程已经发布,持续更新(本周内完结)。完结后发布第三方登录教程。
教程完全免费!观看地址
http://www.hcoder.net/course

还有mui、h5+、新闻客户端实战教程 都在这个页面上,欢迎观看!

继续阅读 »

app开发实战视频教程 - 《用户注册、登录》视频教程已经发布,持续更新(本周内完结)。完结后发布第三方登录教程。
教程完全免费!观看地址
http://www.hcoder.net/course

还有mui、h5+、新闻客户端实战教程 都在这个页面上,欢迎观看!

收起阅读 »

流应用引擎SDK

SDK 流应用

流应用引擎SDK是为流应用的发行渠道,如应用市场、浏览器、桌面、语音助手、扫码工具、清理替换、广告sdk、推送sdk等,通过集成DCloud的流应用引擎SDK,可在自己的产品中发行流应用。

每个流应用都有一个唯一的appid,发行渠道集成了流应用引擎SDK后,调起流应用引擎SDK时传入指定的appid,即可启动该流应用。

Android平台流应用引擎SDK

下载流应用引擎SDK集成文档
下载最新版本流应用引擎SDK

2017-11-30发布

更新日志

  1. 适配全面屏手机。
  2. 支持辅助输入。
  3. 修复在Android7上启动应用闪一下桌面的问题(需将io.dcloud.appstream.StreamAppMainActivity的主题样式设置为"@android:style/Theme.NoDisplay")。
  4. 同步更新流应用内核:修复一些已知的BUG等。
    下载流应用引擎SDK

2017-11-20发布

更新日志

  1. 修复部分手机沉浸式离线集成无效的问题。
  2. 修复单页面集成模式下,无法加载远程网页的问题。
  3. 修复已存在地图页面的情况下,创建打开另一个webview页面只显示空白的问题
  4. 同步更新流应用内核:修复一些已知的BUG等
    下载流应用引擎SDK

下载流应用引擎SDK集成文档
下载最新版本流应用引擎SDK

继续阅读 »

流应用引擎SDK是为流应用的发行渠道,如应用市场、浏览器、桌面、语音助手、扫码工具、清理替换、广告sdk、推送sdk等,通过集成DCloud的流应用引擎SDK,可在自己的产品中发行流应用。

每个流应用都有一个唯一的appid,发行渠道集成了流应用引擎SDK后,调起流应用引擎SDK时传入指定的appid,即可启动该流应用。

Android平台流应用引擎SDK

下载流应用引擎SDK集成文档
下载最新版本流应用引擎SDK

2017-11-30发布

更新日志

  1. 适配全面屏手机。
  2. 支持辅助输入。
  3. 修复在Android7上启动应用闪一下桌面的问题(需将io.dcloud.appstream.StreamAppMainActivity的主题样式设置为"@android:style/Theme.NoDisplay")。
  4. 同步更新流应用内核:修复一些已知的BUG等。
    下载流应用引擎SDK

2017-11-20发布

更新日志

  1. 修复部分手机沉浸式离线集成无效的问题。
  2. 修复单页面集成模式下,无法加载远程网页的问题。
  3. 修复已存在地图页面的情况下,创建打开另一个webview页面只显示空白的问题
  4. 同步更新流应用内核:修复一些已知的BUG等
    下载流应用引擎SDK

下载流应用引擎SDK集成文档
下载最新版本流应用引擎SDK

收起阅读 »

通讯录获取指定的多人信息

mui HTML5+ Contacts 通讯录

首先我要在这里吐槽一下官方文档和问答!!

官方文档实在是太简陋了,要自己做复杂一点点都要自己去摸索,比如获取到了phoneNumbe之后根本没有说还要写value;birthday出来的是number而不是官网上写的Date类型!文档太多槽点不说了。

问答搜索的时候几乎没有我要的信息!!!几乎没有!!!好吧,没有就算了吧,我发表一下提问,然而没几个人可以回复我,发过四个问题,一个解决了,两个没人回答,一个回答还是让我自己解决了。好吧,没人回答就算了,那我百度一下,没什么内容,几乎都是官网的东西,那我google一下吧,还是一个样!!细节内容实在太少了!!做一些简单的app可以,要说复杂的真的是摸着石头过河啊!!!!

吐槽完毕,希望官方可以好好发展一下资料问题,要是没有很好的一份文档以及社区搜索,真的好难吸引太多人,而且用到一半都快要弃用了。。。性能问题我目前还没用遇到过,性能目前来说还是不错的。

正文如下:

一、获取多个人的信息:要解决通讯录导入多个人的信息之前,要解决获取多个人的信息。我通过plus.contacts.getAddressBook和address.find的套用把通讯录里面的所有联系人的id和displayName获取出来,然后通过自己写的通讯录获取页面显示出来。

1、解决这个问题首先你要自己写一个js通讯录,这样可以把你所有联系人首字母分离出来,并且旁边可以跳转到你要的首字母。
资料可以参考我自己写的JS:http://www.cnblogs.com/claireyu1219/p/6131314.html
也可以参考官方的:http://dcloud.io/hellomui/examples/indexed-list.html

2、解决获取所有联系人信息

plus.contacts.getAddressBook(plus.contacts.ADDRESSBOOK_PHONE, function(addressbook) { //获取通讯录信息  
                // 可通过addressbook进行通讯录操作  
                addressbook.find(null, function(contacts) {  
                    var username = new Array();  
                    var LinkList = new LinkedList();  
                    if(contacts.length > 0) { //获取当前通讯录里面所有人  
                        for(var i = 0; i < contacts.length; i  ) {  
                            username[i] = contacts[i].displayName   "-"   contacts[i].id; //连接id和username,为后面筛选最准备  
                        }  
                        //这下面的代码是把所有联系人的信息分类,这就涉及到了自己写的JS页面代码  
                        LinkList = sortPY(username); //把联系人数组分类  
                        //LinkList.show();  
                        createLiCheckBox(LinkList); //分类信息显示至页面,我使用checkBox进行多个联系人选择  
                    }  

                }, function(e) {  
                    alert("Find contact error: "   e.message);  
                });  

            }, function(e) {  

    });

二、从通讯录导入多个选定的个人信息:解决这个问题在先前创建通讯录页面的时候就一定要把联系人的id放在在页面上(使用display隐藏),这样我获取被选中的checkBox的时候就可以直接获取id,并且把这些id放到一个数组里面。再通过plus.contacts.getAddressBook和address.find的套用把这些id的联系人信息筛选出来。

1、解决使用checkBox获取联系人id,这里我使用了JQuery。

//筛选已经被选中的checkbox  
    $("input:checked").each(function() {  
            var index = $(this).parent().prev().children('label').text(); //获取id  
            var name = $(this).parent().prev().children('p').text(); //获取姓名  
            username.push(name);  
            usernameIndex.push(index);  
    });

2、解决把这些index放到find里面进行筛选信息,把特定id下面的联系人信息拿出来

plus.contacts.getAddressBook(plus.contacts.ADDRESSBOOK_PHONE, function(addressbook) { //获取通讯录信息  
            for(var j = 0; j < username.length; j  ) {//循环所选取的联系人,记得循环一定要放在这里,一开始我放在        plus.contacts.getAddressBook外面是错误  
                        addressbook.find(null, function(contacts) {  
                            console.log("进入查询");  
                            for(var i = 0; i < contacts.length; i  ) {//无论是否为多个信息,一定要循环数组  
                                console.log("进入循环");  
                                //var id = contacts[i].id;  
                                var displayname = contacts[i].displayName;  
                                var phone = "";  
                                var emails = "";  
                                var dates = "";  
                                var remark = "";  
                                if(contacts[i].phoneNumbers.length > 0) {//这里需要判断是否为空,为空的数组没有index=0;  
                                    phone = contacts[i].phoneNumbers[0].value;  
                                } else {  
                                    phone = contacts[i].phoneNumbers;  
                                }  

                                if(contacts[i].emails.length > 0) {//这里需要判断是否为空,为空的数组没有index=0;  
                                    emails = contacts[i].emails[0].value;  
                                } else {  
                                    emails = contacts[i].emails;  
                                }  

                                var dateNum = new Date(contacts[i].birthday);//这里的birthday是number类型!!!官方手册坑爹?  
                                dates = dateNum.getFullYear()   "."   (dateNum.getMonth()   1)   "."   dateNum.getDate();  
                                remark = contacts[i].note;  

                                var getContact = {//把所有信息放到一个json里面  
                                    contactName: displayname,  
                                    sex: "",  
                                    department: "",  
                                    positions: "",  
                                    tel: "",  
                                    phone: phone,  
                                    eMail: emails,  
                                    birthday: dates,  
                                    hobby: "",  
                                    remark: remark  
                                };  

                                //这下面是我的业务代码了,这里大家可以写自己的信息  
                                //createContactTable(db);  
                                //InsertContact(db, getContact); //多个信息插入有线程安全的问题出现!!!!!!!  
                            }  
                            //console.log(username.length);                           
                        }, function(e) {  
                            console.log("查询错误");  
                        }, {    
                                                         //这里面的筛选非常重要!!!这样才能选出匹配的信息  
                            filter: [{  
                                logic: "or",  
                                field: "id",  
                                value: usernameIndex[j]  
                            }],  
                            multi: false  
                        });  
                    }  
                }, function(e) {  
                    console.log("打开通讯录错误");  
                });

通过以上代码就可以获取到了多个联系人的信息,大家可以尝试一下。

继续阅读 »

首先我要在这里吐槽一下官方文档和问答!!

官方文档实在是太简陋了,要自己做复杂一点点都要自己去摸索,比如获取到了phoneNumbe之后根本没有说还要写value;birthday出来的是number而不是官网上写的Date类型!文档太多槽点不说了。

问答搜索的时候几乎没有我要的信息!!!几乎没有!!!好吧,没有就算了吧,我发表一下提问,然而没几个人可以回复我,发过四个问题,一个解决了,两个没人回答,一个回答还是让我自己解决了。好吧,没人回答就算了,那我百度一下,没什么内容,几乎都是官网的东西,那我google一下吧,还是一个样!!细节内容实在太少了!!做一些简单的app可以,要说复杂的真的是摸着石头过河啊!!!!

吐槽完毕,希望官方可以好好发展一下资料问题,要是没有很好的一份文档以及社区搜索,真的好难吸引太多人,而且用到一半都快要弃用了。。。性能问题我目前还没用遇到过,性能目前来说还是不错的。

正文如下:

一、获取多个人的信息:要解决通讯录导入多个人的信息之前,要解决获取多个人的信息。我通过plus.contacts.getAddressBook和address.find的套用把通讯录里面的所有联系人的id和displayName获取出来,然后通过自己写的通讯录获取页面显示出来。

1、解决这个问题首先你要自己写一个js通讯录,这样可以把你所有联系人首字母分离出来,并且旁边可以跳转到你要的首字母。
资料可以参考我自己写的JS:http://www.cnblogs.com/claireyu1219/p/6131314.html
也可以参考官方的:http://dcloud.io/hellomui/examples/indexed-list.html

2、解决获取所有联系人信息

plus.contacts.getAddressBook(plus.contacts.ADDRESSBOOK_PHONE, function(addressbook) { //获取通讯录信息  
                // 可通过addressbook进行通讯录操作  
                addressbook.find(null, function(contacts) {  
                    var username = new Array();  
                    var LinkList = new LinkedList();  
                    if(contacts.length > 0) { //获取当前通讯录里面所有人  
                        for(var i = 0; i < contacts.length; i  ) {  
                            username[i] = contacts[i].displayName   "-"   contacts[i].id; //连接id和username,为后面筛选最准备  
                        }  
                        //这下面的代码是把所有联系人的信息分类,这就涉及到了自己写的JS页面代码  
                        LinkList = sortPY(username); //把联系人数组分类  
                        //LinkList.show();  
                        createLiCheckBox(LinkList); //分类信息显示至页面,我使用checkBox进行多个联系人选择  
                    }  

                }, function(e) {  
                    alert("Find contact error: "   e.message);  
                });  

            }, function(e) {  

    });

二、从通讯录导入多个选定的个人信息:解决这个问题在先前创建通讯录页面的时候就一定要把联系人的id放在在页面上(使用display隐藏),这样我获取被选中的checkBox的时候就可以直接获取id,并且把这些id放到一个数组里面。再通过plus.contacts.getAddressBook和address.find的套用把这些id的联系人信息筛选出来。

1、解决使用checkBox获取联系人id,这里我使用了JQuery。

//筛选已经被选中的checkbox  
    $("input:checked").each(function() {  
            var index = $(this).parent().prev().children('label').text(); //获取id  
            var name = $(this).parent().prev().children('p').text(); //获取姓名  
            username.push(name);  
            usernameIndex.push(index);  
    });

2、解决把这些index放到find里面进行筛选信息,把特定id下面的联系人信息拿出来

plus.contacts.getAddressBook(plus.contacts.ADDRESSBOOK_PHONE, function(addressbook) { //获取通讯录信息  
            for(var j = 0; j < username.length; j  ) {//循环所选取的联系人,记得循环一定要放在这里,一开始我放在        plus.contacts.getAddressBook外面是错误  
                        addressbook.find(null, function(contacts) {  
                            console.log("进入查询");  
                            for(var i = 0; i < contacts.length; i  ) {//无论是否为多个信息,一定要循环数组  
                                console.log("进入循环");  
                                //var id = contacts[i].id;  
                                var displayname = contacts[i].displayName;  
                                var phone = "";  
                                var emails = "";  
                                var dates = "";  
                                var remark = "";  
                                if(contacts[i].phoneNumbers.length > 0) {//这里需要判断是否为空,为空的数组没有index=0;  
                                    phone = contacts[i].phoneNumbers[0].value;  
                                } else {  
                                    phone = contacts[i].phoneNumbers;  
                                }  

                                if(contacts[i].emails.length > 0) {//这里需要判断是否为空,为空的数组没有index=0;  
                                    emails = contacts[i].emails[0].value;  
                                } else {  
                                    emails = contacts[i].emails;  
                                }  

                                var dateNum = new Date(contacts[i].birthday);//这里的birthday是number类型!!!官方手册坑爹?  
                                dates = dateNum.getFullYear()   "."   (dateNum.getMonth()   1)   "."   dateNum.getDate();  
                                remark = contacts[i].note;  

                                var getContact = {//把所有信息放到一个json里面  
                                    contactName: displayname,  
                                    sex: "",  
                                    department: "",  
                                    positions: "",  
                                    tel: "",  
                                    phone: phone,  
                                    eMail: emails,  
                                    birthday: dates,  
                                    hobby: "",  
                                    remark: remark  
                                };  

                                //这下面是我的业务代码了,这里大家可以写自己的信息  
                                //createContactTable(db);  
                                //InsertContact(db, getContact); //多个信息插入有线程安全的问题出现!!!!!!!  
                            }  
                            //console.log(username.length);                           
                        }, function(e) {  
                            console.log("查询错误");  
                        }, {    
                                                         //这里面的筛选非常重要!!!这样才能选出匹配的信息  
                            filter: [{  
                                logic: "or",  
                                field: "id",  
                                value: usernameIndex[j]  
                            }],  
                            multi: false  
                        });  
                    }  
                }, function(e) {  
                    console.log("打开通讯录错误");  
                });

通过以上代码就可以获取到了多个联系人的信息,大家可以尝试一下。

收起阅读 »

图片组件 : 单选 多选 预览 删除 数量限制;录音组件 :录音展示 删除 数量限制

demo

媒体列表组件
图片:单选 多选 预览 删除 数量限制
录音:录音展示 删除 数量限制

<body>  
        <div id="imgList"></div>  
        <div id="audioList"></div>  
        <script src="js/mui.min.js"></script>  
        <script type="text/javascript" src="js/md5.min.js" ></script>  
        <script src="js/mui.zoom.js"></script>  
        <script src="js/mui.previewimage.js"></script>  
        <script type="text/javascript" src="js/media_components.js" ></script>  

        <script type="text/javascript">  
            mui.init({  
                gestureConfig: {  
                    longtap: true, //默认为false  
                    hold: true, //默认为false,不监听  
                    release: true //默认为false,不监听  
                }  
            });  
            mui.plusReady(function() {  
                mui('#imgList').imageListInit({  
                    size:5  
                });  
                mui('#audioList').audioListInit({  
                    size:5  
                });  
            });  
        </script>  
    </body>

详细案例见附件

继续阅读 »

demo

媒体列表组件
图片:单选 多选 预览 删除 数量限制
录音:录音展示 删除 数量限制

<body>  
        <div id="imgList"></div>  
        <div id="audioList"></div>  
        <script src="js/mui.min.js"></script>  
        <script type="text/javascript" src="js/md5.min.js" ></script>  
        <script src="js/mui.zoom.js"></script>  
        <script src="js/mui.previewimage.js"></script>  
        <script type="text/javascript" src="js/media_components.js" ></script>  

        <script type="text/javascript">  
            mui.init({  
                gestureConfig: {  
                    longtap: true, //默认为false  
                    hold: true, //默认为false,不监听  
                    release: true //默认为false,不监听  
                }  
            });  
            mui.plusReady(function() {  
                mui('#imgList').imageListInit({  
                    size:5  
                });  
                mui('#audioList').audioListInit({  
                    size:5  
                });  
            });  
        </script>  
    </body>

详细案例见附件

收起阅读 »

app开发视频教程汇总 另感谢dcloud送的显示器

移动APP

hui 最新版本 1.1.9已经发布
更新内容:
1、优化基础css
2、改进轮播组件(更灵活的配置)
3、改进tab选项卡
4、增加popoverMsg组件
5、修正animate动画
6、增加picker 组件
非常好用 越来越完善的 ui框架(ui组件30+, dom操作方法 20+),更新及时,反馈迅速,欢迎使用!
http://www.hcoder.net/hui

app开发学习资料汇总:
mui、h5+教程、app新闻客户端实战教程、iconfont使用教程、开放数据源尽在hcoder
http://www.hcoder.net
本周内完成app开发用户登录、注册视频教程录制并发布敬请关注!

hcoder在的dcloud官方举报的比赛中获得一等奖(三星曲面显示器)目前已经收到奖品,并在qq群内发了红包!
感谢dcloud!提供给我们国内最优秀的编辑器,最便捷的app开发方式。

继续阅读 »

hui 最新版本 1.1.9已经发布
更新内容:
1、优化基础css
2、改进轮播组件(更灵活的配置)
3、改进tab选项卡
4、增加popoverMsg组件
5、修正animate动画
6、增加picker 组件
非常好用 越来越完善的 ui框架(ui组件30+, dom操作方法 20+),更新及时,反馈迅速,欢迎使用!
http://www.hcoder.net/hui

app开发学习资料汇总:
mui、h5+教程、app新闻客户端实战教程、iconfont使用教程、开放数据源尽在hcoder
http://www.hcoder.net
本周内完成app开发用户登录、注册视频教程录制并发布敬请关注!

hcoder在的dcloud官方举报的比赛中获得一等奖(三星曲面显示器)目前已经收到奖品,并在qq群内发了红包!
感谢dcloud!提供给我们国内最优秀的编辑器,最便捷的app开发方式。

收起阅读 »

ios蓝牙打印机插件分享

https://github.com/hennychen/HPrinter.git

如果可以用到,请帮忙资助下谢谢!

https://github.com/hennychen/HPrinter.git

如果可以用到,请帮忙资助下谢谢!

推送android和ios的坑(个推)

Push push问题解决方法 推送

最近做的app中使用到了推送,现在把一些踩过的坑跟大家分享下!
我先描述下,我要求的推送效果:app不管在线还是离线,系统通知栏中都显示消息,点击消息按照消息里的要求打开指定页面显示内容。
一、注册个推,填写appid等,这就不说了;确保安卓系统中app的push进程没有被安全软件杀死。

二、推送模板:个推的模板有好几个,为了能给安卓和ios都能推送,只能选择透传消息模板。

三、测试推送消息
你配置的推送必须要打包之后才有效
配置搞定之后最好用推送平台推送一下消息如果都OK(IOS离线在线都可以)如果IOS不行最大的问题是你的IOS的推送证书有问题你需要自己检查了
1.获取设备标示(在demo的push页面有方法)
四、官方给了一种标准和非标准的推送格式。标准的是{title:'标题',content:'内容',payload:'数据'}非标准就是不前面的格式。应用在前台透传消息是不会再显示在通知栏中的。(如果一定要的话就需要在监听透传消息的方法里自己调用创建本地推送的方法plus.push.createMessage(str, jsonData, options))。
1.android:应用在前台会直接收到透传然后自己去处理。
后台不杀死push进程收到透传就去创建本地推送在通知栏显示plus.push.createMessage(str, jsonData, options)
杀死push进程什么也收不到了。当再次打开应用会收到之前的推送。(问了官方说android杀死应用就是收不到郁闷)
android开启了自启模式然而并没有什么卵用。
2.ios:应用在前台会直接收到透传然后自己去处理。
应用关闭和在后台就需要将消息推送个APNS然后APNS在推送给ios手机。(如果后台和关闭状态收不到推送就有可能是 ios的正式配置有问题 你需要一个ios的哥们帮你了)。
3.在创建本地推送并想去你想跳转的页面。那么ios和android就会有少许不同。(巨坑这个需要根据你们自己推送消息定)
这个我需要发送的推送消息格式
{"e":"adsfasdfasf","eid":"afdasdfasf","params":{"xxx":"1231","ccccc":"222222"}}。
4.android的push监听可以写很多都没事而ios你写了它会多次调用push监听方法。多次调用处理方法 这个只能自己一点一点的根据推送的消息格式和数据去处理.

五、测试推送格式和之后处理的一些方法(图1)
1.获取设备标示(在demo的push页面有方法)
2.你每次测试推送不可能都打包测试消息格式这样太浪费时间不现实,有一个比较好的方法将demo的push页面中的发送"透传数据"消息
requireTranMsg();找到打印出url之后在控制台输出地址复制到网页中打开会出现一个透传的模版。之后你就更新里面消息格式就可以了。(如果没问题的在打包测试推送由后端发来的消息)
3.同一手机有用,换手机需要重新来过。

声明一下啊ApiConfig.staticToast("点击本地创建消息启动:");是我写的一个工具类就是打印日志信息 需要的单独加我吧
图2是我自己封装js文件 有网络请求 推送 存储 扫码 定位 支付 上传图片并压缩 微信分享 app下载更新 native获取android的权限

推送只需要在main页面做一次监听其他页面都可以用了  
    pushUtil.pushListener();  
    pushUtil.cancelPushClear();  

//下面是push推送封装的js文件  
var Push = function() {  

    }  
/**  
 *  
 * 推送的监听  
 */  
Push.prototype.pushListener = function () {  
    var _this = this;  
   //点击通知监听  
    plus.push.addEventListener("click", function (msg) {  
        switch (msg.payload) {  
            case "LocalMSG":  
                ApiConfig.staticToast("点击本地创建消息启动:");  
                break;  
            default:  
                ApiConfig.staticToast("点击离线推送消息启动:");  
                break;  
        }  
        if (msg.payload) {  
            _this.handle(msg);  
        }  
    }, false);  
     //透传监听  
    plus.push.addEventListener("receive", function (msg) {  
        if (msg.aps) { // Apple APNS message  
            ApiConfig.staticToast("接收到在线APNS消息:");  
        } else {  
            ApiConfig.staticToast("接收到在线透传消息:");  
        }  
        if (plus.os.name == 'iOS') {  
            if (msg.payload) {  
                _this.notificationMessage(msg);  
            }  
        } else {  
            _this.notificationMessage(msg);  
        }  
    }, false);  
}  

/**  
 * 根据推送消息在通知栏中显现对应的提示  
 * @param {Object} msg  
 */  
Push.prototype.notificationMessage = function(msg) {  
    ApiConfig.staticToast(msg, 1);  
    ApiConfig.staticIsDebug("notificationMessage", msg, 1);  
    var content = '';//你要展示的提示  
    var _this = this;  
    var jsonData = '';  
    switch(plus.os.name) {  
        case "Android":  
            jsonData = eval("(" + msg.payload + ")");  
            break;  
        case "iOS":  
            jsonData = msg.payload;  
            break;  
    }  
    _this.createLocalPushMsg(msg, content);  
}  

/**  
 *  处理透传消息  
* @param {Object} msg   
* @param {Object} content  
 */  
Push.prototype.createLocalPushMsg = function(msg, content) {  
    //创建一个符合你自己要显示推送通知  
        _this.createMessage(str, jsonData, options);  
}  

/**  
 *  创建本地推送消息  
 * @param {Object} content  
 * @param {Object} payload  
 * @param {Object} options  
 */  
Push.prototype.createMessage = function(content, payload, options) {  
    switch(plus.os.name) {  
        case "Android":  
            payload = payload;  
            break;  
        case "iOS":  
            payload = payload.eid;  
            break;  
    }  
    plus.push.createMessage(content, payload, options);  
        content: ( String ) 必选  
        消息显示的内容,在系统通知中心中显示的文本内容。  

        payload: ( String ) 可选  
        消息承载的数据,可根据业务逻辑自定义数据格式。  

        options: ( MessageOptions ) 可选  
        创建消息的额外参数,参考MessageOptions。  
}  

/**  
 * 处理通知方法  
 * @param {Object} msg  
 */  
Push.prototype.handle = function (msg) {  
  var _this = this;  
  //获取到某个页面的参数  
  var aaa = plus.webview.getWebviewById('xxxxx');  
  //打印日志的不需要管 当成console.log  
  ApiConfig.staticIsDebug("msg", msg, 1);  
  var jsonData = '';  
  //判断机型是那种 这需要处理一下 Android过来是字符串类型 在这个转换成json格式的数据 ios是对象  
  switch (plus.os.name) {  
    case "Android":  
      jsonData = eval("(" + msg.payload + ")");  
      break;  
    case "iOS":  
      //aps是apns的属于app应用离线和再后台情况  
      if (msg.aps) {  
        try {  
          jsonData = msg.payload;  
        } catch (e) {  
        }  
      } else {  
        //app再前台的情况  
        jsonData = msg.payload;  
      }  
      break;  
  }  
  var openUrl = '';//打开的webView的地址  
  var openId = '';//创建webView的唯一id标识  
  //根据你的推送类型去判断单独处理或者跳转到某个页面  
  switch (jsonData.e) {  
    case 'xxxx':  
      break;  
    case 'aaaa':  
      break;  
    case 'bbbb':  
      break;  
    case 'ccccc':  
      break;  
    default:  
      break;  
  }  
  //跳转的方法  
  _this.openUrlParams(openUrl, openId, params);  

  //需要回调的业务去刷新 比如你再订单详情支付完成之后去刷新订单列表页面的方法  
  //aaa是刷新的那个页面的参数 Refresh是刷新的函数 params你可能需要的参数  
  mui.fire(aaa, 'Refresh', params);  

  //写在回调的那个页面  
  window.addEventListener('Refresh', function () {  
    //pulldownRefresh();  
    //具体业务逻辑   
  });  
  //处理推送的小红点  
  this.cancelPushclear();  
}  

/**  
 *跳转相应的页面  
 * @param {Object} openUrl  
 * @param {Object} openId  
 * @param {Object} params  
 */  
Push.prototype.openUrlParams = function (openUrl, openId, params) {  
  utilsJs.openWebView(openUrl, openId, params);  
}  

Push.prototype.cancelPushClear = function () {  
  plus.push.clear();  
}  

/**  
 * utilsJs.openWebView(openUrl, openId, params);  
 * 封装mui.openWindow方法  
 * @param {Object} openUrl String  
 * @param {Object} openId  String  
 * @param {Object} params  对象  
 */  
Utils.prototype.openWebView = function (openUrl, openId, params) {  
  //关闭右滑关闭  
  //            styles: {  
  //                popGesture: 'none'  
  //            },  
  if (openUrl && openId) {  
    mui.openWindow({  
      url: openUrl,  
      id: openId,  
      popGesture: 'close',  
      extras: params,  
      createNew: false, //是否重复创建同样id的webview,默认为false:不重复创建,直接显示  
      show: {  
        autoShow: true, //页面loaded事件发生后自动显示,默认为true  
        aniShow: "slide-in-right" //页面显示动画,默认为”slide-in-right“;  
      },  
      waiting: {  
        autoShow: true, //自动显示等待框,默认为true  
        title: '正在加载...' //等待对话框上显示的提示内容  
      }  
    });  
  } else {  
    ApiConfig.staticShowToast('请求参数有问题!');  
  }  
}

此代码仅适用html5+不适用混编,几个月前写的可能有一些遗漏地方,如果有误请指正。qq:934834037
附上源码链接

继续阅读 »

最近做的app中使用到了推送,现在把一些踩过的坑跟大家分享下!
我先描述下,我要求的推送效果:app不管在线还是离线,系统通知栏中都显示消息,点击消息按照消息里的要求打开指定页面显示内容。
一、注册个推,填写appid等,这就不说了;确保安卓系统中app的push进程没有被安全软件杀死。

二、推送模板:个推的模板有好几个,为了能给安卓和ios都能推送,只能选择透传消息模板。

三、测试推送消息
你配置的推送必须要打包之后才有效
配置搞定之后最好用推送平台推送一下消息如果都OK(IOS离线在线都可以)如果IOS不行最大的问题是你的IOS的推送证书有问题你需要自己检查了
1.获取设备标示(在demo的push页面有方法)
四、官方给了一种标准和非标准的推送格式。标准的是{title:'标题',content:'内容',payload:'数据'}非标准就是不前面的格式。应用在前台透传消息是不会再显示在通知栏中的。(如果一定要的话就需要在监听透传消息的方法里自己调用创建本地推送的方法plus.push.createMessage(str, jsonData, options))。
1.android:应用在前台会直接收到透传然后自己去处理。
后台不杀死push进程收到透传就去创建本地推送在通知栏显示plus.push.createMessage(str, jsonData, options)
杀死push进程什么也收不到了。当再次打开应用会收到之前的推送。(问了官方说android杀死应用就是收不到郁闷)
android开启了自启模式然而并没有什么卵用。
2.ios:应用在前台会直接收到透传然后自己去处理。
应用关闭和在后台就需要将消息推送个APNS然后APNS在推送给ios手机。(如果后台和关闭状态收不到推送就有可能是 ios的正式配置有问题 你需要一个ios的哥们帮你了)。
3.在创建本地推送并想去你想跳转的页面。那么ios和android就会有少许不同。(巨坑这个需要根据你们自己推送消息定)
这个我需要发送的推送消息格式
{"e":"adsfasdfasf","eid":"afdasdfasf","params":{"xxx":"1231","ccccc":"222222"}}。
4.android的push监听可以写很多都没事而ios你写了它会多次调用push监听方法。多次调用处理方法 这个只能自己一点一点的根据推送的消息格式和数据去处理.

五、测试推送格式和之后处理的一些方法(图1)
1.获取设备标示(在demo的push页面有方法)
2.你每次测试推送不可能都打包测试消息格式这样太浪费时间不现实,有一个比较好的方法将demo的push页面中的发送"透传数据"消息
requireTranMsg();找到打印出url之后在控制台输出地址复制到网页中打开会出现一个透传的模版。之后你就更新里面消息格式就可以了。(如果没问题的在打包测试推送由后端发来的消息)
3.同一手机有用,换手机需要重新来过。

声明一下啊ApiConfig.staticToast("点击本地创建消息启动:");是我写的一个工具类就是打印日志信息 需要的单独加我吧
图2是我自己封装js文件 有网络请求 推送 存储 扫码 定位 支付 上传图片并压缩 微信分享 app下载更新 native获取android的权限

推送只需要在main页面做一次监听其他页面都可以用了  
    pushUtil.pushListener();  
    pushUtil.cancelPushClear();  

//下面是push推送封装的js文件  
var Push = function() {  

    }  
/**  
 *  
 * 推送的监听  
 */  
Push.prototype.pushListener = function () {  
    var _this = this;  
   //点击通知监听  
    plus.push.addEventListener("click", function (msg) {  
        switch (msg.payload) {  
            case "LocalMSG":  
                ApiConfig.staticToast("点击本地创建消息启动:");  
                break;  
            default:  
                ApiConfig.staticToast("点击离线推送消息启动:");  
                break;  
        }  
        if (msg.payload) {  
            _this.handle(msg);  
        }  
    }, false);  
     //透传监听  
    plus.push.addEventListener("receive", function (msg) {  
        if (msg.aps) { // Apple APNS message  
            ApiConfig.staticToast("接收到在线APNS消息:");  
        } else {  
            ApiConfig.staticToast("接收到在线透传消息:");  
        }  
        if (plus.os.name == 'iOS') {  
            if (msg.payload) {  
                _this.notificationMessage(msg);  
            }  
        } else {  
            _this.notificationMessage(msg);  
        }  
    }, false);  
}  

/**  
 * 根据推送消息在通知栏中显现对应的提示  
 * @param {Object} msg  
 */  
Push.prototype.notificationMessage = function(msg) {  
    ApiConfig.staticToast(msg, 1);  
    ApiConfig.staticIsDebug("notificationMessage", msg, 1);  
    var content = '';//你要展示的提示  
    var _this = this;  
    var jsonData = '';  
    switch(plus.os.name) {  
        case "Android":  
            jsonData = eval("(" + msg.payload + ")");  
            break;  
        case "iOS":  
            jsonData = msg.payload;  
            break;  
    }  
    _this.createLocalPushMsg(msg, content);  
}  

/**  
 *  处理透传消息  
* @param {Object} msg   
* @param {Object} content  
 */  
Push.prototype.createLocalPushMsg = function(msg, content) {  
    //创建一个符合你自己要显示推送通知  
        _this.createMessage(str, jsonData, options);  
}  

/**  
 *  创建本地推送消息  
 * @param {Object} content  
 * @param {Object} payload  
 * @param {Object} options  
 */  
Push.prototype.createMessage = function(content, payload, options) {  
    switch(plus.os.name) {  
        case "Android":  
            payload = payload;  
            break;  
        case "iOS":  
            payload = payload.eid;  
            break;  
    }  
    plus.push.createMessage(content, payload, options);  
        content: ( String ) 必选  
        消息显示的内容,在系统通知中心中显示的文本内容。  

        payload: ( String ) 可选  
        消息承载的数据,可根据业务逻辑自定义数据格式。  

        options: ( MessageOptions ) 可选  
        创建消息的额外参数,参考MessageOptions。  
}  

/**  
 * 处理通知方法  
 * @param {Object} msg  
 */  
Push.prototype.handle = function (msg) {  
  var _this = this;  
  //获取到某个页面的参数  
  var aaa = plus.webview.getWebviewById('xxxxx');  
  //打印日志的不需要管 当成console.log  
  ApiConfig.staticIsDebug("msg", msg, 1);  
  var jsonData = '';  
  //判断机型是那种 这需要处理一下 Android过来是字符串类型 在这个转换成json格式的数据 ios是对象  
  switch (plus.os.name) {  
    case "Android":  
      jsonData = eval("(" + msg.payload + ")");  
      break;  
    case "iOS":  
      //aps是apns的属于app应用离线和再后台情况  
      if (msg.aps) {  
        try {  
          jsonData = msg.payload;  
        } catch (e) {  
        }  
      } else {  
        //app再前台的情况  
        jsonData = msg.payload;  
      }  
      break;  
  }  
  var openUrl = '';//打开的webView的地址  
  var openId = '';//创建webView的唯一id标识  
  //根据你的推送类型去判断单独处理或者跳转到某个页面  
  switch (jsonData.e) {  
    case 'xxxx':  
      break;  
    case 'aaaa':  
      break;  
    case 'bbbb':  
      break;  
    case 'ccccc':  
      break;  
    default:  
      break;  
  }  
  //跳转的方法  
  _this.openUrlParams(openUrl, openId, params);  

  //需要回调的业务去刷新 比如你再订单详情支付完成之后去刷新订单列表页面的方法  
  //aaa是刷新的那个页面的参数 Refresh是刷新的函数 params你可能需要的参数  
  mui.fire(aaa, 'Refresh', params);  

  //写在回调的那个页面  
  window.addEventListener('Refresh', function () {  
    //pulldownRefresh();  
    //具体业务逻辑   
  });  
  //处理推送的小红点  
  this.cancelPushclear();  
}  

/**  
 *跳转相应的页面  
 * @param {Object} openUrl  
 * @param {Object} openId  
 * @param {Object} params  
 */  
Push.prototype.openUrlParams = function (openUrl, openId, params) {  
  utilsJs.openWebView(openUrl, openId, params);  
}  

Push.prototype.cancelPushClear = function () {  
  plus.push.clear();  
}  

/**  
 * utilsJs.openWebView(openUrl, openId, params);  
 * 封装mui.openWindow方法  
 * @param {Object} openUrl String  
 * @param {Object} openId  String  
 * @param {Object} params  对象  
 */  
Utils.prototype.openWebView = function (openUrl, openId, params) {  
  //关闭右滑关闭  
  //            styles: {  
  //                popGesture: 'none'  
  //            },  
  if (openUrl && openId) {  
    mui.openWindow({  
      url: openUrl,  
      id: openId,  
      popGesture: 'close',  
      extras: params,  
      createNew: false, //是否重复创建同样id的webview,默认为false:不重复创建,直接显示  
      show: {  
        autoShow: true, //页面loaded事件发生后自动显示,默认为true  
        aniShow: "slide-in-right" //页面显示动画,默认为”slide-in-right“;  
      },  
      waiting: {  
        autoShow: true, //自动显示等待框,默认为true  
        title: '正在加载...' //等待对话框上显示的提示内容  
      }  
    });  
  } else {  
    ApiConfig.staticShowToast('请求参数有问题!');  
  }  
}

此代码仅适用html5+不适用混编,几个月前写的可能有一些遗漏地方,如果有误请指正。qq:934834037
附上源码链接

收起阅读 »

在mac上远程链接windows

今天在用mac远程链接windows电脑的时候,以为很简单,结果一不小心却掉进了坑里。
window自带的mstsc没办法用,于是转战https://www.microsoft.com/zh-CN/download/confirmation.aspx?id=18140
下载了 Microsoft 适用于 Mac 的远程桌面连接客户端 2.1.1

一切都很顺利,结果在链接的时候却出现了


,无奈访遍各大论坛发现我的mac是sierra,依旧无法解决问题,突然,转机出现了,在mac store 下载 parallels client

这个软件,免费的,填好ip,填上用户名和密码,完美的解决了我的问题!!!那个激动啊!

继续阅读 »

今天在用mac远程链接windows电脑的时候,以为很简单,结果一不小心却掉进了坑里。
window自带的mstsc没办法用,于是转战https://www.microsoft.com/zh-CN/download/confirmation.aspx?id=18140
下载了 Microsoft 适用于 Mac 的远程桌面连接客户端 2.1.1

一切都很顺利,结果在链接的时候却出现了


,无奈访遍各大论坛发现我的mac是sierra,依旧无法解决问题,突然,转机出现了,在mac store 下载 parallels client

这个软件,免费的,填好ip,填上用户名和密码,完美的解决了我的问题!!!那个激动啊!

收起阅读 »

获取首页id和webview

如何获取webview的id?
情况是这样的,启动加载的第一个页面index.html,没有设置id,url等,如何在其它页面获取index.html页面的webview?
或者告知如何为一个页面设置id,应用启动时设置的哪个页面的id?
方法如下:
获取首页id plus.runtime.appid;
首页webview plus.webview.getLaunchWebview();

继续阅读 »

如何获取webview的id?
情况是这样的,启动加载的第一个页面index.html,没有设置id,url等,如何在其它页面获取index.html页面的webview?
或者告知如何为一个页面设置id,应用启动时设置的哪个页面的id?
方法如下:
获取首页id plus.runtime.appid;
首页webview plus.webview.getLaunchWebview();

收起阅读 »

5+SDK问题

5+sdk

java.lang.ClassNotFoundException: io.dcloud.feature.statistics.StatisticsBootImpl

mEntryProxy.onCreate(this, savedInstanceState, SDK.IntegratedMode.WEBAPP, null);
这句话报错

继续阅读 »

java.lang.ClassNotFoundException: io.dcloud.feature.statistics.StatisticsBootImpl

mEntryProxy.onCreate(this, savedInstanceState, SDK.IntegratedMode.WEBAPP, null);
这句话报错

收起阅读 »

开发者与谷歌享受一整天的幸福:GOOGLE Developer Day 2016“开发说”

11.jpg
2016年12月8日,开发者齐聚国家会议中心,期待这场盼望已久的Google大会。记者带了许多问题来问谷歌,在新闻中心,记者们都就对华投资、谷歌广告收入等问题各种提问,小编做为一枚专业开发者CVP一琢磨,就想要发现些干货。

12.jpg

Google 全球开发者产品总监 Ben Galbraith

在和Ben Galbraith 2次交流中,他特别乐于提到自己的家人,发布会上亮相了他的全家福并问候了中国的开发者。这也许正是优秀开发者的特质:特别顾家,哈哈。

file0003.jpg

Ben Galbraith全家福

一、明星产品:Angular

带领我们参观展台的童鞋是明星,属于创新力很强的那一类人。他让小编体验关于谷歌新推出的技术Angular,这不仅是一套框架、适用于多种平台,而且更强大。Google Angular项目负责人Naomi Black介招其功能特性(见下图)。

004.jpg

005.jpg

从开发者那得到关于底层的答案,它是由一套javascript的框架搭建的,有兴趣的大牛可以找到相关资料研究一下。(网址:www.angular.cn )。至于功能,和咱们熟悉的h5差不多,数数手指头的简洁:和Linux界面一致的编译功能、两条命令完成打包、用浏览器访问安卓开发的手机APP界面。的确不错,眼前一亮!

二、谷歌针对苹果、安卓开发者推出Firebase:谷歌发布全新Firebase。

Firebase于2014年被谷歌收购,以其为用户提供云端支持而著称。这项服务现在已初步落地,针对中国开发者,谷歌表示,就其计算架构、云平台搭建做出了相应的改变。而服务扩展性也得到极大的加强,并与其它工具实现了集成。

Firebase提供了实时数据库、授权、存储、远程配置、托管、云信息、崩溃报告、测试实验室服务,极大的方便了开发者。无论是向前和向后,在推广和盈利方面谷歌宣布直接有面向中国企业的部门做客户支持,开展其在中国的业务。

006.jpg

三、机器学习:

最后,谷歌还重点介绍了,机器学习(ML)方面的进展。Ben Galbraith介绍说,TensorFlow是新一代的产品名字。它紧密结合了GOOGLE Assistant平台为开发者服务,同时希望开发者使用其产品。本产品将于本月底发布。好期待哦!

007.jpg

李世石人机围棋赛采用的机器学习技术

四、谷歌开发技术应用创新英雄榜:

008.jpg

009.jpg010.jpg

011.jpg013.jpg

五、谷歌答开发者问:

1.问:这个问题我想问Scott,如今Google的市场定位是什么的?如果是帮助开发者的话,是否意味着跟开发者业务相关的主要收入成为Google中国的主要收入?

第二个问题想问下Ben,在过去几年,我们知道有原生应用与网页应用的争论,今天Google强调PWA,是不是觉得网页会重新的回到市场的主流?谢谢。

Scott Beaumont:好,我先回答你问题的第一部分,我觉得Ben比较有资格回答第二部分。当然,我们在中国,服务中国的开发者和中国的企业。如果你看我们在中国的业务,有的小到一个人有个想法,想把这个想法变成App放在Android平台。从大的方面看,有非常大的企业,他们基于Android平台来制造手机。在我的主题演讲中,我也讲到了, 我们希望在这里让这些人的想法变成现实,在Android平台上助他们在中国取得成功。同时,我们在全球也有非常多的资产,可以帮助他们走向全球。

所以,总的来说我们想做两点事情。第一点,是帮助个人实现他们想法。第二点,我们希望帮助这些企业走向全球。

Ben Galbraith:好,我来回答你这个问题的第二部分。我觉得我们在中国非常高兴,也非常激动的看到Android系统上的一些发展,在网络生态系统上的一些发展。我们看看如何才能帮助这些即做Android也做网页系统开发的开发者,实现这些功能。比如说我们Firebase,这个也是服务于iOS的开发者的。再看我们网页上的功能,现在网页浏览器的功能比以前要多得多,所以开发者可以在移动网页的开发上做更多,或是过去做不到的事情。这是我们通过Chrome浏览器,以及与参与标准制订的那些团体一起协作来制造的这么一个趋势。

在2017年,网页开发者的能力将远远超过过去。这也是非常令大家激动的 。今天就跟阿里巴巴的人见过面,他们也共享了他们的网页开发的体验。大家都非常喜欢这一些,用户现在在网页上,不仅仅是在浏览,他们还可以从浏览直接切换到交易,这都是新的网页上出现的功能,大家都非常喜欢这些新的发展。

刚才你还问到Google Play的收入分成。我们对所有放在Google Play上的App都有个通用的标准,一个分成的模式。这是通用于所有人的。

2.问:这次的GDD应该是5年来比较大的一次,吸引了很多开发者来。这应该是Google给中国广大开发者的一个信号,就是重要性的提升。第一个问题问Scott,您在2017年Google重点是什么?还有一个问题问Ben,您说要帮助中国开发者走向世界,您有哪些具体的措施帮助他们?

Scott Beaumont:2017年,我们和中国的互动还是会快速的发展。会通过很多方式,比如说,我们可以帮助中国开发者走向全球,帮助中国网络经济的发展,希望把中国的文化带到全球。把中国的一些文化机构,包括博物馆放到网站上去。还有,希望帮助中国开发者参与到他们值得信赖的生态系统中,帮助开发者更好的进行创造。所以,2017年,我们希望在中国的增长不断的持续,希望跟中国的市场进行互动,做更多的事情。

Ben Galbraith:回答你的第二个问题,我们怎样帮助开发者走向成功。首先,先回顾一下我们今天讲的东西。第一,我们推出了专门的中国开发者网页。第二,自2017年开始,Google Developers Agency Program也将向中国软件开发代理商开放。这个项目的重点,就是帮助中国企业和中国那些好的开发者取得联系。第三,我们有开放的公众号,帮助与开发者进行联系。第四,我们带来更多的技术,帮助中国开发者使用它。第五,Google Play帮助开发者将自己的应用带到全球。第六,还有一个在大会没有提到的,我们帮助合作方进行联络,帮助他们开发App。总的来说,我们再看有哪些不同的活动可以带到中国来,帮助中国的开发者社区。这里,我们还没有做更多新的宣布。

3.问:想问一下Google在未来5年发展的关健词,例如今天提到的人工智能,VR这些。另外,Google推出了PWA。而在中国也有微信小程序盛行。想问一下,这种即点即用,是不是意味着App开发走向衰落?谢谢。

Ben Galbraith:首先你刚才说到中国的趋势,中国的趋势其实也是全球趋势的一部分。中国的App生态系统保持它的重要性,而且该生态系统出现更多的创新。回到今天早上讲到,关于这个网页,网页我们有很多的产品,包括Progressive Web App,以及AMP(加速的移动页面)。有很多新的生态系统在出现,包括基于对话的平台,这个未来会得到进一步的发展。另外我们在Google Assistant上做了大量的投资。此外,还有虚拟现实,也是我们非常关注的话题,我们对它非常有兴趣,我们觉得Daydream未来可以提供高质量、沉浸式的虚拟现实体验给广大的用户。

另外还有机器学习,这是在这一切底下的一个很根基的技术。机器学习中的Te nsorFlor技术可以让开发者很轻松的应用它。而且,我觉得在中国,软件会变得越来越智能,像Google Assistant这样的产品就可以帮助开发者使用机器学习。

中国的趋势非常多的,很抱歉我没有把它们浓缩到1-2个趋势,包括你提到的Instant App,也在得到不断的发展。这个Instant App,现在还是在发展之中,我们未来会对它有更多的想法。

Scott Beaumont:补充一点,其实我们在中国特别关注的就是本地的创新。比如说,我们也不知道微信以后会产生什么样的创新,但是我们知道中国的规模、中国的计算机这个量的大小,计算能力等等是非常宏大。在中国,他们让创新更符合中国。而这种中国特色的创新,回过来又会影响全球的创新。机器学习、机器智慧是全球的现象,中国开发者会怎么利用机器学习、机器智慧这个技术,在什么样的领域会产生巨大的效用,这种效用最后怎样影响全球的开发者社区。

我想,用一个词来描述的话,中国在未来5年的关键词就是创新。创新也是Google的热忱,也是让开发者沸腾的一种精神。我们在中国想做的事情,第一个,就是让开发者的想法变成现实,第二个,就是把这个想法带到全球,发挥到全球。

另外,我们在中国也在积极了解本地开发者的想法,帮助他们把这个想法进行创新,变成有中国特色的开发。

4问:Google搜索何时返华?还有对于因为在中国没有Google Play以及GMS所导致的Android体验的糟糕现象,Google是怎么看待的,有什么建议?

Scott :这个问题,目前我们没有更多信息可以分享。 我们CEO的确在正式场合希望更好的服务中国Android的用户,不过,迄今为止我们没有更新的信息跟大家分享。

问:现在很多的中国开发者有VR游戏的团队,希望通过Daydream改变他们的生存状态。我想问三个问题,我们对开发者登录Daydream平台的标准是什么呢?第二个问题是我们会不会给VR团队什么扶持政策?另外他们分成是怎么样呢?

Ben Galbraith:关于第一个问题,如果开发者有Unity的话,他们把Unity上的应用放在Daydream中。此外,我们有很多其他的工具合作伙伴,工具的供应方,如果你是3D内容,你可以把3D转化后放到Daydream上。如果是虚拟现实的也可以放到Daydream上。

第二个,我们很高兴开发者能够把内容放到Daydream上,我们也会与开发者进行更多的互动,来帮助到他们,但是我们并没有补贴政策。我们的工具是免费的,99.9%生态系统中的内容都会放到我们的平台上。

第三,关于收入分成,这个是使用标准的模式,并没有单独针对Daydream的政策。

来源:http://www.cocoachina.com/industry/20161208/18322.html

继续阅读 »

11.jpg
2016年12月8日,开发者齐聚国家会议中心,期待这场盼望已久的Google大会。记者带了许多问题来问谷歌,在新闻中心,记者们都就对华投资、谷歌广告收入等问题各种提问,小编做为一枚专业开发者CVP一琢磨,就想要发现些干货。

12.jpg

Google 全球开发者产品总监 Ben Galbraith

在和Ben Galbraith 2次交流中,他特别乐于提到自己的家人,发布会上亮相了他的全家福并问候了中国的开发者。这也许正是优秀开发者的特质:特别顾家,哈哈。

file0003.jpg

Ben Galbraith全家福

一、明星产品:Angular

带领我们参观展台的童鞋是明星,属于创新力很强的那一类人。他让小编体验关于谷歌新推出的技术Angular,这不仅是一套框架、适用于多种平台,而且更强大。Google Angular项目负责人Naomi Black介招其功能特性(见下图)。

004.jpg

005.jpg

从开发者那得到关于底层的答案,它是由一套javascript的框架搭建的,有兴趣的大牛可以找到相关资料研究一下。(网址:www.angular.cn )。至于功能,和咱们熟悉的h5差不多,数数手指头的简洁:和Linux界面一致的编译功能、两条命令完成打包、用浏览器访问安卓开发的手机APP界面。的确不错,眼前一亮!

二、谷歌针对苹果、安卓开发者推出Firebase:谷歌发布全新Firebase。

Firebase于2014年被谷歌收购,以其为用户提供云端支持而著称。这项服务现在已初步落地,针对中国开发者,谷歌表示,就其计算架构、云平台搭建做出了相应的改变。而服务扩展性也得到极大的加强,并与其它工具实现了集成。

Firebase提供了实时数据库、授权、存储、远程配置、托管、云信息、崩溃报告、测试实验室服务,极大的方便了开发者。无论是向前和向后,在推广和盈利方面谷歌宣布直接有面向中国企业的部门做客户支持,开展其在中国的业务。

006.jpg

三、机器学习:

最后,谷歌还重点介绍了,机器学习(ML)方面的进展。Ben Galbraith介绍说,TensorFlow是新一代的产品名字。它紧密结合了GOOGLE Assistant平台为开发者服务,同时希望开发者使用其产品。本产品将于本月底发布。好期待哦!

007.jpg

李世石人机围棋赛采用的机器学习技术

四、谷歌开发技术应用创新英雄榜:

008.jpg

009.jpg010.jpg

011.jpg013.jpg

五、谷歌答开发者问:

1.问:这个问题我想问Scott,如今Google的市场定位是什么的?如果是帮助开发者的话,是否意味着跟开发者业务相关的主要收入成为Google中国的主要收入?

第二个问题想问下Ben,在过去几年,我们知道有原生应用与网页应用的争论,今天Google强调PWA,是不是觉得网页会重新的回到市场的主流?谢谢。

Scott Beaumont:好,我先回答你问题的第一部分,我觉得Ben比较有资格回答第二部分。当然,我们在中国,服务中国的开发者和中国的企业。如果你看我们在中国的业务,有的小到一个人有个想法,想把这个想法变成App放在Android平台。从大的方面看,有非常大的企业,他们基于Android平台来制造手机。在我的主题演讲中,我也讲到了, 我们希望在这里让这些人的想法变成现实,在Android平台上助他们在中国取得成功。同时,我们在全球也有非常多的资产,可以帮助他们走向全球。

所以,总的来说我们想做两点事情。第一点,是帮助个人实现他们想法。第二点,我们希望帮助这些企业走向全球。

Ben Galbraith:好,我来回答你这个问题的第二部分。我觉得我们在中国非常高兴,也非常激动的看到Android系统上的一些发展,在网络生态系统上的一些发展。我们看看如何才能帮助这些即做Android也做网页系统开发的开发者,实现这些功能。比如说我们Firebase,这个也是服务于iOS的开发者的。再看我们网页上的功能,现在网页浏览器的功能比以前要多得多,所以开发者可以在移动网页的开发上做更多,或是过去做不到的事情。这是我们通过Chrome浏览器,以及与参与标准制订的那些团体一起协作来制造的这么一个趋势。

在2017年,网页开发者的能力将远远超过过去。这也是非常令大家激动的 。今天就跟阿里巴巴的人见过面,他们也共享了他们的网页开发的体验。大家都非常喜欢这一些,用户现在在网页上,不仅仅是在浏览,他们还可以从浏览直接切换到交易,这都是新的网页上出现的功能,大家都非常喜欢这些新的发展。

刚才你还问到Google Play的收入分成。我们对所有放在Google Play上的App都有个通用的标准,一个分成的模式。这是通用于所有人的。

2.问:这次的GDD应该是5年来比较大的一次,吸引了很多开发者来。这应该是Google给中国广大开发者的一个信号,就是重要性的提升。第一个问题问Scott,您在2017年Google重点是什么?还有一个问题问Ben,您说要帮助中国开发者走向世界,您有哪些具体的措施帮助他们?

Scott Beaumont:2017年,我们和中国的互动还是会快速的发展。会通过很多方式,比如说,我们可以帮助中国开发者走向全球,帮助中国网络经济的发展,希望把中国的文化带到全球。把中国的一些文化机构,包括博物馆放到网站上去。还有,希望帮助中国开发者参与到他们值得信赖的生态系统中,帮助开发者更好的进行创造。所以,2017年,我们希望在中国的增长不断的持续,希望跟中国的市场进行互动,做更多的事情。

Ben Galbraith:回答你的第二个问题,我们怎样帮助开发者走向成功。首先,先回顾一下我们今天讲的东西。第一,我们推出了专门的中国开发者网页。第二,自2017年开始,Google Developers Agency Program也将向中国软件开发代理商开放。这个项目的重点,就是帮助中国企业和中国那些好的开发者取得联系。第三,我们有开放的公众号,帮助与开发者进行联系。第四,我们带来更多的技术,帮助中国开发者使用它。第五,Google Play帮助开发者将自己的应用带到全球。第六,还有一个在大会没有提到的,我们帮助合作方进行联络,帮助他们开发App。总的来说,我们再看有哪些不同的活动可以带到中国来,帮助中国的开发者社区。这里,我们还没有做更多新的宣布。

3.问:想问一下Google在未来5年发展的关健词,例如今天提到的人工智能,VR这些。另外,Google推出了PWA。而在中国也有微信小程序盛行。想问一下,这种即点即用,是不是意味着App开发走向衰落?谢谢。

Ben Galbraith:首先你刚才说到中国的趋势,中国的趋势其实也是全球趋势的一部分。中国的App生态系统保持它的重要性,而且该生态系统出现更多的创新。回到今天早上讲到,关于这个网页,网页我们有很多的产品,包括Progressive Web App,以及AMP(加速的移动页面)。有很多新的生态系统在出现,包括基于对话的平台,这个未来会得到进一步的发展。另外我们在Google Assistant上做了大量的投资。此外,还有虚拟现实,也是我们非常关注的话题,我们对它非常有兴趣,我们觉得Daydream未来可以提供高质量、沉浸式的虚拟现实体验给广大的用户。

另外还有机器学习,这是在这一切底下的一个很根基的技术。机器学习中的Te nsorFlor技术可以让开发者很轻松的应用它。而且,我觉得在中国,软件会变得越来越智能,像Google Assistant这样的产品就可以帮助开发者使用机器学习。

中国的趋势非常多的,很抱歉我没有把它们浓缩到1-2个趋势,包括你提到的Instant App,也在得到不断的发展。这个Instant App,现在还是在发展之中,我们未来会对它有更多的想法。

Scott Beaumont:补充一点,其实我们在中国特别关注的就是本地的创新。比如说,我们也不知道微信以后会产生什么样的创新,但是我们知道中国的规模、中国的计算机这个量的大小,计算能力等等是非常宏大。在中国,他们让创新更符合中国。而这种中国特色的创新,回过来又会影响全球的创新。机器学习、机器智慧是全球的现象,中国开发者会怎么利用机器学习、机器智慧这个技术,在什么样的领域会产生巨大的效用,这种效用最后怎样影响全球的开发者社区。

我想,用一个词来描述的话,中国在未来5年的关键词就是创新。创新也是Google的热忱,也是让开发者沸腾的一种精神。我们在中国想做的事情,第一个,就是让开发者的想法变成现实,第二个,就是把这个想法带到全球,发挥到全球。

另外,我们在中国也在积极了解本地开发者的想法,帮助他们把这个想法进行创新,变成有中国特色的开发。

4问:Google搜索何时返华?还有对于因为在中国没有Google Play以及GMS所导致的Android体验的糟糕现象,Google是怎么看待的,有什么建议?

Scott :这个问题,目前我们没有更多信息可以分享。 我们CEO的确在正式场合希望更好的服务中国Android的用户,不过,迄今为止我们没有更新的信息跟大家分享。

问:现在很多的中国开发者有VR游戏的团队,希望通过Daydream改变他们的生存状态。我想问三个问题,我们对开发者登录Daydream平台的标准是什么呢?第二个问题是我们会不会给VR团队什么扶持政策?另外他们分成是怎么样呢?

Ben Galbraith:关于第一个问题,如果开发者有Unity的话,他们把Unity上的应用放在Daydream中。此外,我们有很多其他的工具合作伙伴,工具的供应方,如果你是3D内容,你可以把3D转化后放到Daydream上。如果是虚拟现实的也可以放到Daydream上。

第二个,我们很高兴开发者能够把内容放到Daydream上,我们也会与开发者进行更多的互动,来帮助到他们,但是我们并没有补贴政策。我们的工具是免费的,99.9%生态系统中的内容都会放到我们的平台上。

第三,关于收入分成,这个是使用标准的模式,并没有单独针对Daydream的政策。

来源:http://www.cocoachina.com/industry/20161208/18322.html

收起阅读 »

APP开发实战视频教程 - 《仿今日头条》 发布了

5+App开发

APP开发实战视频教程 - 《仿今日头条》 发布了,内容涵盖
课程提纲
第1讲 : 基于h5+的app 开发介绍、hui、mui介绍、项目部署
时长 : 41:00
第2讲 : 制作子窗口、数据加载、下拉刷新
时长 : 44:33
第3讲 : 新闻分类切换 、上拉加载更多
时长 : 33:49
第4讲 : 懒加载的使用
时长 : 11:10
第5讲 : 新闻详情页面开发
时长 : 19:37
第6讲 : 新闻详情页面分享功能
时长 : 12:13 播放 : 2356 次
第7讲 : app 在线升级
时长 : 15:38

说明
前面2节视频因直播问题不够清清晰,后面的较为清晰。 20元可以购买视频高清文件及项目源码(购买请联系qq 1265928288)。

项目最终效果截图

视频教程地址:
http://www.hcoder.net/course

继续阅读 »

APP开发实战视频教程 - 《仿今日头条》 发布了,内容涵盖
课程提纲
第1讲 : 基于h5+的app 开发介绍、hui、mui介绍、项目部署
时长 : 41:00
第2讲 : 制作子窗口、数据加载、下拉刷新
时长 : 44:33
第3讲 : 新闻分类切换 、上拉加载更多
时长 : 33:49
第4讲 : 懒加载的使用
时长 : 11:10
第5讲 : 新闻详情页面开发
时长 : 19:37
第6讲 : 新闻详情页面分享功能
时长 : 12:13 播放 : 2356 次
第7讲 : app 在线升级
时长 : 15:38

说明
前面2节视频因直播问题不够清清晰,后面的较为清晰。 20元可以购买视频高清文件及项目源码(购买请联系qq 1265928288)。

项目最终效果截图

视频教程地址:
http://www.hcoder.net/course

收起阅读 »