Cordova 填坑备忘

原创
2017/12/21 22:48
阅读数 369
  1. 按照官方文档 install 了 cordova 之后,在create 具体的项目之前,必须要安装好 Android SDK 切记,不然报错 code 254
  2. 安装了Android SDK后create项目还是可能报错,内容为什么文件的后缀名不是 tar zip 类似的,这是由于国内网络被墙,模板没有的缘故,需要在创建的时候选择一个模板,具体参考 官方文档 ,这里提供一个基本模板的名字
cordova create    文件夹名称   包ID    应用名称     --template cordova-app-hello-world 
  1. cordova 创建APP有一些依赖相,需要检查环境是否全部完成
cordova requirements

这里会出现一个叫 Gradle 的依赖项,Gradle具体的作用可以自行百度 这里我们不要安装,只需要把文件下载下来,放到系统自己生成目录下即可,也不用解压。系统指定的目录根据操作系统有差异。我用的是ubuntu 16.04 系统目录为

.gradle/wrapper/dists/gradle-4.1-all/bzyivzo6n839fup2jbap0tjew(这一串为系统生成,可根据具体情况自行决定)
  1. 使用cordova的事件 可以使用vue-cordova这个插件,具体参考代码库。有一点需要提醒。严格按照cordova官方教程中的调用顺序。先监听deviceready事件,其他的都在这个事件的回调函数中监听
// 示例 
Vue.cordova.on('deviceready', () => { // your code here this.$toast('ready') Vue.cordova.on('pause', () => { // your code here this.$toast('pause') }) Vue.cordova.on('resume', () => { // your code here this.$toast('resume') }) })
  1. 在使用localStorage时要记住,localStorage存储的都是字符串,bool类型也会转为字符串,同时对象类型要用JSON.stringify处理后存储。在取出来的时候要用JSON.parse解析一下。
  2. 想用localStorage初始化APP,对localStorage的操作不要放在Vue.cordova.on('deviceready')这个事件中操作,应为先执行vue,再执行cordova的事件,放在cordova的事件中,起不到初始化的目的,应为在这个事件之前数据已经被调用了。
  3. 想用device.platform 需要安装 插件
bash cordova plugin add cordova-plugin-device
  1. 关于media插件的使用问题
  • 关于new一个media类时有一个成功或者失败的回调函数,这些函数其实都是在你执行完record或者play的时候才调用的,并不是new后调用。
  • 在record的时候,传递一个src,这个src可以文件名,最好是用.m4a结尾,这样可以保证Android和iOS的兼容性,同时文件大小可以得到很好的控制
  • 在src使用文件名的时候,如果要用file-transfer上传,此时需要文件的完整路径,iOS和Android的路径是有区别的。
JavaScript if(device.platform == "iOS") { path = cordova.file.tempDirectory + filename; } else if(device.platform == "Android") { path = cordova.file.externalRootDirectory + filename; }
  1. cordova 插件在安装或者编译的时候出现错误Error: ENOENT时,可以考虑是不是platform版本太高,插件本身不支持。换一个低版本的试一下。

  2. 在集成极光推送的时候,如果创建项目的时候是采用的模板,并且没有指定包名,那么在集成的时候集成会失败,应为默认模板的包名为默认模板的包名,因此如果获取不到极光的ID,要全局搜一下默认包名,然后替换成自己的

  3. 在cordova build Android 的时候,报错为关于android:ttcIndex 资源找不到了,导致aapt启动不了。解决方案:传送门

  4. cordova打包的webapp 顶部底部滑动出现白色或灰色背景。解决方案:在 config.xml 中添加

  5. 解决Cordova开发的iOS的app界面被状态栏覆盖

  6. 在iOS的开发过程中,如果用xcode编译的话,默认使用的文件及配置都是staging这个文件下的,因此需要修改这个文件夹下的文件。

  7. 在iOS开发的过程中,有些需要权限,但是如果config.xml文件没有配置相应权限的话会导致APP崩溃,因此,需要配置权限。要么在config.xml配置,要么在resources下的plist文件内配置(同staging文件夹一样,默认使用此)

  8. 在iOS开发时,遇到上下滑动,fixed 元素消失的问题。解决方案为,把fixed元素移出上下滑动的div

  9. 打包ios运行上下滑动出现空白解决方法(webview)

  10. 百度地图缩放等级 参考地址

  11. 对于有录音需求的APP来说,cordova-plugin-media 这个插件生成的录音文件并不能在iOS和Android上通用,具体表现为,iOS的录音可以两个平台播放,Android录音,iOS不能播放。

// 修改 cordova media 插件源码
// android/java/org.apache.cordova/media/AudioPlayer
// 修改 startRecording 方法
this.recorder.setAudioSource(MediaRecorder.AudioSource.MIC); this.recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); this.recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
// 在录音中,iOS扩展名为m4a,Android扩展名为mp4
  1. jpush 推送,测试环境可以收到通知,生产环境收不到通知。这种基本上都是在xcode 9以后出现的。 做如下检查: 找到 TARGET -> Capabilities -> Push Notification 选项点开 找到Entitlements-Release.plist (位置在ios/{工程名}/文件夹内)文件,看看有没有 aps-environment 字段,没有补上。
<plist version="1.0">
<dict>
    <key>aps-environment</key>
    <string>development</string>
</dict>
</plist>
  1. mint ui swipe 组件,当出现两张图同时显示时,并且不再滚动。解决方案如下:
// 1. 在 swipe 上添加  ref="swipe"
// 2. 在需要的地方使用下面的代码
this.$refs.swipe.next()
  1. mint ui loadmore 组件,当一个手指向下滑动,另一个手指点击页面的时候,如果此时,页面停住了,并且上边出现下拉刷新,解决方案如下。
搜索在 mint-ui 的loadmore源文件中找到 handleTouchEnd ,记得写event进去
handleTouchEnd: function handleTouchEnd(event) {...}
然后在down和up两个事件中加入 我标注的红字即可!

if (this.direction === 'down' && this.getScrollTop(this.scrollEventTarget) === 0 && this.translate > 0) {
event.preventDefault();
event.stopPropagation();
...
if (this.direction === 'up' && this.bottomReached && this.translate < 0) {
event.preventDefault();
event.stopPropagation();
...
  1. localstroage 在iOS内不可靠,因为OS会在内存不足时清理。因此,要实现永久存储数据,如果是简单的数据的话可以用cordova-plugin-nativestorage 这个插件代替。还有一个要注意的地方是,ios内多线程执行,因此最好注意顺序。如果getItem获取不到值的话,是会进入error函数内
展开阅读全文
打赏
0
1 收藏
分享
加载中
更多评论
打赏
0 评论
1 收藏
0
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部