objective ios iphone xcode swift swift2

ios - objective - ¿Cómo paso un objeto rápido a javascript(WKWebView/swift)



swift wkwebview javascript (4)

Aquí hay una actualización del código Swift de la respuesta aceptada de Ashok, compatible con 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)") }) }

Estoy trabajando en pasar datos de swift a javascript dentro de WKWebView

Tengo una clase personalizada:

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

e inicializarlo con

var info = AllInfo()

Luego tengo un WKWebView con el que paso un WKUserScript con el que tengo una fuente de propiedad:

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

Mi problema es cómo acceder a este objeto en el javascript. Intenté acceder a él como un objeto JavaScript y una matriz asociativa sin suerte. Aquí está la js funciton:

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

EDITAR: Cuando intento acceder al objeto de esta manera, no estoy definido.

Entonces mis preguntas son:

¿Puedo pasar un AnyObject a JavaScript y acceder a él? De lo contrario, de qué tipo debo hacer la clase rápida para poder pasarla fácilmente.

Estoy tentado de crear un objeto javascript en una secuencia rápida y pasar eso, pero creo que hay una mejor manera.

Gracias

EDITAR: Respondí cómo pude pasar datos como JSON a continuación.


En .swift, defina y llame a este método

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)") } }

En el archivo .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; }


Pasar un objeto nativo a javascript es complejo, especialmente para WKWebView que se ejecuta en modo multiproceso. Cualquier operación con respecto al objeto nativo necesita cruzar el límite del proceso. WKWebView no tiene soporte de enlace de idioma entre nativo y javascript. Sin embargo, WKWebView es compatible con la API de paso de mensajes. Debe envolverlo para interacciones complejas entre JS y nativo.

Creé un proyecto llamado XWebView que proporciona una API con estilo de enlace de idioma basada en el paso de mensajes sin procesar de WKWebView. Está escrito en Swift.

En cuanto a su ejemplo, el objeto debe ser inyectado en el espacio de nombres javascript en primer lugar:

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

Puede acceder al objeto en javascript:

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

Para exponer un objeto Swift a JavaScript, las propiedades y los métodos deben ser dinámicos. Esto significa que las propiedades deben ser dinámicas , los métodos deben tener el atributo @objc . (Consulte https://developer.apple.com/swift/blog/?id=27 para el envío dinámico). Para simple, herede de NSObject.


Respondiendo mi propia pregunta:

JSON es (probablemente) el mejor tipo para pasar a javascript.

Eliminé la clase y en su lugar creé un NSDictionary como (o escribí tu clase como NSDictionary):

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

Luego conviértalo en JSON (dentro do / catch if swift 2):

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

La conversión JSON a cadena:

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

Luego agrega la propiedad del souce como:

source: "changeDisplay(/(allInfoJSONSting))"

Para depurar, lo mejor es que su función simplemente establezca una variable global para lo que pase, luego use el modo de desarrollador de safari para acceder a una consola web e inspeccionar la variable global.

Avíseme si hay una manera mejor o si tiene alguna sugerencia.

Gracias