IOS10.0+, Android 6.0+系统升级后Hybird应用常见问题修复

IOS10.0+, Android 6.0+系统升级后Hybird应用常见问题修复_第1张图片

移动操作系统,每年会有一个大版本的发布,对部分功能多少会有影响,最近由于苹果发布了IOS10,以及android .6系统的普及,导致部分项目无法正常运转,尝试了一番,解决了所有问题,为此记录一下,方便同样问题的同志及时解决掉。

IOS10升级后的问题

其实自从IOS9+以后, iphone平台变化还是挺大的,可能这里列举不是很全,算是参考吧!

HTTPS协议

IOS9以后要求所有的app都要尊崇https协议,以及ipv6服务标准。

对此最好的解决方案就是,更改服务的协议到https。

还有一种方案就是需要配置NSAppTransportSecurity。

IOS10.0+, Android 6.0+系统升级后Hybird应用常见问题修复_第2张图片

也可以对指定的url添加白名单:


IOS10.0+, Android 6.0+系统升级后Hybird应用常见问题修复_第3张图片

从2017年1月1日起,,所有新提交的 app 默认不允许使用NSAllowsArbitraryLoads来绕过ATS的限制,默认情况下你的 app 可以访问加密足够强的(TLS V1.2以上)HTTPS内容。

可以选择使用NSExceptionDomains设置白名单的方式对特定的域名开放HTTP内容来通过审核,比如说你的应用集成了第三方的登录分享SDK,可以通过这种方式来做。

更多的配置:

NSAllowsArbitraryLoads - 设置 true 即支持所有 HTTP 请求

NSExceptionDomains - 添加白名单

NSExceptionMinimumTLSVersion - 白名单指定域名支持的 TLS 版本

NSExceptionRequiresForwardSecrecy - 白名单指定域名是否支持 Forward Secrecy

NSExceptionAllowsInsecureHTTPLoads - 白名单指定域名禁用 ATS

NSThirdPartyExceptionMinimumTLSVersion - 白名单指定第三方服务域名最低支持的 TLS 版本

NSThirdPartyExceptionRequiresForwardSecrecy - 白名单指定第三方服务域名是否支持 Forward Secrecy

NSThirdPartyExceptionAllowsInsecureHTTPLoads - 白名单指定第三方域名禁用 ATS

配置白名单针对第三方应用

如果你的应用需要打开或者检查本地是否安装了指定的app,就需要配置一个LSApplicationQueriesSchemes, 这样才可以成功调用支付,或者地图等应用。

比如下面这个设置,是针对于百度地图的:


配置description针对用户使用权限

在升级ios10以后,发现调用相机或者相册等权限时,发现闪退现象。

查找一番需要配置description, 如下:


IOS10.0+, Android 6.0+系统升级后Hybird应用常见问题修复_第4张图片

大概统计了一下需要加的一些字段列在下面:

NSContactsUsageDescription -> 通讯录

NSMicrophoneUsageDescription -> 麦克风

NSPhotoLibraryUsageDescription -> 相册

NSCameraUsageDescription -> 相机

NSLocationAlwaysUsageDescription -> 地理位置

NSLocationWhenInUseUsageDescription -> 地理位置

配置allow-intent

做H5的同学都知道,可以通过h5调用系统打电话功能,比如:


发现在ios10上不起作用,查找一番需要配置allow-intent, 这个要在混合应用的config.xml中进行配置:


IOS10.0+, Android 6.0+系统升级后Hybird应用常见问题修复_第5张图片

再次尝试一下,OK了!

cordova加载html 页面,出现白屏

当升级系统过,返现之前的app打开后出现白屏现象,于此同时后台没有任何错误,找了很久没有发现问题,猜想是不是因为平台版本太老的原因:

于是,升级了一下ios-platorm 到4.0版本,因为之前用的都是3.X.

再次运行,可以看到页面,但是还又一些小问题,比如布局错乱等问题。

在对JS Library做了一次升级,全部升级到latest版本,保证代码的可运行状态。

这次终于正常了,一切ok.

这里建议大家一定要到平台版本及时更新,以保证对系统webkit做最好的支持。

现在最新的是:

ios-platform 4.2

android-platform 5.2

推送通知

iOS10以后,想要正常收到推送通知,需要进行额外的配置:


IOS10.0+, Android 6.0+系统升级后Hybird应用常见问题修复_第6张图片

字体改变

iOS10的字体发生了变化,这导致一些文字在原有的宽高约束下可能会出现显示不完整或者留白的情况,需要逐一检查。

Android

相比较而言Android变化影响会小一些,但是同样会存在问题。

需要升级到最新的platform

保证我们自定插件能得到更多的api支持以及webkit更好的支持。

权限配置

自android6.0以后,android对权限的要求和ios十分相似,要求用户手动授权是否允许应用使用该权限。

对于Android来讲,主要有两种权限,一个是正常权限,比如网络。还有一个危险权限,比如相册,相机,联系人等等,都需要用户授权。

我们所要关注的就是危险权限,这些权限会被分为不同的权限组(PermissionGroup),这里需要说明一下,当一个权限组里的任一权限被授权,这个组里的其他权限也都会被授权,比如:READ_EXTERNAL_STORAGE这个读SD卡的权限被授权了,这时候WRITE_EXTERNAL_STORAGE也同时被授权。

具体实现方案比如:

权限的检查:

if(ContextCompat.checkSelfPermission(thisActivity,Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {

}else{

// }

这里涉及到一个API,ContextCompat.checkSelfPermission,主要用于检测某个权限是否已经被授予,方法返回值为PackageManager.PERMISSION_DENIED或者PackageManager.PERMISSION_GRANTED。当返回DENIED就需要进行申请授权了。

申请权限:

ActivityCompat.requestPermissions(thisActivity,newString[]{Manifest.permission.READ_CONTACTS},MY_PERMISSIONS_REQUEST_READ_CONTACTS);

该方法是异步的,第一个参数是Context;第二个参数是需要申请的权限的字符串数组;第三个参数为requestCode,主要用于回调的时候检测。可以从方法名requestPermissions以及第二个参数看出,是支持一次性申请多个权限的,系统会通过对话框逐一询问用户是否授权。

处理权限申请回调:

@Override

public voidonRequestPermissionsResult(intrequestCode, String permissions[], int[]grantResults)

{

switch (requestCode) {

caseMY_PERMISSIONS_REQUEST_READ_CONTACTS: { /

/ If request is cancelled, the result arrays areempty.

if(grantResults.length>0&&grantResults[0] ==PackageManager.PERMISSION_GRANTED) { /

/ permission was granted, yay! Do the //contacts-related task you need to do. } else {

// permission denied, boo! Disable the //functionality that depends on this permission.

} return; }

}

}

对于混合应用,我们可以安装一个插件来替代:


这个插件是针对于android 平台的:

使用如下:


IOS10.0+, Android 6.0+系统升级后Hybird应用常见问题修复_第7张图片

Normal Permissions如下:

ACCESS_LOCATION_EXTRA_COMMANDS READ_SYNC_SETTINGS

ACCESS_NETWORK_STATE READ_SYNC_STATS

ACCESS_NOTIFICATION_POLICY RECEIVE_BOOT_COMPLETED

ACCESS_WIFI_STATE REORDER_TASKS

BLUETOOTH REQUEST_INSTALL_PACKAGES

BLUETOOTH_ADMIN SET_TIME_ZONE

BROADCAST_STICKY SET_WALLPAPER

CHANGE_NETWORK_STATE SET_WALLPAPER_HINTS

CHANGE_WIFI_MULTICAST_STATE TRANSMIT_IR

CHANGE_WIFI_STATE USE_FINGERPRINT

DISABLE_KEYGUARD VIBRATE

EXPAND_STATUS_BAR WAKE_LOCK

GET_PACKAGE_SIZE WRITE_SYNC_SETTINGS

INTERNET SET_ALARM

KILL_BACKGROUND_PROCESSES INSTALL_SHORTCUT

MODIFY_AUDIO_SETTINGS UNINSTALL_SHORTCUT

NFC

DangerousPermissions如下:

Permission Group Permissions

CALENDAR

READ_CALENDAR

WRITE_CALENDAR

CAMERA

CAMERA

CONTACTS

READ_CONTACTS

WRITE_CONTACTS

GET_ACCOUNTS

LOCATION

ACCESS_FINE_LOCATION

ACCESS_COARSE_LOCATION

MICROPHONE

RECORD_AUDIO

PHONE

READ_PHONE_STATE

CALL_PHONE

READ_CALL_LOG

WRITE_CALL_LOG

ADD_VOICEMAIL

USE_SIP

PROCESS_OUTGOING_CALLS

SENSORS

BODY_SENSORS

SMS

SEND_SMS

RECEIVE_SMS

READ_SMS

RECEIVE_WAP_PUSH

RECEIVE_MMS

STORAGE

READ_EXTERNAL_STORAGE

WRITE_EXTERNAL_STORAGE

Cordova6.0+新特性

cordova的特性不是很多,主要是版本支持,但是有一点需要我们注意。

对于插件安装的发布,升级后可以指定默认版本对于cordova, 这也就意味着,我们在执行:


可能不会获取到最新版本的插件。

但是可以通过如下方法获取:

IOS10.0+, Android 6.0+系统升级后Hybird应用常见问题修复_第8张图片

上图为2017年最新的视频教程资料,搜索2352149755加我好友私聊我上传视频教程,有什么不懂的也可以来私聊问我。

不定时更新中。

如果你能明白这些视频资料的好差,那么你也算是入行了,底层和中高层就是这一步之差。

你可能感兴趣的:(IOS10.0+, Android 6.0+系统升级后Hybird应用常见问题修复)