当我按照Apple的示例进行操作时,总是得到nil activeTab:
override func toolbarItemClicked(in window: SFSafariWindow) {
// This method will be called when your toolbar item is clicked.
window.getActiveTab(completionHandler: { (activeTab) in
print(activeTab)
activeTab?.getActivePage(completionHandler: { (activePage) in
print(activePage)
activePage?.getPropertiesWithCompletionHandler( { (properties) in
print(properties)
if properties?.url != nil {
let urlString = properties!.url.absoluteString
print("URL!", urlString)
let videoURL = self.youtubeDl(urlString: urlString)
if videoURL != nil {
window.openTab(with: videoURL!, makeActiveIfPossible: true, completionHandler: nil)
}
}
})
})
})
}
Run Code Online (Sandbox Code Playgroud) 我正在开发一个大型 Mac 应用程序,该应用程序分为许多不同进程中的许多组件。其中一个组件是 Safari Extension Companion[1],它是一种“应用程序扩展”,允许基于 JavaScript 的扩展与本机代码对话(这是我们组件之间安全 IPC 所必需的)。IPC 通道是用户~/Library/Application Support/<APPNAME>/目录中的 Unix 域套接字。出于遗留原因,Unix 套接字服务器使用 HTTP,客户端库使用自定义URLProtocol,以防万一。
这适用于我们所有其他组件,但它们都没有在沙箱中运行[2]。但是,扩展伴侣的 Xcode 模板创建了一个沙箱,并且如果是沙箱,则伴侣会加载,但它似乎需要沙箱。我尝试在权利文件中设置com.apple.security.app-sandbox为false,或删除权利文件(以及对它的所有引用),两者似乎都阻止了 Safari 加载伴侣(如果直接调用它仍然作为自己的二进制文件运行,但 Safari 显然赢了) t 触摸它)。
我已经向沙箱添加了例外,以允许它访问相关目录,并且直接访问 IPC 套接字;但这似乎还不够。尝试打开套接字时遇到的错误是EPERM(不允许操作),这并不能真正解释问题。在向权利添加例外并修复路径后,~/Library/现在可以按预期写入日志文件(也在 "real" 下)之类的内容。
此错误发生在connect调用套接字时(它返回 -1,表示错误,并且errno为 1 ( EPERM)),因此实际上从未尝试写入或读取套接字。这对我来说似乎很奇怪,因为 - 根据Apple Sandbox Design Guide -
UNIX 域套接字很简单;它们就像任何其他文件一样工作
关于沙盒例外。
权利文件(使用此处的答案从自动生成的模板中修改:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict> …Run Code Online (Sandbox Code Playgroud) 我遇到了一个奇怪的问题,我第二次运行 Safari 应用程序扩展时,它不会显示在 Safari 中。
SFSafariWebsiteAccess.Level“Some”更改为“All”。如果我更改其他值,也会发生同样的事情。如果我保持扩展代码和设置完全不变,则不会出现任何问题。但是一旦我更改了某个值,即使我将这些设置更改回来,它也会完全中断。
这对我来说发生在两台不同的 Mac 上,分别是 10.13 和 10.14 以及最新的 Xcode。
该应用程序扩展编程指南这样说:
要提供OS X应用程序扩展,建议您将包含的应用程序提交到App Store,但这不是必需的.
而Safari浏览器应用扩展编程指南这样说:
Safari应用程序扩展程序捆绑在应用程序中,并通过App Store分发.
有没有人知道,如果可以在Mac App Store 外部发布带有应用程序的Safari App Extension ?
谢谢!
safari macos mac-app-store osx-extensions safari-app-extension
我正在 xcode 中使用 swift 开发一个 safari 应用程序扩展。
在 my 中SafariExtensionHandler.swift,我声明了一个 func:
override func popoverViewController() -> SFSafariExtensionViewController {
return SafariExtensionViewController.shared
}
Run Code Online (Sandbox Code Playgroud)
而在我的SafariExtensionViewController.swift,
class SafariExtensionViewController: SFSafariExtensionViewController {
static let shared: SafariExtensionViewController = {
let shared = SafariExtensionViewController()
shared.preferredContentSize = NSSize(width:320, height:240)
return shared
}()
}
Run Code Online (Sandbox Code Playgroud)
但是,当我单击 safari 工具栏中的图标时,没有任何显示,也没有错误。有人帮忙吗?我对 safari 应用程序扩展和苹果家庭开发很陌生。
我有此扩展,我想在该扩展的JavaScript部分中打开一个新标签。在将其迁移到Safari App Extension之前,我可以做
window.open(url, "_blank");
Run Code Online (Sandbox Code Playgroud)
但是,当我在Safari 12中将其作为App Extension运行时,它将当前链接添加到阅读列表(?!)。
当我在控制台中运行上面的代码时,它将打开的新标签url,但我必须在Safari偏好设置中启用弹出窗口。我在苹果非常糟糕的文档中找不到任何东西。
这甚至可以在“客户端”上实现,还是我必须在Swift代码中处理呢?