
app制作流程中需要测试吗?还有哪些步骤呢
对于一款功能完善的app软件来说,那么很多人关注的是它是如何开发制作而来的,虽然说app开发报价可能每一家开发公司给出的参考不一样,但是对于一款完善的app软件来说,大致的开发流程都是一样的,下面就详细跟大家介绍一下,app开发中的流程及内容都是关于哪些方面的,也同时让企业投资者对于app开发能有进一步的认识。
1、iOS/Android客户端开发
程序员按照app效果图进行客户端开发,对设计效果图的代码实现,写入功能调用的接口,连接服务器端,方使服务器端的数据进行交互,开发出与效果图一致的app的客户端。
2、app程序测试
app的全面测试,此测试是模拟用户在正常使用的情况下以及非正常使用的情况下有可能出现的问题,当然,需要导入必要的数据进行测试,出现错误继续开发修复,通过则证明整体app已经完成,然后再将成品交由用户试用。
3、上传到应用商店
完成签名验证之后,开发好的客户端app程序就可以提交发布到各应用商店。iOS版本的app提交到苹果的appStore,安卓的提交到国内各大安卓应用商店。
4、app的维护及更新
对上线之后的app进行维护,收集用户反馈信息,及时修复app应用中出现的错误(Bug)。
那么关于app的开发流程郑州app开发公司燚轩科技就为大讲解到这里了,对于开发一款app软件来说,并不是制作完成就结束了,恰恰相反,app软件的制作完成只是开始,对于企业投资者来说,首先要选择的就是有长久售后技术服务的app开发公司,这样对于以后的运营中出现的问题也好解决了。本文由郑州app开发http://www.appsaa.com整理发布,如需转载请注明出处!
对于一款功能完善的app软件来说,那么很多人关注的是它是如何开发制作而来的,虽然说app开发报价可能每一家开发公司给出的参考不一样,但是对于一款完善的app软件来说,大致的开发流程都是一样的,下面就详细跟大家介绍一下,app开发中的流程及内容都是关于哪些方面的,也同时让企业投资者对于app开发能有进一步的认识。
1、iOS/Android客户端开发
程序员按照app效果图进行客户端开发,对设计效果图的代码实现,写入功能调用的接口,连接服务器端,方使服务器端的数据进行交互,开发出与效果图一致的app的客户端。
2、app程序测试
app的全面测试,此测试是模拟用户在正常使用的情况下以及非正常使用的情况下有可能出现的问题,当然,需要导入必要的数据进行测试,出现错误继续开发修复,通过则证明整体app已经完成,然后再将成品交由用户试用。
3、上传到应用商店
完成签名验证之后,开发好的客户端app程序就可以提交发布到各应用商店。iOS版本的app提交到苹果的appStore,安卓的提交到国内各大安卓应用商店。
4、app的维护及更新
对上线之后的app进行维护,收集用户反馈信息,及时修复app应用中出现的错误(Bug)。
那么关于app的开发流程郑州app开发公司燚轩科技就为大讲解到这里了,对于开发一款app软件来说,并不是制作完成就结束了,恰恰相反,app软件的制作完成只是开始,对于企业投资者来说,首先要选择的就是有长久售后技术服务的app开发公司,这样对于以后的运营中出现的问题也好解决了。本文由郑州app开发http://www.appsaa.com整理发布,如需转载请注明出处!
收起阅读 »
付费求高手解答IAP丢单问题
如题,就是IAP用户付费过程当中,如果App尚未收到苹果服务器返回的确认信息就退出了,而苹果已经扣钱了,App这边如何处理。
使用HBuider的plus.payment开发。
有酬谢!
qq: 3114330860
谢谢~
如题,就是IAP用户付费过程当中,如果App尚未收到苹果服务器返回的确认信息就退出了,而苹果已经扣钱了,App这边如何处理。
使用HBuider的plus.payment开发。
有酬谢!
qq: 3114330860
谢谢~

快应用接入uni统计使用教程
部分手机厂商给快应用提供了在自家手机上的统计服务,但这并不能满足开发者需求。
开发者需要在一处看到全平台的数据,可以筛选厂商渠道进行对比分析,还需要更精细的统计服务来支持良好的运营。
DCloud的uni统计支持全平台统计,可在一个后台查看所有厂商的快应用数据,本教程根据创建快应用的不同模式,介绍接入uni统计的方案。
接入uni统计
通过HBuilderX新建快应用
通过HBuilderX新建快应用时,会自动在项目根目录下创建dcloud_stat.js、dcloud_stat_conf.js,并在app.ux中加入统计调用,如下:
<script>
import './dcloud_stat.js';
module.exports = {
onCreate: function () {
console.log("app launch");
/**
* DCloud统计服务类似于快应用里的友盟或阿拉丁,可登录 http://dev.dcloud.net.cn 查看统计数据
* 使用该服务可在一点看到所有渠道的运营数据,避免登陆不同渠道的后台,更方便的掌握业务运营状态。
* 如不需要此服务,请注释掉本行代码
*/
dc_stat.report();
},
/**manifest**/
}
</script>
开发者无需修改,即可直接使用uni统计。
PS:如果开发者不想使用uni统计服务,在app.ux将dc_stat.report();注释即可。
通过HBuilderX将小程序转快应用
通过HBuilderX将小程序转化为快应用时,会自动在项目根目录下创建dcloud_stat.js、dcloud_stat_conf.js,并在app.ux中加入统计调用,如下:
<script>
require('./polyfill.js');
/**
* DCloud统计服务类似于快应用里的友盟或阿拉丁,可登录 http://dev.dcloud.net.cn 查看统计数据
* 使用该服务可在一点看到所有渠道的运营数据,避免登陆不同渠道的后台,更方便的掌握业务运营状态。
* 如不需要此服务,请注释掉本行代码
*/
require('./dcloud_stat.js');
//其它转换后代码
</script>
开发者无需修改,即可直接使用uni统计。
PS:如果开发者不想使用uni统计服务,在app.ux将 require('./dcloud_stat.js'); 注释即可。
其它方式
如果已经使用其它IDE开发完快应用,可以按照如下步骤接入uni统计:
1、从http://quickapp.dcloud.io 下载安装HBuilderX,启动后注册一个HBuilder账号
2、将已开发的快应用项目拖入HBuilderX
3、下载uni_stat_sdk并解压,将其中的dcloud_stat.js、dcloud_stat_conf.js拷贝到app.ux同级的目录(src目录下);
4、修改dcloud_stat_confi.js,填入快应用包名;
5、在app.ux中导入dcloud_stat,如下:
import './dcloud_stat.js';
6、在app.ux的onCreate中增加打点统计代码,如:
onCreate:function(){
//新增uni统计打点
dc_stat.report();
//其它业务代码
},
7、为保证统计数据准确,uni统计会读取用户设备信息(若用户拒绝,则会生成虚拟设备标志并存储本地),因此需要在manifest.json中增加如下接口声明:
"features": [/*接口列表*/
{"name": "system.fetch"},
{"name": "system.device"},
{"name": "system.storage"},
/* 项目需要的其它接口声明*/
]
8、点击发行,生成rpk文件,安装到调试器进行验证,或上传到快应用联盟;
注意:首次需要使用HBuilderX打包生成rpk文件,这是为了绑定,验证统计功能没问题后,后续可以继续使用其它的开发环境打包rpk。
查看统计数据
开发者接入uni统计并将rpk发布到应用市场后,即可通过HBuilder账号登录dev开发者中心,查看快应用的日活、留存等数据,如下:
注意:目前统计数据支持隔天统计,即今天可以查看昨天的数据,暂不支持实时统计。
部分手机厂商给快应用提供了在自家手机上的统计服务,但这并不能满足开发者需求。
开发者需要在一处看到全平台的数据,可以筛选厂商渠道进行对比分析,还需要更精细的统计服务来支持良好的运营。
DCloud的uni统计支持全平台统计,可在一个后台查看所有厂商的快应用数据,本教程根据创建快应用的不同模式,介绍接入uni统计的方案。
接入uni统计
通过HBuilderX新建快应用
通过HBuilderX新建快应用时,会自动在项目根目录下创建dcloud_stat.js、dcloud_stat_conf.js,并在app.ux中加入统计调用,如下:
<script>
import './dcloud_stat.js';
module.exports = {
onCreate: function () {
console.log("app launch");
/**
* DCloud统计服务类似于快应用里的友盟或阿拉丁,可登录 http://dev.dcloud.net.cn 查看统计数据
* 使用该服务可在一点看到所有渠道的运营数据,避免登陆不同渠道的后台,更方便的掌握业务运营状态。
* 如不需要此服务,请注释掉本行代码
*/
dc_stat.report();
},
/**manifest**/
}
</script>
开发者无需修改,即可直接使用uni统计。
PS:如果开发者不想使用uni统计服务,在app.ux将dc_stat.report();注释即可。
通过HBuilderX将小程序转快应用
通过HBuilderX将小程序转化为快应用时,会自动在项目根目录下创建dcloud_stat.js、dcloud_stat_conf.js,并在app.ux中加入统计调用,如下:
<script>
require('./polyfill.js');
/**
* DCloud统计服务类似于快应用里的友盟或阿拉丁,可登录 http://dev.dcloud.net.cn 查看统计数据
* 使用该服务可在一点看到所有渠道的运营数据,避免登陆不同渠道的后台,更方便的掌握业务运营状态。
* 如不需要此服务,请注释掉本行代码
*/
require('./dcloud_stat.js');
//其它转换后代码
</script>
开发者无需修改,即可直接使用uni统计。
PS:如果开发者不想使用uni统计服务,在app.ux将 require('./dcloud_stat.js'); 注释即可。
其它方式
如果已经使用其它IDE开发完快应用,可以按照如下步骤接入uni统计:
1、从http://quickapp.dcloud.io 下载安装HBuilderX,启动后注册一个HBuilder账号
2、将已开发的快应用项目拖入HBuilderX
3、下载uni_stat_sdk并解压,将其中的dcloud_stat.js、dcloud_stat_conf.js拷贝到app.ux同级的目录(src目录下);
4、修改dcloud_stat_confi.js,填入快应用包名;
5、在app.ux中导入dcloud_stat,如下:
import './dcloud_stat.js';
6、在app.ux的onCreate中增加打点统计代码,如:
onCreate:function(){
//新增uni统计打点
dc_stat.report();
//其它业务代码
},
7、为保证统计数据准确,uni统计会读取用户设备信息(若用户拒绝,则会生成虚拟设备标志并存储本地),因此需要在manifest.json中增加如下接口声明:
"features": [/*接口列表*/
{"name": "system.fetch"},
{"name": "system.device"},
{"name": "system.storage"},
/* 项目需要的其它接口声明*/
]
8、点击发行,生成rpk文件,安装到调试器进行验证,或上传到快应用联盟;
注意:首次需要使用HBuilderX打包生成rpk文件,这是为了绑定,验证统计功能没问题后,后续可以继续使用其它的开发环境打包rpk。
查看统计数据
开发者接入uni统计并将rpk发布到应用市场后,即可通过HBuilder账号登录dev开发者中心,查看快应用的日活、留存等数据,如下:
注意:目前统计数据支持隔天统计,即今天可以查看昨天的数据,暂不支持实时统计。
收起阅读 »
各位同学,苏宁广告研发中心前端组招聘啦~
团队介绍:
苏宁广告研发中心前端开发组,负责线上和线下广告业务,前端涉及面比较广,需要有扎实的前端基础,以应对不同平台不同客户端的项目
招聘要求:
- 拥有两年以上pc开发经验,一年以上wap开发经验
- 有过硬的切图能力,能完美还原设计稿
- 要求扎实的js基础,熟悉面向对象,异步编程,函数式编程等
- 脚手架要求熟悉webpack gulp fis3中的一种或几种
- 前端框架要求熟悉vue, react, angular中的一种或几种,对组件间的数据通信有一定的理解
- 具备一定的抽象能力,对前端架构有很好的想法
- 加分项:nodejs,weex,小程序开发
简历发邮箱:liuyfj@cnsuning.com
招聘长期有效
团队介绍:
苏宁广告研发中心前端开发组,负责线上和线下广告业务,前端涉及面比较广,需要有扎实的前端基础,以应对不同平台不同客户端的项目
招聘要求:
- 拥有两年以上pc开发经验,一年以上wap开发经验
- 有过硬的切图能力,能完美还原设计稿
- 要求扎实的js基础,熟悉面向对象,异步编程,函数式编程等
- 脚手架要求熟悉webpack gulp fis3中的一种或几种
- 前端框架要求熟悉vue, react, angular中的一种或几种,对组件间的数据通信有一定的理解
- 具备一定的抽象能力,对前端架构有很好的想法
- 加分项:nodejs,weex,小程序开发
简历发邮箱:liuyfj@cnsuning.com
招聘长期有效
收起阅读 »
h5+、mui、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+VUE.JS H5+ APP 实战教程
http://www.hcoder.net/course/info_240.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+VUE.JS H5+ APP 实战教程
http://www.hcoder.net/course/info_240.html
MUI、H5 APP 实战教程 - 仿《有道词典》
https://ke.qq.com/course/194834
H5 跨平台APP开发电商项目实战教程 -《仿京东优选商城》
https://ke.qq.com/course/225830
更多课程中心
http://www.hcoder.net/course

让Vue-cli 构建SPA 搭上 HTML5+的顺风车
过程
本人,是一个比较懒,
- 不喜欢学习原生开发,所以入局了HTML5+
- 不喜欢放肆复制粘贴,所以入局了Vuejs
在论坛寻找了很久,也google了很久,一直没有一个Vue-cli构建SPA开发HTML5+应用的完美例子。
- 论坛里面有一个 vue-cli template for Hbuilder的例子,但是编译完成之后,生成的文件并不能使得基座页面刷新,需要手动重启基座才能看到最新的效果
- 论坛中也有人提到,在mainfast.json文件中将入口文件设置为[your own id]:8080,但是没有具体的步骤,经过一番探索,已经成功掌握了这一方式
在论坛的解决方案 【2】 中,能够直接使用官方的 webpcak 模板,并且保证了热更新能够正常使用,也能够掉起HTML5+的API,下面将具体步骤贴出,用以方便论坛中有需要的人
结果
如果想要使用vue-cli构建基于Vue的SPA程序,并且能够在真机调试的时候能够顺利的调用HTML5+的接口,而且要能够通过Chrome远程调试的话,那么您的照着下面的步骤慢慢来
修改Vue-cli的webpack配置
1、 修改 config/index.js
{
build:{
assetsPublicPath:'./'
}
}
- 打包前修改html里面静态资源的路径,代码中网络资源一定要加上https、http
修改src/main.js文件
//为每个组件都混入一个plusready的状态标识,方便在组件中安全的调用plus接口,如果你想在组件中安全的调用puls接口也可以用混入方法拓展Vue对象原型,将plus注入到Vue对象的原型链上去
Vue.mixin({
computed: {
plusReady() {
return this.$store.state.isplusReady;
}
}
})
// 配置html plus 环境
document.addEventListener('plusready', function () {
// 设置一个全局plusready状态
store.state.isplusReady = true;
// 监听返回按键
let now = false;
let time = null;
plus.key.addEventListener('backbutton', function () {
// 如果是首页则执行退出操作
if (app.$route.path === "/home" || app.$route.path === "/my-center") {
time = null;
if (now) {
now = false;
plus.runtime.quit();
} else {
now = true;
plus.nativeUI.toast("再按一次退出", { duration: 'short' });
time = setTimeout(() => {
now = false;
}, 1000);
}
// 如果是内页则执行路由返回操作
} else {
router.go(-1);
}
})
})
app项目配置
- 新建一个app项目
- 开发时修改入口为 http://[your own ip]:8080(例:http://192.168.0.1:8080)
- 打包后,将dist文件夹中所有文件复制到app根目录,入口文件设置为index.html,检查index.html中没有绝对路径,源代码中网络资源文件已经添加http、https协议头
到此结束
如有更加新奇的想法请跟帖讨论,本帖内容不涉及基础知识,vuejs官网,HTML5+API官网
过程
本人,是一个比较懒,
- 不喜欢学习原生开发,所以入局了HTML5+
- 不喜欢放肆复制粘贴,所以入局了Vuejs
在论坛寻找了很久,也google了很久,一直没有一个Vue-cli构建SPA开发HTML5+应用的完美例子。
- 论坛里面有一个 vue-cli template for Hbuilder的例子,但是编译完成之后,生成的文件并不能使得基座页面刷新,需要手动重启基座才能看到最新的效果
- 论坛中也有人提到,在mainfast.json文件中将入口文件设置为[your own id]:8080,但是没有具体的步骤,经过一番探索,已经成功掌握了这一方式
在论坛的解决方案 【2】 中,能够直接使用官方的 webpcak 模板,并且保证了热更新能够正常使用,也能够掉起HTML5+的API,下面将具体步骤贴出,用以方便论坛中有需要的人
结果
如果想要使用vue-cli构建基于Vue的SPA程序,并且能够在真机调试的时候能够顺利的调用HTML5+的接口,而且要能够通过Chrome远程调试的话,那么您的照着下面的步骤慢慢来
修改Vue-cli的webpack配置
1、 修改 config/index.js
{
build:{
assetsPublicPath:'./'
}
}
- 打包前修改html里面静态资源的路径,代码中网络资源一定要加上https、http
修改src/main.js文件
//为每个组件都混入一个plusready的状态标识,方便在组件中安全的调用plus接口,如果你想在组件中安全的调用puls接口也可以用混入方法拓展Vue对象原型,将plus注入到Vue对象的原型链上去
Vue.mixin({
computed: {
plusReady() {
return this.$store.state.isplusReady;
}
}
})
// 配置html plus 环境
document.addEventListener('plusready', function () {
// 设置一个全局plusready状态
store.state.isplusReady = true;
// 监听返回按键
let now = false;
let time = null;
plus.key.addEventListener('backbutton', function () {
// 如果是首页则执行退出操作
if (app.$route.path === "/home" || app.$route.path === "/my-center") {
time = null;
if (now) {
now = false;
plus.runtime.quit();
} else {
now = true;
plus.nativeUI.toast("再按一次退出", { duration: 'short' });
time = setTimeout(() => {
now = false;
}, 1000);
}
// 如果是内页则执行路由返回操作
} else {
router.go(-1);
}
})
})
app项目配置
- 新建一个app项目
- 开发时修改入口为 http://[your own ip]:8080(例:http://192.168.0.1:8080)
- 打包后,将dist文件夹中所有文件复制到app根目录,入口文件设置为index.html,检查index.html中没有绝对路径,源代码中网络资源文件已经添加http、https协议头
到此结束
如有更加新奇的想法请跟帖讨论,本帖内容不涉及基础知识,vuejs官网,HTML5+API官网
收起阅读 »
第三方登陆微信真机调试成功,发布app后登陆无法发起
这几天app中集成第三方微信的登陆,在真机调试中安卓和ios都没问题;但是打包后安卓出现登陆无法发起的情况;
app中sdk已经配置了,后来才发现原来是集成微信开放平台中有个签名的值;
需要将app的配置文件中的signature签名填写到微信开放平台中关于该应用的签名中;
注:微信开放平台中应用签名的修改,应该是需要等待24后才会生效的;修改后可能不会马上生效;
这几天app中集成第三方微信的登陆,在真机调试中安卓和ios都没问题;但是打包后安卓出现登陆无法发起的情况;
app中sdk已经配置了,后来才发现原来是集成微信开放平台中有个签名的值;
需要将app的配置文件中的signature签名填写到微信开放平台中关于该应用的签名中;
注:微信开放平台中应用签名的修改,应该是需要等待24后才会生效的;修改后可能不会马上生效;
收起阅读 »
手机端原生js滑动验证
<!DOCTYPE html>
<html>
<head>
<meta charset="utf8">
<style>
/ 滑动控件容器,亮灰色背景 /
dragContainer {
position: relative;
display: inline-block;
background: #e8e8e8;
width: 100%;
height: 100px;
border: 2px solid #e8e8e8;
}
/* 滑块左边部分,绿色背景 */
#dragBg {
position: absolute;
background-color: #7ac23c;
width: 0px;
height: 100%;
}
/* 滑动验证容器文本 */
#dragText {
position: absolute;
width: 100%;
height: 100%;
/* 文字水平居中 */
text-align: center;
/* 文字垂直居中,这里不能用百分比,因为百分比是相对原始line-height的,而非div高度 */
line-height: 33px;
/* 文本不允许选中 */
user-select: none;
-webkit-user-select: none;
line-height: 100px;
font-size: 22px;
}
/* 滑块 */
#dragHandler {
position: absolute;
width: 100px;
height: 100%;
cursor: move;
}
/* 滑块初始背景 */
.dragHandlerBg {
background: #fff no-repeat center url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA3hpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDIxIDc5LjE1NTc3MiwgMjAxNC8wMS8xMy0xOTo0NDowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo0ZDhlNWY5My05NmI0LTRlNWQtOGFjYi03ZTY4OGYyMTU2ZTYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NTEyNTVEMURGMkVFMTFFNEI5NDBCMjQ2M0ExMDQ1OUYiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NTEyNTVEMUNGMkVFMTFFNEI5NDBCMjQ2M0ExMDQ1OUYiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo2MTc5NzNmZS02OTQxLTQyOTYtYTIwNi02NDI2YTNkOWU5YmUiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NGQ4ZTVmOTMtOTZiNC00ZTVkLThhY2ItN2U2ODhmMjE1NmU2Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+YiRG4AAAALFJREFUeNpi/P//PwMlgImBQkA9A+bOnfsIiBOxKcInh+yCaCDuByoswaIOpxwjciACFegBqZ1AvBSIS5OTk/8TkmNEjwWgQiUgtQuIjwAxUF3yX3xyGIEIFLwHpKyAWB+I1xGSwxULIGf9A7mQkBwTlhBXAFLHgPgqEAcTkmNCU6AL9d8WII4HOvk3ITkWJAXWUMlOoGQHmsE45ViQ2KuBuASoYC4Wf+OUYxz6mQkgwAAN9mIrUReCXgAAAABJRU5ErkJggg==");
}
/* 验证成功时的滑块背景 */
.dragHandlerOkBg {
background: #fff no-repeat center url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA3hpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDIxIDc5LjE1NTc3MiwgMjAxNC8wMS8xMy0xOTo0NDowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo0ZDhlNWY5My05NmI0LTRlNWQtOGFjYi03ZTY4OGYyMTU2ZTYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NDlBRDI3NjVGMkQ2MTFFNEI5NDBCMjQ2M0ExMDQ1OUYiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NDlBRDI3NjRGMkQ2MTFFNEI5NDBCMjQ2M0ExMDQ1OUYiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDphNWEzMWNhMC1hYmViLTQxNWEtYTEwZS04Y2U5NzRlN2Q4YTEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NGQ4ZTVmOTMtOTZiNC00ZTVkLThhY2ItN2U2ODhmMjE1NmU2Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+k+sHwwAAASZJREFUeNpi/P//PwMyKD8uZw+kUoDYEYgloMIvgHg/EM/ptHx0EFk9I8wAoEZ+IDUPiIMY8IN1QJwENOgj3ACo5gNAbMBAHLgAxA4gQ5igAnNJ0MwAVTsX7IKyY7L2UNuJAf+AmAmJ78AEDTBiwGYg5gbifCSxFCZoaBMCy4A4GOjnH0D6DpK4IxNSVIHAfSDOAeLraJrjgJp/AwPbHMhejiQnwYRmUzNQ4VQgDQqXK0ia/0I17wJiPmQNTNBEAgMlQIWiQA2vgWw7QppBekGxsAjIiEUSBNnsBDWEAY9mEFgMMgBk00E0iZtA7AHEctDQ58MRuA6wlLgGFMoMpIG1QFeGwAIxGZo8GUhIysmwQGSAZgwHaEZhICIzOaBkJkqyM0CAAQDGx279Jf50AAAAAABJRU5ErkJggg==");
}
</style>
<script>
window.onload = function() {
var dragContainer = document.getElementById("dragContainer");
var dragBg = document.getElementById("dragBg");
var dragText = document.getElementById("dragText");
var dragHandler = document.getElementById("dragHandler");
//滑块最大偏移量
var maxHandlerOffset = dragContainer.clientWidth - dragHandler.clientWidth;
//是否验证成功的标记
var isVertifySucc = false;
initDrag();
function initDrag() {
dragText.textContent = "拖动滑块验证";
dragHandler.addEventListener("touchstart", onDragHandlerMouseDown);
}
function onDragHandlerMouseDown() {
document.addEventListener("touchmove", onDragHandlerMouseMove);
document.addEventListener("touchend", onDragHandlerMouseUp);
}
function onDragHandlerMouseMove(ev) {
/*
html元素不存在width属性,只有clientWidth
offsetX是相对当前元素的,clientX和pageX是相对其父元素的
*/
var left = ev.touches[0].clientX - dragHandler.clientWidth / 2;
if(left < 0) {
left = 0;
} else if(left > maxHandlerOffset) {
left = maxHandlerOffset;
verifySucc();
}
dragHandler.style.left = left + "px";
dragBg.style.width = dragHandler.style.left;
}
function onDragHandlerMouseUp() {
document.removeEventListener("touchmove", onDragHandlerMouseMove);
document.removeEventListener("touchend", onDragHandlerMouseUp);
dragHandler.style.left = 0;
dragBg.style.width = 0;
}
//验证成功
function verifySucc() {
isVertifySucc = true;
dragText.textContent = "验证通过";
dragText.style.color = "white";
dragHandler.setAttribute("class", "dragHandlerOkBg");
dragHandler.removeEventListener("touchstart", onDragHandlerMouseDown);
document.removeEventListener("touchmove", onDragHandlerMouseMove);
document.removeEventListener("touchend", onDragHandlerMouseUp);
};
}
</script>
</head>
<body>
<div id="dragContainer">
<div id="dragBg"></div>
<div id="dragText"></div>
<div id="dragHandler" class="dragHandlerBg"></div>
</div>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf8">
<style>
/ 滑动控件容器,亮灰色背景 /
dragContainer {
position: relative;
display: inline-block;
background: #e8e8e8;
width: 100%;
height: 100px;
border: 2px solid #e8e8e8;
}
/* 滑块左边部分,绿色背景 */
#dragBg {
position: absolute;
background-color: #7ac23c;
width: 0px;
height: 100%;
}
/* 滑动验证容器文本 */
#dragText {
position: absolute;
width: 100%;
height: 100%;
/* 文字水平居中 */
text-align: center;
/* 文字垂直居中,这里不能用百分比,因为百分比是相对原始line-height的,而非div高度 */
line-height: 33px;
/* 文本不允许选中 */
user-select: none;
-webkit-user-select: none;
line-height: 100px;
font-size: 22px;
}
/* 滑块 */
#dragHandler {
position: absolute;
width: 100px;
height: 100%;
cursor: move;
}
/* 滑块初始背景 */
.dragHandlerBg {
background: #fff no-repeat center url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA3hpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDIxIDc5LjE1NTc3MiwgMjAxNC8wMS8xMy0xOTo0NDowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo0ZDhlNWY5My05NmI0LTRlNWQtOGFjYi03ZTY4OGYyMTU2ZTYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NTEyNTVEMURGMkVFMTFFNEI5NDBCMjQ2M0ExMDQ1OUYiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NTEyNTVEMUNGMkVFMTFFNEI5NDBCMjQ2M0ExMDQ1OUYiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo2MTc5NzNmZS02OTQxLTQyOTYtYTIwNi02NDI2YTNkOWU5YmUiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NGQ4ZTVmOTMtOTZiNC00ZTVkLThhY2ItN2U2ODhmMjE1NmU2Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+YiRG4AAAALFJREFUeNpi/P//PwMlgImBQkA9A+bOnfsIiBOxKcInh+yCaCDuByoswaIOpxwjciACFegBqZ1AvBSIS5OTk/8TkmNEjwWgQiUgtQuIjwAxUF3yX3xyGIEIFLwHpKyAWB+I1xGSwxULIGf9A7mQkBwTlhBXAFLHgPgqEAcTkmNCU6AL9d8WII4HOvk3ITkWJAXWUMlOoGQHmsE45ViQ2KuBuASoYC4Wf+OUYxz6mQkgwAAN9mIrUReCXgAAAABJRU5ErkJggg==");
}
/* 验证成功时的滑块背景 */
.dragHandlerOkBg {
background: #fff no-repeat center url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA3hpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDIxIDc5LjE1NTc3MiwgMjAxNC8wMS8xMy0xOTo0NDowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo0ZDhlNWY5My05NmI0LTRlNWQtOGFjYi03ZTY4OGYyMTU2ZTYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NDlBRDI3NjVGMkQ2MTFFNEI5NDBCMjQ2M0ExMDQ1OUYiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NDlBRDI3NjRGMkQ2MTFFNEI5NDBCMjQ2M0ExMDQ1OUYiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDphNWEzMWNhMC1hYmViLTQxNWEtYTEwZS04Y2U5NzRlN2Q4YTEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NGQ4ZTVmOTMtOTZiNC00ZTVkLThhY2ItN2U2ODhmMjE1NmU2Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+k+sHwwAAASZJREFUeNpi/P//PwMyKD8uZw+kUoDYEYgloMIvgHg/EM/ptHx0EFk9I8wAoEZ+IDUPiIMY8IN1QJwENOgj3ACo5gNAbMBAHLgAxA4gQ5igAnNJ0MwAVTsX7IKyY7L2UNuJAf+AmAmJ78AEDTBiwGYg5gbifCSxFCZoaBMCy4A4GOjnH0D6DpK4IxNSVIHAfSDOAeLraJrjgJp/AwPbHMhejiQnwYRmUzNQ4VQgDQqXK0ia/0I17wJiPmQNTNBEAgMlQIWiQA2vgWw7QppBekGxsAjIiEUSBNnsBDWEAY9mEFgMMgBk00E0iZtA7AHEctDQ58MRuA6wlLgGFMoMpIG1QFeGwAIxGZo8GUhIysmwQGSAZgwHaEZhICIzOaBkJkqyM0CAAQDGx279Jf50AAAAAABJRU5ErkJggg==");
}
</style>
<script>
window.onload = function() {
var dragContainer = document.getElementById("dragContainer");
var dragBg = document.getElementById("dragBg");
var dragText = document.getElementById("dragText");
var dragHandler = document.getElementById("dragHandler");
//滑块最大偏移量
var maxHandlerOffset = dragContainer.clientWidth - dragHandler.clientWidth;
//是否验证成功的标记
var isVertifySucc = false;
initDrag();
function initDrag() {
dragText.textContent = "拖动滑块验证";
dragHandler.addEventListener("touchstart", onDragHandlerMouseDown);
}
function onDragHandlerMouseDown() {
document.addEventListener("touchmove", onDragHandlerMouseMove);
document.addEventListener("touchend", onDragHandlerMouseUp);
}
function onDragHandlerMouseMove(ev) {
/*
html元素不存在width属性,只有clientWidth
offsetX是相对当前元素的,clientX和pageX是相对其父元素的
*/
var left = ev.touches[0].clientX - dragHandler.clientWidth / 2;
if(left < 0) {
left = 0;
} else if(left > maxHandlerOffset) {
left = maxHandlerOffset;
verifySucc();
}
dragHandler.style.left = left + "px";
dragBg.style.width = dragHandler.style.left;
}
function onDragHandlerMouseUp() {
document.removeEventListener("touchmove", onDragHandlerMouseMove);
document.removeEventListener("touchend", onDragHandlerMouseUp);
dragHandler.style.left = 0;
dragBg.style.width = 0;
}
//验证成功
function verifySucc() {
isVertifySucc = true;
dragText.textContent = "验证通过";
dragText.style.color = "white";
dragHandler.setAttribute("class", "dragHandlerOkBg");
dragHandler.removeEventListener("touchstart", onDragHandlerMouseDown);
document.removeEventListener("touchmove", onDragHandlerMouseMove);
document.removeEventListener("touchend", onDragHandlerMouseUp);
};
}
</script>
</head>
<body>
<div id="dragContainer">
<div id="dragBg"></div>
<div id="dragText"></div>
<div id="dragHandler" class="dragHandlerBg"></div>
</div>
</body>
</html>

企业app开发与运营中,需要与郑州app开发沟通什么
对于目前郑州app开发市场来说,其趋势正在呈直线上升,而且不仅做app开发的企业逐渐在增加,app开发公司的数量也在不断的增加,那么对于app开发过程中,企业投资者一般比较关心的问题与注意的事项还是非常多的,下面就详细跟大家分析一下。
1、解决目标用户难题
一款受欢迎app的打造,首先对用户来说是有价值的,能够满足用户的某些需求,否则便没有市场。解决用户的问题越多,问题越大,你app发挥的功能就越大,用户的粘性就随之增强了。因此,企业在开发和维护自己的移动app时,一定要多交流、多调研、多搜集用户反馈,及时更新和完善自己的不足,争取为用户创造更大的价值。
2、关注目标用户需求
目标用户的需要贯穿于app开发、推广、运营等全过程。研发前,你需要通过调查和确定目标用户,来设计开发你的app功能;推广中,你需要结合用户的关注点有针对性的撰写广告内容,吸引更多用户的眼球;运营时,需要不断与用户交流、沟通、反馈,完善自身的服务和产品。企业时刻做好这一点,有利于自身品牌的树立和信誉度提升。
3、借助推广让用户尽快找到你
只有更多人使用你的app,才能发挥它更大的价值,为企业带来收益。app开发好后,企业一定要加大市场营销推广力度,通过各种主流媒体如微博微信等推广自己的app,让用户有问题能迅速找到你,并且你能很好的解决他的问题。如果不做广告推广,用户很难找到你,你的app不仅无法更好的更新跌倒,其价值意义也不大,可能白白浪费研发的成本。
4、做好企业的运营服务
一款app开发成功之后,企业的工作并没有结束,除了时常通过用户反馈优化和完善自身的产品外,app运营服务便是之后的重点工作。如果不进行有效维护运营,app很有可能马上死掉。企业的运营服务重在专业度和责任心,两者缺一不可,需要专业懂运营的人去维护自己的客户,通过app为客户带来更多的价值,在此过程中就需要运营人员保持高度的责任心和耐心,认真回答客户的疑问。
关于企业需要在app开发过程中注意的问题和注意事项了,如果想要了解郑州app开发公司哪家好或者报价等问题的话,也可以咨询我们。本文由郑州app开发http://www.appsaa.com整理发布,如需转载请注明出处!
对于目前郑州app开发市场来说,其趋势正在呈直线上升,而且不仅做app开发的企业逐渐在增加,app开发公司的数量也在不断的增加,那么对于app开发过程中,企业投资者一般比较关心的问题与注意的事项还是非常多的,下面就详细跟大家分析一下。
1、解决目标用户难题
一款受欢迎app的打造,首先对用户来说是有价值的,能够满足用户的某些需求,否则便没有市场。解决用户的问题越多,问题越大,你app发挥的功能就越大,用户的粘性就随之增强了。因此,企业在开发和维护自己的移动app时,一定要多交流、多调研、多搜集用户反馈,及时更新和完善自己的不足,争取为用户创造更大的价值。
2、关注目标用户需求
目标用户的需要贯穿于app开发、推广、运营等全过程。研发前,你需要通过调查和确定目标用户,来设计开发你的app功能;推广中,你需要结合用户的关注点有针对性的撰写广告内容,吸引更多用户的眼球;运营时,需要不断与用户交流、沟通、反馈,完善自身的服务和产品。企业时刻做好这一点,有利于自身品牌的树立和信誉度提升。
3、借助推广让用户尽快找到你
只有更多人使用你的app,才能发挥它更大的价值,为企业带来收益。app开发好后,企业一定要加大市场营销推广力度,通过各种主流媒体如微博微信等推广自己的app,让用户有问题能迅速找到你,并且你能很好的解决他的问题。如果不做广告推广,用户很难找到你,你的app不仅无法更好的更新跌倒,其价值意义也不大,可能白白浪费研发的成本。
4、做好企业的运营服务
一款app开发成功之后,企业的工作并没有结束,除了时常通过用户反馈优化和完善自身的产品外,app运营服务便是之后的重点工作。如果不进行有效维护运营,app很有可能马上死掉。企业的运营服务重在专业度和责任心,两者缺一不可,需要专业懂运营的人去维护自己的客户,通过app为客户带来更多的价值,在此过程中就需要运营人员保持高度的责任心和耐心,认真回答客户的疑问。
关于企业需要在app开发过程中注意的问题和注意事项了,如果想要了解郑州app开发公司哪家好或者报价等问题的话,也可以咨询我们。本文由郑州app开发http://www.appsaa.com整理发布,如需转载请注明出处!
收起阅读 »
Android平台离线打包定位报has not amap appkey 错误
下载了H5+SDK配置了百度地图插件在本地跑起来以后
plus.geolocation.getCurrentPosition(function(p) {
alert(JSON.stringify(p))
})//提交位置信息
}, function(e) {
alert(JSON.stringify(e))
console.log('Geolocation error: ' + e.message);
},{provider:'baidu'});
提示has not amap appkey
这时要把libs 目录下所有关于高德地图的jar 删掉,map-amap.jar, AMap_3DMap_V2.4.1.jar, AMap_Services_V2.4.0.jar,AMap_Location_V3.3.0_20170118.jar,map-amap.jar,geolocation-amap.jar
下载了H5+SDK配置了百度地图插件在本地跑起来以后
plus.geolocation.getCurrentPosition(function(p) {
alert(JSON.stringify(p))
})//提交位置信息
}, function(e) {
alert(JSON.stringify(e))
console.log('Geolocation error: ' + e.message);
},{provider:'baidu'});
提示has not amap appkey
这时要把libs 目录下所有关于高德地图的jar 删掉,map-amap.jar, AMap_3DMap_V2.4.1.jar, AMap_Services_V2.4.0.jar,AMap_Location_V3.3.0_20170118.jar,map-amap.jar,geolocation-amap.jar