Qt Qml Map 与 HERE 插件如何使用 here.token 正确验证

Qt Qml Map with HERE plugin how to correctly authenticate using here.token

我正在努力在 HERE 插件中进行身份验证。我正在使用 windows 10 和 Qt 5.9.1 Mingw 32 位,我的应用程序几乎都是用 C++ 编写的。我使用 QML 的唯一部分是关于地图的。我想使用 HERE 插件,但我是 QtLocation 和插件的新手,我真的不明白我需要做什么才能在 HERE 中进行身份验证。我试着按照 HERE 网站上的指南进行操作,但我真的无法理解。

我从 qt 了解到,我必须使用以下代码在 HERE 上进行验证:

Plugin {
    name: "here"
    PluginParameter { name: "here.app_id"; value: "myapp" }
    PluginParameter { name: "here.token"; value: "abcdefg12345" }
}

所以我需要here.app_idhere.token.

我在 HERE 网站上创建了一个帐户,并使用 REST 创建了一个项目。所以现在我有了 APP ID 参数,但我真的不明白如何将 TOKEN 值放入第二行。首先,对于我的具体情况,我需要创建一个 api 密钥或一个 OAuth 2.0?

我试着按照这个 link using Postman 中的内容进行操作,最后我得到了一个很长的 tokoen,我复制并放入了 "here.token" 参数但是当我 运行 应用程序时它给我 无效 here.token 并且它不显示地图.

有人可以给我任何关于如何正确获取令牌值的提示吗?或者有人可以指点我一些链接吗?是否有不同的登录方式,例如使用 api 密钥而不是令牌登录?

----------------更新---------------------------- ----------

一段时间后,我不得不return解决这个我从未解决过的问题:现在的情况是我设法通过邮递员获得了令牌,但它始终无效。 现在我正在使用 Qt 5.15.2 和 MinGw 64 位。

我正在使用修改后的 minimal_map 示例以添加 here.app_id 和 here.token 参数。

main.qml

import QtQuick 2.15
import QtQuick.Window 2.15
import QtLocation 5.6
import QtPositioning 5.6

Window {
    width: Qt.platform.os == "android" ? Screen.width : 512
    height: Qt.platform.os == "android" ? Screen.height : 512
    visible: true

    Plugin {
        id: mapPlugin
        name: "here" // "mapboxgl", "esri", ...
        // specify plugin parameters if necessary
        parameters: [
         PluginParameter {
             name: "here.app_id"
             value: "xxxxx"
         },
         PluginParameter {
             name: "here.token"
             value: "yyyyyy"
         }]
    }

    Map {
        anchors.fill: parent
        plugin: mapPlugin
        center: QtPositioning.coordinate(59.91, 10.75) // Oslo
        zoomLevel: 14
    }
}

问题是,当我 运行 应用程序时,输出如下:

Invalid here.token
3 ,  "Qt Location requires app_id and token parameters.\nPlease register at https://developer.here.com/ to get your personal application credentials."

为了获得令牌,我完成了以下操作:

  1. 我在 developer.here 站点注册了免费增值计划并创建了一个项目。
  2. 我创建了一个 REST API 和一个 OAuth 2.0(JSON Web 令牌)如下(我保存了我在第 3 步中使用的 credentials.properties 文件):
  3. 我下载了 Postman,创建了一个帐户,然后按照 the answer to this question 的说明进行操作。 我收到了 json 格式的回复,如下所示: 一个
  4. 我在我的 minimal_map 示例中设置了 app_id(而不是“xxxxx”)我发布的第一张图片中显示的 APP ID 值和 here.token(而不是“yyyyyy”) acces_token 在来自 POSTMAN 的 JSON 响应中收到。
  5. 我尝试清理项目,删除构建文件夹但没有任何改变,答案总是:
Invalid here.token
3 ,  "Qt Location requires app_id and token parameters.\nPlease register at https://developer.here.com/ to get your personal application credentials."

我缺少什么来获得在 Qt 中显示此处插件的令牌?

HERE 服务已更新,但 Qt 尚未更新其插件。

主要变化是:

  • 只有在使用HERE SDK时才需要app_id和token,在Qt的情况下必须使用apiKey。

  • HERE 服务 url 进行了以下更改:

  • 使用https(以前可以通过http访问,现在不行)。

  • 之前的主机格式是X.api.here.com,现在是X.ls.hereapi.com.

也就是说,您必须将请求更改为:

http://X.api.here.com/?app_code={here.app_code}&app_id={here.app_id}&{other_parameters}

https://X.ls.here.com/?apiKey={here.apiKey}&{other_parameters}

Qt 5.14:

考虑到上述情况,我创建了一个 patch 来实现上述内容,因此要使用它,您必须遵循以下过程:

git clone https://code.qt.io/qt/qtlocation.git
cd qtlocation
git checkout 5.14
wget https://raw.githubusercontent.com/eyllanesc/Whosebug/master/questions/60544057/Qt5.14/update-HERE-Qt5.14.patch
git config --global user.email "you@example.com"
git am < update-HERE-Qt5.14.patch
qmake .
make
make install

Qt 5.9:

考虑到以上内容,我创建了一个实现上述内容的 patch,因此要使用它,您必须遵循以下过程:

git clone https://code.qt.io/qt/qtlocation.git
cd qtlocation
git checkout 5.9
wget https://raw.githubusercontent.com/eyllanesc/Whosebug/master/questions/60544057/Qt5.9/update-HERE-Qt5.9.patch
git config --global user.email "you@example.com"
git am < update-HERE-Qt5.9.patch
qmake .
make
make install

Window {
    visible: true
    width: 640
    height: 480
    Plugin {
        id: mapPlugin
        name: "here"
        PluginParameter { name: "here.apiKey"; value: "{YOUR_API_KEY}" }
    }
    Map {
        anchors.fill: parent
        plugin: mapPlugin
        center: QtPositioning.coordinate(59.91, 10.75) // Oslo
        zoomLevel: 14
    }
}


更新

这里的服务提供了各种不同权限的认证系统url。因此,考虑到上述情况,我已经尝试了每种情况,并且发现 Qt 使用 HERE SDK FOR IO 或 HERE SDK FOR ANDROID(在我回答之前,它用于身份验证类型 REST)。

所以在这种情况下,您必须激活其中一种身份验证:

对于 IOS 的 HERE SDK 或 ANDROID 的 HERE SDK,您必须分别为捆绑包或包名称设置任意值。

所以你必须使用 here.app_id 的 APP ID 和 here.token 的 APP CODE:

Plugin {
    id: mapPlugin

    name: "here"
    parameters: [
        PluginParameter {
            name: "here.app_id"
            value: "APP_ID"
        },
        PluginParameter {
            name: "here.token"
            value: "APP_CODE"
        }
    ]
}

关于 https://developer.here.com/documentation/maps/3.1.12.0/dev_guide/topics/why-use.html

的文档

HERE JS API 3.1 API 专为 WebGL 和 HTML5 环境而构建,可最大限度地提高移动设备和桌面上的地图和地图对象渲染效率。

浏览器支持

地图 API 是专门为 支持 WebGL 的现代浏览器 构建的,并且 HTML5 在桌面和移动环境中。虽然它针对某些浏览器和环境进行了优化,但我们尽最大努力确保 API 可以在广泛的平台和 浏览器 .

上使用

因此 JS API 应该适用于任何基于现代浏览器引擎的 WebView Type 元素。然而,HERE 不在任何嵌入式浏览器上提供对 HERE API 的支持,例如Qt QML等

获取凭证

HERE JavaScript API 的所有用户在与后端服务通信时必须获得 API 密钥才能进行身份验证和授权。 API 键是为每个应用程序分配的。您需要登录并选择一个计划(例如,免费增值)。 How to generate an API Key