1. 程式人生 > >React Native網路狀態解析及封裝

React Native網路狀態解析及封裝

剛建立的React Native 微信公眾號,歡迎微信掃描關注訂閱號,每天定期會分享react native 技術文章,移動技術乾貨,精彩文章技術推送。同時可以掃描我的微信加入react-native技術交流微信群。歡迎各位大牛,React Native技術愛好者加入交流!


一、介紹


上一篇部落格和大家分享了React Native 如何去適配 iPhoneX,本篇部落格也可規劃為一種適配,React Native網路。

在React Native中,官方給開發者提供了NetInfo來監聽手機網路。從官方文件中可以看到,NetInfo提供了兩種方式來獲取網路狀態,並且以非同步的方式判斷裝置是否聯網,以及是否使用了移動資料網路。

1. iOS:


   none - 裝置處於離線狀態。
   wifi - 裝置處於聯網狀態且通過wifi連結,或者是一個iOS的模擬器。
   cell - 裝置是通過Edge、3G、WiMax或是LTE網路聯網的。
   unknown - 發生錯誤,網路狀況不可知

2. Android:

   NONE - 裝置處於離線狀態
   BLUETOOTH - 藍芽資料連線
   DUMMY - 模擬資料連線
   ETHERNET - 乙太網資料連線
   MOBILE - 行動網路資料連線
   MOBILE_DUN - 撥號行動網路資料連線
   MOBILE_HIPRI - 高優先順序行動網路資料連線
   MOBILE_MMS

- 彩信行動網路資料連線
   MOBILE_SUPL - 安全使用者面定位(SUPL)資料連線
   VPN - 虛擬網路連線。需要Android5.0以上
   WIFI - WIFI資料連線
   WIMAX - WiMAX資料連線
   UNKNOWN - 未知資料連線

NetInfo獲取網路分為兩種方式:

(1)註冊監聽

(2)isConnected


不過這裡還是有很多問題,例如在官方文件中:


當我們去使用該方法去獲取網路狀態時,會發現在Android裝置上是可以輕鬆獲取到裝置是否聯網,但是在iOS裝置上,結果回撥方法始終不會被呼叫。百思不得姐...翻看react-native github的 issue,同樣很多人遇到這種問題。目前算是RN的一種缺陷,未來版本可能有待解決。目前解決的方式是在Android平臺通過isConnected來獲取,在iOS裝置上則通過註冊監聽器的方式來獲取裝置是否聯網。為了解決一系列的坑,出現了以下封裝。

二、封裝


為了方便,我將其常用的獲取網路相關功能封裝為一個工具,核心程式碼如下:

Android相關:

/***
 * 獲取網路連線狀態
 * (Android裝置)
 * @param callback
 */
const getNetworkState = (callback) => {
    NetInfo.isConnected.fetch().done(
        (isConnected) => {
            callback(isConnected);
        }
    );
}
/**
 * 網路是否為計費: 行動網路 true , WiFi: false
 * (Android裝置)
 * @param {*} callback 
 */
const isConnectionExpensive = (callback) => {
    NetInfo.isConnectionExpensive().then((isConnectionExpensive) => {
        callback(isConnectionExpensive)
    }).catch(error => {
        console.error(error);
    })
}
iOS相關:
/**
 * 註冊網路監聽,獲取網路連線狀態
 * (iOS裝置)
 * true: 連線, false: 離線
 * @param {*}  callback
 */
const addNetListener = (callback) => {
    NetInfo.isConnected.addEventListener(TAG_NETWORK_CHANGE, callback);
}

/**
 * 移除網路監聽
 * (iOS裝置)
 * @param {*} callback 
 */
const removeNetListener = (callback) => {
    NetInfo.isConnected.removeEventListener(TAG_NETWORK_CHANGE, callback);
}


三、使用

NetWork.getNetworkState((isConnected) => {
    if(isConnected) {
        // 連線狀態
    } else {
        // 未連線狀態
    }
})
該庫支援Android、iOS的網路狀態監測、當前連線網路型別、Android當前裝置網路是否為計費狀態等。其他具體使用見庫文件。