在 Safari 12 Extension Popover 中访问当前页面信息
Accessing Current Page Information in Safari 12 Extension Popover
我正在尝试让活动选项卡的页面信息显示在弹出窗口中。我能够让它显示当前页面的 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
会起作用,但后来意识到您无法以编程方式打开弹出窗口 window。
一旦数据的异步请求完成,我是否必须切换到 UITableView
或具有 reloadData()
功能的东西到 运行?
MacOS 10.14.4 |野生动物园 12.1 | Xcode10.2
您可以在 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 的属性。
尝试在主线程上更新您的 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
我正在尝试让活动选项卡的页面信息显示在弹出窗口中。我能够让它显示当前页面的 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
会起作用,但后来意识到您无法以编程方式打开弹出窗口 window。
一旦数据的异步请求完成,我是否必须切换到 UITableView
或具有 reloadData()
功能的东西到 运行?
MacOS 10.14.4 |野生动物园 12.1 | Xcode10.2
您可以在 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 的属性。
尝试在主线程上更新您的 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