que objective-c swift sfsafariviewcontroller

objective-c - mobile safari webview que es



¿Puedo precargar el contenido web para Safari View Controller? (4)

Puedo crear Safari View Controller sin problema:

let svc = SFSafariViewController(URL: NSURL(string: remote_url)!, entersReaderIfAvailable: true) self.presentViewController(svc, animated: true, completion: nil)

¿Hay alguna manera de que pueda precargar la URL antes de presentar el controlador de vista al usuario?

Por ejemplo, primero puedo precargar la URL (contenido web) en el fondo, y después de que el usuario haga clic en algo, puedo mostrar el controlador de vista Safari con el contenido de inmediato. El usuario sentirá que la carga de la página es más rápida o instantánea.

Las soluciones de PS / hacks también son aceptables. Por ejemplo, usar caché o iniciar el controlador de vista en segundo plano, etc.

EDITAR: por favor considere SFSafariViewController solamente.


Aquí hay una solución. Obviamente, si haces clic en el botón de inmediato verás la carga. Pero básicamente, cargué el navegador y coloqué la vista detrás de otra y puse un botón en esta otra vista.

Cuando se presiona el botón, el navegador se pone al frente, ya cargado. El único problema aquí es que no estoy usando ninguna transición pero al menos esa es una solución.

import UIKit import SafariServices class ViewController: UIViewController { var svc = SFSafariViewController(URL: NSURL(string: "https://microsoft.com/")!, entersReaderIfAvailable: true) var safariView:UIView? let containerView = UIView() let btn = UIButton() override func viewDidLoad() { super.viewDidLoad() //let tmpView = svc.view addChildViewController(svc) svc.didMoveToParentViewController(self) svc.view.frame = view.frame containerView.frame = view.frame containerView.backgroundColor = UIColor.redColor() safariView = svc.view view.addSubview(safariView!) view.addSubview(containerView) btn.setTitle("Webizer", forState: UIControlState.Normal) btn.titleLabel!.textColor = UIColor.blackColor() btn.addTarget(self, action: "buttonTouched:", forControlEvents: .TouchUpInside) btn.frame = CGRectMake(20, 50, 100, 100) containerView.addSubview(btn) view.sendSubviewToBack(safariView!) // Do any additional setup after loading the view, typically from a nib. } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } @IBAction func buttonTouched(sender: AnyObject) { view.bringSubviewToFront(safariView!) //self.presentViewController(svc, animated: true, completion: nil) } }


Lamentablemente, este comportamiento no es compatible con la implementación actual de SFSafariViewController . Recomendaría presentar un radar a Apple para agregar soporte para este comportamiento, pero como otros han sugerido, lo mejor es usar WKWebView y comenzar a cargar antes de agregarlo a la jerarquía.

Encontré un encantador radar de Twitter que en realidad menciona exactamente lo que estás pidiendo. Creo que podría encontrar útiles las siguientes solicitudes:

Alta prioridad: - Posibilidad de calentar el SFSafariViewController antes de presentarlo con una URL, solicitud de URL, datos HTML o archivo en el disco - Actualmente, están invirtiendo mucho en calentar la caché de URL compartida para los Tweets de alta prioridad, de modo que si el usuario los golpea. Abriremos UIWebView (lamentablemente no WKWebView) con esa página web pre-cacheada. Si pudiéramos simplemente calentar un SFSafariViewController con el enlace deseado, esto eliminaría una enorme cantidad de esfuerzo por nuestra parte.

Puedes ver en su implementación que simplemente almacenan en caché las respuestas usando UIWebView, ya que WKWebView parece ofuscar un poco la semántica de almacenamiento en caché. El único riesgo es que UIWebView sea un posible candidato para la desaprobación, como se ve en sus docs "En las aplicaciones que se ejecutan en iOS 8 y versiones posteriores, use la clase WKWebView en lugar de usar UIWebView".

Así que, desafortunadamente, parece que hay muchos puntos por los que debes saltar para que todo esto funcione, por lo que tu mejor opción por ahora es simplemente molestar a Apple y engañar al radar Twitters.


Puede descargar la página web utilizando el siguiente código. y representarlo con la ayuda de svc let data: NSData? do {let weatherData = try NSData (contentsOfURL: NSURL (string: remote_url) !, opciones: NSDataReadingOptions ()) data = weatherData print (weatherData)} catch {print (error)}

y cargarlo cuando lo necesites en el svc


Puede intentar usar un caché http, pero no creo que funcione, ya que el Safari View Controller funciona como un proceso separado (probablemente igual que Safari), por lo que, por ejemplo, elude a ATS.

¿La única forma en que puedo pensar en este trabajo es forzar de alguna manera al Safari del usuario para que lo cargue? openURL: o agregar a la lista de lectura tal vez? Esto no suena como una solución viable.

Siempre puede experimentar con la presentación personalizada del controlador de vista, adjuntarla a la jerarquía de vistas, eventos de aparición de CGRectMake(0,0,1,1) , pero establecer su marco en CGRectMake(0,0,1,1) o adjuntarlo en algún lugar fuera de la pantalla, luego esperar un momento y Represéntalo con un marco correcto.