The URL dispatcher is a service which allows applications to launch other applications and to open specific URLs with specific applications.

  • The most common case is to open https://foo.com/* links in a specific foo app. If you have the Youtube webapp installed, you will notice that Youtube links (from the Video scope, for example) are opened with it.
  • Another use case would be to open an application or scope from another application.

In this tutorial, you are going to learn how to setup the URL dispatcher for your app or webapp and retrieve arguments from QML. It assumes you already have a working app or that you are starting developing one, using a QML template provided by the SDK.

Note that the sample app we are going to use is called "urldispatcher-tutorial", you will need to adapt the snippets with your application name.

Basic setup

Registering your app as a URL opener, is a matter of adding a JSON formatted file to your app metadata.

To do so, start by editing the hooks part of your manifest.json file.

{
    (...)
    "hooks": {
        "urldispatcher-tutorial": {
            "apparmor": "urldispatcher-tutorial.apparmor",
            "desktop": "urldispatcher-tutorial.desktop"
        }
    },
    (...)
}

It needs a new urls key, pointing to a ".dispatcher" file you are going to create at the root of your SDK project.

{
    (...)
    "hooks": {
        "urldispatcher-tutorial": {
            "apparmor": "urldispatcher-tutorial.apparmor",
            "desktop": "urldispatcher-tutorial.desktop",
            "urls": "urldispatcher-tutorial.dispatcher"
        }
    },
    (...)
}

This new JSON formatted file needs to define a series of protocols and domains, more specifically: an array of protocol and optional domain-suffix dictionnaries:

In this example, let's make it a default opener for all http(s)://design.ubuntu.com/* links. Create an <appname>.dispatcher file containing the following code:

[
        {
                "protocol": "http",
                "domain-suffix": "design.ubuntu.com"
        },
        {
                "protocol": "https",
                "domain-suffix": "design.ubuntu.com"
        }
]

That's it, you app will be used as an opener when design.ubuntu.com links are activated by the user.

Custom protocols

This simple syntax means you can create your own protocols and have your app opened when they are present in activated links.

For example:

[
        {
                "protocol": "url-dispatcher",
        }
]

Opening URLs and apps

Opening other apps and URLs in general from QML can be done with Qt.openUrlExternally().

For example, you can create a button to open the camera app this way:



Button {
    id: openCameraApp
    text: i18n.tr("Camera")
    onClicked: {
        Qt.openUrlExternally("appid://com.ubuntu.camera/camera/current-user-version");
    }
}

As you can see, it's using the appid protocol, followed by:

  • the package name
  • the app name
  • and the version number (replacable with a current-user-version wildcard).

You can also use the application protocol with a desktop file name:

application:///com.ubuntu.camera_camera_3.0.0.572.desktop

Handling command-line arguments

An Arguments component can be used to retrieve command-line launch arguments.

You can also use it to specify usage and help text.

Here is an example of what a music player could use:

Arguments {
    id: args
    defaultArgument.help: i18n.tr("Expects URL of the media to play.")
    defaultArgument.valueNames: ["URL"]
    Argument {
        name: "playlist"
        help: i18n.tr("Path of playlist to play")
        required: false
        valueNames: ["PATH"]
    }
}

Which will generate the following terminal help output:

Usage: <app> --playlist=PATH URL
Options:
  --playlist=PATH      Path of playlist to play

Expects URL of the media to play.

Arguments values can be retrieved by simply using the component id.

  • The default argument value is retrieved with: args.defaultArgument.at(<position of the argument>)
  • Named arguments values are retrieved with: args.values.<argument name>

Known issues

When multiple applications register for the same protocol and domain, the last one installed takes precedence over the others. A new UI to let the user pick which application to use is currently being worked on. You can follow its progress on bug report #1378350

If you have questions about this tutorial or corner cases usage of the URL Dispatcher, make sure to ask your question on AskUbuntu with the application-development tag.