How to pass fast javascript object (WKWebView / swift)

I am working on passing data from swift to javascript inside WKWebView

I have a custom class:

class AllInfo: AnyObject {
    var title = "Special Title"
    var description = "Special Description"
}

and initialize it

var info = AllInfo()

Then I have a WKWebView with which I pass WKUserScript with which I have a source property:

source: "changeDisplay('\(info)')"

My problem is how to access this object in javascript. I tried to access it as a javascript object, as well as an associative array with no luck. Here's js funciton:

function changeDisplay(passedInfo) {
    document.querySelector('h1').innerHTML = passedInfo.title
    document.querySelector('h2').innerHTML = passedInfo.description
}
setTimeout(function () {changeDisplay();}, 5000);

EDIT: When I try to access an object like this, I get undefined.

So my questions are:

Can I pass AnyObject to JavaScript and access it? If not, what type should I do for the quick class so that I can pass it easily.

javascript swift , , .

EDIT: , JSON .

+4
4

javascript , WKWebView, . . WKWebView native javascript. WKWebView API . JS native.

XWebView, API WKWebView. Swift.

, javascript -:

let webView = WKWebView(frame: frame, configuration: WKWebViewConfiguration())
webView.loadPlugin(AllInfo(), namespace: "someInfo")

javascript:

console.log(window.someInfo.title);
window.someInfo.title = "Some title";

Swift javascript, . , , @objc. (. https://developer.apple.com/swift/blog/?id=27 ). NSObject.

+2

.swift

func evaluateJavaScriptForData(dictionaryData: [String: AnyObject]) {
    // Convert swift dictionary into encoded json
    let serializedData = try! NSJSONSerialization.dataWithJSONObject(dictionaryData, options: .PrettyPrinted)
    let encodedData = serializedData.base64EncodedStringWithOptions(.EncodingEndLineWithLineFeed)
    // This WKWebView API to calls 'reloadData' function defined in js
    webView.evaluateJavaScript("reloadData('\(encodedData)')") { (object: AnyObject?, error: NSError?) -> Void in
        print("completed with \(object)")
    }
}

.js/.html

function reloadData(sBinaryParam) {
    // This 'atob' decodes the Base64 encoded data sent by swift
    var sDecodedParam = window.atob(sBinaryParam);
    var oData = JSON.parse(sDecodedParam);
    // This 'oData' is your js object (dictionary)
    return true;
}
+10

:

JSON - () javascript.

NSDictionary ( NSDictionary):

var allInfoRawSwift = ["title": "This is the title", "description": "this is the description"]

JSON ( do/catch, swift 2):

let allInfoJSON = try NSJSONSerialization.dataWithJSONObject(allInfoRawSwift, options: NSJSONWritingOptions(rawValue: 0))

JSON :

let allInfoJSONString = NSString(data: allInfoJSON, encoding: NSUTF8StringEncoding)!

suce, :

source: "changeDisplay(\(allInfoJSONSting))"

, , , Safari - .

, - .

+2

Swift Ashok , Swift 3.0.2:

func evaluateJavaScriptForData(dictionaryData: [String: AnyObject]) {
    // Convert swift dictionary into encoded json
    let serializedData = try! JSONSerialization.data(withJSONObject: swiftObject, options: .prettyPrinted)
    let encodedData = serializedData.base64EncodedString(options: .endLineWithLineFeed)
    // This WKWebView API to calls 'reloadData' function defined in js
    webView.evaluateJavaScript("reloadData('\(encodedData)')", completionHandler: { result, error in
        print("Completed Javascript evaluation.")
        print("Result: \(result)")
        print("Error: \(error)")
    })
}
0

All Articles