1.首先是新項目npm install, 不能運行cnpm install ,那樣會導致目錄不對,安裝文件在.npminstall的隱藏文件夾下,並且是軟連接,然后運行會出現頭文件找不到
2.rn 打包離線包 https://segmentfault.com/a/1190000004189538
react-native bundle --entry-file index.ios.js --bundle-output ./ios/bundle/index.ios.jsbundle --platform ios --assets-dest ./ios/bundle --dev false
改下oc里
jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index.ios" fallbackResource:nil]; //開發時使用 // jsCodeLocation = [[NSBundle mainBundle] URLForResource:@"index.ios" withExtension:@"jsbundle"]; //added by john,使用打包的離線包
3.jsx render()方法下html直接注釋有問題
4.sublime打開項目的時候,不能在根目錄npm run start,一直報事件流錯誤,然后導致在xcode里運行的時候會出現bundle是nill,這個可能和個人編輯器有關.
5.當fetch數據時候直接報 Network request failed,而網絡是好的時候,看看xcode里的錯誤信息,是不是http被block了,在Xcode下plist文件里改下配置Allow Arbitrary Loads設置成YES就好
6.注意箭頭函數的this指針,這個是es6的語法,我定義的一個模塊Util,像下面這樣使用
let Util = { fn1:()=>{ ... }, fn2:()=>{ this.fn1() //錯誤 Util.fn1() //正確 } }
7.AsyncStorage這是個異步進行存取值的對象,setItem和getItem返回的是個promise,像下面這樣是取不到值的
let varifyTime = Util.storageGetItem('varifyTime')
let varifyCode = Util.storageGetItem('varifyCode')
只能在then里的回調取,但是那樣你就只能把處理放在then的回調里面。比如我要取兩個保存在AsyncStorage下的值,只有這兩個值都有了,才能進行簽名
Util.storageGetItem('varifyTime').then(function(varifyTime){
let varifyTime = varifyTime;
Util.storageGetItem('varifyTime').then(function(varifyCode){
let varifyCode = varifyCode
let encryptstr = Util.encrypt(varifyCode,varifyTime); //這里是去簽名
})
})
瘋了,兩層嵌套
可以使用 async/await來同步異步返回,就像下面
Sign:async(data) => { let dataStr = JSON.stringify(data) let varifyTime = await Util.storageGetItem('varifyTime'); let varifyCode = await Util.storageGetItem('varifyCode'); let encryptstr = Util.encrypt(varifyCode, varifyTime); }
這樣就清楚多了
8.這個其實和RN無關,是http請求的東西,http,要么get,直接url,post的話有表單和Json格式,如下兩種
/** * http表單請求方式,包括成功及失敗的回調 * @param url * @param data * @param successCallback * @param failCallback */ httpPostForm: (url, data, successCallback, failCallback) => { console.log('tag', '請求地址=' + url); fetch(url, { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/x-www-form-urlencoded' }, body: data + '' }) .then((response) => response.text()) .then((responseText) => { let result = JSON.parse(responseText); if (result.msg_code === '9004') { console.log('success: ' + responseText); successCallback(result.result); } else { console.log('fail: ' + responseText); failCallback(result.msg); } }) .catch((err) => { console.log('err: ' + err); failCallback(err); }).done(); },
/** * http的json請求方式,包括成功及失敗的回調 * @param url * @param data * @param successCallback * @param failCallback */ httpPostJson: (url, data, successCallback, failCallback) => { console.log('tag', '請求地址=' + url); fetch(url, { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', }, body: JSON.stringify(data) }) .then((response) => response.text()) .then((responseText) => { let result = JSON.parse(responseText); if (result.msg_code === '9004') { console.log('success: ' + responseText); successCallback(result.result); } else { console.log('fail: ' + responseText); failCallback(result.msg); } }) .catch((err) => { console.log('err: ' + err); failCallback(err); }).done(); },
但如果你表單請求時,你的參數要去拼接,'param1=' + param1 + '&' + 'param2='+ param2...,反正我是覺得不直觀且麻煩,一般請求就是如下定義
data = {
param1:param1,
param2:param2,
param3:param3,
}
AngularJS也是默認采用json格式傳送數據,需要修改設置下httpProvider。
寫個下面的方法
transFormparam :(obj) => { var query = '', name, value, fullSubName, subName, subValue, innerObj, i; for (name in obj) { value = obj[name]; if (value instanceof Array) { for (i = 0; i < value.length; i++) { subValue = value[i]; fullSubName = name + '[' + i + ']'; innerObj = {}; innerObj[fullSubName] = subValue; query += param(innerObj) + '&'; } } else if (value instanceof Object) { for (subName in value) { subValue = value[subName]; fullSubName = name + '[' + subName + ']'; innerObj = {}; innerObj[fullSubName] = subValue; query += param(innerObj) + '&'; } } else if (value !== undefined && value !== null) query += encodeURIComponent(name) + '=' + encodeURIComponent(value) + '&'; } return query.length ? query.substr(0, query.length - 1) : query; },
有了上面的方法,把上面的那個json參數data作為傳入處理下就行了
9. 運行出現Can't find 'node' binary to build React Native bundle 錯誤
先which node,找到node路徑,然后在Build Phases如下修改

10. build & run的時候出現 'bundleURL must be non-nil when not implementing loadSourceForBridge'
Product > Scheme > Edit Scheme > set run configuration to Release.

如果要debug模式,這里還是改成debug,然后一定要在項目目錄跑npm run start命令,也就是要起server
11.
