眾所周知用React Native是可以開發跨平台的Android和iOS App。我們可以用React Native開發Android應用也可以開發iOS應用,那麼如何讓我們開發的React Native應用適配Android和iOS雙平台呢。
在這篇文章中我將從布局、組件選擇、圖片、效能問題、Bugs等幾個方面來談一談Android和iOS的適配問題。 布局
React Native在布局方面採用的是Flexbox,為了能讓代碼有更高複用性以及相容性,我們可以將Android和iOS的樣式盡量保持一致。 善用Platform.OS
為了提高代碼的相容性,我們有時需要判斷當前系統的平台,然後做一些適配。比如,我們在使用StatusBar做導覽列的時候,在iOS平台下根視圖的位置預設情況下是佔據狀態列的位置的,我們通常希望狀態列下面能顯示一個導覽列,所以我們需要為StatusBar的外部容器設定一個高度:
<View style={{height: Platform.OS === 'ios' ? 20:0}}> <StatusBar {...this.props.statusBar} /></View>;
原始碼
另外,在為視圖設定陰影的時候我們需要用到Shadow Propsapi,而該api支援iOS平台,在Android平台下設定陰影我們需要用到elevation。 留意api doc的android或ios標識
並不是所有React Native的一些api或組件的一些屬性和方法都相容Android和iOS,在React Native的api doc中通常會在一些屬性或方法的前面加上android或ios的字樣來標識該屬性或方法所支援的平台,如:
android renderToHardwareTextureAndroid boolios shouldRasterizeIOS bool
在上述代碼中,renderToHardwareTextureAndroid bool只支援Android平台,ios shouldRasterizeIOS bool只支援iOS平台,所有我們在使用這些帶有標記的屬性或方法的時候就需要考慮對於它們不相容的平台我們是否需要做相應的適配了。 組件選擇
React Native發展到現在已經有相當豐富的組件來供開發人員使用,那麼從適配Android和iOS平台的角度如何甄選這些組件呢。
比如,我們要開發一款應用需要用到導航組件,在React Native組件中有NavigatorIOS與Navigator兩個導航組件來供我們選擇,從api doc中我們可以看出NavigatorIOS只支援iOS平台,Navigator則兩個平台都支援。
所以如果我們要開發的應用需要適配Android和iOS,那麼Navigator才是最佳的選擇。
另外,類似的例子還有底部導航的TabBarIOS、ToolbarAndroid等。
心得:為了提高代碼的複用性與相容性建議大家在選擇React Native組件的時候要多留意該組件是不是相容Android和iOS,盡量選擇Android和iOS平台都相容的組件。 圖片適配
開發一款應用少不了的需要用到表徵圖。無論是Android還是iOS,現在不同解析度的裝置越來越多,我們希望這些表徵圖能夠適配不同解析度的裝置。為此我們需要為每個表徵圖提供1x、2x、3x三種大小的尺寸,React Native會根據螢幕的解析度來動態選擇顯示不同尺寸的圖片。比如:在img目錄下有如下三種尺寸的check.png
└── img ├── check.png ├── check@2x.png └── check@3x.png
那麼我們就可以通過下面的方式來使用check.png:
<Image source={require('./img/check.png')} />
提示:我們在使用具有不同解析度的表徵圖時,一定要引用標準解析度的圖片如require('./img/check.png'),如果我們這樣寫require('./img/check@2x.png'),那麼應用在不同解析度的裝置上都只會顯示check@2x.png圖片,也就無法達到圖片自適配的效果。 效能問題
對於大多數想用React Native開發應用的開發人員來說,都很關心React Native的效能問題,React Native和H5+WebView以及原生應用之間的效能對比是:WebView Bugs
對於React Native的Bug我們可以提Issue與Pull Request,另外也可以關注React Native的版本發布releases,每次版本發布都會修複一些Bug,以及添加一些新的功能與api。
以上便是我對於React Native適配Android和iOS上的一些心得,
如果大家在適配Android和iOS中遇到問題可以在本文的下方進行留言,我看到了後會及時回複的哦。
另外也可以關注我的新浪微博,或者關注我的Github來擷取更多有關React Native開發的技術乾貨。 參考:React Native開發視頻教程