标签: safari-app-extension

为什么我的Safari App Extension NSLog消息不会出现在Xcode的控制台中?

我正在关注Apple的创建Safari App Extension的指南.简而言之,我:

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

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

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

override func toolbarItemClicked(in window: SFSafariWindow) {
    // This method will be called when your toolbar item is clicked.
    NSLog("The extension's toolbar item was clicked")

    window.getActiveTab(completionHandler: { (activeTab) in
        activeTab?.getActivePage(completionHandler:  { (activePage) in
            activePage?.dispatchMessageToScript(withName: "toolbarItemClicked", userInfo: nil)

        })
    })
}
Run Code Online (Sandbox Code Playgroud)

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

safari.self.addEventListener("message", function (event) {
    alert("We got a message from the extension! - " + event.name + ": " + event.message);
});
Run Code Online (Sandbox Code Playgroud)

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

我是一个真正的Xcode新手,所以我确定我错过了一些明显的东西 …

xcode nslog swift safari-app-extension

20
推荐指数
1
解决办法
1841
查看次数

如何以编程方式关闭Safari App Extension popover?

我正在使用XCode 8.3和Swift 3构建Safari App扩展,遵循Safari App Extension编程指南.扩展程序包括单击扩展程序工具栏项时显示的弹出窗口.弹出窗口视图包含一些链接到用户可以执行的操作的按钮.

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

我知道NSPopover有一个performClose方法,但似乎没有办法从扩展中访问popover本身:app扩展只允许你提供一个SFSafariExtensionViewController,其内容神奇地出现在popover中.

我也试过使用这个StackOverflow答案中dismissViewController所描述的,但在我的视图中控制器总是为零,并且只是使用消息崩溃扩展:self.presentingself.dismissViewController(self)

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

最后,我注意到一个相关的问题,关于以编程方式打开工具栏项目popover在过去的6个月里没有得到答复.这让我怀疑苹果可能只是严格限制弹出窗口的打开和关闭方式.即使是这种情况,也很高兴知道这些限制是什么.

macos xcode popover swift safari-app-extension

11
推荐指数
1
解决办法
1194
查看次数

为使用Electron创建的macOS应用程序创建"Safari App Extension"?

自从"Safari App Extension"发布以来,我已经玩弄了使用xcode为本机应用程序创建safari app扩展.然而,现在,我正在尝试为使用Electron Framework构建的应用程序创建扩展.

我想知道这是否可能,如果有人有任何运气实现这一目标.我不确定如何在不使用xcode的情况下启动safari app扩展.

对于那些不熟悉"Safari App Extension"的人,您可以通过打开MacOS应用程序将其添加到现有本机项目,转到"File-> New-> Target-> Safari Extension",然后在现有应用程序中创建扩展名,在Safari-> Preferences-> Extensions中使扩展可用.

谢谢你的阅读.

safari macos safari-extension electron safari-app-extension

8
推荐指数
1
解决办法
665
查看次数

将Web扩展转换为Safari App Extension

我有网络扩展,目前运行在Chrome,Firefox和Opera上.现在我想知道是否有一种方法可以使用相同的代码来构建Safari App Extension,可能类似于PhoneGap(在Safari App Extension项目中包装所有现有的JS代码),或者有一些限制,例如javascript的标签处理和一些事情只需要用本机代码编写.

谢谢

google-chrome-extension safari-extension firefox-addon-webextensions safari-app-extension

8
推荐指数
3
解决办法
2376
查看次数

Safari 应用程序扩展:Popover 中的 WKWebKit 未加载内容

目标 实现一个 Safari 应用程序扩展,显示一个弹出窗口,里面有一个显示网页的 WebView。

问题 弹出窗口在 Safari 中正确显示,单击它会显示一个空白的弹出窗口,其中没有任何内容。

根据控制台中的日志,viewDidLoad() 消息正确显示,但弹出窗口只是空白。我在这里做错了什么?

谢谢!

这是我的代码: SafariExtensionViewController.swift

import SafariServices
import WebKit
import os.log

class SafariExtensionViewController: SFSafariExtensionViewController, WKNavigationDelegate {

    static let shared = SafariExtensionViewController()

    var webView : WKWebView!

    override func viewDidLoad() {
        super.viewDidLoad()
        let log = OSLog(subsystem: Bundle.main.bundleIdentifier!, category: "safari")    
        self.preferredContentSize = NSMakeSize(300, 450)
        webView = WKWebView(frame: self.view.frame)
        self.view.addSubview(webView)
        webView.navigationDelegate = self
        webView.translatesAutoresizingMaskIntoConstraints = false;

        let height = NSLayoutConstraint(item: webView, attribute: .height, relatedBy: .equal, toItem: self.view, attribute: .height, multiplier: 1, constant: 0)
        let width …
Run Code Online (Sandbox Code Playgroud)

swift wkwebview safari-app-extension

6
推荐指数
2
解决办法
1057
查看次数

如何在 safari 应用程序扩展中收听“beforeNavigate”事件

我正在开发一个 safari 应用程序扩展。我必须像在旧的 Safari JS 扩展中一样收听“beforeNavigate”事件,我们可以使用Safari 的 Windows & Tabs API收听这些事件。

我浏览了How to create Safari App Extension,但不幸的是在那里找不到与这些事件相关的任何内容。

任何人都可以帮助我使用 Safari App Extensions 的类似 API,就像我们在旧的 Safari JS 扩展中一样。

safari safari-extension safari-app-extension macos-app-extension

6
推荐指数
1
解决办法
650
查看次数

如何在 safari 应用程序和从 safari 应用程序扩展资源文件夹加载的 html 页面之间进行通信

我正在尝试构建一个简单的 safari 应用扩展。在about:blank我从扩展的资源文件夹加载一个 html 页面。以下是代码。

//script.js - injected script
if(window.location.href=="about:blank"){
    window.location.href = safari.extension.baseURI + "page.html";
}
Run Code Online (Sandbox Code Playgroud)

我想要这个加载的页面和 safari 应用程序之间的通信。显然注入的脚本script.js在加载的 html 页面上不可用

我尝试将 链接script.js到 html 页面内联,但safari对象本身不可用于safari.extension.dispatchMessagesafari.self.addEventListener

编辑:
有了这个(注入的脚本 script.js 在加载的 html 页面/选项卡上不可用,页面被加载)我的意思是在资源选项卡中打开 web 检查器时,我们看不到任何extension scripts

javascript safari macos xcode safari-app-extension

5
推荐指数
1
解决办法
1456
查看次数

Safari应用扩展程序在Hello World项目几秒钟后崩溃

  1. 打开xcode

  2. 文件>新建>项目>可可应用

  3. 文件>新建>目标>野生动物园扩展名

  4. 编译并运行扩展

  5. 选择野生动物园。

  6. xcode编译没有错误。

Safari打开几秒钟,然后崩溃。

这是调试窗口的输出。

2018-10-10 15:27:18.039905-0700 Safari [1020:16719] [SQLiteStore]无法在/ Users // Library / Safari / Favicon Cache / favicons.db-lock中获取数据库存储协调锁:[35:资源暂时不可用] 2018-10-10 15:27:18.040155-0700 Safari [1020:16719] [SQLiteStore]无法在文件:/// Users // Library / Safari / Favicon%20Cache / favicons上获得对数据库的独占访问。 D b。2018-10-10 15:27:18.041141-0700 Safari [1020:16719] [SQLiteStore]无法在/ Users // Library / Safari / Favicon Cache / favicons.db-lock中获取数据库存储协调锁:[35:资源暂时不可用] 2018-10-10 15:27:18.041226-0700 Safari [1020:16719] [SQLiteStore]无法在文件:/// Users // Library / Safari / Favicon%20Cache / favicons上获得对数据库的独占访问。 D b。2018-10-10 15:27:18.041331-0700 Safari [1020:16719] [SQLiteStore]退回到内存存储中2018-10-10 15:27:18.042877-0700 Safari [1020:16719] [FaviconPersistence]对数据库/ Users // Library …

safari xcode swift safari-app-extension

5
推荐指数
1
解决办法
689
查看次数

如何使用 Swift 和 Cocoa 获取当前活动窗口

我目前正在开发一个 Safari 应用程序扩展,它由两部分组成:

  • 仅限主机状态栏的应用程序
  • Safari 扩展

此外,主机应用程序提供了一个全局快捷方式,可在状态栏中打开一个弹出窗口。但是,我想检查哪个应用程序的窗口当前处于活动状态,因为如果 Safari 窗口当前处于活动状态,我不想打开弹出窗口。有没有办法使用 Swift 找出哪个应用程序的窗口当前处于活动状态?

感谢您的帮助。

macos cocoa swift safari-app-extension

5
推荐指数
1
解决办法
3039
查看次数

检测 Safari 应用扩展是否已安装并启用

我有一个 Safari 应用程序扩展。有没有办法从包含的应用程序中检测扩展程序是否已在 Safari 中成功安装并启用?文档还有很多不足之处\xe2\x80\xa6

\n

macos safari-app-extension

4
推荐指数
1
解决办法
1282
查看次数