ionic测试时一直使用ionic build android/ios发布debug包,一切正常;上线当天打release包后一直提示网络连接错误,debug版本和release版本的程序代码是完全一致的,区别也只在于release版本多了签名,这和http请求应该没关系的,经查询得知,在debug模式下会跳过证书的认证,这时候http请求是没问题的,但是release版本就会进行认证,这和PC端的道理其实是一样的,证书无效或者未认证会提示是否还要进行访问,但是使用ajaix进行http请求无法看到提示信息导致连接一直失败。
修改方案:
对于IOS来说:
修改webstrom 工程platforms-->MyApp-->AppDelegate.m-->在末尾追加如下代码:
@implementation NSURLRequest(DataController)
+ (BOOL)allowsAnyHTTPSCertificateForHost:(NSString *)host
{
return YES;
}
@end
对于Android来说:
修改 \platforms\android\CordovaLib\src\org\apache\cordova\engine\SystemWebViewClient 文件里的 onReceivedSslError 函数,原函数如下:
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
final String packageName = parentEngine.cordova.getActivity().getPackageName();
final PackageManager pm = parentEngine.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
super.onReceivedSslError(view, handler, error);
}
} catch (NameNotFoundException e) {
// When it doubt, lock it out!
super.onReceivedSslError(view, handler, error);
}
}
修改为如下即可:
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
handler.proceed();
}
修改完成重新打包,亲测可用。打包时使用ionic build android --release --prod添加–prod能够优化APP启动速度,一点小建议。
在网上还看到有人说这个网络问题是由于cordova造成的,原因是没有添加白名单插件,使用cordova plugin ls
进行查看是否存在cordova-plugin-whitelist这个插件,如果存在则使用cordova plugin remove cordova-plugin-whitelist
卸载之后再重新安装即可cordova plugin add cordova-plugin-whitelist
这也是可能的原因之一,但是这只是针对很老的cordova平台而言,目前基本使用的都是5.0以上的会自动包含此插件,也做个参考吧,有可能在操作插件时不经意间把白名单插件卸载了。