Cocoa webview UserAgent "webkit-legacy" проблема

Я решил это. Посмотрите на выбранный ниже ответ!

Я боролся, чтобы найти, что приводит к тому, что приложение WebView OSX Cocoa действует иначе, чем Safari. Оказывается, пользователь-агент отличается (вроде очевидным?), И веб-сайт, который я посещаю, не знает, как с этим справиться.

Удивительно, что https://messenger.com (facebook chat).

Проблема заключается в том, что она не отображает изображение на экране. Он загружается, но на самом деле он не отображается. Взгляните на это.

Снимок экрана с тестовым приложением

Если вы посмотрите на область, которую я обозначил как "2", вы просто видите пустое пространство. Я не подвергал этому цензуре. Он просто пуст.

Итак, здесь моя оригинальная ссылка вопроса: Простая Swift Cocoa приложение с WebKit: Загрузка изображения не работает

Я решил первый выпуск (спасибо ответам: D), но второй вопрос не устраняется.

  1. Общее изображение не отображается - я помечен как 2 на картинке.
    • снова, из других браузеров или выпущенных приложений, он показывает фотографии, которые я поделился с участниками, как показано ниже. (конечно, я подвергал цензуре фотографии) пример браузера, показывающий общие фотографии

Чтобы отладить это, я открыл элемент Inspect Element и нашел это.

<body class=" webkit-legacy webkit mac x1 body_textalign Locale_en_US _z4_" dir="ltr">

Когда я загрузил ту же самую страницу из Safari, я бы увидел следующее:

<body class="safari webkit mac x1 body_textalign Locale_en_US _z4_" dir="ltr">

Итак, я решил заменить эту строку из WebView моего приложения и альт! оно работает! так что...

TL;DR: Как я могу выполнять эту работу каждый раз при загрузке представления?

Я попытался найти некоторые методы для настройки моего пользовательского агента в Safari, но я не могу заставить это работать. Любое предложение пожалуйста?

Ответы

Ответ 1

Как и было обещано, вот ответ.

Я добавил эту функцию в класс ViewController.

func webView(sender: WebView!, didFinishLoadForFrame frame: WebFrame!) {
    webView.stringByEvaluatingJavaScriptFromString("document.body.className = 'safari webkit mac x1 Locale_en_US _z4_';")
}

Довольно просто, но он отлично работает.

У меня все еще есть проблемы с самим приложением (например, кнопка "Загрузить изображение не запускает диалог проводника файлов" ), но основные функции, такие как

  • отправлять/получать сообщения
  • просмотр общих изображений

работает нормально.

Я планирую работать над этим для

  • скачать изображение
  • Уведомление

Если вы заинтересованы в том, чтобы помочь мне, прокомментируйте!

Спасибо всем за вашу помощь:)

Ответ 2

Я создал простую прикладную программу и исправил эту проблему. Я предоставил тот же пользовательский агент, что и в Safari. После этого совлокальные фотографии работают так, как ожидалось.

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    self.webView.customUserAgent = @"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/601.2.7 (KHTML, like Gecko) Version/9.0.1 Safari/601.2.7";
    self.webView.mainFrameURL = @"https://messenger.com";
}

После этого я сравниваю пользовательские агенты:

Оригинальный пользовательский агент WebView: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/600.8.9 (KHTML, like Gecko)

Пользовательский агент Safari: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/601.2.7 (KHTML, like Gecko) Version/9.0.1 Safari/601.2.7

Итак, похоже, мне нужно изменить только последнюю часть User Agent. Например:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    self.webView.applicationNameForUserAgent = @"Safari/601.2.7";
    self.webView.mainFrameURL = @"https://messenger.com";
}

С помощью этого кода также работают общие фотографии. К сожалению, он не работает с другими значениями applicationNameForUserAgent, которые я пробовал.