Comment puis-je passer rapidement à un objet javascript (WKWebView / swift)
Je suis en train de travailler sur la transmission des données de swift pour javascript à l'intérieur d'un WKWebView
J'ai une classe personnalisée:
class AllInfo: AnyObject {
var title = "Special Title"
var description = "Special Description"
}
et de l'initialiser avec
var info = AllInfo()
J'ai alors d'un WKWebView avec qui j'ai passer un WKUserScript avec qui j'ai une source de la propriété de:
source: "changeDisplay('\(info)')"
Mon problème est comment puis-je accéder à cet objet en javascript. J'ai tenté d'y accéder comme un objet javascript ainsi que tableau associatif avec pas de chance. Voici le js d'une fonction:
function changeDisplay(passedInfo) {
document.querySelector('h1').innerHTML = passedInfo.title
document.querySelector('h2').innerHTML = passedInfo.description
}
setTimeout(function () {changeDisplay();}, 5000);
EDIT: Quand je fais essayer d'accéder à l'objet comme celui-ci, je reçois pas défini.
Donc mes questions sont:
Puis-je passer un AnyObject à JavaScript et à l'accès?
Si non, que dois-je faire de la swift de la classe, de sorte que je peux facilement passer.
Je suis tenté de créer un objet javascript dans swift comme une chaîne de caractères et le passer, mais je pense qu'il y a une meilleure façon.
Grâce
EDIT: j'ai répondu comment j'ai pu passer des données en JSON ci-dessous.
OriginalL'auteur Deciple | 2015-08-20
Vous devez vous connecter pour publier un commentaire.
Le passage d'un objet natif javascript est complexe, en particulier pour les WKWebView qui fonctionne en multi-mode. Toute opération concernant l'objet natif doit traverser des processus de démarcation. WKWebView n'a pas de langue en charge de la liaison entre les indigènes et javascript. Cependant, WKWebView prend en charge la transmission de message de l'API. Vous avez de l'envelopper pour les interactions complexes entre JS et native.
J'ai créé un projet nommé XWebView qui fournit langue de liaison de style API basée sur le message brut passant de WKWebView. Il est écrit en Swift.
Quant à votre exemple, l'objet doit être injecté dans le code javascript de l'espace de noms tout d'abord:
Vous pouvez accéder à l'objet en javascript:
Pour exposer un objet Swift pour javascript, des propriétés et des méthodes doivent être dynamiques de l'expédition. Cela signifie, les propriétés doivent être dynamique, les méthodes doivent a @objc attribut. (Voir https://developer.apple.com/swift/blog/?id=27 dynamique dispatching). Pour simple, hériter de NSObject.
OriginalL'auteur soflare
.swift, de définir et d'appeler cette méthode
.js/.html fichier
pourriez-vous mettez pas d'objets personnalisés en objet JSON en premier?
oui je suis en manque de quelque chose, en effet. J'ai donc trouvé qu'il était facile de transformer un JSON pour objet personnalisé, et bien, j'ai peut-être besoin d'écrire une fonction reverse à son tour un objet personnalisé en JSON.
Cela ne fonctionne pas si les données contiennent des caractères Chinois.
atob
n'est pas en mesure de décoder le format UTF-8, malheureusement: stackoverflow.com/questions/30106476/...OriginalL'auteur Ashok
Pour répondre à ma propre question:
JSON est (sans doute) le meilleur type pour passer de javascript.
J'ai enlevé la classe et créé à la place d'un NSDictionary comme (ou de type de votre classe comme NSDictionary):
Puis de le convertir en JSON (à l'intérieur de n'/catch, si swift 2):
De la convertir en JSON à la chaîne:
Puis ajouter la source propery comme:
Pour le débogage, il est préférable d'avoir la fonction que vous venez de définir une variable globale à ce que votre passage, puis de l'utilisation de safari, le mode développeur pour accéder à une console web et inspecter la variable globale.
Laissez-moi savoir si il ya une meilleure façon, ou si vous avez des conseils.
Grâce
OriginalL'auteur Deciple
Voici une mise à jour du code Swift de Ashok a accepté de répondre, compatible avec Swift 3.0.2:
OriginalL'auteur Jamie Birch