JSPatch中遇到的問題-js斷點調試

關于:

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'], {
//實例方法
}, {})

- **舉個栗子** : 真機運行, 點擊單步調試, 會定位了崩潰的錯誤地點
![Snip20170120_7.png](http://upload-images.jianshu.io/upload_images/1426699-1c3bcdfe7b245b48.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)鼠標放上去定位具體錯誤地點
    ![Snip20170120_8.png](http://upload-images.jianshu.io/upload_images/1426699-87559c036b360028.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)**解決 : 查詢文檔是locate后面不應該有()**
![Snip20170120_9.png](http://upload-images.jianshu.io/upload_images/1426699-1c962772aefb8723.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

- **去掉上面 `locate` 后面的這個括號** : 繼續運行程序, 點擊單步調試, 異常結果如下 :  找不到這個宏
![Snip20170120_10.png](http://upload-images.jianshu.io/upload_images/1426699-0a6fea345ae2505e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
> 查詢文檔得知, `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`,運行程序, 不會報錯了.
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容