您的位置:首页 > 移动开发

ionic开发App-问题收集总结

2016-11-19 23:28 766 查看

总结

使用ionic开发App算是告一段落了。使用前端的技术来统一移动端,不得不承认这个听起来很酷。JavaScript要统一世界的节奏。

然而现实并不是这样,使用ionic开发App虽然在开发速度上比原生开发快很多(有AngularJS的基础上,1~2个礼拜熟悉ionic框架,一个月左右做完App),但依然存在下面这个几个比较致命的问题:

1. App流畅度不足,用户体验差。尤其是在Android4.4以下的手机,性能更是惨不忍睹。iOS上流畅度则相对会好很多。所以尽量控制每个页面的复杂度。

2. 长列表性能不佳。这点在此次开发的App倒不是很明显,因为公司的业务并不涉及大量的数据展示。

3. 可定制化不高。所有的行为都只能基于ionic框架的基础去实现,可玩性不高,难以实现个性化定制。

4. 插件问题。在ionic中,跟原生设备打交道都只能通过cordova插件这一种方式。常用的几个基本插件都有了成熟的解决方法及用法,但是如果遇到比较冷门的需求,在没有找到插件的情况下,只能自己写插件或者考虑其他解决办法了。这次开发过程中就遇到了这个坑,App需要对接连连支付,后面还是在github上找到了一个连连支付插件,最后通过更改插件源代码才能用到App上,实现了对接连连支付。

虽然存在着致命缺点,但是依然不能忽略ionic的优点。每种技术存在都有其价值与市场。ionic最大的优点便是可以在低成本的情况下,快速地开发出一款并不是最完美但是依然可以使用的App。

下面便是在开发过程中所遇到的部分问题

ionic tab在Android中显示在顶部的解决方案

解决办法:

在 iOS中, tabs 一直处于底部. 在android中 ionic tabs 一直在顶部,如果要改我们可以通过配置$ionicConfigProvider。代码如下:

.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,在手机打开的时候,会出现下面的错误:

the connection to the server was unsuccessful. (file ///android_asset/www/index.html)


这一般是由于
www/index.html
下的index.html文件找不到。可能是编译没成功导致的。

$ionicHistory.clearHistory无效

有时候会出现ionicHistory.clearHistory无效,解决办法,用timeout()

$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

You could add the ion-nav-bar to each view.

<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:

<ion-nav-bar class="bar-positive" ng-style="{'background-color': viewColor}">
<ion-nav-back-button></ion-nav-back-button>
</ion-nav-bar>


CSS:

.nav-bar-block, .bar {
background-color: inherit !important;
}


Controller:

$scope.$on('$ionicView.beforeEnter', function() {
$rootScope.viewColor = 'green';
});


ionic隐藏后退按钮上的文字

可以采用CSS和js配置两种方式

CSS方式

/*隐藏后退按钮文字*/
.bar .buttons .back-text {
display: none !important;
}


js方式:在config()中添加

$ionicConfigProvider.backButton.previousTitleText(false);


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

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

<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移到页面最底部。

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://


<a class="button button-block button-light" href="weixin://">打开微信</a>


然后在根目录下的config.xml中配置:

<access origin="weixin:*" launch-external="yes"/>  //打开微信的


ionic.Platform.exitApp()退出后,再进入应用 splashscreen不显示

在config.xml文件里添加

<preference name="SplashShowOnlyFirstTime" value="false" />


ionic 签名后的问题

问题描述:

ionic can't access http after generate  signed release apk


可能的解决办法:

1、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


代码如下:

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。

<ion-view view-title="title">
</ion-view>


但是这种方式只适合静态的title。但是如果要动态设置title的话,特别是当要设置的title是由http请求的数据时,上面的方式就无法显示title。可以用
ion-nav-title
替换:

<ion-view >
<ion-nav-title>
{{yourTitlte}}
</ion-nav-title>
</ion-view>


在Controller中的代码

$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
,然后在该事件监听中调用你所需要的插件。

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中调用该插件的方法名字。

<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版本

文章首发于我的个人博客: www.iamsuperman.cn
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ionic