1. 程式人生 > >IOS JavaScriptCore 跳轉失去物件和一些BUG總結

IOS JavaScriptCore 跳轉失去物件和一些BUG總結

引: 以前做專案的時候也做過webview和js互動,以為會手到擒來。結果WTFK、兩天的時間來研究它。主要遇到了一個BUG,下面簡單的說一下。

  下面一段程式碼注入時機的選擇,這是一個很重要的問題。

    context = [_webViewvalueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];

//列印異常

context.exceptionHandler = ^(JSContext *context1, JSValue *exceptionValue) {

        context1.

exception = exceptionValue;

NSLog(@"%@", exceptionValue);

    };

context[@"object"] =self; //JSExport協議關聯 native的方法

①  在webViewDidStartLoad注入

   現象: 在UIWebView的webViewDidStartLoad階段建立JSContext並暴露oc端的方法,在載入一級頁面時js正常呼叫oc的方法,而跳轉到二級頁面中卻無法執行oc的方法;而在webViewDidStartLoad階段由於並未載入完js檔案, 因此js層定義的函式在oc端無法執行。

    原因:我跟蹤了jsContext二級頁面根本沒有建立,這時候的jsContext還是第一次載入頁面的那個物件。所以JS無法獲取物件執行oc方法。

②在webVIewDidFinishLoad建立

   現象:由於載入js階段在webVIewDidFinishLoad階段之前,因此一級頁面js無法呼叫oc方法,但是二級頁面同理也是如此

  原因: 如果JS的呼叫OC的方法,也就是在webview載入之前那就掉不起來。因為之前JS無法獲得OC物件  

 解決辦法:

    1., 可以通過在js設定setTimeout來讓任務放到執行佇列的末端,先執行oc層的webVIewDidFinishLoad方法,待任務完成後再執行js中的非同步程式碼,通過這種方式可以完成js呼叫oc方法;

 或者JS設定一個監聽監聽OC是否載入完成,如果完成就呼叫方法。

   2.用一個私有API,監聽何時建立好jscontext,在這時候注入。這個方法很好,只是蘋果不允許上架。哎


相關推薦

IOS JavaScriptCore 失去物件一些BUG總結

引: 以前做專案的時候也做過webview和js互動,以為會手到擒來。結果WTFK、兩天的時間來研究它。主要遇到了一個BUG,下面簡單的說一下。   下面一段程式碼注入時機的選擇,這是一個很重要的問

iOS介面一些優化方案

App應用程式開發, 介面跳轉是基礎中的基礎, 幾乎沒有一個App是用不到介面跳轉的, 那麼怎麼樣去書寫介面跳轉程式碼才是比較合理的呢? 大家可能在想跳轉無非就2種方式, 能有什麼內容? 其實並不是這樣子的, 對於研發老手來說, 大型應用幾乎都是利用URLSc

iOS開發app間相互以及appStore系統設定

1.app間相互跳轉 (1)兩個專案,這裡我們暫且說專案A和專案B。 (2)專案A跳轉到專案B。 步驟1:開啟專案B工程 找到info 目錄下的URL Types,點選+號進行新增,然後設定URL schemes。 (3)將專案B的URL schemes 記錄下來,以便在專

iOS ViewController返回

檢視控制器 iOS和android的檢視控制器的邏輯類似 應用程式用一個棧來管理檢視 跳轉到下一個檢視 let nextView = CameraViewControll() self

iOS應用(包括iPhone原有應用第三方應用)

iOS應用間跳轉簡介 在開發的過程中,我們經常會遇到需要從一個應用程式跳轉到另一個應用程式的場景。這就需要我們掌握iOS應用程式之間的相互跳轉知識。 應用間跳轉應用場景 使用第三方使用者登入,跳轉到需授權的App。如QQ登入,微信登入等

iOS介面過程中導航欄tabBar的隱藏與顯示

一、當A頁面要push到B頁面,需要將B頁面的導航欄隱藏時,我們只需要在A頁面中重寫以下兩個方法: override func viewWillAppear(animated: Bool) {

IOS 應用 (IOS9白名單)

tom super created reat 獲取 import 字符 ges ict 跳轉到指定app的實現 IOS中應用的跳轉是通過URL實現的,因此在實現應用跳轉之前我們要設置一下對應的URL。 圖一(尋找配置軟件的URL) 圖二(具體配置選項) 註意: 如果IO

ios NavigationViewController以及返回傳值

spl art com osi nts isp lai -i rgb (一)使用NavigationViewController進行頁面跳轉時,應該使用pushViewController方法來跳轉至下一頁面。這種話。下一頁面相同在Navigatio

iOS 10到其他app

取消 and self LEDE har .com shared available else - (BOOL)jumpsToThirdAPP:(NSString *)urlStr{ if ([urlStr hasPrefix:@"mqq"] ||

iOS如何玩App推廣統計?

想獲取APP安裝數量統計嗎? 想輕鬆獲取更多使用者數量嗎? 想有效保持使用者的活躍度嗎? 這裡我來帶你玩轉APP的推廣與統計,推薦使用的是專業、輕便的Shareinstall雲服務。 什麼是shareinstall: Shareinstall其實是一個APP的推

iOS 頁面效能優化

基礎知識 想在螢幕上顯示一個檢視,我們只需要簡單地實現以下程式碼,並執行Application到模擬器或真機即可。   圖1 -渲染服務程序 雖然看到的效果跟Application的程式碼是一一對應的,但檢視繪

分享最近對網站外鏈頁面程式碼的一些改善

很久之前在部落格分享了幾篇關於外鏈跳轉的程式碼或教程。如果沒看過的可以先了解下: 最近,有了一些靈感以及在其他部落格也吸收了一些相關經驗,就把現用的外鏈程式碼小改了下,感覺還不錯,現在分享下,喜歡的可以試試。 Ps:不喜歡囉嗦的朋友請直接從第五步開始看。 一、安全加固 首先,加入了在魚叔部落

HeapDumpOnOutOfMemoryError堆儲實踐一些分析

程式碼1在迴圈中建立long[]例項時,上次迴圈建立的long[]例項沒有被引用,可以被垃圾回收掉,所以在引數Xmx40m下,程式碼1建立佔用32M記憶體的long[]還是可以正常執行的,試圖建立佔用64M記憶體的long[]才丟擲異常;程式碼2在迴圈中建立long[]例項時,上次迴圈建立的long[]例項還

JSP中頁面response.sendRedirect()request.getRequestDispatcher()的區別

Java Web開發中,採用MVC模式的時候,在控制器完成模型的呼叫之後會選擇介面對使用者響應,用常有2種方式 1,通過response物件的sendRedirect方法重定向: response.

ios開發:到根檢視並到第一個tabbar第一個頁面

跳轉到根檢視並跳轉到第一個tabbar第一個頁面 // 直接跳轉到跟檢視 self.navigationController.tabBarController.hid

掃描二維碼自動識別手機系統(Android/IOS不同頁面

移動網際網路發展迅速,各種APP的開發都太瘋狂了,一般稍大點兒的應用,都會準備多個版本,比如:iPhone版、iPad版、Android版,我們姑且稱之為:終端適配。 業務做的再大點兒的,APP還會考慮覆蓋到多個國家,比如:中文版、英文版、日文版、韓文版等,我們可稱之為

在沒有個人/公司網站的情況下,如何利用同一個二維碼自動識別手機系統(Android/IOS不同下載頁面

一、使用場景 開發了一款App,包括iOS及Android版,到了推廣階段,準備生成二維碼讓使用者掃碼下載,那這個二維碼該怎麼生成?iOS及Andorid各自生成一個二維碼讓使用者區分下載?當然這種方式是可行的,但卻增加了使用者的使用成本!那是不是有一種方式可

jsp頁面請求轉發請求重定向的區別

jsp實質上就是一個servlet,在完成多頁面跳轉的時候有倆種方式1.請求轉發2.請求重定向 用servlet來舉列子實現(現把三個Servlet在專案的web.xml中初始化和對映哦) 列子思路:寫好一個介面,裡面有請求轉發實現的servlet(圖中:ForwardServlet),和請

求助,iOS tableview 問題,單擊無法

程式碼 -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ //    NSString *rowString = [self.list ob

vue中的倒計時頁面問題axios網路請求this作用域問題

一、前言       這兩個是在日常開發中碰到的問題,網上都能查得到答案,但是我怕自己會忘記,姑且記錄一下用作筆記吧。 二、vue倒計時跳轉問題 1、案例 比如我們在一次網路請求結束之後,如果返回結果是成功,則倒計時1.5秒跳轉頁面。 2、碰到的問