Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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:

  • Created a new Xcode project (in Xcode 8.1, on macOS 10.12 Sierra) using the Cocoa Application template
  • Created a new target in the app using the Safari Extension template
  • Run the app once, to make sure the Safari App extension is built
  • Selected the “Allow Unsigned Extensions” option in Safari’s Develop menu
  • Enabled the extension in Safari’s Extensions preference pane

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.)

like image 587
Paul D. Waite Avatar asked Dec 08 '16 16:12

Paul D. Waite


People also ask

Why are my Safari extensions not showing?

Open Safari and choose Safari > Preferences. Select the Extensions tab, find your extension, and select its checkbox. If you're developing your extension and it isn't visible in Safari Preferences, you need to allow unsigned extensions in Safari.

How do I see installed extensions in Safari?

In the Safari app on your Mac, click the extension's button in the toolbar. Choose how much access the extension has. Extensions may access the content of the web pages you visit. Check which extensions you have installed and make sure you're familiar with what they do.

How do I enable extensions in Safari Develop menu?

Enable your app extension in SafariOpen Safari and choose Safari > Preferences. Select the Advanced tab, then select the “Show Develop menu in menu bar” checkbox. Choose Develop > Allow Unsigned Extensions, enter your password, and click OK.


1 Answers

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.

like image 63
Aaron Frary Avatar answered Oct 21 '22 07:10

Aaron Frary