公司本年度有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。踩坑还在进行,上述只是一点开发经验。大神轻喷,同行人欢迎一块儿讨论。