ionic开发App-问题收集总结
总结
使用ionic开发App算是告一段落了。使用前端的技术来统一移动端,不得不承认这个听起来很酷。JavaScript要统一世界的节奏。
然而现实并不是这样,使用ionic开发App虽然在开发速度上比原生开发快很多(有AngularJS的基础上,1~2个礼拜熟悉ionic框架,一个月左右做完App),但依然存在下面这个几个比较致命的问题:
- App流畅度不足,用户体验差。尤其是在Android4.4以下的手机,性能更是惨不忍睹。iOS上流畅度则相对会好很多。所以尽量控制每个页面的复杂度。
- 长列表性能不佳。这点在此次开发的App倒不是很明显,因为公司的业务并不涉及大量的数据展示。
- 可定制化不高。所有的行为都只能基于ionic框架的基础去实现,可玩性不高,难以实现个性化定制。
- 插件问题。在ionic中,跟原生设备打交道都只能通过cordova插件这一种方式。常用的几个基本插件都有了成熟的解决方法及用法,但是如果遇到比较冷门的需求,在没有找到插件的情况下,只能自己写插件或者考虑其他解决办法了。这次开发过程中就遇到了这个坑,App需要对接连连支付,后面还是在github上找到了一个连连支付插件,最后通过更改插件源代码才能用到App上,实现了对接连连支付。
虽然存在着致命缺点,但是依然不能忽略ionic的优点。每种技术存在都有其价值与市场。ionic最大的优点便是可以在低成本的情况下,快速地开发出一款并不是最完美但是依然可以使用的App。
下面便是在开发过程中所遇到的部分问题
ionic tab在Android中显示在顶部的解决方案
解决办法:
在 iOS中, tabs 一直处于底部. 在android中 ionic tabs 一直在顶部,如果要改我们可以通过配置$ionicConfigProvider。代码如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15.config(function($stateProvider, $urlRouterProvider,$ionicConfigProvider) {
$ionicConfigProvider.platform.ios.tabs.style('standard');
$ionicConfigProvider.platform.ios.tabs.position('bottom');
$ionicConfigProvider.platform.android.tabs.style('standard');
$ionicConfigProvider.platform.android.tabs.position('standard');
$ionicConfigProvider.platform.ios.navBar.alignTitle('center');
$ionicConfigProvider.platform.android.navBar.alignTitle('left');
$ionicConfigProvider.platform.ios.backButton.previousTitleText('').icon('ion-ios-arrow-thin-left');
$ionicConfigProvider.platform.android.backButton.previousTitleText('').icon('ion-android-arrow-back');
$ionicConfigProvider.platform.ios.views.transition('ios');
$ionicConfigProvider.platform.android.views.transition('android');
参考资料
ionic 隐藏底部菜单栏
可以参考我之前写的文章:ionic 隐藏底部菜单栏
ionic如何后退
ionic提供了$ionicHistory
来访问访问历史以及返回。其中$ionicHistory.goBack([backcount])
就是用来回退视图。
其中backcount
指定了回退多少个视图,默认为-1,即回退一个视图。
参考资料:
ionic在装载ion-view
的时候如何隐藏ion-nav-header
这种问题属于API掌握不够熟练。
只需为ion-view
添加属性:hide-nav-bar=“true”
即可实现隐藏父ion-nav-bar
ionic App打包成apk,在手机打开的时候,会出现下面的错误:
1 | the connection to the server was unsuccessful. (file ///android_asset/www/index.html) |
这一般是由于www/index.html
下的index.html文件找不到。可能是编译没成功导致的。
$ionicHistory.clearHistory无效
有时候会出现$ionicHistory.clearHistory无效,解决办法,用$timeout()1
2
3
4
5$timeout(function () {
$ionicHistory.removeBackView();
$ionicHistory.clearCache();
$ionicHistory.clearHistory();
});
禁止ion-view页面的缓存
cache-view = false即可
如何更改ion-header-bar颜色
参考文章:
change-ion-view-header-color-in-ionic
You could add the ion-nav-bar to each view.
1
2
3
4
5
6
7<ion-view view-title="Page 1">
<ion-nav-bar class="bar-balanced">
<ion-nav-back-button></ion-nav-back-button>
</ion-nav-bar>
<ion-content>
</ion-content>
</ion-view>You could also update the background-color (and any other properties) by using ng-style
Main navbar:1
2
3<ion-nav-bar class="bar-positive" ng-style="{'background-color': viewColor}">
<ion-nav-back-button></ion-nav-back-button>
</ion-nav-bar>
CSS:1
2
3.nav-bar-block, .bar {
background-color: inherit ;
}
Controller:1
2
3$scope.$on('$ionicView.beforeEnter', function() {
$rootScope.viewColor = 'green';
});
ionic隐藏后退按钮上的文字
可以采用CSS和js配置两种方式
CSS方式1
2
3
4/*隐藏后退按钮文字*/
.bar .buttons .back-text {
display: none ;
}
js方式:在config()中添加1
2
$ionicConfigProvider.backButton.previousTitleText(false);
如何给ion-header-bar添加自定义点击事件
首先设置ion-view的hide-nav-bar=true,然后自定义ion-header-bar1
2
3
4
5
6
7
8
9<ion-view class="container" title="" hide-nav-bar="true">
<<ion-header-bar >
<button class="button back-button buttons button-assertive button-clear header-item" ng-click="goBack()">
<i class="icon ion-ios-arrow-thin-left"></i>
</button>
<h1 class="title fund-title" ng-click="toggleQueryModal()">账户-资金记录**
</h1>
</ion-header-bar>
</ion-view>
如何退出App
ionic.Platform.exitApp()
在使用$ionicPlatform.ready()方法时,在真机中偶尔会出现没有监听到的情况,导致一些cordova事件无法被执行比如registerBackButtonAction
。
参考资料:
解决办法将cordova.js移到页面最底部。1
move cordova.js to end of body tag
$ionicPlatform.ready()是用来监听webView中cordova是否加载了,相当于浏览器中的window.onload。所以将cordova.js的引入放到页面最底部,确保页面全都加载后再监听$ionicPlatform.ready()。
ionic如何更改包名
找到根目录下的config.xml
,其中<widget id='com.package.name'>
便是你的包名。更改之后,再用命令cordova build android
重新构建App即可。
ionic中如何打开微信(或者其他应用)
使用协议weixin://
1
<a class="button button-block button-light" href="weixin://">打开微信</a>
然后在根目录下的config.xml中配置:1
<access origin="weixin:*" launch-external="yes"/> //打开微信的
ionic.Platform.exitApp()退出后,再进入应用 splashscreen不显示
在config.xml文件里添加1
<preference name="SplashShowOnlyFirstTime" value="false" />
ionic 签名后的问题
问题描述:1
ionic can't access http after generate signed release apk
可能的解决办法:1
21、add whitelist in confix.xml
cordova plugin add cordova-plugin-whitelist --save
ionic 键盘挡住input框
参考资料:
https://forum.ionicframework.com/t/scroll-to-the-focused-item-input-when-the-keyboard-is-up/422
cordova设置签名的apk不验证服务器端的ssl证书
参考资料
http://ivancevich.me/articles/ignoring-invalid-ssl-certificates-on-cordova-android-ios/
在测试APK的时候,如果后端API为https的,而且在测试服的https证书是非正式的话,会导致测试版apk无法发起http请求。解决办法便是更改ssl验证。
Android端需要更改文件CordovaWebViewClient.java
代码如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
final String packageName = this.cordova.getActivity().getPackageName();
final PackageManager pm = this.cordova.getActivity().getPackageManager();
ApplicationInfo appInfo;
try {
appInfo = pm.getApplicationInfo(packageName, PackageManager.GET_META_DATA);
if ((appInfo.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) {
// debug = true
handler.proceed();
return;
} else {
// debug = false
// THIS IS WHAT YOU NEED TO CHANGE:
// 1. COMMENT THIS LINE
// super.onReceivedSslError(view, handler, error);
// 2. ADD THESE TWO LINES
// ---->
handler.proceed();
return;
// <----
}
} catch (NameNotFoundException e) {
// When it doubt, lock it out!
super.onReceivedSslError(view, handler, error);
}
}
该文件的位置:
- Cordova v4及其以下:
project/platforms/android/CordovaLib/src/org/apache/cordova/CordovaWebViewClient.java
- Cordova v5 及其以上:
project/platforms/android/CordovaLib/src/org/apache/cordova/engine/SystemWebViewClient.java
ionic 动态设置title,或者自定义title
ionic中设置title可以直接使用,ion-view。1
2<ion-view view-title="title">
</ion-view>
但是这种方式只适合静态的title。但是如果要动态设置title的话,特别是当要设置的title是由http请求的数据时,上面的方式就无法显示title。可以用ion-nav-title
替换:1
2
3
4
5
6
<ion-view >
<ion-nav-title>
{{yourTitlte}}
</ion-nav-title>
</ion-view>
在Controller中的代码1
2
3$timeout(function(){
$scope.yourTitle = data;
})
关于ion-view中的view-title
属性,官方定义如下:
A text-only title to display on the parent ionNavBar. For an HTML title, such as an image, see ionNavTitle instead.
也就是说view-title
只能用来设置text-only title,对于其他类型的title如图片等,要用ionNavTitle
替换。同理,如果title是个变量,也应该使用ionNavTitle
。
参考资料:
https://www.raymondcamden.com/2015/12/18/is-your-ionic-view-title-not-updating/
ionic 点击系统返回提示退出确认框
可以参考我写的文章:【ionic App问题总结系列】点击系统返回键退出App
ionic登录拦截机制的实现
可以参考这篇文章:ionic登录拦截机制-使用Modal作为登录框
ionic插件相关
怎么在ionic中打开网页
使用inappbrowser
插件便可实现。
http://stackoverflow.com/questions/34342172/post-a-form-in-a-new-window-inappbrowser-in-ionic-cordova/34357114
怎么在ionic中使用cordova plugin
监听事件deviceready
,然后在该事件监听中调用你所需要的插件。1
2
3
4
5
6
7
8
9
10document.addEventListener("deviceready", function () {
if (window.LLPay) {
if (!Passport.authStatus()) {
AuthService.updateUserInfoAfterAuth($scope.recharge.full_name, $scope.recharge.id_no);
}
window.LLPay.startPay($scope.arguments, function (data) {
}, function (err) {
});
}
})
如果你不知道插件的名字是什么,可以去插件所在的位置的plugin.xml:plugins/your-plugin/plugin.xml
中找到如下的代码,其中clobbers
中target属性便是你在js中调用该插件的方法名字。1
2
3
4<js-module src="www/inappbrowser.js" name="inappbrowser">
<clobbers target="cordova.InAppBrowser.open" />
<clobbers target="window.open" />
</js-module>
ionic微信分享
可以参考我写的文章:【ionic App问题总结系列】ionic微信朋友圈分享
ionic App更新
可以参考我写的文章: 【ionic App问题总结系列】ionic 如何更新App版本