Подтвердить что ты не робот

Могу ли я предварительно загрузить веб-контент для Safari View Controller?

Я могу создать Safari View Controller без проблем:

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

Можно ли предварительно настроить URL-адрес до того, как я представлю пользователю контроллер вида?

Например, я могу предварительно загрузить URL-адрес (веб-контент) в фоновом режиме, а после того, как пользователь нажмет на него что-нибудь, я могу сразу показать контроллер просмотра Safari с содержимым. Пользователь будет чувствовать, что загрузка страницы происходит быстрее или мгновенно.

P.S. Обходные пути/взломы также приемлемы. Например, использование кеша или запуск контроллера представления в фоновом режиме и т.д.

РЕДАКТИРОВАТЬ: пожалуйста, рассмотрите только SFSafariViewController.

4b9b3361

Ответ 1

Вот решение. Очевидно, что если вы нажмете на кнопку сразу, вы увидите загрузку. Но в основном я загружаю браузер и помещаю представление за другой, и я помещаю кнопку в это другое представление.

Когда вы нажимаете кнопку, браузер выводит на передний план, уже загруженный. Единственная проблема здесь в том, что я не использую какой-либо переход, но хотя бы одно решение.

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


}

Ответ 2

К сожалению, это поведение не поддерживается текущей реализацией SFSafariViewController. Я бы рекомендовал подать радар с Apple, чтобы добавить поддержку этого поведения, но, как и другие, вы предложили, что лучше всего использовать WKWebView и начать загрузку до ее добавления в иерархию.

Я наткнулся на прекрасный радар из Twitter, который фактически упоминает именно то, о чем вы просите. Я думаю, вы могли бы найти следующие запросы полезными:

Высокий приоритет:   - Возможность нагревать SFSafariViewController до фактического представления его URL-адресом, URL-запросом, HTML-данными или файлом на диске     - В настоящее время инвестируют значительные средства в потепление общего кэша URL-адресов для высокоприоритетных твитов, чтобы, если пользователь набрал этот твит, мы откроет UIWebView (к сожалению, не WKWebView) с этой предварительно кэшированной сетью стр. Если бы мы могли просто согреть SFSafariViewController с помощью желаемая ссылка, это устранит огромные усилия конец.

В своей реализации вы можете видеть, что они просто кэшируют ответы с использованием UIWebView, так как WKWebView, похоже, немного запутывает семантику кэширования. Единственный риск состоит в том, что UIWebView является вероятным кандидатом на устаревание, как вы видите в их docs "В приложениях, работающих в iOS 8 и более поздних версиях, используйте WKWebView вместо использования UIWebView."

Так что, к сожалению, похоже, что у них много обручей, которые вам нужно перепрыгнуть, чтобы получить все это, поэтому на ваш выбор лучше всего просто приставать к Apple и обманывать радар Twitters.

Ответ 3

Вы можете попробовать использовать кеш http, но я не думаю, что он работал бы, так как Safari View Controller работает как отдельный процесс (вероятно, такой же, как Safari), поэтому почему это, например, обходит АТС.

Единственный способ, которым я могу думать об этой работе, - это каким-то образом заставить пользователя Safari загружать его? openURL: или, возможно, добавить в Список Чтения? Это не похоже на жизнеспособное решение.

Вы всегда можете поэкспериментировать с пользовательской презентацией контроллера представления, прикрепить его к иерархии представлений, вызвать события появления события, но установить его фрейм на CGRectMake(0,0,1,1) или прикрепить его куда-нибудь за пределами экрана, а затем подождать некоторое время и представить его с помощью правильная рамка.

Ответ 4

вы можете загрузить веб-страницу, используя следующий код. и представлять его с помощью svc пусть данные: NSData?  делать {           let weatherData = попробуйте NSData (contentsOfURL: NSURL (string: remote_url)!, options: NSDataReadingOptions()) data = weatherData           печать (weatherData)       } поймать {           печать (ошибка)       }

и загрузите его, когда вам нужно в svc