Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

61
Visualizações
usando callAsyncJavaScript en WKWebView

¿Qué diferencia hay entre los métodos callAsyncJavaScript y evaluateJavaScript ? Utilizarlo con el mismo script como:

 evaluateJavaScript("document.documentElement.outerHTML.toString()")

y

 callAsyncJavaScript("document.documentElement.outerHTML.toString()")

devuelve resultados diferentes: HTML en primer lugar y .sucess(nil) en segundo...

almost 4 years ago · Santiago Trujillo
1 Respostas
Responde à pergunta

0

Hay 3 métodos que permiten ejecutar JS desde WKWebView (bueno, hay más firmas, pero 3 métodos principales):

  • El más antiguo y primitivo es evaluateJavaScript(_:completionHandler:) , que permite ejecutar fragmentos de código arbitrarios. Hoy en día, no hay excusa para usarlo, ya que no tiene beneficios sobre los otros métodos.

  • La versión mejorada más moderna es evaluateJavaScript(_:in:in:completionHandler:) que se introdujo en iOS 14. Se puede usar para ejecutar código síncrono. Utiliza una forma moderna de presentar un resultado: Result<Any, Error> , que permite encapsular cualquier tipo de resultado, éxito o fracaso en un solo objeto conveniente para usar. Pero la diferencia clave es que te permite especificarel contexto de la secuencia de comandos , lo que evita conflictos entre diferentes secuencias de comandos:

Ejecutar una secuencia de comandos en su propio mundo de contenido le otorga una copia separada de las variables de entorno para modificar.

  • Pero ninguna de estas funciones es compatible con código JavaScript asíncrono, es decir, promesa . Puede implementar la ejecución de la promesa si combina evaluateJavaScript con WKScriptMessage (por ejemplo, como se explica aquí ), pero es muy incómodo. Así que callAsyncJavaScript(_:arguments:in:in:completionHandler:) resuelve ese problema: puede usarlo para ejecutar una promesa, sin la ayuda adicional de WKScriptMessage , lo que hace que el código se distribuya menos y sea más fácil. Aquí tienes un ejemplo de cómo se hace.

Además tiene 2 ventajas adicionales de este método:

  • El primer argumento ya no es un nombre de función, sino functionBody , que se convierte en una función anónima y evita los posibles conflictos de nombres debido al alcance global de la función.
  • Y también los argumentos se separan del cuerpo como [String : Any] , lo que nos permite definir el cuerpo de la función en algún lugar de forma estática y reutilizarlo pasando los argumentos (en lugar de inyectarlos en el cuerpo de la función como lo necesita con evaluateJavaScript .

Por lo tanto, debe usar este método para ejecutar código JS asíncrono, y puede usarlo para el código síncrono.

Una cosa más: con callAsyncJavaScript debe recordar que está definiendo el cuerpo de la función, por lo que si desea que se devuelva algo, debe usar la word return (a diferencia de evaluateJavaScript , donde definió una pieza de código para ejecutar, que puede no tienen return , a menos que defina una función).

almost 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda