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

时间:2016-12-08 16:17:05

标签: swift xcode nslog safari-app-extension

我正在关注Apple’s guide for creating a Safari App Extension。简而言之,我:

  • 使用Cocoa应用程序模板创建了一个新的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)

        })
    })
}

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

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

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

我是一个真正的Xcode新手,所以我确定我错过了一些明显的东西 - 但为什么NSLog消息不会出现在控制台中?

(我不会以管理员身份运行,以防万一 - 尽管我在第一次运行Xcode时被要求输入管理员帐户详细信息。我注意到在控制台应用中,当我选择system.log时,我只看到一条消息“无法读取文件”。这个might be related to not running as an administrator。)

2 个答案:

答案 0 :(得分:17)

切换到您的分机的方案(方案就在Run和Stop按钮的右侧),然后点击Run。

弹出窗口会要求您选择要运行的应用:选择Safari。

应该打开一个新的Safari实例,您将开始在Xcode控制台中看到日志输出。

如果您尚未签署您的应用和扩展程序,Safari将拒绝您的扩展程序,控制台将显示消息

2017-04-12 13:00:44.799843-0400 Safari[37188:2787364] [Extensions] 
Computing the code signing dictionary failed for extension with 
identifier com.your.app.extension
2017-04-12 13:00:44.799865-0400 Safari[37188:2787364] [Extensions] 
Disabling and blocking extension with identifier: 
com.your.app.extension

在这种情况下,您只需要在Safari的“开发人员”菜单中重新选中“允许未签名的扩展”,并在“首选项”窗格中启用该扩展,之后您就可以开始使用。

答案 1 :(得分:0)

Xcode 10.2 beta附带了实现该目标的新方法:SFSafariToolbarItem.showPopover()

参考:https://developer.apple.com/documentation/safariservices/sfsafaritoolbaritem?changes=latest_minor