HomeРазноеUiwebview что это: UIWebView. Показываем сайты, документы и просто HTML |

Uiwebview что это: UIWebView. Показываем сайты, документы и просто HTML |

Как определить размер содержимого UIWebView?

у меня есть другое решение, которое отлично работает.

С одной стороны, подход и решение Ortwin работает только с iOS 6.0 и выше, но не работает правильно на iOS 5.0, 5.1 и 5.1.1, а с другой стороны, есть что-то, что мне не нравится и не может понять подход Ortwin, это использование метода [webView sizeThatFits:CGSizeZero] с параметром CGSizeZero : Если Вы читаете официальную документацию Apple об этих методах и их параметрах, она ясно говорит:

реализация этого метода по умолчанию возвращает часть размера прямоугольника границ представления. Подклассы могут переопределить этот метод, чтобы вернуть пользовательское значение, основанное на требуемом макете любого подвида. Например, объект UISwitch возвращает фиксированное значение размера, представляющее стандартный размер представления коммутатора, а объект UIImageView возвращает размер отображаемого изображения.

я имею в виду, что он наткнулся на его решение без какой-либо логики, потому что, читая документацию, параметр передается в [webView sizeThatFits: . ..] должен, по крайней мере, иметь желаемое width. С его решением желаемая ширина устанавливается в webView‘s кадр перед вызовом sizeThatFits С :

- (void)webViewDidFinishLoad:(UIWebView *)aWebView
{   
    aWebView.scrollView.scrollEnabled = NO;    // Property available in iOS 5.0 and later 
    CGRect frame = aWebView.frame;

    frame.size.width = 200;       // Your desired width here.
    frame.size.height = 1;        // Set the height to a small one.

    aWebView.frame = frame;       // Set webView's Frame, forcing the Layout of its embedded scrollView with current Frame's constraints (Width set above).

    frame.size.height = aWebView.scrollView.contentSize.height;  // Get the corresponding height from the webView's embedded scrollView.

    aWebView.frame = frame;       // Set the scrollView contentHeight back to the frame itself.
}

обратите внимание, что в моем, например,webView был встроен в пользовательский scrollView С другой webViews. .. Все эти webViews их webView.scrollView.scrollEnabled = NO, и последний кусок кода, который я должен добавить был расчет height на contentSize моего scrollView эти webViews, но это было так же просто, как суммировать мой webView ‘ s frame.size.height вычисляется с помощью описанного выше трюка…

Нужен контент в UIWebView для быстрого отображения
[4 ответа]

Спасибо за подсказку! Это заставило меня отстраниться. К сожалению, я, кажется, натыкаюсь на кучу блокпостов.

Проблема в том, что если я использую NSURLRequestReturnCacheDataDontLoad, я думаю, что ресурсы, которые я загружаю, уже должны быть в кэше.

Чтобы положить их в тайник, я попробовал вот это:

    NSURLRequest *request =     [NSURLRequest 
                            requestWithURL:cachedURL 
                            cachePolicy:NSURLRequestReloadIgnoringLocalCacheData 
                            timeoutInterval:60. 0] ;

    NSURLResponse *responseToCache = 
                        [[NSURLResponse alloc]
                            initWithURL:[request URL] 
                            MIMEType:@"text/html" 
                            expectedContentLength:[dataAtURL length] 
                            textEncodingName:nil] ;

    NSCachedURLResponse *cachedResponse = 
                        [[NSCachedURLResponse alloc]
                            initWithResponse:responseToCache data:dataAtURL
                            userInfo:nil storagePolicy:NSURLCacheStorageAllowedInMemoryOnly] ;

        // Store it
    [[NSURLCache sharedURLCache] storeCachedResponse:cachedResponse forRequest:request] ;

    [responseToCache release] ;
    [cachedResponse release] ;

    NSLog(  @"*** request %@, cache=%@", request ,[[NSURLCache sharedURLCache] 
            cachedResponseForRequest:request]                           ) ;

Я получил этот код из другого места в сети, но я думаю, что, хотя он работал на Mac, он не работает на iPhone, моей целевой платформе.

Похоже, что он не вставляет элемент в кэш; NSLog печатает null для «cache=%@».

Затем я попытался перегрузить NSURLCache:

- (NSCachedURLResponse *)cachedResponseForRequest:(NSURLRequest *)request
    {
    NSLog( @"FileFriendlyURLCache asked from request %lx of type %@ for data at URL: %@" , 
        request , [request class] , [[request URL] absoluteString] ) ;

    NSCachedURLResponse *result = nil ;

    if( [[[request URL] absoluteString] hasPrefix:@"file://"] )
        {
        NSLog( @"\tFulfilling from cache" ) ;

        NSError *error = nil ;
        NSData *dataAtURL = [NSData dataWithContentsOfURL:[request URL] 
                        options:0 error:&error] ;
        if( error )
            NSLog( @"FileFriendlyURLCache encountered an error while loading %@: %@" ,
                [request URL] , error ) ;

        NSURLResponse *reponse = [[NSURLResponse alloc]
                                    initWithURL:[request URL] 
                                    MIMEType:@"text/html" 
                                    expectedContentLength:[dataAtURL length] 
                                    textEncodingName:nil] ;
        result = [[NSCachedURLResponse alloc] initWithResponse:reponse data:dataAtURL
            userInfo:nil storagePolicy:NSURLCacheStorageAllowedInMemoryOnly] ;

        #warning LEOPARD BUG MAKES IT SO I DONT AUTORELEASE result NSCachedURLResponse

        [reponse release] ;
        }
    else
        {
        NSLog( @"\tFulfilling from web" ) ;
        result = [super cachedResponseForRequest:request] ;
        }

    NSLog( @"Result = %@" , result ) ;

    return result ;
    }

В своем запросе я указываю политику кэша NSURLRequestReturnCacheDataDontLoad. Этот метод, кажется, называется просто отлично, но он имеет странное поведение на iPhone. Независимо от того, возвращаю ли я экземпляр NSCachedURLResponse, UIWebView все равно возвращает ошибку:

Error Domain=NSURLErrorDomain Code=-1008 UserInfo=0x45722a0 "resource unavailable"

Как будто UIWebView игнорирует тот факт, что он получает что-то еще, кроме нуля, и все равно терпит неудачу. Затем я заподозрил неладное и подумал, что вся система загрузки URL просто игнорирует все, что приходит из -cachedResponseForRequest, поэтому я создал подкласс NSCachedURLResponse, который выглядит следующим образом:

@implementation DebugCachedURLResponse

- (NSData *)data
    {
    NSLog( @"**** DebugCachedURLResponse data accessed." ) ;
    return [super data] ;
    }

- (NSURLResponse *)response
    {
    NSLog( @"**** DebugCachedURLResponse response accessed." ) ;
    return [super response] ;
    }

- (NSURLCacheStoragePolicy)storagePolicy
    {
    NSLog( @"**** DebugCachedURLResponse storagePolicy accessed. " ) ;
    return [super storagePolicy] ;
    }

- (NSDictionary *)userInfo
    {
    NSLog( @"**** DebugCachedURLResponse userInfo accessed." ) ;
    return [super userInfo] ;
    }
@end

Затем я изменил -cachedResponseForRequest, чтобы использовать этот класс вместо этого:

    result = [[DebugCachedURLResponse alloc] initWithResponse:reponse data:dataAtURL
        userInfo:nil storagePolicy:NSURLCacheStorageAllowedInMemoryOnly] ;

Я установил запрос на наличие политики кэша NSURLRequestUseProtocolCachePolicy и запустил программу. Хотя я вижу, что моя версия -cachedResponseForRequest вызывается и возвращает DebugCachedURLResponses для всех файлов URLs, ни одна из моих отладок не вызывается, говоря мне, что мои экземпляры DebugCachedURLResponse полностью игнорируются!

Так что здесь я опять застрял. Я не думаю, что у вас есть какие-то другие идеи?

Большое спасибо за ваш первый ответ.

что это за приложение на Андроиде, нужно ли оно и как удалить?

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

Что это такое?

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

С помощью утилиты у пользователей имеется возможность просмотра контента без перехода по ссылкам, то есть, в самом приложении. Нет необходимости переходить в Opera или в Яндекс.Браузер. за счет этого существенно ускоряется процесс Интернет-серфинга и экономится заряд батареи, ведь, как известно, сторонними браузерами потребляется больше ресурсов аккумулятора.


Важно! HiView полноценно работает не на всех ОС Андроид, а лишь на версиях, начиная с пятой и далее. С более ранними вариантами у программы конфликт, поэтому для полноценного функционирования потребуется обновить операционную систему, иначе приложение будет выдавать ошибки. Кроме того, для старых версий не предусматривается необходимых обновлений для утилиты, а значит, она будет влиять на производительность устройства и потреблять существенный объем оперативной памяти.

Нужно ли удалять приложение?

Нет, делать этого не надо, т.к. это станет причиной множества неблагоприятных последствий. Программы, которые работают с HiView в случае деинсталляции последней, могут перестанет нормально функционировать. Данный процесс может затронуть мессенджеры, приложения для социальных сетей, прогнозы погоды и пр.


Важно! Более 50% пользователей заметили, что после удаления HiView со смартфона, их устройство стало часто перезагружаться. Это сильно повлияло на комфортность использования гаджета.

Таким образом, HiView является весьма полезной утилитой, за счет которой пользование телефоном или планшетом становится более удобным. При этом еще и экономится заряд батареи. Поэтому не следует отключать или удалять HiView без крайней необходимости.

Однако, следует отличать указанную утилиту от установленных или предустановленных рекламных сервисов. Это совершенно разные вещи. И как раз от таких программ лучше сразу избавиться.

ios — несколько экземпляров UIWebView или что это такое?

Переполнение стека

  1. Около
  2. Товары

  3. Для команд
  1. Переполнение стека
    Общественные вопросы и ответы

  2. Переполнение стека для команд
    Где разработчики и технологи делятся частными знаниями с коллегами

  3. Вакансии
    Программирование и связанные с ним технические возможности карьерного роста

  4. Талант
    Нанимайте технических специалистов и создавайте свой бренд работодателя

  5. Реклама
    Обратитесь к разработчикам и технологам со всего мира

  6. О компании

UIWebView »Бизнес-блог о приложениях

Вчера Apple представила iBooks Author на образовательном мероприятии в Нью-Йорке. Почти сразу люди возмутились: как Apple посмела представить бесплатное приложение, которое не отвечает всем их личным потребностям? И наглость настаивать на лицензионном соглашении, благоприятствующем собственным устройствам и рынкам Apple. Не говоря уже о том, что iBooks Author работает только на Mac. Конечно, я бы также предпочел инструмент, который решает больше моих проблем, связанных с публикацией, наряду с единорогами и бесплатным пивом. Но, поскольку я не оплачиваю счет за разработку iBooks Author, мое мнение по этому поводу не имеет большого значения.Итак, давайте продолжим и посмотрим, что на самом деле представляет собой iBooks Author.

iBooks Author предназначен для решения очень узко определенной проблемы: как легко создавать и публиковать великолепно выглядящие интерактивные электронные книги для iBookstore, которые можно будет читать на iPad. Судя по тому, что я видел, он очень хорошо решает эту проблему.

iBooks Author не предназначен для использования в качестве инструмента разработки ePub общего назначения. Это, конечно, разочаровывает. Большинство людей не знают, что у Apple уже есть один из очень немногих коммерческих, простых в использовании инструментов для создания файлов ePub в приложении iWork Pages для Mac.Это не так уж и хорошо, но Pages решает проблему написания книги, содержащей в основном текст, добавления изображений и сохранения ее в формате ePub. Неутешительным последствием внедрения iBooks Author, вероятно, является то, что Pages не увидит в будущем многих улучшений его возможностей ePub.

.ibooks по сравнению с ePub

Вывод iBooks Author похож на ePub, но не совсем. Если вы откроете файл .ibooks (это zip-архив, как и файлы ePub), вы увидите ту же структуру, что и ePub.У каждой страницы есть собственный файл xhtml, и есть пара файлов XML, описывающих структуру книги.

Создать программу чтения ePub для iOS не так уж сложно, поскольку отдельные страницы или главы представляют собой довольно стандартные файлы HTML, которые могут отображаться в UIWebView. Я считаю, что iBooks v1.x по сути был построен на UIWebView. Но это значительно изменилось с iBooks 2.

Более подробно изучив файлы xhtml, созданные iBooks Author, вы найдете множество нестандартных CSS: -ibooks-layout-hint :, -ibooks-list-text-indent :, -ibooks-strikethru-type :, и т.п.Я знаю, что существует несколько расширений CSS, специфичных для WebKit, с префиксом -webkit, но я не знаю, что WebKit и тем более UIWebView будет делать с этими новыми расширениями -ibooks.

Но становится еще хуже.

Когда вы используете один из встроенных виджетов, вы получите следующий код:
Этот код должен запускаться что-то в двоичном файле iBooks 2, которое отображает виджет. Было бы лучше, если бы iBooks Author сгенерировал здесь стандартный JavaScript + CSS.Нативный подход, вероятно, был применен по соображениям производительности, что может подтвердить любой, кто пытался разработать сложные интерактивные анимации с помощью JavaScript и CSS.

Следствием этих дизайнерских решений является то, что больше невозможно загрузить файлы xhtml в UIWebView и увидеть полностью отрисованную страницу. Возникает вопрос, как они реализовали эти новые функции в iBooks 2? Я не вижу способа просто использовать общедоступные API UIWebView для этого. Но учитывая фиаско, когда iBooks был пойман с использованием частного API для регулировки яркости экрана, кажется неразумным снова идти по этому пути.Может быть, они начали с нуля, используя открытый исходный код WebKit? В Apple наверняка хватит таланта на это.

Так почему же Apple выбрала проприетарные расширения для ePub вместо того, чтобы полностью соответствовать стандарту? Мы можем только догадываться.

  • Они хотят привязать издателей к iBookstore, чтобы увеличить количество отстающих книг.
  • Они хотят, чтобы от этого бесплатного инструмента выиграли только продажи iPad.
  • Им нужен полный контроль над форматом.
  • Ограничения по времени и бюджету заставили их пойти по более легкому пути.
  • Текущий стандарт ePub не предоставляет все функции и возможности, которые они хотели бы включить.

Думаю, во всем вышесказанном есть доля правды, но я бы положил свои деньги на последнее. См. Также проницательный анализ Джона Грубера.

Учитывая, что выходной формат закрыт, Apple могла бы переключиться на полностью совместимый с ePub формат, как только стандарты подтянутся.Я не думаю, что это очень вероятно. Но учтите, что это всего лишь первая версия iBooks Author.

Отсутствие совместимости с iPhone

Любопытно, что iBooks Author создает электронные книги только для iPad. Я не думаю, что есть какие-либо технические причины для исключения iPhone и iPod touch. Скорее всего, это проблема с производством контента. Создание макетов страниц для этих усовершенствованных электронных книг для iPad достаточно дорогое удовольствие. Принуждение издателей выполнить работу дважды, чтобы также нацелиться на iPhone, вероятно, было бы слишком большим требованием.

Для образовательного рынка iPad, вероятно, является правильной целью. Но если вы планируете использовать iBooks Author для создания электронных книг для более широкой аудитории, то отсутствие поддержки iPhone и iPod touch определенно следует учитывать.

Газетный киоск

Одно, казалось бы, очевидное применение iBooks Author — создание журналов для распространения через газетный киоск. Этого желает Джейсон Снелл из MacWorld. Текущее лицензионное соглашение запрещает распространение содержимого, созданного с помощью iBooks Author, через газетный киоск (если вы не раздаете его бесплатно), но это не должно быть слишком сложно получить исключение от Apple или, возможно, увидеть, что Apple изменит лицензионное соглашение включить Newsstand в дополнение к iBookstore.

Но, учитывая архитектуру iBooks 2 и файлы, созданные iBooks Author, сторонним разработчикам будет сложно создать приложения для чтения журналов для отображения контента, созданного iBooks Author.

Итак, Apple должна создать обычное приложение для чтения журналов, например iNewsstand, который имеет те же функции, что и iBooks, но также обрабатывает подписки и доставляет контент с помощью инфраструктуры Newsstand? Было бы немного странно представлять его сейчас, поскольку он стал бы газетным киоском в папке Newsstand.(Apple активно отговаривала сторонних агрегаторов журналов включать в свои приложения Newsstand.)

Как насчет образца проекта, который издатели журналов могут загрузить и расширить для собственного использования? Это также кажется маловероятным, поскольку это уменьшит некоторые из преимуществ, которые Apple получает (намеренно или в качестве побочного эффекта) от нового проприетарного формата файлов.

IBooksPageViewController

Элегантным решением проблемы предоставления сторонним разработчикам возможности отображать контент, созданный iBooks Author, было бы предоставление нового контроллера представления, который может читать и отображать. ibooks файлы. Это было бы как UIWebView на стероидах. Мы можем обсудить, должно ли это быть представление или контроллер представления. Учитывая фиксированный макет страницы электронных книг, созданных в iBooks Author, я думаю, что контроллер представления будет более подходящим.

Представьте себе крутые приложения, которые могут быть созданы разработчиками, если творческий потенциал бесплатного инструмента iBooks Author можно использовать в приложениях для iOS. Если истинное намерение Apple состоит в том, чтобы сохранить собственные форматы файлов и технологии, эксклюзивные для платформы iOS, это все еще достигается и продвигается с помощью этого решения.

Мне нравится эта идея. Думаю, я пойду прямо сейчас и отправлю для этого радар.

написано Ником
\\ теги: iBooks, iBookstore, UIWebView

Полное руководство по внедрению WKWebView

читать

Использование веб-просмотра не новость. У нас уже много лет был UIWebView .

Затем появился WKWebView в iOS 8, и нам пришлось заново изучить некоторые вещи.

Это полное руководство (на Swift!) По реализации вашего контроллера представления, имеющего WKWebView , с целью (черт возьми) отображения веб-страниц.

Это не так просто, как я думал, с парой уроков, которые я усвоил в процессе.

Настройка с помощью Interface Builder

В настоящее время (начиная с Xcode 7.3.1) вы не можете напрямую добавить WKWebView в свою сцену. В библиотеке объектов есть компонент веб-представления, но он предназначен для старого UIWebView .

Я уверен, что компонент когда-нибудь будет добавлен, но пока вам нужно настроить его в своем коде.

  class MyWebViewController: UIViewController {

    var webView: WKWebView!

    переопределить функцию viewDidLoad () {
        super.viewDidLoad ()
        
        // Создаем WKWebView в коде, потому что IB не может добавить WKWebView напрямую
        webView = WKWebView ()
        webView. translatesAutoresizingMaskIntoConstraints = false
        view.addSubview (веб-просмотр)
        view.addConstraints (NSLayoutConstraint.constraintsWithVisualFormat ("| - [webView] - |",
            параметры: NSLayoutFormatOptions (rawValue: 0),
            метрики: ноль,
            просмотров: ["webView": webView]))
        view.addConstraints (NSLayoutConstraint.constraintsWithVisualFormat ("V: | -20- [webView] - |",
            параметры: NSLayoutFormatOptions (rawValue: 0),
            метрики: ноль,
            просмотров: ["webView": webView]))
            
        // 2 способа загрузки веб-страницы: `loadHTML ()` или `loadURL ()`
    }
}
  

В viewDidLoad мы должны создать WKWebView в коде.

Мы добавляем его в представление, смывая до границ, используя формат визуального языка автоматического макета.

Есть 2 способа загрузить веб-страницу:

  1. Загрузить HTML как строку
  2. Загрузить URL-запрос

В viewDidLoad вызовите либо loadHTML () , либо loadURL () , которые мы рассмотрим дальше.

1. Загрузить HTML как строку

  func loadHTML () {
    webView.loadHTMLString (" "
        + "

http://samwize.com

" + " ", baseURL: nil) }

Мы используем loadHTMLString для загрузки локального HTML.

Запустите это сейчас, нажмите на ссылку, и ничего не произойдет.

Почему?

Поскольку политика безопасности транспорта приложений требует использования безопасного соединения или если вы не занесли его в белый список. Добавьте в свой Info.plst :

   NSAppTransportSecurity 

     NSAllowsArbitraryLoads 
    <истина />

  

Как я узнал об ошибке?

Рад, что вы спросили.

Хотя отладчик Xcode не отображает никаких ошибок / предупреждений, существует замечательный отладчик Safari Debugger .

Перейдите в Safari> Develper> Simulator / Your Device , и вы сможете отлаживать страницу так же, как на рабочем столе.

Для реального устройства вам нужно будет включить эту функцию в приложении «Настройки »> «Safari»> «Дополнительно» .

Помните об этом ОЧЕНЬ полезном инструменте.

2. Загрузить URL-запрос

Просто используя loadRequest .

  func loadURL () {
    let urlString = "http://samwize.com"
    охранник let url = NSURL (строка: urlString) else {return}
    let request = NSMutableURLRequest (URL: url)
    webView.loadRequest (запрос)
}
  

2 делегата

В веб-представлении есть 2 делегата, которые вы, скорее всего, будете использовать.

  class MyWebViewController: UIViewController, WKUIDelegate, WKNavigationDelegate {
    переопределить функцию viewDidLoad () {
        ...
        webView.UIDelegate = себя
        webView. navigationDelegate = себя
    }
}
  

WKUIDelegate предоставляет метод для представления некоторых собственных пользовательских интерфейсов (см. Диалоговые окна Javascript позже).

WKNavigation Делегируйте навигацию от страницы к странице.

Вы можете изменить значение заголовка HTTP с помощью NSMutableURLRequest , например. в loadURL () вот так:

  request.setValue ("Росомаха", forHTTPHeaderField: "Люди Икс-Заголовок")
  

Одно из наиболее распространенных полей заголовков — это User-Agent .Вы можете установить его для объекта запроса.

Но более удобный способ — использовать webView.customUserAgent , чтобы установить только один раз для веб-представления. Или вы можете изменить его глобально, установив NSUserDefaults.

А вот как узнать текущий пользовательский агент:

  webView.evaluateJavaScript ("navigator.userAgent") {(результат,  

Предварительная загрузка UIWebView или WKWebView в Swift (пример)

Описание

Ключом к предварительной загрузке WebView (UIWebView или WKWebView) является вызов viewDidLoad до появления представления. Уловка заключается в том, что в viewDidLoad у вас есть WKWebView или UIWebView, готовые выполнить loadRequest раньше времени. Первый контроллер, запускаемый приложением, должен выполнить предварительную загрузку.

Шагов:

  1. В вашем переопределении viewDidLoad для контроллера WebView установите URL-адрес и загрузите запрос (вы можете асинхронизировать этот запрос с фоновым потоком, но знайте, что запрос по-прежнему выполняется в основном потоке асинхронно, он не должен блокироваться).
  2. В первом контроллере (таком как MainTabBar или какой-нибудь вводный экран, который у вас есть) вы вызовете viewDidLoad WebView. Предположим, вы делаете это в UITabBarController . Контроллер YourWebViewController , который вы видите, является ссылкой на ваш контроллер веб-просмотра.

UITabBarController

  функция переопределения viewDidLoad () {
    super.viewDidLoad ()
    // getWebViewController () - это помощник, который получает нужный контроллер.Вы можете реализовать это как хотите, но вы должны
    // легко получить это из viewControllers на UITabBarController или любом другом ViewController
    if let webViewController = getWebViewController () {
        dispatch_async (dispatch_get_main_queue (), {() -> Пусто в
            // это будет асинхронно вызывать viewDidLoad, но пока не все будет размещать и не будет блокировать основной поток
            webViewController.view.setNeedsLayout ()
            // не вызываем webViewController.view.layoutIfNeeded () здесь, потому что это заблокирует основной поток в режиме RELEASE, что отстойно
        )}
      }
    }  

YourWebViewController

  функция переопределения viewDidLoad () {
  super.viewDidLoad ()
  let url = "https://priime.com/some/great/endpoint"
  let request = NSURLRequest (URL: url)
  // Этот webView - UIWebView или WKWebView
  webView.loadRequest (запрос)
}  

Qt WebView 5.15.1

Qt WebView предоставляет способ отображения веб-содержимого в приложении QML без обязательного включения полного стека веб-браузера с использованием собственных API-интерфейсов, где это имеет смысл.

Это полезно на мобильных платформах, таких как Android, iOS и UWP (универсальная платформа Windows); особенно в iOS, где политика требует, чтобы весь веб-контент отображался в веб-представлении операционной системы.

В Windows, Linux и macOS Qt WebView зависит от модуля Qt WebEngine для визуализации содержимого.

Предварительные требования

Чтобы модуль Qt WebView работал правильно на всех платформах, необходимо вызвать QtWebView :: initialize () перед созданием экземпляра QGuiApplication и перед созданием окна QPlatformOpenGLContext.

Типы QML

Модуль предоставляет единственный компонент QML для отображения веб-контента в приложении: WebView.

Ограничения

Из-за ограничений платформы перекрытие WebView с другими компонентами QML не поддерживается. Это приведет к непредсказуемым результатам, которые могут отличаться от платформы к платформе.

Примеры

Взгляните на примеры Qt WebView, чтобы продемонстрировать, как API-интерфейсы могут использоваться в приложениях.

Лицензии

Qt WebView доступен по коммерческим лицензиям от компании Qt. Кроме того, он доступен под Стандартной общественной лицензией ограниченного применения GNU, версия 3, или Стандартной общественной лицензией GNU, версия 2. Для получения дополнительных сведений см. Лицензирование Qt.

Ссылка API

© 2020 Компания Qt Company Ltd.
Включенная сюда документация является собственностью
их владельцы. Представленная здесь документация лицензирована в соответствии с условиями лицензии GNU Free Documentation License версии 1.3, опубликованный Free Software Foundation. Qt и соответствующие логотипы являются товарными знаками компании Qt Company Ltd. в Финляндии и / или других странах по всему миру. Все остальные товарные знаки являются собственностью
их владельцев.

Совместное использование веб-данных с iOS с помощью WKWebView

Недавно я помогал разработать приложение iOS для клиента, который продает программное обеспечение множеству различных образовательных организаций. Мы написали приложение на Swift, и оно взаимодействует с уже существующим веб-API нашего клиента.

Одна из проблем, с которыми мы столкнулись, заключалась в том, что многим клиентам наших клиентов требуется поддержка единой учетной записи и множественного входа (SAML) через их собственные веб-порталы. Для поддержки SAML нам нужен был простой способ передачи учетных данных API пользователя с веб-страницы в наше приложение iOS. В этой статье я покажу, как этого можно добиться с помощью WKWebView .

Проблема

Общий обзор проблемы, с которой мы столкнулись:

  • Наш клиент предоставляет программное обеспечение многим организациям, и у каждой есть пользователи, которым необходимо войти в систему.
  • Чтобы войти в систему, пользователь должен указать свою организацию.
  • После определения организации пользователь может войти в систему, используя API нашего клиента или, в некоторых случаях, внешний веб-сайт, размещенный в организации.

При использовании SAML пользователи отправляются на веб-страницу организации для входа в систему, а затем перенаправляются обратно на целевую страницу, которую контролирует наш клиент. Как только произойдет это перенаправление, у нас будут учетные данные для входа (например, токен пользователя, необходимый для API нашего клиента).Возникает вопрос: как передать этот токен в собственное приложение iOS?

WKWebView

В iOS 8 Apple предоставила WKWebView как часть WebKit, новый способ встраивания веб-представлений в собственное приложение. (Среди других функций WKWebView может похвастаться лучшей производительностью, чем более старый UIWebView.) В следующих примерах кода я покажу, как разработчик может передавать данные в форме объекта JavaScript с веб-страницы в собственное приложение iOS.

Сначала создайте простой UIViewController в Интерфейсном Разработчике и дайте ему собственный класс.Я назвал свой SamlLoginViewController . В методе loadView контроллера представления мы создаем WKWebView и настраиваем канал связи между Интернетом и нашим приложением следующим образом:

 
импорт UIKit
импортировать WebKit

class SamlLoginViewController: WKScriptMessageHandler {
    var webView: WKWebView?
    пусть userContentController = WKUserContentController ()

    override func loadView () {
        супер.loadView ()

        let config = WKWebViewConfiguration ()
        config.userContentController = userContentController

        self.webView = WKWebView (фрейм: self.view.bounds, конфигурация: config)
        userContentController.addScriptMessageHandler (self, name: "userLogin")

        self.view = self.webView
    }
  

Перед тем, как погрузиться в loadView , обратите внимание, что вверху объявлены две переменные экземпляра: webView и userContentController .Далее мы собираемся добавить в наш класс протокол WKScriptMessageHandler . Наш класс будет обрабатывать сообщения, передаваемые из JavaScript на веб-странице.

Чтобы создать WKWebView , мы сначала создаем объект WKWebViewConfiguration и устанавливаем его значение userContentController равным WKUserContentController в нашем классе. WKWebView может быть сконструирован следующим образом:

 
let config = WKWebViewConfiguration ()
config.userContentController = userContentController

self.webView = WKWebView (фрейм: self.view.bounds, конфигурация: config)
  

После создания WKWebView мы настраиваем обработчик сообщений:

 
userContentController.addScriptMessageHandler (self, name: "userLogin")
  

Побочным эффектом addScriptMessageHandler является создание объекта, который будет добавлен в window.webkit.messageHandlers для любой веб-страницы, загруженной в WKWebView .В этом случае мы называем обработчик «userLogin», чтобы наш код JavaScript мог получить доступ к window.webkit.messageHandlers.userLogin .

Затем нам нужно создать метод делегата для получения сообщений в нашем контроллере представления:

 
func userContentController (userContentController: WKUserContentController, didReceiveScriptMessage message: WKScriptMessage) {
    let dict = message.body as! [Строка: AnyObject]
    let username = dict ["username"] as! Строка
    let secretToken = dict ["secretToken" as! Строка
    
    // теперь используйте имя и токен по своему усмотрению!
}
  

Объект JavaScript

Последний кусок головоломки — это JavaScript, необходимый для отправки сообщения.На странице, загруженной в WKWebView , необходимо запустить следующий код:

 
ВОЙТИ  

Этот код создает простую кнопку HTML и добавляет ровный слушатель для вызова messageHandler, который автоматически устанавливается WKWebView .

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *