【问题标题】:Identify Phonegap mobile application from JS从 JS 识别 Phonegap 移动应用
【发布时间】:2014-01-30 03:03:26
【问题描述】:

我们正在构建一个网络应用程序,让用户能够创建自己的移动应用程序并管理其个人资料中的内容。移动应用程序对我们所有的用户都有类似的功能,唯一不同的是 - 它是内容。因此,当一个人来并在我们的网络服务中创建了一个移动应用程序,然后他添加了一些新闻、照片等 - 他的移动应用程序应该只显示他的新闻和照片,另一个人将拥有自己的移动应用程序和他自己的新闻和照片。

要获取特定应用程序的内容,我们有唯一的 API KEY,使用此 API KEY 移动应用程序会向我们的 API 发出请求以获取唯一的内容。

但主要问题是,我们不知道如何将这个 API KEY 嵌入到移动应用程序中。

情况如下:

  • 我们使用Phonegap创建移动应用,原代码是HTML+JS。要构建应用程序,我们使用 Phonegap Build API,这需要从 Github 存储库或 ZIP 存档交付 JS 应用程序。由于唯一不同的是内容(HTML+JS 代码库对于每个用户应用程序都是相同的),我们决定为所有用户应用程序使用单个 Github 存储库。此外,维护一个存储库比维护多个存储库更容易
  • 我们使用Phonegap Build API 自动为用户创建移动应用程序。因此,当用户按下“CREATE”时——Phonegap 移动应用程序正在使用 Github 存储库代码创建。 Phonegap Build API 'create' 方法允许设置应用程序的标题、描述、版本、包等。所以每个应用程序都会有一些自定义设置。此设置可在应用构建前后进行配置,因此我们可以更改标题、版本或包。

在这种情况下,每个应用程序中的 JS 代码都是相同的,我们不能在 JS 代码中硬编码唯一的 api key 来进行 API 调用。我们可以使用这些可配置的选项(标题、描述等),最好的一个是“包”,我们可以在其中设置唯一的应用程序标识符(例如“com.application.user1app”),但问题是我们不能在应用程序构建后直接在设备上获取它们。我们已经找到了一些自定义的 phonegap 插件,它们能够在 JS 中获取应用程序版本或应用程序名称,但是它们已经过时或不再支持,Phonegap 默认插件也没有这个功能。由于我们不是本地移动开发人员,因此编写自定义插件对我们来说是个问题(或者您可能知道任何可以返回应用程序包名称的 phonegap 3.1.0 插件,这将有很大帮助)

问题是:您认为,有没有其他方法可以从构建的应用程序的 JS 中识别出具体用户的应用程序正在运行什么?确定移动应用程序应该在哪里进行 API 调用? (如果我们无法硬编码 API KEY 并且我们没有插件)。

我们的计划并不严格,所以如果没有其他方法,我们会要求自定义插件或修改应用程序创建过程的方案。 谢谢。

【问题讨论】:

  • 为什么不使用设备 UUID 而不是 api 密钥?您可以获得每个设备的独特内容。如果你真的想使用 api 密钥,它可以在第一次连接时发送到设备并存储在本地存储中。
  • @QuickFix,一个应用程序可以安装在多个设备上,我们不需要识别设备,而是在设备上运行的应用程序。一个应用程序适用于一位网站用户,而不是一台设备。如果我们有很多用户应用程序,我们想知道哪个应用程序向 API 发出请求,有关设备的信息不会提供此信息。要在第一次连接时将 API 密钥发送到设备,我们应该知道哪个应用程序在请求它,以获取该应用程序的 API 密钥。

标签: cordova phonegap-plugins phonegap-build


【解决方案1】:

我建议您将所有特定于客户端的配置选项保留在单独的 JS 文件中,我们将其命名为 client.js。 该文件将作为构建过程的一部分生成,您可以将其与移动应用程序的其他源代码一起放入 ZIP 文件中。

client.js

var clientSettings = {
    apiId: "API-ID",
    apiSecret: "Your Secret",
}

client.js 用法

if (clientSettings !== undefined) {
     // Your mobile specific code goes here, take API keys, version, platform etc.
     // what ether you put in client.js could be accessed from here
} else {
     // We are running from the browser. Go different path and use other API
}

作为预防措施,我建议将 client.js 添加到 .gitignore

【讨论】:

  • 由于Phonegap构建服务对一些托管的私有应用程序有限制,我们不得不拒绝使用ZIP压缩包(仅适用于私有应用程序),这不是我们处理的最佳解决方案档案。所以我们需要为每个将要构建的应用程序修改 client.js,或者为每个带有自定义 client.js 的应用程序创建一个 github 存储库,这对我们来说似乎都不是最好的解决方案
  • 顺便说一下,我们使用 Grunt 来构建一个 JS 项目,因此可以创建自定义 client.js,但我们不想将其涉及到用户应用程序构建过程中,因为它会更复杂 - 使用 grunt 构建 JS 应用程序的额外服务器,为该应用程序创建自己的存储库,然后才执行我们现在拥有的操作。它需要更多的步骤来完成,现在我们只处理 Github repo,不关心 JS 部分
  • 您可以从 www/ 文件夹根目录中的 config.xml 中获取值,如 spezzino 提到的示例。在 Cordova 3.3 中,该文件绝对适用于 Android 和 iOS。
【解决方案2】:

如果你在构建之前修改了config.xml文件(包括包名和标题),你可以在里面放一个apiKey,然后通过这个方法使用jQuery读取

$.get("config.xml", function(data){
    alert($(data).find('widget').attr('apiKey'));
});


<widget id="com.example.hello" version="1.0.0" apiKey="API_KEY_HERE">
    <name>HelloWorld</name>
    <description>
        A sample Apache Cordova application that responds to the deviceready event.
    </description>
</widget>

【讨论】:

  • 我也有过这样的想法,得到你的回答,现在测试了。似乎这个用于构建的 config.xml 在构建后不再存储。我已经为 android 下载了已编译的 *.apk 应用程序,提取的文件和我发现的唯一 config.xml 是“/res/xml/config.xml”,但我无法通过 AJAX 访问它。此外,我的应用程序的包 ID 为“com.phonegap.hello-world”,但是当我通过这些提取的文件搜索“世界”一词时,它什么也没给出。搜索自定义“apiKey”属性也失败了。
【解决方案3】:

感谢@spezzino 和@codevision,我现在使用的解决方案有点像你们的混合。 由于移动应用程序构建(Phonegap)的源代码存储在 GitHub 上,因此我提供了以下操作序列:

1) 请求新应用程序时,正在创建client.json(使用 GitHub API),其内容如下:

{ "api-key": "applicationapikeygoeshere" }

存储库现在将提交client.json 文件。

2) 构建请求被发送到 Phonegap Build API,它使用来自存储库的代码。目前 repo 包含来自最新提交的client.json,因此应用程序也将拥有它。

3) 成功的 Phonegap 构建 client.json 从存储库中删除(使用 GitHub API)后,存储库进入初始状态,我们将能够使用此存储库构建下一个应用程序而不会发生冲突。

4) 然后在移动应用程序中通过requirejs 获取client.json 并进行解析,以使用api 密钥

也许它不是很灵活和可扩展,但对于我的问题来说,它是最短且非常轻松的解决方案,不必为每个应用程序的构建或存储库使用额外的服务器。

顺便说一下,作为中间步骤(2.5),我们正在为特定提交创建一个引用(标签),当配置被上传时(同样,使用 GitHub API)。因此,在 GutHub 上,我们可以快速访问所有版本。

GitHub API to create/delete files

GitHub API to create a reference to commit

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-28
    • 2012-08-23
    相关资源
    最近更新 更多