PhoneGap Hybrid APP 开发实战(2):Framework7 + Vue.js模板

上一篇:PhoneGap Hybrid APP 开发实战(1):第一个 Android APK
注:绘本内容有版权,不会公开。只讨论开发过程。

关键字:PhoneGap Hybrid Framework7 Vue 打包 CrossWalk插件 TV插件 Media插件 适配Android4

中间有不少坑啊。。。还好,终于趟完了。现在第一个实用的英语绘本apk已经上线:手机、电视安卓盒子都能用,支持电视遥控器。

最终完成图:

Paste_Image.png
Paste_Image.png

推荐的 Framework7+Vue.js 模板:cordova-template-framework7-vue-webpack

$ npm i phonegap -g
$ phonegap create <project_dir> --template cordova-template-framework7-vue-webpack
$ phonegap platform add android browser ios

我们先来看看这个模板的结构:

  1. 创建
c:\git>phonegap create pg_vue_demo --template cordova-template-framework7-vue-webpack
Creating a new cordova project.
  1. 安装依赖
c:\git\pg_vue_demo>npm install
C:\git\pg_vue_demo>npm i
npm WARN prefer global node-gyp@3.6.1 should be installed with -g
 node-sass@4.5.2 install C:\git\pg_vue_demo\node_modules\node-sass
 node scripts/install.js
Downloading binary from https://github.com/sass/node-sass/releases/download/v4.5.2/win32-x64-48_binding.node
Download complete  ] - :
Binary saved to C:\git\pg_vue_demo\node_modules\node-sass\vendor\win32-x64-48\binding.node
Caching binary to C:\Users\Yan\AppData\Roaming\npm-cache\node-sass\4.5.2\win32-x64-48_binding.node

 node-sass@4.5.2 postinstall C:\git\pg_vue_demo\node_modules\node-sass
 node scripts/build.js
Binary found at C:\git\pg_vue_demo\node_modules\node-sass\vendor\win32-x64-48\binding.node
Testing binary
Binary is fine
helloworld@1.0.0 C:\git\pg_vue_demo
...
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@^1.0.0 (node_modules\chokidar\node_modules\fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.1.1: wanted {"os":"darwin","arch":"any"} (current: {"os":"win32","arch":"x64"})
npm WARN uglifyjs-webpack-plugin@0.3.1 requires a peer of uglify-js@^2.8.0 but none was installed.
npm WARN helloworld@1.0.0 No repository field.

检查一下uglify-js的版本,如果是3.0+,反而会报错,安装低一的版本:

npm install uglify-js@^2.8.0
  1. 首次运行

命令phonegap run browser -- --lr可以实现开发阶段热替换!直接在Chrome浏览器中快速调试。

$ phonegap platform add browser android
C:\git\pg_vue_demo>phonegap platform add android
Adding android project...

Creating Cordova project for the Android platform:
        Path: platforms\android
        Package: com.phonegap.helloworld
        Name: helloworld
        Activity: MainActivity
        Android target: android-25
Subproject Path: CordovaLib
Android project created with cordova-android@6.1.2
Installing "cordova-plugin-whitelist" for android
               This plugin is only applicable for versions of cordova-android greater than 4.0. If you have a previous platform version, you do *not*
need this plugin since the whitelist will be built in.
Before deploy hook started...
Checking is node modules installed...

Node modules already installed.
Cordova hook completed. Resuming to run your cordova command...

$ phonegap run browser -- --lr
[phonegap] executing 'cordova platform add --save browser' ...

这时,打开Chrome浏览器:http://localhost:8000/ -> Done! 漂亮的demo界面出现了!试用一下,是不是工作正常?

Paste_Image.png

可以直接加入script to /package.json,以后直接npm run dev就行:

"scripts": {
        "dev": "echo \"check http://127.0.0.1:8081/\" && phonegap run browser -- --lr"
    }, 
  • 调试方法1:如上,Chrome -> F12 -> 打开调试窗口

  • 调试方法2:Phonegap Desktop(不能热更新)

  • 打开Phonegap Desktop桌面版

  • 把我们的项目目录,拖动到Phonegap Desktop

Paste_Image.png
  • 会变成绿色,点击http://<IP>:3000,会自动运行
  • 手机端运行Phonegap App,输入地址:http://<IP>:3000
  • Bingo!手机端也可以正常预览了,而且已经是原生App层面的预览了!
  • 桌面端能实时看到交互:
Paste_Image.png
  • 调试方法2 - CLI:

  • 生成www目录:phonegap run browser,这个目录其实就是WebApp的生产输出了

  • CLI:phonegap serve,这个跟Phonegap Developer App效果一样

  • 根据CLI的提示地址,网页、手机都可以。在手机上打开Phonegap Developer App就行

  • 调试方法3 - Remote Debug:

    • 安卓真机,打开USB调试,USB连接电脑
    • phonegap run android
    • 等待1、2分钟,会自动打包,手机上会自动安装应用App
    • 手机上可以体验啦
    • 打开电脑Chrome: chrome://inspect/,连接手机
      Paste_Image.png
    • 可以同步调试:电脑上操作、手机上操作都可以,另外Console、Element也可以查看,非常有帮助
  • 目录结构:

傲游截图20170510221211.png

下一步,我们就要修改这些源文件,来实现我们的App!


静态static、资源文件assets

file-loader:
webpack学习笔记-2-file-loader 和 url-loader -
https://blog.csdn.net/qq_38652603/article/details/73835153

    module: {
      rules: [
        {test: /\.(png|jpe?g|gif)$/, loader: 'file-loader', options: {name: '[name].[ext]?[hash]'}},

vue里,访问static文件:
<img src="/static/aaa.png" alt="Vuetify.js" class="" />
aaa.png存放的目录为:
<project>/src/static/aaa.png

另一种方法:url-loader
webpack踩坑之路 (2)——图片的路径与打包 -
https://www.cnblogs.com/ghost-xyx/p/5812902.html
定义打包后的存放路径(/dist/images/)和文件名:
Webpack.config:

module: {
  loaders: [
    {
      test: /\.(png|jpg)$/,
      loader: 'url-loader?limit=8192&name=images/[hash:8].[name].[ext]'
    }
  ]
}

#publicPath
#output.publicPath 表示资源的发布地址,当配置过该属性后,
#打包文件中所有通过相对路径引用的资源都会被配置的路径所替换。
output: {
  path: 'dist',
  publicPath: '/assets/',
  filename: 'bundle.js'
}

JS:

var imgUrl = require('./images/bg.jpg'),
imgTempl = '<img src="'+imgUrl+'" />';
document.body.innerHTML = imgTempl;

以下是一些可能会遇到的坑,碰到问题记得回来搜一下:

android-minSdkVersion | Android Developers

https://developer.android.com/guide/topics/manifest/uses-sdk-element.html
Android 7.1 25
6.0 23
5.1 22
4.4 19
4.2 17
4.0 14

run android时报错:Error: Could not find gradle wrapper within Android SDK. Might need to update your Android SDK - Android

There appears to be a workaround though, which I just got to work on my machine. Here's what I did:
Download tools_r25.2.3-windows.zip from Android Downloads.
Extracted zip on desktop
Replaced C:\Users\username\AppData\Local\Android\sdk\tools with extracted sub-folder tools/
In project folder:
$ cordova platforms remove android
$ cordova platforms add android

Media插件,播放Android本地音频文件

web调试时,音频文件放入 /src/static/mp3/a1.mp3,然后引用就行
但打包到Android,路径会变化成:file:///data/user/0/com.adobe.phonegap.app/files/phonegapdevapp/www/static/mp3/a1.mp3

所以,在vue文件时判断一下device:

function getPhoneGapPath(device) {
  var path = window.location.pathname;
  var sizefilename = path.length - (path.lastIndexOf("/") + 1);
  path = path.substr(path, path.length - sizefilename);
  if (device.android) {
    path = 'file://' + path;
  }
  return path;
};
  var srcfile = 'a1.mp3';
   let src = '';
  src = getPhoneGapPath(device) + 'static/mp3/' + srcfile;
  console.log(JSON.stringify(device)); // Object to String
  console.log(' PATH: ' + src);
  var media = new Media(src);
  console.log(media);
  media.play();
})

打开了“pushState: true”功能,有时刷新会报错:

找不vue.common.js:522 TypeError: Cannot read property 'title' of undefined TypeError: Cannot read property 'addEventListener' of null
http://127.0.0.1:8081/#!//playPicBook/

这时,把地址栏 #后面的去掉,再刷新就行!
或者设置: pushStateOnLoad: false

安卓全屏:

config.xml -> to add:
<preference name="Fullscreen" value="true" />

判断手机横向还是竖向

原生:
window.screen.orientation
angle: 90/-90 横屏
angle: 0 竖屏

# html
                            <f7-grid>
                                <f7-col :width="orient==0 ? 50: 33">
                                    <f7-button open-panel="left">Left Panel</f7-button>
                                </f7-col>
                                <f7-col :width="orient==0 ? 50: 33">
                                    <f7-button open-panel="right">Right Panel</f7-button>
                                </f7-col>
                                <f7-col :width="orient==0 ? 50: 33">
                                    <f7-button open-panel="right">3rd col</f7-button>
                                </f7-col>
                            </f7-grid>
# vue.js
computed: {
  orient () {
    return window.screen.orientation.angle;
  }
}

Detect on smartphone change screen orientation
$$(window).on('orientationchange',function(e){ console.log(e.orientation)});

Cordova Screen Orientation Plugin: https://github.com/gbenvenuti/cordova-plugin-screen-orientation

function my_app_statusbar_toggle() {
    if ( My_App.device.statusBar && Mp_App.device.iphone ) {
        switch( window.orientation ) {
            case -90 :
            case 90 :
                if ( window.innerWidth >= 736 ) {
                    $$( 'html' ).removeClass( 'with-statusbar-overlay' );
                }
                break;
            default :
                if ( window.innerWidth >= 414 ) {
                    $$( 'html' ).addClass( 'with-statusbar-overlay' );
                }
                break;
        }
    }
}

window.addEventListener( 'orientationchange', function() {
    my_app_statusbar_toggle();
} );
window.addEventListener( 'load', function() {
    my_app_statusbar_toggle();
} );

APK位置(未签名)

$ C:\git\f7-vue-cord>phonegap run android自动打包成APK: \platforms\android\build\outputs\apk\android-debug.apk

对安卓盒子遥控器的支持

Android TV:cordova plugin add https://github.com/hughisaacs2/Cordova-Android-TV-Plugin.git
包含:上下左右键,OK键,返回键

Changing Build API level Android Studio

For android studio users:right click the App directorychoose the "module setting" optionchange the ADK Platform as what you need

下一篇: PhoneGap Hybrid APP 开发实战(3):用户登录 鉴权

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容