Доступ к информации о текущей странице во всплывающем окне расширения Safari 12

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

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

SFSafariApplication.getActiveWindow { (window) in
    window?.getActiveTab { (tab) in
        tab?.getActivePage(completionHandler: { (page) in
            page?.getPropertiesWithCompletionHandler( { (properties) in
                self.pageTitle = properties?.title ?? "Unknown"
                self.ActivePageTitle.stringValue =  self.pageTitle
            })
        })
    }
}

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

Я пытался запустить его в viewDidLoad(), но он срабатывает только при первом открытии всплывающего окна.

При запуске в viewWillAppear() я получаю следующую ошибку:

pid(17738)/euid(501) is calling TIS/TSM in non-main thread environment,
ERROR : This is NOT allowed. Please call TIS/TSM in main thread!!!

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

Должен ли я переключиться на UITableView или что-то, что имеет функцию reloadData() для запуска после завершения асинхронного запроса данных?

MacOS 10.14.4 | Сафари 12.1 | Xкод 10.2


person loken    schedule 13.04.2019    source источник


Ответы (2)


Попробуйте обновить код пользовательского интерфейса в основном потоке. Оберните обновления заголовков страниц в DispatchQueue. У меня была почти такая же проблема, и это сработало для меня.

SFSafariApplication.getActiveWindow { (window) in
    window?.getActiveTab { (tab) in
        tab?.getActivePage(completionHandler: { (page) in
            page?.getPropertiesWithCompletionHandler( { (properties) in
                DispatchQueue.main.async {
                    self.pageTitle = properties?.title ?? "Unknown"
                    self.ActivePageTitle.stringValue =  self.pageTitle
                }
            })
        })
    }
}

Чтобы отдать должное, я нашел ответ, копаясь в этом коде на GitHub (ознакомьтесь с методом updateDataLabels()): https://github.com/otzbergnet/tabCount/blob/master/tabCount%20Extension/SafariExtensionViewController.swift

person cweirup    schedule 10.02.2020

Вы можете получить объект SFSafariPageProperties в SafariExtensionHandler и использовать этот объект в SafariExtensionViewController.

- (void)popoverWillShowInWindow:(SFSafariWindow *)window {
    [window getActiveTabWithCompletionHandler:^(SFSafariTab *activeTab) {
        [activeTab getActivePageWithCompletionHandler:^(SFSafariPage *page) {
            [page getPagePropertiesWithCompletionHandler:^(SFSafariPageProperties *properties) {
                // Now you can use "properties" in viewController using shareObject
            }];
        }];
    }];
}

Теперь нужно снова получить свойства SFSafariPage в viewWillAppear.

person vijay    schedule 22.04.2019
comment
Кажется, это просто код Objective-C для того, что я уже опубликовал в вопросе? У меня нет проблем с получением информации, у меня возникают проблемы с ее вводом до того, как появится всплывающее окно, или с обновлением открытого всплывающего окна с информацией, когда она у меня есть. - person loken; 24.04.2019