關于:
JSPatch -- 熱修復BUG神器, 大公司會用它來做模塊更新, 而且配合React native會更好. 關于它的一些介紹就不廢話了, 直接上說做 hot fix js斷點調試
中遇到的問題
js斷點調試步驟
1 推薦代碼優先使用工具轉換會省很多時間 : JSPatchConvertor
2 將OC代碼轉換后, 保存成main.js文件, 拖到項目中去
3 在app delegate里面寫上
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 用于發布前測試腳本。先把腳本放入項目中,調用后,會在當前項目的 bundle 里尋找 main.js 文件執行
[JSPatch testScriptInBundle];
return YES;
}
4 轉換后啟動 js斷點調試 : JS-斷點調試
-
5 在真機上運行項目
Safari
會彈出Safari Web檢查器
Snip20170120_1.png- 如果沒有彈出
Safari Web檢查器
, 直接點擊JSContext
- 如果沒有彈出
Snip20170120_2.png
相對于js不熟悉的, 仔細看文檔 : JSPatch用法
遇到的問題
- 1 關于API
defineClass
Snip20170120_3.png
-
注意點 :
如果沒有新增property,字符串數組,這一項可省略, 有的話就加進去數組, 在這里假設有屬性property
-
如果既有
類
方法, 又有實例方法
, 分別用一個括號擴住方法用逗號隔開,實例方法
在前,類方法
在后
// JS
defineClass("JPTableViewController", ['data', 'totalCount'], {
//實例方法
}, {
//類方法
shareInstance: function() {
...
},
})
+ **如果有 `類` 方法, 沒有 `實例方法` , 前面裝`實例方法`{} 不能省略**
```
// JS
defineClass("JPTableViewController", ['data', 'totalCount'], {}, {
//類方法
shareInstance: function() {
...
},
})
+ **如果沒有 `類` 方法, 有 `實例方法` , 后面裝`類`方法的{} 不能省略**
```
// JS
defineClass("JPTableViewController", ['data', 'totalCount'], {
//實例方法
}, {})
- **舉個栗子** : 真機運行, 點擊單步調試, 會定位了崩潰的錯誤地點
鼠標放上去定位具體錯誤地點
**解決 : 查詢文檔是locate后面不應該有()**

- **去掉上面 `locate` 后面的這個括號** : 繼續運行程序, 點擊單步調試, 異常結果如下 : 找不到這個宏

> 查詢文檔得知, `Objective-C 里的常量/枚舉不能直接在 JS 上使用
+ **解決過程** : 可以直接在 JS 上用 `具體值`代替 `NSNotFound ` 在OC中按住command點擊 查看是 `static const NSInteger NSNotFound = NSIntegerMax;`
繼續點擊查詢發現`#define NSIntegerMax LONG_MAX` 本身是一個宏, 無法得知具體數值, 只能打印`NSLog(@"宏: %ld", (long)NSNotFound);` 得到結果 `9223372036854775807`
+ **解決** 用上面 `log` 的數值取代`main.js`里面的`NSNotFound`,運行程序, 不會報錯了.