问题标签 [safari-app-extension]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
2592 浏览

swift - 如何在 Safari 应用程序扩展中获取活动选项卡?

当我遵循 Apple 示例时,我总是得到nil activeTab

0 投票
3 回答
2389 浏览

macos - 您可以在 Mac App Store 之外*分发 Safari 应用程序扩展吗?

应用程序扩展编程指南这样说:

要交付 OS X 应用程序扩展,建议您将包含的应用程序提交到 App Store,但这不是必需的。

Safari 应用程序扩展编程指南这样说:

Safari 应用程序扩展捆绑在应用程序中并通过 App Store 分发。

有谁知道,是否可以使用Mac App Store之外的应用程序分发 Safari 应用程序扩展?

谢谢!

0 投票
2 回答
3094 浏览

swift - 为什么我的 Safari App Extension NSLog 消息没有显示在 Xcode 的控制台中?

我正在按照Apple 的指南创建 Safari App Extension。简而言之,我有:

  • 使用 Cocoa Application 模板创建了一个新的 Xcode 项目(在 Xcode 8.1 中,在 macOS 10.12 Sierra 上)
  • 使用 Safari 扩展模板在应用程序中创建了一个新目标
  • 运行应用程序一次,以确保构建 Safari 应用程序扩展
  • 在 Safari 的开发菜单中选择了“允许未签名的扩展”选项
  • 在 Safari 的扩展首选项窗格中启用扩展

扩展的工具栏按钮出现在 Safari 中。Apple 的指南说,当我单击工具栏按钮时,我应该在控制台中看到 NSLog 消息,但我什么也没看到。

我编辑了 SafariExtensionHandler.swift 以向扩展注入的脚本发送消息:

我编辑了注入的脚本 (script.js) 来提醒该消息:

当我单击工具栏按钮时会出现警报(当我在 webkit.org 上的页面上时,因为我已经离开了默认的 SFSafariWebsiteAccess 设置),因此扩展程序正在工作并注册单击。但我在 Xcode 的控制台或控制台应用程序中看不到 NSLog。

我是一个真正的 Xcode 新手,所以我确定我遗漏了一些明显的东西——但为什么 NSLog 消息没有出现在控制台中?

(我不会以管理员身份运行,以防万一——尽管我确实在第一次运行 Xcode 时被要求输入管理员帐户详细信息。我确实注意到在控制台应用程序中,当我选择system.log,我只看到一条消息“无法读取文件”。这可能与未以管理员身份运行有关。)

0 投票
1 回答
595 浏览

macos - 我可以让 Safari App Extension 工具栏按钮的文本徽章不那么难看吗?

Safari App Extensions不允许您动态更改工具栏按钮图像,但它们允许您通过将字符串传递给扩展处理程序的方法来将字符串作为标记添加到按钮:validationHandler

不幸的是,这个带有标记的文本看起来不太好:

在此处输入图像描述

我在文档中找不到有关自定义标记文本外观的任何内容,但以防万一,有没有办法避免剪裁可能是圆形徽章的内容?

0 投票
2 回答
1682 浏览

swift - 如何以编程方式关闭 Safari 应用程序扩展弹出框?

我正在按照Safari App Extension Programming Guide使用 XCode 8.3 和 Swift 3 构建一个 Safari App Extension 。该扩展包含一个弹出框,当单击该扩展的工具栏项时会出现该弹出框。弹出视图包含一些链接到用户可以执行的操作的按钮。

我想在执行操作后单击其中一个按钮来关闭弹出框。默认情况下,单击弹出框外的任何位置都会将其关闭,但我无法在指南或文档中找到任何其他方式来关闭弹出框。

我知道NSPopover有一个performClose方法,但似乎没有办法从扩展中访问弹出框本身:应用程序扩展只允许您提供一个SFSafariExtensionViewController,其内容神奇地出现在弹出框中。

我也尝试过按照StackOverflow answerdismissViewController中的描述使用,但在我的视图中控制器始终为零,并且只是使扩展程序崩溃并显示以下消息:self.presentingself.dismissViewController(self)

dismissViewController:: Error: maybe this view controller was not presented?.

最后,我注意到一个关于以编程方式打开工具栏项弹出框的相关问题在过去 6 个月中没有得到解答。这让我怀疑苹果可能只是对如何打开和关闭弹出框有严格的限制。即使是这种情况,也很高兴确切地知道限制是什么。

0 投票
1 回答
1327 浏览

macos - Mac 应用程序扩展在 Unix 套接字上调用 connect 获取 EPERM(沙盒?)

我正在开发一个大型 Mac 应用程序,该应用程序在许多不同进程中的许多组件中拆分。其中一个组件是 Safari Extension Companion[1],它是一种“应用程序扩展”,允许基于 JavaScript 的扩展与本机代码对话(这是我们组件之间安全 IPC 所必需的)。IPC 通道是用户~/Library/Application Support/<APPNAME>/目录中的一个 Unix 域套接字。由于遗留原因,Unix 套接字服务器使用 HTTP 并且客户端库使用自定义URLProtocol的,以防万一。

这适用于我们所有其他组件,但它们都没有在沙箱中运行[2]。但是,扩展伴侣的 Xcode 模板创建了一个沙箱,如果沙箱加载了伴侣,它似乎需要沙箱。我尝试在权利文件中设置com.apple.security.app-sandboxfalse或删除权利文件(以及对它的所有引用),两者似乎都阻止了 Safari 加载伴侣(如果直接调用它仍然作为自己的二进制文件运行,但 Safari 显然不会不要碰它)。

我在沙箱中添加了例外,以允许它直接访问相关目录,以及直接访问 IPC 套接字;但这似乎还不够。尝试打开套接字时遇到的错误是EPERM(不允许操作),这并不能真正解释问题。在将例外添加到权利并修复路径之后,日志文件(也在 "real" 下~/Library/)之类的内容现在按预期写入。

这个错误发生在对connect套接字的调用上(它返回-1,表示一个错误,并且errno是1(EPERM)),所以实际上从来没有尝试写入或读取套接字。这对我来说似乎很奇怪,因为 - 根据Apple Sandbox Design Guide -

UNIX 域套接字很简单;它们就像任何其他文件一样工作

关于沙盒异常。

权利文件(使用此处的答案从自动生成的模板修改:


有没有办法让 Safari Extension Companion 完全不用沙箱工作?如果没有,我如何允许同伴使用 IPC 套接字?

或者,有没有办法在扩展伴侣中使用 UNIX 套接字(如果问题不在于沙箱本身)?


*编辑:此问题已被编辑为先前的问题 -ENOENT调用时(未找到文件)connect- 在得到任何评论或答案之前已解决。这是由于sockaddr_un完整的域套接字路径太短,并且通过使用套接字的真实路径而不是通过沙盒版本的(非常长的)路径Library/Application Support和在那里种植的符号链接来解决。但是,新问题似乎在同一个地方,也可能是由于沙盒。

编辑 2:更新了权利以包括网络客户端(和服务器,为了很好的衡量标准)。虽然 Unix 套接字不是网络套接字,但它是一个失败的网络 API,所以我认为它可能会有所帮助。不过没有区别;还是继续EPERM打电话吧connect


[1] 使用 Extension Companion 而不是原生代码 Safari App Extension,因为背景/全局逻辑相当复杂,但目前在所有主要浏览器中基本相同;用本机代码重写它将是一项重大的一次性任务,也是一项持续的维护负担。我也怀疑这对我遇到的问题没有帮助。

[2] 两个主要的不能被沙盒化,因为它们需要访问整个文件系统。该应用程序不是通过 App Store 分发的,因此缺少沙盒不会带来合规性问题。为了安全起见,我想启用沙盒,但这不切实际。

0 投票
1 回答
693 浏览

swift - 在 showPreferencesForExtension 中未检测到 Safari 应用程序扩展

我正在构建一个 Safari 应用程序扩展,其主视图带有一个按钮以在 Safari 偏好设置中启用扩展。

该按钮使用以下代码:

“com.bry.teste”是包 ID,“com.bry.teste.teste1”是扩展包 ID

问题是,这段代码适用于我的 Mac OSX 版本 = 10.13.1,我只是将它发送给另一个使用相同操作系统的朋友,它也能正常工作。

但是,我将它发送给另外 2 个使用 10.12.6 (Sierra) 并且不起作用的朋友。

代码打印此错误: Optional(Error Domain=SFErrorDomain Code=1 "(null)")

我认为这意味着扩展 id 不存在,但在另一个主题中,有人说这与扩展所有者或其他东西有关。

我无法弄清楚为什么它在 10.13 而不是在 12.6 中工作,12+ 操作系统支持 safariServices。

有什么提示吗?

0 投票
1 回答
87 浏览

ios - 是否可以在 ios 应用程序中使用 safari 扩展

我正在开发具有应用程序扩展功能的 iOS 应用程序。但是使用“应用程序扩展程序”我们无法自定义 safari 内容。任何人都知道“Safari 扩展程序”。我们可以在 ios 应用程序中使用 safari 扩展程序吗?

0 投票
1 回答
719 浏览

xcode - 为什么我可以在其他计算机上运行我签名的 Safari 应用程序扩展,但不能在我开发它的那台计算机上运行?

按照Apple 的文档,我已经开始了一个 Safari 应用程序扩展项目。

我有我的(空的)应用程序和最小的扩展。我已经归档了应用程序,并使用我的开发者 ID 对其进行了签名。当我将归档的应用程序复制到朋友的 Mac 上,运行它并启动 Safari 时,应用程序扩展程序出现在 Safari 首选项的“扩展程序”窗格中(带有父应用程序的图标),并且启用后运行良好。

但是,当我在我的 Mac(我开发它的地方)上运行该应用程序并启动 Safari 时,除非我在 Safari 的开发菜单中选中“允许未签名的异常”,否则该应用程序扩展不会显示在 Safari 的“扩展”首选项窗格中,如本文所述答案——当它出现时,它有一个通用的应用程序图标,而不是父应用程序的图标。

虽然我希望最终让应用程序和应用程序扩展可供其他人使用,但我主要是为自己制作。因此,我希望能够在每次启动 Safari 时不必检查“允许未签名的异常”的情况下使用它。

如何使应用程序扩展程序显示在我开发扩展程序的计算机上的 Safari 扩展程序首选项窗格中?

0 投票
0 回答
225 浏览

safari-content-blocker - 如何从 safari 工具栏项应用扩展中获取 safari 内容拦截器应用扩展的状态(启用/禁用)?

我正在开发带有 Safari Content Blocker 和 Safari Toolbar Item 扩展的 mac 应用程序。

我能够从 mac 应用程序(包含应用程序)获取 Safari 中的 Content Blocker 扩展(启用/禁用)的状态,并能够在 mac 应用程序内显示 Content Blocker 已禁用的警告。

但是有什么方法可以让我从 Safari 工具栏项扩展中获取 Content Blocker 扩展的状态(启用/禁用)?

这是当用户单击 Safari 工具栏项时弹出框可见时执行的代码。

当上面的代码执行时,state.isEnabled总是false.

是否可以从另一个扩展中获取一个扩展的状态?如果是,如何?如果没有,有没有办法处理这种情况?