android - 在用户不知情的情况下用基于 cordova/phonegap 的应用程序交换现有的 native 应用程序

标签 android ios cordova hybrid-mobile-app

我即将使用 phonegap(适用于 android 和 ios)部署一个混合应用程序。我们想在用户不知情的情况下更换它,所以我想我可以只使用相同的设备 ID(例如“de.company.myapp”)——这样在下一次应用商店更新后,用户将安装新应用.

请注意,在 iOS 上这似乎不是问题。

cordova config.xml:

<?xml version="1.0" encoding="UTF-8"?>
<widget xmlns     = "http://www.w3.org/ns/widgets"
    xmlns:gap = "http://phonegap.com/ns/1.0"
    id        = "de.company.myapp"
    version   = "1.0.0">
...

在使用 android 进行测试时,我收到此错误:(请注意,旧的 native 应用程序已安装在设备上)

...
Installing app on device...
>> 
>> /path/to/cordova/platforms/android/cordova/node_modules/q/q.js:126
>>                     throw e;
>>                           ^
>> ERROR: Failed to launch application on device: ERROR: Failed to install apk to device:   pkg: /data/local/tmp/Fahrschulcard-debug-unaligned.apk
>> Failure [INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES]

所以这意味着 apk 签名不匹配。删除旧应用程序后我当然可以安装新应用程序,但是有很多Android用户使用旧应用程序,所以让他们先删除旧应用程序是很糟糕的。

问题:

因此可以使用与用于构建 native 应用程序的证书/签名相同的证书/签名吗?

有没有人有过这种需求的经验,这可能吗?

最佳答案

要回答我自己的问题,需要做两件事来解决这个问题:

  1. 您需要原始的 *.keystore 文件,旧的 native 应用程序使用该文件进行签名(连同密码)
  2. 确保在你的 android list 中禁用调试选项

对于 cordova 构建,您必须创建一个名为 ant.properties 的文件,如 this post 中所述。 .

一旦创建了 ant.properties 文件,您只需运行以下命令即可创建已签名的发布就绪 apk 文件 platforms/android/ant-build/appname-发布.apk:

$ cordova build android --release 

关于android - 在用户不知情的情况下用基于 cordova/phonegap 的应用程序交换现有的 native 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25015013/

相关文章:

android - 如何隐藏TextView并且只在滚动时显示

javascript - PhoneGap/Cordova 以及最新版本的 Google Chrome 中没有 'Access-Control-Allow-Origin'

javascript - 如何从 mac 中完全删除 Ionic 和 Cordova 安装?

android - Cordova Javascript QR 扫描仪插件无法在 Android 上运行 (cordova-plugin-qrscanner)

java 。在内部回调中获取同步数据

java - 如何通过电子邮件发送保存的 CSV 文件或在 Android 中使用 Google Drive 上传?

ios - 从 Xcode 运行 React Native 应用程序失败(从 cli 运行相同的应用程序工作正常)

android - 所有 W3C 规范和不同浏览器的实现的困惑

ios - unity以plist文件格式生成project.pbxproj,而不是旧的ASCII文件格式

android - Android 中 FragmentTransaction 的类型不匹配与 getFragmentManager().beginTransaction()