公司本年度有App任務,陸陸續續用RN開發了兩個應用。一款是涉及儀器控制的平板項目,另外一款是客戶端的App。下文談談使用RN開發的部分認知(其實只是隨便扯一扯,沒有什麼深度)javascript
其實能問出這個問題的我猜只有小公司了(好比咱們),由於大公司早已入坑,甚至已有公司出坑了(Airbnb)。前端
在使用react-native run-android以後,本質是將Java等初始化代碼打成了一個包,後續開發和動態更新都是經過讀取在經過命令啓動的8081端口服務下的js bundle實現的,因此初次出現以下提示java
Unable to load script from assets 'index.android.bundle' ...
只須要搖一搖真機,在出現的dialog中設置Dev setting中的host、port再reload後就正常了node
我是首次是經過Android 6.0開發,後來打算使用Android 5.1進行測試。錯誤信息以下react
com.android.builder.testing.api.DeviceException: com.android.ddmlib.InstallException: Failed to install all
出現這種狀況,網上不少說是經過修改gradle來進行修改,可是一般開發android程序時,須要測試不一樣的設備。能夠直接使用adb命令進行安裝android
adb install android/app/build/outputs/apk/app-debug.apk
特別是在使用了babel-resolver以後---,錯誤信息以下ios
unable to resolve module ***
解決方式:
react-native start --reset-cachegit
在使用command + /
添加註釋後,常常出現錯誤:程序員
Cannot add a child node that doesn't have a YogaNode to a parent without measure function
解決方式固然是檢查本身的JSX代碼是否註釋寫的不對。github
在咱們使用了Mobx Redux
等狀態管理時,熱更新不會更新這些代碼,而頻繁搖一搖實在是太累了。此時可使用
adb shell input keyevent 82
此時至關於虛擬了一個搖一搖事件。
當咱們的開發環境可能有多種設備且不方便插USB得話,能夠進行Adb遠程調試。方法以下:
1. 安卓端:首先安裝安卓終端模擬器 su setprop service.adb.tcp.port 5555 stop adbd start adbd 2. 開發端: adb connect ANDROID_HOST adb install ***.apk 須要喚出設置頁面的話,用上面的搖一搖問題的解決方案
以經過js獲取原生Android序列號爲例,此處代碼會比官方文檔全。其餘的能夠參考官方文檔
public class SerialNumberModule extends ReactContextBaseJavaModule{ @Override public String getName() { return "SerialNumber"; } public SerialNumberModule(ReactApplicationContext reactContext) { super(reactContext); } @ReactMethod public void getSerialNumber (Callback successCallback, Callback errorCallback) { String SerialNumber = android.os.Build.SERIAL; try { successCallback.invoke(SerialNumber); } catch (IllegalViewOperationException e) { errorCallback.invoke(e.getMessage()); } } }
public class SerialNumberPackage implements ReactPackage { @Override public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) { return Collections.emptyList(); } @Override public List<NativeModule> createNativeModules( ReactApplicationContext reactContext) { List<NativeModule> modules = new ArrayList<>(); modules.add(new SerialNumberModule(reactContext)); return modules; } }
@Override protected List<ReactPackage> getPackages() { return Arrays.<ReactPackage>asList( new MainReactPackage(), new SerialNumberPackage() ); }
import { NativeModules } from 'react-native' ******* 在組件內: componentWillMount () { NativeModules.SerialNumber.getSerialNumber(success => { console.log('success', success) }, err => { console.log('err', err) }) }
能夠在項目根目錄下執行
1. react-native bundle --entry-file index.js --bundle-output ./ios/bundle/index.ios.jsbundle --platform ios --assets-dest ./ios/bundle --dev false 2. 修改AppDelegate.m文件,將 jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index.ios" fallbackResource:nil]; 註釋掉,並添加 jsCodeLocation = [[NSBundle mainBundle] URLForResource:@"index.ios" withExtension:@"jsbundle"]; 3. 將打好的文件在ios目錄下的bundle目錄裏的兩個文件和一個文件夾拖拽到Xcode的項目相應名字的目錄下 4. 插上真機,在Xcode的目標上選擇真機,點擊Xcode標題欄的product --> archive便可
先上結論,我的認爲這種開發模式早晚會結束,第三方強行兼容設備老是不行的。類比黑莓兼容Android。我的仍是信WEB, 信W3C。踩坑還在進行,上述只是一點開發經驗。大神輕噴,同行人歡迎一塊兒討論。