swiftxcodenslogsafari-app-extension

Why aren’t my Safari App Extension NSLog messages showing up in the console in Xcode?


I’m following Apple’s guide for creating a Safari App Extension. In short, I’ve:

The extension’s toolbar button appears in Safari. Apple’s guide says I should see the NSLog message in the console when I click the toolbar button, but I’m not seeing anything.

I’ve edited SafariExtensionHandler.swift to send a message to the script injected by the extension:

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)

        })
    })
}

And I’ve edited the injected script (script.js) to alert that message:

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

The alert appears when I click the toolbar button (when I’m on a page on webkit.org, as I’ve left in the default SFSafariWebsiteAccess settings), so the extension is working and registering the click. But I don’t see the NSLog in Xcode’s console, or the Console app.

I’m a real Xcode newbie, so I’m sure I’m missing something obvious — but why isn’t the NSLog message appearing in the console?

(I don’t run as an administrator, in case that makes a difference — although I did enter the administrator account details whenever I was asked to whilst running Xcode for the first time. I do notice that in the Console app, when I select system.log, I just see a message saying “Unable to read the file”. This might be related to not running as an administrator.)


Solution

  • Switch to the scheme for your extension (schemes are just to the right of the Run and Stop buttons), and then hit Run.

    A Popup will ask you to choose an app to run: select Safari.

    A new instance of Safari should open and you'll start seeing log output in the Xcode console.

    If you haven't signed your app and extension however, Safari will reject your extension and the console will show a message like

    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
    

    In this case you just need to re-check "Allow Unsigned Extensions" in Safari's Developer menu and enable the extension in the Preferences pane, after which you should be good to go.