问题标签 [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 投票
1 回答
105 浏览

swift - 如何在 safair app extensionn popover 的 wkwebview 中调试 js 代码?

它不仅仅是一个 wkwebview,它是一个在 wkwebview 中运行的单页应用程序,它是 Safari 应用程序扩展的弹出窗口。我需要在我的 SafariExtensionViewController 和 wkwebview 中的这个 spa 之间进行通信。我完全失去了如何处理它的想法。

0 投票
1 回答
215 浏览

swift - Safari 应用程序扩展弹出框未调用表格视图通知方法

我想在 Safari 应用程序扩展的弹出窗口中包含一个基于视图的 NSTableView。

从 Xcode 中的默认项目开始,我将 SFSafariExtensionViewController 设置为表格视图的委托和数据源,因为它是弹出框上的唯一内容,而且大多数情况下都可以。

我可以填充表并实现类似的tableView(_:shouldSelectRow:)方法,但返回通知对象的方法(例如tableViewSelectionDidChange(_:)不被调用)。

虽然这些方法显示了一种知道何时选择行的笨拙方式,但我无法知道何时编辑单元格。

由于我必须将 NSTableView 的委托插座连接到文件所有者以允许委托方法工作,我也尝试连接 dataSource 插座,但这确实没有帮助。

这是我的代码的本质(现在包括返回虚拟表数据以进行测试编辑):

(显然我不需要两者textDidEndEditing(_:)controlTextDidEndEditing(_:)但我只是在尝试一切。)

我猜这个问题与没有为 SFSafariExtensionViewController 中的通知注册的表格视图有关?不过,该对象继承自 NSViewController,所以我认为这些方法应该自动工作。

这是我第一次使用 swift,已经很久没有写过 Mac 应用了。但是扩展的实际功能是有效的,现在我只想拥有通过 UI 自定义设置的能力。

然而,关于 Safari 应用程序扩展编程的文章似乎很少,Apple 的文档很少,我什至无法找到任何具有弹出窗口中的表格视图的代码示例来学习。

我可能遗漏了一些非常明显的东西,但是我已经用完了在这里和整个网络上尝试的搜索,所以任何帮助都将不胜感激。

更新:

我想我有一个答案,通过将表中的 NSTextFields 显式链接到作为委托的文件所有者,tableViewSelectionDidChange(_:)andcontrolTextDidEndEditing(_:)方法现在正在工作。肯定有其他问题导致前者无法工作,我不小心打破并修复了,但这对后者来说是有道理的。

这就是我需要的功能才能工作,但是我仍然很困惑为什么textDidEndEditing(_:)当我被领导认为它应该工作时仍然无法工作。

在 Apple 的文档中,textDidEndEditing(_ :) 是 NSTextField 的一种方法,它链接到一个页面说controlTextDidEndEditing(_ :) 已弃用

我误解了什么?

0 投票
0 回答
186 浏览

swift - Safari App Extension 中奇怪的 NSOpenPanel 附件视图行为

我正在为 Safari 应用程序扩展编写设置弹出框。这包括一个表格视图,下面有一个分段控件,其中包含添加、删除和操作模板。后者显示一个菜单,其中包含用于导入和导出设置的项目。

导入是通过NSOpenPanel我添加了一个带有复选框的附件视图来替换现有设置而不是添加到它们。

The problem is, when the menu item is selected the accessory view appears to be behind the the modal NSOpenPanelcausing the following behaviours.

  • NSViewdo 之前短暂地出现在屏幕NSOpenPanel上,然后
  • NSOpenPanel显示附件视图应位于的空白空间(大小正确),并且
  • 如果您单击另一个应用程序(或桌面)以使 Safari 进入后台,则附件视图确实会出现在 中NSOpenPanel,除了
  • 如果另一个应用程序与该应用程序重叠,NSOpenPanel则该NSView应用程序上方会出现 ,您可以单击复选框进行更改,然后
  • 但是,单击 Safari 使其最前面NSView再次消失
  • 单击选项按钮两次NSOpenPanel以关闭附件视图然后重新打开可以解决问题。

我在 中添加了背景颜色,NSView以确认问题出在那个而不是封闭的NSButton.

为了验证我的代码是否正确,我创建了一个新的应用程序项目,其视图上只有一个按钮,然后将我的代码复制到其操作插座中。它工作正常。

然后我创建了一个新的 Safari App Extension 项目,并在它的弹出窗口上做了同样的事情,并遇到了同样的问题。我还尝试将代码移到弹出窗口的视图控制器之外,但这没有任何区别。因此,问题似乎与从 Safari 应用程序扩展中调用它有关。

另外,我认为是一个相关的问题,有时当NSOpenPanel关闭时(无论是通过选择文件还是取消它)控件不会传递回主 Safari 窗口。它只是变得没有反应。您可以在屏幕上移动窗口,但应用程序本身(包括菜单栏)不会响应任何鼠标或键盘输入。唯一的选择是强制退出它。但是,这也会影响NSSavePanel没有附件视图的导出。

我在 macOS 10.14.6 上为 Safari 13.0.4 使用 Xcode 11.3。这是代码:

(注释掉的行是因为NSOpenPanel.allowsOtherFileTypes被忽略了,但至少这在独立应用程序测试中也一直不起作用!)

谁能解释一下?我真的很想在 Safari 中进行设置,而不是使用包含的应用程序来管理它们。

0 投票
1 回答
185 浏览

javascript - 在通过 Safari App Extension 注入的 JavaScript 中以编程方式单击 HTML 链接

我正在编写一个 Safari 应用程序扩展来自动登录到 Citrix Web 门户。我注入的 JavaScript 需要做两件事。首先,要提交一个 HTML 表单(带有名称/密码)。这工作得很好,并将我带到另一个需要单击 HTML 锚的页面。问题是我无法以编程方式单击 HTML 锚链接。

笔记:

  1. 我需要以编程方式单击的锚链接的实际 HTML 是:<a class="pluginassistant-skiplink web-screen-link _ctxstxt_SkipToLogon _ctxsattr_title_SkipToLogonTip" href="#" title="Click here to skip to log on">Log on</a>我对 Web 编程不够熟悉,无法理解普通用户单击该链接时会发生什么,通过简单的检查似乎不会导致任何地方(和有一个NULL onClick属性)。

  2. 我看到分散的参考资料表明 jQuery 在这里可能有用,但我也无法弄清楚如何将 jQuery 注入 Safari 应用程序扩展脚本。到目前为止,Can't find variable $当我尝试使用 jQuery 时,我的尝试导致了错误。

0 投票
1 回答
183 浏览

swift - 在嵌套完成处理程序之后执行代码

我正在编写一个 Safari 应用程序扩展,并希望在我的视图控制器中获取活动页面的 URL。

这意味着嵌套完成处理程序来获取窗口、获取选项卡、获取页面、访问其属性。烦人但足够简单。它看起来像这样:

明显的问题是它不起作用。作为完成处理程序,它们将在函数结束之前执行。该变量url将为 nil,并且这些内容将在尝试获取 URL 之前完成。

解决此问题的一种方法是使用DispatchQueue. 它可以工作,但代码真的很难看:

这些if块需要知道我们不是在处理 nil 值。我们需要确定完成处理程序将返回,因此.leave()在我们可以调用 a 之前的调用.enter()最终会返回为零。

我什至不能在某种getURLForPage()函数或扩展中隐藏所有丑陋(添加某种SFSafariApplication.getPageProperties是我的偏好),因为显然你不能从.notify块内的函数返回。

虽然我尝试使用queue.wait和创建一个函数DispatchQueue,如下面的答案中描述的那样能够使用 return...</p>

https://stackoverflow.com/a/42484670/2081620

…对我来说并不奇怪它会导致死锁,因为.wait它仍在主队列上执行。

有没有更好的方法来实现这一目标?顺便说一句,“要做的事情”是根据用户请求更新 UI,因此需要在主队列中。

编辑:为免生疑问,这不是 iOS 问题。虽然适用类似原则,但 Safari 应用程序扩展只是 macOS 版 Safari 的一项功能。

0 投票
1 回答
394 浏览

safari - 如何在 Safari Content Blocker 扩展中重定向请求

我正在构建一个 Safari 应用程序扩展,它将通过本地代理重定向某些请求。

例如https://tracking-script.com/track/user/123需要重定向http://localhost:9000

唯一的问题是我不知道在应用程序引导期间哪些域不好。我的捆绑包包括:1. 用于托管 Safari 扩展和内容阻止程序的 MacOS 应用程序 2. 我可以执行某些操作的 Safari 扩展程序 3. 内容阻止程序,它基本上在应用程序引导期间为 Safari 提供规则 https://www.infoq.com/articles/野生动物园内容拦截器/

是否可以动态检查请求并通过给定端口重定向它?

我的本地网络上有一个设备,它给了我这些规则。因此,如果一个页面请求https://tracking-script.com/track/user/123我首先想咨询我在 localhost 上运行的设备。如果设备的响应说this domain is bad我希望我的内容阻止程序将此请求重定向到http://localhost:9000而不是转到原始 URL。

这在 Safari/MacOS 中是否可行?我可以通过连接 onBeforeRequest 钩子在 chrome 和 firefox 扩展中做到这一点。我向我的设备发出请求,如果设备说域错误,那么我返回{redirect_url: 'http://localhost:9000'}并且浏览器重定向此请求。

0 投票
1 回答
77 浏览

swift - 在 xcode 11 的新 Safari 应用程序扩展中获取新标签打开/关闭的事件侦听器

我是 Safari 浏览器扩展开发的新手。我的要求如下。

  1. 首次单击工具栏项时显示用户注册屏幕,并将用户详细信息保存在本地存储中。
  2. 获取新标签打开/关闭、活动标签详细信息、搜索标题、网址的回调。

我参考了苹果文档,但我不清楚能否完成上述任务。如果有人可以提供工作示例和代码,我将不胜感激。谢谢

0 投票
1 回答
448 浏览

macos - 一旦我进行任何修改,来自 Safari App Extension 的注入 Javascript 将停止工作

我正在尝试开发我的第一个 Safari 应用程序扩展,我遵循 Apple 关于构建 safari 应用程序扩展的文档,我的 Xcode 版本是 11.5。看来该扩展程序有效,因为我可以看到 Safari 导航栏上加载了扩展程序按钮,并且我可以得到“Hello World!” messageReceived当在 Safari 中加载页面时,来自 SFSafariExtensionHandler 子类方法中注入的 script.js 。到目前为止,在添加 Safari 扩展时 Xcode 自动生成的所有代码都很好。但是,对 script.js 的任何修改,比如添加一个新的空行,或者只是重复相同的 dispatchMessage 调用,都会导致扩展无法运行,如下面的代码:

这是非常令人沮丧的,特别是考虑到自动生成的扩展代码已经生成了大量的警告和错误消息,即使它看起来正在工作。但我确实看到 App Store 中有很多 Safari 扩展产品,所以有人能指出我正确的方向吗?

0 投票
1 回答
70 浏览

swift - 检查标签/页面是否固定在 Safari 应用程序扩展中

我正在编写一个Safari 应用程序扩展,它将所有打开的选项卡作为 url。后来我想打开它们。我面临的问题是我找不到用于检查选项卡(页面)是否已固定的 API 。这导致打开所有收集的 url 也会打开所有固定的问题,这是不希望的。

有没有办法确定标签/页面是否被固定?

0 投票
0 回答
160 浏览

ios - 如何使用 Safari App Extension 重定向搜索引擎

我正在尝试实现一个 safari 应用程序扩展,其中 safari 地址 bad 中的每个搜索都被重定向到另一个搜索引擎(在这种情况下,到 DuckDuckGo,仅作为示例)。我已经成功地做到了这一点。但是,使用此逻辑,如果用户打开www.google.com并在其搜索栏中进行搜索,该逻辑也会尝试重定向这些搜索。我该如何阻止这种情况发生?