总结

使用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');

参考资料

http://bbs.phonegap100.com/thread-1495-1-1.html 

ionic 隐藏底部菜单栏

可以参考我之前写的文章:ionic 隐藏底部菜单栏

ionic如何后退

ionic提供了$ionicHistory来访问访问历史以及返回。其中$ionicHistory.goBack([backcount])就是用来回退视图。
其中backcount指定了回退多少个视图,默认为-1,即回退一个视图。
参考资料:

http://ionichina.com/topic/569a5f8458c6c76d17fde189

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颜色

参考文章:

http://stackoverflow.com/questions/30015413/

change-ion-view-header-color-in-ionic

  1. 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>
  2. 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 !important;
}

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 !important;
}

js方式:在config()中添加

1
2

$ionicConfigProvider.backButton.previousTitleText(false);

如何给ion-header-bar添加自定义点击事件

首先设置ion-view的hide-nav-bar=true,然后自定义ion-header-bar

1
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

参考资料:

https://github.com/driftyco/ionic/issues/1751

解决办法将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
2
1add 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
27
public 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
10
document.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版本