返回博客
前端
2017-05-0114 min

使用vue2.0和cordova开发手机应用跨域问题记录

最近一直在练习使用vue2,恰巧在酷安有一款安卓开发者开发的重制知乎日报,受到一些启发,知乎日报是我很喜欢的应用,在网上找到别人整理的知乎日报接口,就想着用vue也写一个自己的知乎日报,在使用cordova打包成apk。 原来vue项目我使…

使用vue2.0和cordova开发手机应用跨域问题记录

最近一直在练习使用vue2,恰巧在酷安有一款安卓开发者开发的重制知乎日报,受到一些启发,知乎日报是我很喜欢的应用,在网上找到别人整理的知乎日报接口,就想着用vue也写一个自己的知乎日报,在使用cordova打包成apk。

原来vue项目我使用的请求接口插件是vue-resource,但现在官方推荐的axios,在这里我也打算使用axios.

在vue可以使用axios + vue-axios,可以像原来的方法一样使用ajax了。

开发过程中我遇到的最大的一个问题就是跨域了。

因为是第三方接口不支持cors,我想用jsonp试一下,但axios又不支持jsonp,我就使用了jQuery的getJSON()方法,很不幸接口并不支持JSONP.

我在网上找了一下,发现已经有前辈做过用vue 1和这个接口开发的知乎日报了,他使用的是用node转发这个接口。我也尝试这么做,在本地运行时我可以获取到接口中的数据,但当我将node文件部署到heroku上后,使用postman测试接口并不成功。后端知识有限也不知道问题出在哪。 我自己的接口测试

这是他的接口,发现使用了nginx 别人的接口 在github上问了一下,他只说可以使用nginx访问他的接口,但我是想我的接口能用,但我对nginx的使用仅限于本地开发时反向代理接口,对服务器端使用nginx实在不了解,而且我想是不是在自己的服务器才能使用nginx呢?这方面以后要学。

跨域问题困扰很久,但前两天晚上上床睡觉前,突然想到,我是想开发成一个apk应用,而跨域问题是在浏览器中存在的,那么问题来了,用cordova开发的应用还用考虑跨域吗?赶紧去了解了一下,不出所料通过白名单配置是可以不受跨域影响的。 试验了一下,成功! config文件中

text
<plugin name="cordova-plugin-whitelist" spec="1" />
    <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:*" />

其中'<access origin>'标签表示域限制设置," * "表示可以访问外部服务器。

index.html中修改<meta>标签改变csp(内容安全策略),就可访问所有外部资源了。

text
<meta http-equiv="Content-Security-Policy" content="default-src * 'self' 'unsafe-inline';img-src * 'self' data:;font-src 'self' data:">

修改图标和启动画

安装splashscreen插件

text
cordova plugin add cordova-plugin-splashscreen 

基本配置

然后在config.xml文件中,添加以下代码

text
<platform name="android">  
    <icon density="ldpi" src="res/icon/android/drawable-ldpi/icon.png" />
    <icon density="mdpi" src="res/icon/android/drawable-mdpi/icon.png" />
    <icon density="hdpi" src="res/icon/android/drawable-hdpi/icon.png" />
    <icon density="xhdpi" src="res/icon/android/drawable-xhdpi/icon.png" />
    <icon density="xxhdpi" src="res/icon/android/drawable-xxhdpi/icon.png" />
    <!-- 以下是欢迎页面,可根据需要进行添加 -->
    <splash density="land-hdpi" src="res/screen/android/splash-land-hdpi.png" />  
    <splash density="land-ldpi" src="res/screen/android/splash-land-ldpi.png" />  
    <splash density="land-mdpi" src="res/screen/android/splash-land-mdpi.png" />  
    <splash density="land-xhdpi" src="res/screen/android/splash-land-xhdpi.png" />  
    <splash density="port-hdpi" src="res/screen/android/splash-port-hdpi.png" />  
    <splash density="port-ldpi" src="res/screen/android/splash-port-ldpi.png" />  
    <splash density="port-mdpi" src="res/screen/android/splash-port-mdpi.png" />  
    <splash density="port-xhdpi" src="res/screen/android/splash-port-xhdpi.png" />  
</platform>  
<platform name="ios">  
    <!-- iOS 8.0+ -->  
    <!-- iPhone 6 Plus  -->  
    <icon src="res/icon/ios/icon-60@3x.png" width="180" height="180" />  
    <!-- iOS 7.0+ -->  
    <!-- iPhone / iPod Touch  -->  
    <icon src="res/icon/ios/icon-60.png" width="60" height="60" />  
    <icon src="res/icon/ios/icon-60@2x.png" width="120" height="120" />  
    <!-- iPad -->  
    <icon src="res/icon/ios/icon-76.png" width="76" height="76" />  
    <icon src="res/icon/ios/icon-76@2x.png" width="152" height="152" />  
    <!-- iOS 6.1 -->  
    <!-- Spotlight Icon -->  
    <icon src="res/icon/ios/icon-40.png" width="40" height="40" />  
    <icon src="res/icon/ios/icon-40@2x.png" width="80" height="80" />  
    <!-- iPhone / iPod Touch -->  
    <icon src="res/icon/ios/icon.png" width="57" height="57" />  
    <icon src="res/icon/ios/icon@2x.png" width="114" height="114" />  
    <!-- iPad -->  
    <icon src="res/icon/ios/icon-72.png" width="72" height="72" />  
    <icon src="res/icon/ios/icon-72@2x.png" width="144" height="144" />  
    <!-- iPhone Spotlight and Settings Icon -->  
    <icon src="res/icon/ios/icon-small.png" width="29" height="29" />  
    <icon src="res/icon/ios/icon-small@2x.png" width="58" height="58" />  
    <!-- iPad Spotlight and Settings Icon -->  
    <icon src="res/icon/ios/icon-50.png" width="50" height="50" />  
    <icon src="res/icon/ios/icon-50@2x.png" width="100" height="100" />  
    <!-- 以下是欢迎页面,可根据需要进行添加 -->
    <splash src="res/screen/ios/Default~iphone.png" width="320" height="480"/>  
    <splash src="res/screen/ios/Default@2x~iphone.png" width="640" height="960"/>  
    <splash src="res/screen/ios/Default-Portrait~ipad.png" width="768" height="1024"/>  
    <splash src="res/screen/ios/Default-Portrait@2x~ipad.png" width="1536" height="2048"/>  
    <splash src="res/screen/ios/Default-Landscape~ipad.png" width="1024" height="768"/>  
    <splash src="res/screen/ios/Default-Landscape@2x~ipad.png" width="2048" height="1536"/>  
    <splash src="res/screen/ios/Default-568h@2x~iphone.png" width="640" height="1136"/>  
    <splash src="res/screen/ios/Default-667h.png" width="750" height="1334"/>  
    <splash src="res/screen/ios/Default-736h.png" width="1242" height="2208"/>  
    <splash src="res/screen/ios/Default-Landscape-736h.png" width="2208" height="1242"/>  
</platform>

其他配置

自动隐藏启动页面AutoHideSplashScreen(默认为:true)

text
<preference name="AutoHideSplashScreen" value="true" />

显示启动页面的时间长度SplashScreenDelay(默认为:3000)

text
<preference name="SplashScreenDelay" value="3000" />

若想禁用启动页面,可设置为:

text
<preference name="SplashScreenDelay" value="0"/>

如果是iOS平台上想禁止启动页面,还需要添加

text
<preference name="FadeSplashScreenDuration" value="0"/>

启动页面淡入淡出的效果 是否显示淡入淡出效果FadeSplashScreen(默认为:true)

text
<preference name="FadeSplashScreen" value="false"/>

淡入淡出效果的执行时间长度FadeSplashScreenDuration(默认为:500)

text
<preference name="FadeSplashScreenDuration" value="750"/>

注意:FadeSplashScreenDuration时间是包含在SplashScreenDelay的时间里的。 启动页面是否允许旋转(默认为:true)

text
<preference name="ShowSplashScreenSpinner" value="false"/>

插件还可以通过js代码调用,提供有以下两个方法: navigator.splashscreen.hide();//隐藏启动页面 navigator.splashscreen.show();//显示启动页面 在Android平台下的特殊设置

text
<preference name="SplashMaintainAspectRatio" value="true|false" />
<preference name="SplashShowOnlyFirstTime" value="true|false" />

SplashMaintainAspectRatio:选填项,默认为false。当设置为true时,则不会拉伸图片来填充屏幕,会以图片原始比例显示图片。 SplashShowOnlyFirstTime:选填项,默认为true。当设置为false时,APP通过navigator.app.exitApp()代码退出app后,在下次打开APP时,还会显示启动页面。若为true时,就不会出现。

注:

安卓图标具体规格如下(存放目录:res/icon/android/)

text
36*36 drawable-ldpi/icon.png
48*48 drawable-mdpi/icon.png
72*72 drawable-hdpi/icon.png
96*96 drawable-xhdpi/icon.png
144*144 drawable-xxhdpi/icon.png

iOS图标具体规格如下(存放目录:res/icon/ios/)

text
57*57 icon.png
114*114 icon@2x.png
29*29 icon-small.png
58*58 icon-small@2x.png
40*40 icon-40.png
80*80 icon-40@2x.png
50*50 icon-50.png
100*100 icon-50@2x.png
60*60 icon-60.png
120*120 icon-60@2x.png
180*180 icon-60@3x.png
72*72 icon-72.png
144*144 icon-72@2x.png
76*76 icon-76.png
152*152 icon-76@2x.png

应用程序启动页面 安卓启动画面具体规格如下(存放目录:res/screen/android/)

text
960*720 splash-land-xhdpi.png
640*480 splash-land-hdpi.png
470*320 splash-land-mdpi.png
426*320 splash-land-ldpi.png
720*960 splash-port-xhdpi.png
480*640 splash-port-hdpi.png
320*470 splash-port-mdpi.png
320*426 splash-port-ldpi.png

iOS启动画面具体规格如下(存放目录:res/screen/ios/)

text
320*480 Default~iphone.png
640*960 Default@2x~iphone.png
768*1024 Default-Portrait~ipad.png
1536*2048 Default-Portrait@2x~ipad.png
1024*768 Default-Landscape~ipad.png
2048*1536 Default-Landscape@2x~ipad.png
640*1136 Default-568h@2x~iphone.png
750*1334 Default-667h.png
1242*2208 Default-736h.png
2208*1242 Default-Landscape-736h.png
vue