在Safari 12 Extension Popover中访问当前页面信息

时间:2019-04-13 23:07:11

标签: swift safari safari-extension sfsafariviewcontroller

我正在尝试使活动选项卡的页面信息显示在弹出窗口中。我能够获取它以显示当前页面的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 | Safari 12.1 | Xcode 10.2

2 个答案:

答案 0 :(得分:1)

尝试在主线程上更新您的UI代码。在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

答案 1 :(得分:0)

您可以在 SafariExtensionHandler 中获得 SFSafariPageProperties 对象,并在 SafariExtensionViewController 中使用该对象。

UPDATE t1 
    IIF(t1.exp IS NULL, t2.exp, t1.exp)
    IIF(t1.last IS NULL, t2.exp, t1.exp)
FROM
    Table1 t1 
LEFT JOIN Table2 t2 
    ON t1.id = t2.id 

UPDATE t2
    IIF(t2.exp IS NULL, t1.exp, t2.exp)
    IIF(t2.last IS NULL, t1.exp, t2.exp)
FROM
    Table2 t2 
LEFT JOIN Table1 t1
    ON t1.id = t2.id 

现在需要在viewWillAppear中再次获取 SFSafariPage 的属性。