cordova使用入门教程
Apache Cordova是一个开源的移动开发框架。允许你用标准的web技术-HTML5,CSS3和JavaScript做跨平台开发。 应用在每个平台的具体执行被封装了起来,并依靠符合标准的API绑定去访问每个设备的功能,比如说:传感器、数据、网络状态等。如果你想做app而又不想请原生工程师,那么这是一个不错的选择,话不多说我们接下来开启cordova学习之路
1.首先你需要安装一个node https://nodejs.org/en/download/ node下载地址 下载安装一下就可以了
查看node版本
node -v
image.png
现在node已经安装成功了
2.接下来需要安装cordova,打开命令行输入
npm install -g cordova
安装完输入
cordova -v
现在cordova已经安装成功了
3.安装完cordova就可以开始你的第一个项目了,找到你的工作文件夹,接下来创建一个 名字为testdemo的文件夹,项目名字为TestDemo,包名为com.yourname.testdemo的Cordova项目,然后进入到项目
cordova create testdemo com.yourname.testdemo TestDemo
cd testdemo
4.这个时候你的项目已经创建完毕,你需要安装ios和android平台
安装ios平台,你需要一个xcode,之后的打包也是需要的
cordova platform add ios
安装android平台
cordova platform add android
//这里安装平台的时候是安装的最新平台 最新平台修改了目录结构 但是大部分插件都没有修改 所以我建议大家安装6.3.0以下的平台
cordova platform add android@6.2.3 用来指定平台版本
5.添加安卓环境 需要安装java jdk 和安卓SDK
JAVA JDK
- 安装[JAVA JDK]
地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html)
我们可以看到下方有两个JAVA JDK 一个是是最新版的 一个不是最新的
我安装了最新版的以后(并且配置了环境变量 在cordova build android的时候报了错误,大概意思是版本不支持 我卸载了最新版的 下载了第二个也就是 Java SE 8u171/8u172 然后就可以了 这里有个小坑)
image.png
安装完成以后我们打开命令行输入JAVAC 可以看到如下图 不是内部命令 是因为我们没配置环境变量
1524300052(1).png
- 打开我的电脑--属性--高级--环境变量
(1).新建系统变量JAVA_HOME,变量名:JAVA_HOME ,变量值:C:\Program Files\Java\jdk1.8.0_171
(2).新建系统变量CLASSPATH,变量名:CLASSPATH ,变量值:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;
(3).选择“系统变量”中变量名为“Path”的环境变量,双击该变量,在原来变量后追加 %JAVA_HOME%\bin
(4).选择“系统变量”中变量名为“Path”的环境变量,双击该变量,在原来变量后追加 %JAVA_HOME%\jre\bin我们再次打开命令行输入“JAVAC”,输出帮助信息即为配置正确。如图:
1524300487(1).png
ANDROID SDK
- 安装[ANDROID SDK]
下载Android Studio并安装(官方文档说 仅安装 Android Stand-alone SDK 也可。但是我试过并不可以,会出下面的错误 说你没有 gradle)
T$FK51TG57I(PYG5P7A4C{B.png
打开android studio 点击file/settings/appearance&behavior/system settings/android SDK 在这里可以看到你的SDK地址 把它复制下来
1524377624(1).png
2 打开我的电脑--属性--高级--环境变量
新建系统变量ANDROID_HOME,变量名:ANDROID_HOME ,变量值:你刚才复制的内容
在path环境变量加追加:
%ANDROID_HOME%\tools
%ANDROID_HOME%\platform-tools
3 打开命令行 输入adb 出来信息就可以了
PS:我第一次运行cordova build android 可以看到正在下载gradle 如下图
1524375663(1).png
PS:然后我安装的平台是 7.0.0 可以看到需要android-26支持 但是我安装的27
1524378052(1).png
image.png
这个时候我们如果打包的话就会报错了
1524378231(1).png
还有就是我们现在用安卓7.0.0的平台的话 有些插件是安装不了的 如果需要安装插件的话 就要降低android版本 我这里用的是android6.2.3 需要的是android-25
那么我们就去下载一下SDK吧 把你需要的勾选上 然后点击OK就可以了
1524378428(1).png
PS:如果你安装了androidstuido 还是包gradle的错误那你需要手动去下载
gradle-x.x-bin.zip (x.x代表版本)
根据需要下载某一版本
地址:
(https://services.gradle.org/distributions)
添加环境变量
PATH=D:\gradle-x.x\bin
关闭cmd或powershell窗口
重新打开,输入gradle -v,查看gradle安装成功与否
6. 查看平台,删除平台
cordova platforms list
cordova platform rm 平台名字
7.删除插件 安装插件
cordova plugin rm 插件名字
cordova plugin add 插件名字
8. QQ登录 微信登录 支付宝支付 crosswalk插件 以下插件是我经常用到的
//YOUR_QQ_APPID, YOUR_WECHAT_APPID, your AppId 是你在QQ互联 微信开放平台 以及支付宝申请的appid
1.QQ登录 cordova plugin add cordova-plugin-qqsdk --variable QQ_APP_ID=YOUR_QQ_APPID
2.微信登录 cordova plugin add cordova-plugin-wechat --variable wechatappid=YOUR_WECHAT_APPID
3.支付宝支付 cordova plugin add cordova-plugin-alipay-v2 --variable APP_ID=[your AppId]
4.crosswalk插件 cordova plugin add cordova-plugin-crosswalk-webview
5.在android目录下assects目录下添加一个没有后缀名的文件 名字是xwalk-command-line 内容是xwalk --ignore-gpu-blacklist
6.在打包的时候 如果两个程序包名一样 不安装cordova-plugin-crosswalk-webview 插件的APK是不能覆盖安装有此插件的APK
7.版本插件 cordova plugin add cordova-plugin-app-version
8.启动页插件 cordova plugin add cordova-plugin-splashscreen
9.获取手机Mac地址 cordova plugin add com-badrit-macaddress
10.系统插件 cordova plugin add cordova-plugin-device
11.系统键盘插件 cordova plugin add ionic-plugin-keyboard
11.字体插件cordova plugin add cordova-plugin-fonts
如果你需要其他的插件可以到 http://cordova.axuer.com/plugins/ 里面搜索 里面还有js代码直接复制粘贴就可以
9. 解决Could not resolve org.xwalk:xwalk_core_library:23 .打包失败问题
参考地址 https://stackoverflow.com/questions/36654990/error-building-xwalk-with-cordova-android
打开platforms\ android \ cordova-plugin-crosswalk-webview \ eqp-xwalk.gradle
把这个:
dependencies {
xwalkSpec
}
改为这一个:
dependencies {
compile 'org.xwalk:xwalk_core_library:23.53.589.4' //xwalkSpec
}
10.解决 In <declare-styleable> FontFamilyFont, unable to find attribute android:font 抱错
1527662814(1).png打开打开platforms\ android \build.gradle
在 dependencies {...}代码下面添加以下代码
// ADDED THESE LINES
configurations.all {
resolutionStrategy.force 'com.android.support:support-v4:26+'
}
11.cordova各个文件
项目的文件
image.png
hooks文件夹没有什么用 不可以改动
node_nodeule文件夹不可以改动
platforms文件夹是你的平台代码
plugins文件夹里面是一些插件
res是你存放icon和启动页的文件夹
www里面就是你的代码啦
.npmignore文件时忽略文件没用
build.json是我写的json文件下面介绍打包的时候再提
config.xml这个文件是最重要的 里面是一些配置信息
package.json和package-lock.json不用动 是自动生成的配置文件
release-key.keystore文件是打包正式安装包的需要的签名文件
12.cordova里面的config.xml
<?xml version='1.0' encoding='utf-8'?>
//这里的id是你创建项目的时候写的包名 可以随便写 但是还是语义化一点比较好
//如果是ios平台这个是bundle_id bundle_id是在苹果开发者中心申请的,不可以随便写 必须填写你申请的
//包名和bundle_id是判断你APP的唯一标识
<widget id="com.yourname.testdemo" version="1.0.0" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
//app名称
<name>TestDemo</name>
//app描述 填不填都可以
<description>
cordova demo
</description>
//作者
<author email="141204xxxx@qq.com" href="http://cordova.io">
MY TEAM
</author>
//这里是你的app页面入口 也就是在WWW文件夹下的html
//比如你想定入口在html文件夹下的guide.html 应该填写html/guide.html
<content src="index.html" />
//下面的没有研究 自带的
<access origin="*" />
<allow-intent href="http://*/*" />
<allow-intent href="https://*/*" />
<allow-intent href="tel:*" />
<allow-intent href="sms:*" />
<allow-intent href="mailto:*" />
<allow-intent href="geo:*" />
//接下来是平台代码了
<platform name="android">
<allow-intent href="market:*" />
//icon app图标 在res文件夹下
<icon density="ldpi" src="res/icon/android/36.png" />
<icon density="mdpi" src="res/icon/android/48.png" />
<icon density="hdpi" src="res/icon/android/72.png" />
<icon density="xhdpi" src="res/icon/android/96.png" />
<icon density="xxhdpi" src="res/icon/android/144.png" />
<icon density="xxxhdpi" src="res/icon/android/192.png" />
//icon app图标 在res文件夹下
<splash density="land-hdpi" src="res/screen/android/800-480.png" />
<splash density="land-ldpi" src="res/screen/android/320-200.png" />
<splash density="land-mdpi" src="res/screen/android/480-320.png" />
<splash density="land-xhdpi" src="res/screen/android/1280-720.png" />
<splash density="port-hdpi" src="res/screen/android/480-800.png" />
<splash density="port-ldpi" src="res/screen/android/200-320.png" />
<splash density="port-mdpi" src="res/screen/android/320-480.png" />
<splash density="port-xhdpi" src="res/screen/android/720-1280.png" />
</platform>
//这是一些配置
//app强制竖屏portrait 横屏是landscape
<preference name="orientation" value="portrait" />
<preference name="SplashScreen" value="screen"/>
<preference name="SplashScreenDelay" value="0"/>#显示时间
<preference name="AutoHideSplashScreen" value="false"/>#禁止自动隐藏
<preference name="FadeSplashScreen" value="false"/>#禁用淡出效果
<preference name="SplashMaintainAspectRatio" value="true" />#图像cover屏幕
<preference name="ShowSplashScreenSpinner" value="false" />#隐藏加载灰圈
<preference name="SplashShowOnlyFirstTime" value="false" />#每次重新启动都显示
//Fullscreen设置程序是否全屏。全屏时状态栏将不可见,默认为false显示状态栏。
<preference name="Fullscreen" value="false" />
//info.plist文件配置信息 在ios平台才需要 不然在iTunes content上传构建版本的时候会被拒绝
//我就被拒绝过 邮件内容是The app's Info.plist must contain an NSPhotoLibraryUsageDescription key with a string value explaining to the user how the app uses this data
<edit-config file="*-Info.plist" mode="merge" target="NSCameraUsageDescription">
<string>允许访问用于上传和发送照片</string>
</edit-config>
<edit-config file="*-Info.plist" mode="merge" target="NSPhotoLibraryUsageDescription">
<string>允许访问用于上传和发送照片</string>
</edit-config>
<edit-config file="*-Info.plist" mode="merge" target="NSLocationWhenInUseUsageDescription">
<string>允许访问位置信息</string>
</edit-config>
<edit-config file="*-Info.plist" mode="merge" target="NSPhotoLibraryAddUsageDescription">
<string>允许访问用于上传和发送照片</string>
</edit-config>
//插件信息
<plugin name="cordova-plugin-whitelist" spec="^1.3.2" />
<plugin name="cordova-plugin-alipay-v2" spec="0.0.4">
<variable name="APP_ID" value="[xxxxxxxxxxx]" />
</plugin>
<plugin name="com-badrit-macaddress" spec="https://github.com/mohamed-salah/MacAddress.git" />
<plugin name="cordova-plugin-wechat" spec="^2.1.0">
<variable name="WECHATAPPID" value="xxxxxxxxxxxx" />
</plugin>
<plugin name="cordova-plugin-qqsdk" spec="^0.9.6">
<variable name="QQ_APP_ID" value="xxxxxxxxxx" />
</plugin>
<plugin name="cordova-plugin-crosswalk-webview" spec="^2.4.1">
<variable name="XWALK_VERSION" value="23+" />
<variable name="XWALK_LITEVERSION" value="xwalk_core_library_canary:17+" />
<variable name="XWALK_COMMANDLINE" value="--disable-pull-to-refresh-effect" />
<variable name="XWALK_MODE" value="embedded" />
<variable name="XWALK_MULTIPLEAPK" value="true" />
</plugin>
<plugin name="cordova-plugin-device" spec="^2.0.1" />
<plugin name="cordova-plugin-splashscreen" spec="^5.0.2" />
<plugin name="cordova-plugin-app-version" spec="^0.1.9" />
<plugin name="cordova-plugin-camera" spec="^4.0.2" />
<plugin name="cordova-plugin-compat" spec="^1.2.0" />
//平台版本
<engine name="android" spec="^6.2.3" />
</widget>
13. 解决ios状态栏被覆盖问题 修改Class文件夹 MainViewController.m
因为测试的时候发现苹果5状态栏被覆盖了 所以修改以下代码
把
- (void)viewWillAppear:(BOOL)animated
{
// View defaults to full size. If you want to customize the view's size, or its subviews (e.g. webView),
// you can do so here.
[super viewWillAppear:animated];
}
替换为
- (void)viewWillAppear:(BOOL)animated
{
// View defaults to full size. If you want to customize the view's size, or its subviews (e.g. webView),
// you can do so here.
if([[[UIDevice currentDevice]systemVersion ] floatValue]>=7)
{
CGRect viewBounds=[self.webView bounds];
viewBounds.origin.y=20;
viewBounds.size.height=viewBounds.size.height-20;
self.webView.frame=viewBounds;
}
[super viewWillAppear:animated];
}
-(void)viewWillDisappear:(BOOL)animated
{
if([[[UIDevice currentDevice]systemVersion ] floatValue]>=7)
{
CGRect viewBounds=[self.webView bounds];
viewBounds.origin.y=20;
viewBounds.size.height=viewBounds.size.height+20;
self.webView.frame=viewBounds;
}
[super viewWillDisappear:animated];
}
14. 解决ios页面上下滚动问题 把以下代码添加到config文件
<preference name="WebViewBounce" value="false" />
<preference name="DisallowOverscroll" value="true" />
15. android项目在config文件里修改包名的时候一定要删除平台再安装一次
16. ios项目每一次打包都需要删除平台再安装一次 防止代码没有更新
17.打包debug APK android
打开命令行 cd到你的项目中
cordova build android
image.png
这样打包就成功了 红圈的地方是你的安装包地址 因为我用了crosswolk插件 所以会有两个安装包 你们用armv7就可以
18.打包正式包
PS:上一步是debug安装包 是测试用的 签名是自生成的 不可以用来正式发布的 因为他的签名是根据电脑生成的也就是说你换了电脑就不能用了 正式安装包有签名文件 也就是前面说的keystore文件为你的安装包生成签名 只要keystroe文件一样 你的签名就不会变化
PS: 包名是APK的唯一标识 用来识别是不是同一个APK 而签名呢我的理解代表的开发者 包名一样的可以覆盖安装 包名不一样的不可以覆盖安装
//首先生成一个keystroe签名文件 这个keystroe不能丢失要保存好 我上次试了一次重新生成keystroe文件结果发现文件不同
keytool -genkey -v -keystore release-key.keystore -alias cordova-demo -keyalg RSA -keysize 2048 -validity 10000
//上面的命令意思是,生成一个 release-key.keystore 的文件,别名(alias)为 cordova-demo 。(validity)期限10000天
//过程中会要求设置 keystore 的密码和 key 的密码。我们分别设置为 123456 和 123456。这四个属性要记牢,下一步有用。
//生成一个正式安装包
cordova build android --release
//对这个安装包签名
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore release-key.keystore platforms/android/build/outputs/apk/android-armv7-release-unsigned.apk mgc
//为了以后不必这么麻烦 我们可以在项目中创建一个json文件 前面提到的build.json文件
{
"android": {
"release": {
"keystore": "release-key",//keystroe文件名
"alias": "cordova-demo",//项目别名
"storePassword": "123456",//密码
"password": "123456"//密码
}
}
}
下次就可以直接用 cordova build --release 了。
image.png
image.png
我们可以看到它调用了你的build.json文件和你的keystore文件 会直接给你生成一个签好名的正式安装包了
文章推荐:https://segmentfault.com/a/1190000005177715 这个感觉更详细一些
19.最痛苦的来了 打包苹果安装包 ipa 文件
下面是mac上打包ios包的步骤(从申请账号到app store应用上架)
1. 申请ios开发者账号
开发者账号分类
6788994-041bd44dd3065f8b.png
如果是个人账号发布的应用,App Store开发者的位置显示的是开发者个人的名字,而公司账号则可以显示公司的名字,现在App Store上的应用一般都是公司账号。
企业账号比较特殊,发布的安装包可以安装到任何设备上,但是不能发布到App Store。一般一些企业内部的应用都使用这种账号,想开发什么就开发什么,不用担心苹果审核机制的问题。
接下来的账号申请,参考https://www.jianshu.com/p/9b994a019ee6 很详细。
到这里账号已经申请下来了,我的是$99的公司级开发账号。
2. 打开苹果开发网站 https://developer.apple.com/ ,点击Account,登录你的开发者账号
3. 进入 Certificates, Identifiers & Profiles
4. 添加证书
6788994-580cb124448d2359.png6788994-90c1c835d95fe1de.png
这四个证书是一个一个添加的,如果你的app 有推送 则需要弄添加那两个推送的证书,没有就不用管,只添加那两个app发布证书即可。
两次continue之后,看到如下图界面 choosefile
6788994-32bf564088ce2467.png接下来回到桌面,打开钥匙串,获取CSR文件。
6788994-0dacdc0af2efc91a.png 6788994-eae345b11286ddc9.png继续后,有弹框提示存储位置,存在能找到的地方后回到刚才请求发布证书的页面,choose file 选择刚才的文件,然后点击continue。然后如下如界面,点击download,下载下来后找到该文件,双击,则自动添加到你电脑的钥匙串中了。
6788994-c7fc4fa2582ea03d.png5.创建App IDs和绑定你的App的BundleIdentifier
6788994-8988d4171137ed39.png 6788994-9ec70ccea9f0b54f.png注:你填写的bundle ID 有可能已经被注册过了,那么你需要自行修改一个,但如果这里改了,记得代码的config.xml文件里也要改!
下面勾选上你app用到的服务,比如推送,没有的话直接下一步下一步就好。
6788994-638b813627da4452.png
6.生成描述文件(描述文件的作用就是把证书和BundleIdentifier关联起来)
6788994-456201b1dcda06d9 (1).png1524102088(1).png
1524102253(1).png这里我们先选 Ad Hoc 选择APPid
1524102253(1).png选择你创建好的证书
1524102492(1).png因为我们选的 是 Ad Hoc 这个是为测试设备创建的 也就是说 我们需要选择udid 这个udid可以在devices里面添加 这有添加了你手机的udid之后 ,你的手机才可以安装APP
然后 是上传到APP strore 的描述文件, 没有截图了,口述吧:
a) 还是先选择 app id
b) 选择你刚创建的发布证书
c) 在Profile Name栏里输入一个文件名字 下载下来 ,双击,就自动添加到你电脑的钥匙串中了。这里必须要放到钥匙串中不然你是用不了得
7. 将在windows上写的代码 移植到mac上,通过拷贝或者git下载。放入到www文件夹下
8.打开命令行 进入到你的项目 然后重新平台 安装平台 (为保证代码得到更新)
9.然后进入到你的项目文件夹 邮件以Xcode打开platforms/ios/xxxx.xcodeproj文件
10.接下来我们配置一下基础信息 就可以打包了(我也不是搞IOS开发的 配置可能不太详细 或者什么地方有误) 我是参考的这篇文章https://www.jianshu.com/p/749322c7b01a 大家可以看一下
QQ图片20180419155024.png
QQ图片20180419155940.jpg1 Display Name 是你的项目名称 在config.xml写好的
2 Bundle identifier 是你的在开发者中心申请的 在config.xml写好的
3 version build 是你的版本信息 在config.xml写好的
4 上面的信息是我在config文件里面配置好的 自动带过来的
5 sign(debug)和sign(release)选择你下载好的描述文件
5 xcode 8.0以后点击Signing 小方块选项可以自动配置你的证书
6 打包时上面的小锤子一定要选择Generic iOS Device
QQ图片20180419161126.jpg7 如果你的app需要什么照相机 但是提示是英文的 你可以点击info 把其中的English改为China
8 接下来我们可以点击上面的product/Archive 进行打包了
这里 我们可以选择导出或者上传到APPstore(Export或者Upload to APP Store)
9 当我们导出的时候 弹出下面的图 第一个是导出上传 APP Store的包 第二个则是你的设备测试包 也就是你添加的udid的手机可以安装测试的
1524102088(1).png还记不记得下面这张图
你选择的描述文件时 上传APP Store的 你就导出APP Store的包
你选择的是Ad Hoc的描述文件 你就导出Ad Hoc的包
PS:https://icon.wuruihong.com/ 一个一键生成各种尺寸网站