IOS10.0+, Android 6.0+系統升級後Hybird應用常見問題修復

這裏寫圖片描述

移動操作系統,每年會有一個大版本的發佈,對部分功能多少會有影響,最近由於蘋果發佈了IOS10,以及android .6系統的普及,導致部分項目無法正常運轉,嘗試了一番,解決了所有問題,爲此記錄一下,方便同樣問題的同志及時解決掉。

IOS10升級後的問題

其實自從IOS9+以後, iphone平臺變化還是挺大的,可能這裏列舉不是很全,算是參考吧!

HTTPS協議

IOS9以後要求所有的app都要尊崇https協議,以及ipv6服務標準。

對此最好的解決方案就是,更改服務的協議到https。

還有一種方案就是需要配置NSAppTransportSecurity。

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSAllowsArbitraryLoads</key>
  <true/>
</dict>

也可以對指定的url添加白名單:

<key>NSExceptionDomains</key>
      <dict>
        <key>codepush.azurewebsites.net</key>
        <dict/>
        <key>codepush.blob.core.windows.net</key>
        <dict/>
        <key>codepushupdates.azureedge.net</key>
        <dict/>
      </dict>

從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, 這樣纔可以成功調用支付,或者地圖等應用。

比如下面這個設置,是針對於百度地圖的:

<key>LSApplicationQueriesSchemes</key>
      <array>
          <string>baidumap</string>
          <string>whatsapp</string>
      </array>

配置description針對用戶使用權限

在升級ios10以後,發現調用相機或者相冊等權限時,發現閃退現象。

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

<!-- 相冊 --> 
<key>NSPhotoLibraryUsageDescription</key> 
<string>App需要您的同意,才能訪問相冊</string> 
<!-- 相機 --> 
<key>NSCameraUsageDescription</key> 
<string>App需要您的同意,才能訪問相機</string> 
<!-- 麥克風 --> 
<key>NSMicrophoneUsageDescription</key> 
<string>App需要您的同意,才能訪問麥克風</string> 
<!-- 位置 --> 
<key>NSLocationUsageDescription</key> 
<string>App需要您的同意,才能訪問位置</string> 
<!-- 在使用期間訪問位置 --> 
<key>NSLocationWhenInUseUsageDescription</key> 
<string>App需要您的同意,才能在使用期間訪問位置</string> 
<!-- 始終訪問位置 --> 
<key>NSLocationAlwaysUsageDescription</key> 
<string>App需要您的同意,才能始終訪問位置</string> 
<!-- 日曆 --> 
<key>NSCalendarsUsageDescription</key> 
<string>App需要您的同意,才能訪問日曆</string> 
<!-- 提醒事項 --> 
<key>NSRemindersUsageDescription</key> 
<string>App需要您的同意,才能訪問提醒事項</string> 
<!-- 運動與健身 --> 
<key>NSMotionUsageDescription</key> <string>App需要您的同意,才能訪問運動與健身</string> 
<!-- 健康更新 --> 
<key>NSHealthUpdateUsageDescription</key> 
<string>App需要您的同意,才能訪問健康更新 </string> 
<!-- 健康分享 --> 
<key>NSHealthShareUsageDescription</key> 
<string>App需要您的同意,才能訪問健康分享</string> 
<!-- 藍牙 --> 
<key>NSBluetoothPeripheralUsageDescription</key> 
<string>App需要您的同意,才能訪問藍牙</string> 
<!-- 媒體資料庫 --> 
<key>NSAppleMusicUsageDescription</key> 
<string>App需要您的同意,才能訪問媒體資料庫</string>

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

NSContactsUsageDescription -> 通訊錄

NSMicrophoneUsageDescription -> 麥克風

NSPhotoLibraryUsageDescription -> 相冊

NSCameraUsageDescription -> 相機

NSLocationAlwaysUsageDescription -> 地理位置

NSLocationWhenInUseUsageDescription -> 地理位置

配置allow-intent

做H5的同學都知道,可以通過h5調用系統打電話功能,比如:

<a href="tel:2342345" />

發現在ios10上不起作用,查找一番需要配置allow-intent, 這個要在混合應用的config.xml中進行配置:

<content src="index.html" />
    <access origin="*" />
    <allow-intent href="http://*/*" />
    <allow-intent href="https://*/*" />
    <allow-intent href="baidumap://*/*" />
    <allow-intent href="bdmap://*/*" />
    <allow-intent href="tel:*" />
    <allow-intent href="sms:*" />
    <allow-intent href="mailto:*" />
    <allow-intent href="geo:*" />
    <allow-intent href="itms:*" />
    <allow-intent href="itms-apps:*" />

再次嘗試一下,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的字體發生了變化,這導致一些文字在原有的寬高約束下可能會出現顯示不完整或者留白的情況,需要逐一檢查。

Android

相比較而言Android變化影響會小一些,但是同樣會存在問題。

需要升級到最新的platform

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

權限配置

自android6.0以後,android對權限的要求和ios十分相似,要求用戶手動授權是否允許應用使用該權限。

對於Android來講,主要有兩種權限,一個是正常權限,比如網絡。還有一個危險權限,比如相冊,相機,聯繫人等等,都需要用戶授權。

我們所要關注的就是危險權限,這些權限會被分爲不同的權限組(PermissionGroup),這裏需要說明一下,當一個權限組裏的任一權限被授權,這個組裏的其他權限也都會被授權,比如:READ_EXTERNAL_STORAGE這個讀SD卡的權限被授權了,這時候WRITE_EXTERNAL_STORAGE也同時被授權。

具體實現方案比如:

  1. 權限的檢查:
    if(ContextCompat.checkSelfPermission(thisActivity,Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
    }else{
    // }
    這裏涉及到一個API,ContextCompat.checkSelfPermission,主要用於檢測某個權限是否已經被授予,方法返回值爲PackageManager.PERMISSION_DENIED或者PackageManager.PERMISSION_GRANTED。當返回DENIED就需要進行申請授權了。

  2. 申請權限:
    ActivityCompat.requestPermissions(thisActivity,newString[]{Manifest.permission.READ_CONTACTS},MY_PERMISSIONS_REQUEST_READ_CONTACTS);
    該方法是異步的,第一個參數是Context;第二個參數是需要申請的權限的字符串數組;第三個參數爲requestCode,主要用於回調的時候檢測。可以從方法名requestPermissions以及第二個參數看出,是支持一次性申請多個權限的,系統會通過對話框逐一詢問用戶是否授權。

  3. 處理權限申請回調:
    @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; }
    }
    }

對於混合應用,我們可以安裝一個插件來替代:

cordova plugin add cordova-plugin-android-permissions@0.10.0

這個插件是針對於android 平臺的:

使用如下:

var permissions = cordova.plugins.permissions;
permissions.hasPermission(permissions.CAMERA, checkPermissionCallback, null);

function checkPermissionCallback(status) {
  if(!status.hasPermission) {
    var errorCallback = function() {
      console.warn('Camera permission is not turned on');
    }

    permissions.requestPermission(
      permissions.CAMERA,
      function(status) {
        if(!status.hasPermission) errorCallback();
      },
      errorCallback);
  }
}

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, 這也就意味着,我們在執行:

cordova plugin add cordova-plugin-camera

可能不會獲取到最新版本的插件。

但是可以通過如下方法獲取:

cordova plugin add cordova-plugin-camera@latest

這樣可以保證項目的穩定性。

值得高興的是cordova6.0+已經對ios10做了支持。

個人微信公衆號

這裏寫圖片描述

發佈了208 篇原創文章 · 獲贊 143 · 訪問量 79萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章