2

我试图让活动选项卡的页面信息显示在弹出窗口中。我可以让它显示当前页面的 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!!!

我认为也许将扩展名切换为使用 acommand会起作用,但后来意识到您无法以编程方式打开弹出窗口。

一旦数据的异步请求完成,我是否必须切换到UITableView或具有运行功能的东西?reloadData()

macOS 10.14.4 | Safari 12.1 | Xcode 10.2

4

2 回答 2

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

于 2020-02-10T05:57:16.633 回答
-1

您可以在 SafariExtensionHandler 中获取SFSafariPageProperties对象并在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
            }];
        }];
    }];
}

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

于 2019-04-22T08:37:11.330 回答