Webkit против SFSafariViewController и основных данных

Какой метод является наиболее предпочтительным для веб-браузера в приложении? В моем приложении должна быть панель инструментов внизу, и мне нужно иметь возможность делать снимки экрана посещенных веб-страниц, нажав кнопку на панели инструментов.

Вот с чем я столкнулся. Я хочу иметь возможность щелкнуть ссылку в своем приложении, открыть браузер в приложении, сделать снимок экрана и сохранить в основных данных вместе с другой информацией о сайте.

Я могу сохранить снимок экрана в фотопленку с помощью метода .takesnapshot() для Webkit. Я не смог сохранить его в основных данных. По состоянию на прошлую ночь я нашел несколько функций на SO, которые показывают, как сделать снимок экрана UIView и вернуть UIImage, но я не смог вернуть это обратно в Data, так как это то, что Core Data ожидает для двоичного данные. У кого-нибудь есть хороший ресурс для сохранения снимков Webkit в Core Data?

В одной из функций, которые я пробовал прошлой ночью, мне удалось вернуть объект UIImage, но мне не удалось преобразовать его обратно в данные. Я могу сохранить все остальные данные о сайте в Core Data, но я не могу сохранить изображение — на самом деле, когда я попытался сохранить данные напрямую с помощью метода Webkit .takesnapshot(), результат был нулевым.


person Nutrion    schedule 30.04.2019    source источник


Ответы (1)


Я собираюсь ответить на ваш вопрос в двух частях.

WebKit против SFSafariViewController

Если вы хотите иметь настраиваемую панель инструментов с кнопкой для создания снимков экрана, я бы использовал UIViewController с настраиваемой панелью вкладок, где вы можете добавить любые кнопки, которые хотите, а затем я бы также встроил представление WebKit в контроллер представления. Это должно быть довольно просто.

Сохранение скриншота в Core Data

Судя по всему, вы можете сделать снимок экрана неправильно, вы хотите сделать это с контекстом начала и конца изображения следующим образом:

let layer = UIApplication.shared.keyWindow!.layer
let scale = UIScreen.main.scale
UIGraphicsBeginImageContextWithOptions(layer.frame.size, false, scale)
layer.render(in: UIGraphicsGetCurrentContext()!)
let screenshot = UIGraphicsGetImageFromCurrentImageContext()

Теперь у вас есть скриншот, сохраненный как UIImage? в вашей переменной screenshot. Затем вы должны преобразовать это в данные с помощью:

let data = UIImagePNGRepresentation(screenshot!)

Что должно дать вам представление данных вашего изображения, которое вы затем можете сохранить в Core Data.

person Mr.P    schedule 30.04.2019
comment
У меня почему-то нет UIImagePNGRepresentation. То, что вы предоставили, очень близко к тому, что у меня уже есть в функции, и оно возвращает UIImage. Это то, что я не смог преобразовать. Похоже (если я не упустил что-то, что вероятно), этот метод больше не существует по этой ссылке: -instance-method-uiimage-jpegdata">link Я попробовал это вчера, и я также не получаю метод .jpegData для возвращаемого значения. - person Nutrion; 01.05.2019
comment
Извините, UIImagePNGRepresentation устарело, должно быть UIImage.pngData(screenshot!) - person Mr.P; 01.05.2019