2017-05-29 28 views
1

我目前想從港口的Android到iOS的應用程序,通過網頁視圖應用了許多邏輯的JavaScript函數返回(類似於Android的JS接口)。充分利用斯威夫特WkWebView接口在IOS 10

在Android版本,我可以有一些諸如

function sendInfo(fileName, dataContent){ 
    Android.saveData(fileName, dataContent); 
} 

並通過Java部分

@JavascriptInterface 
public void saveData(String fileName, String dataContents) { 
    //.. do something with the received information 
} 

我試圖做內部的ios同樣的事情的界面處理,雖然我我目前有問題。請注意,我們在IOS10中使用Swift 3。我目前擁有的是:

我已經創建了內部的loadView(配置和控制器),所以由它到達的viewDidLoad()一切都被顯示在應用程序。

override func loadView(){ 
     super.loadView() 

     let contentController = WKUserContentController() 
     contentController.add(self as WKScriptMessageHandler, name: "callbackHandlerFile") 

     // configuration 
     let config = WKWebViewConfiguration() 
     config.userContentController = contentController 
     self.webView = WKWebView(frame: self.view.frame, configuration: config) 
     self.view = self.webView 

    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     let url = NSURL(fileURLWithPath: Bundle.main.path(forResource: "html/_wv", ofType: "html")!) 
     let req = URLRequest(url: url as URL) 
     self.webView!.load(req) 

    } 

我的問題來自於一個事實,我已經看到了將信息從Javascript發送到快捷的方式是這樣的:

function sendInfo(fileName, dataContent){ 
    webkit.messageHandlers.callbackHandlerFile.postMessage(fileName); 
    webkit.messageHandlers.callbackHandlerFile.postMessage(dataContent); 
} 

然後我們檢索它們爲:

// message handler delegate method 
func userContentController(_ userContentController: WKUserContentController, didReceive message:WKScriptMessage){ 
    if(message.name == "callbackHandlerFile") { 
      print(message.body)  
    } 
} 

print語句將打印出兩個消息一個接一個,這意味着將打印文件名的內容,然後dataContent的內容,因爲所有的數據上了混搭同樣的例子。

我怎麼會去通過獲得由於Android對方同樣的效果?我需要的,因爲我需要創建一些文件I/O,因此具有不同callbackHandlers是相當多了question.All我需要的是有一些類似於Android版本會對同一個地方這兩個部分。任何指針將不勝感激。

編輯:

我知道,我可以通過對象的消息處理程序,所以我會碰到這樣的:

webkit.messageHandlers.callbackHandlerFile.postMessage({fileName: file,data: data_txt}); 

但還是cant't找到一種方法,而不訪問此數據編譯器給我的錯誤,因爲message.body也適用於字符串

+1

你嘗試用數據和要執行的操作創建一個JSON對象試試? '{ 「行動」: 「SAVEDATA」, 「數據」:{ 「文件名」:文件名, 「dataContent」:dataContent }' – piyuj

+0

@piyuj是的,但我不明白如何檢索它的內消息。Swift代碼中的主體部分。我猜測我將不得不將對象轉換爲字典之類的東西來訪問它的值。 –

+0

是的沒錯,你可以把它轉換成字典 – piyuj

回答

2

您可以處理此創建具有數據和你想要做的動作JSON對象。

例子:

{ "action" : "saveData", "data": { "fileName": fileName, "dataContent" : dataContent } }

然後處理響應的解釋是這樣的:

// message handler delegate method 
func userContentController(_ userContentController: WKUserContentController, didReceive message:WKScriptMessage){ 
     guard let body = message.body as? [String: Any] else { 
      return 
     } 
} 
+0

這是驚人的piyui。我正在研究這種形式,我可以檢查收到的信息的內容,並從那裏檢查操作類型和處理數據的方式。你從挫折中拯救了我。乾杯! –