多个构建风格的 applicationId 清单占位符不起作用

2024-03-22

我正在修改当前的 android 项目,以便它可以安装在同一设备上以实现多种风格和构建配置。

构建.gradle:

{
    // ...
    defaultConfig {
        applicationId "com.myapp"
        manifestPlaceholders = [
            manifestApplicationId: "${applicationId}",
            onesignal_app_id: "xxxx",
            onesignal_google_project_number: "xxxx"
        ]
    // ...
    }

    productFlavors {
        production {
            applicationId "com.myapp"
            // ...
        }

        dev {
            applicationId "com.myapp.dev"
            // ...
        }

        // ...
    }

    buildTypes {
        release {
            // ...
        }

        debug {
            applicationIdSuffix ".debug"
            // ...
        }
    }

    // ...
}

AndroidManifest.xml:

<manifest ... >
    <uses-permission android:name="${applicationId}.permission.C2D_MESSAGE" />
    <permission
    android:name="${applicationId}.permission.C2D_MESSAGE"
    android:protectionLevel="signature" />      
    <!-- ... -->

    <receiver
        android:name="com.onesignal.GcmBroadcastReceiver"
        android:permission="com.google.android.c2dm.permission.SEND" >
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            <category android:name="${applicationId}" />
        </intent-filter>
    </receiver>

    <!-- ... -->
</manifest>

当我编译相同风格的调试版本和发布版本时,我收到错误消息:

...

INSTALL_FAILED_DUPLICATE_PERMISSION

perm=com.myapp.permission.C2D_MESSAGE

pkg=com.myapp.dev

...

按照说明,manifestApplicationId 占位符来自 OneSignal 库上的 AndroidManifest.xmlhttps://documentation.onesignal.com/docs/android-sdk-setup https://documentation.onesignal.com/docs/android-sdk-setup

有人知道如何解决这个问题吗?谢谢。


OneSignal 需要manifestPlaceholders key manifestApplicationId设置为您的applicationId(又名您的包名称)。

这可以通过将其设置在您的buildTypes像下面这样。

buildTypes {
   debug {
      defaultConfig {
         manifestPlaceholders = [manifestApplicationId          : "${applicationId}",
                                 onesignal_app_id               : "11111111-1111-1111-1111-111111111111",
                                 onesignal_google_project_number: "111111111"]
       }
   }

   release {
      defaultConfig {
         manifestPlaceholders = [manifestApplicationId          : "${applicationId}",
                                 onesignal_app_id               : "22222222-2222-2222-2222-222222222222",
                                 onesignal_google_project_number: "222222222"]
      }
   }
}

Update 1:OneSignal-Android 3.3.0 不再需要manifestApplicationId.

Update 2:OneSignal-Android 4.0.0 不再需要任何manifestPlaceholders价值观。Instead OneSignal.setAppId(ONESIGNAL_APP_ID)需要在运行时调用 https://documentation.onesignal.com/docs/android-sdk-setup.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多个构建风格的 applicationId 清单占位符不起作用 的相关文章

随机推荐

  • 桌面组合被禁用错误

    在我的 NET 4 0 上的 WPF 应用程序中 我让用户报告两个错误 这些错误似乎非常间歇性 我无法处理 下面 我发布了消息和堆栈跟踪的最上面一行 如果需要 我可以发布完整的堆栈跟踪 Message Desktop composition
  • Android:检查我的应用程序是否允许运行后台活动

    我有一个运行秒表服务的应用程序 并且我在前台运行该服务 我有一个显示计时器的通知 每秒更新一次 在我离开应用程序 30 秒后 通知停止更新 我发现原因是我的设备的电池优化 在我的应用程序的系统设置中 有一个电池优化部分 其中包含一个名为Al
  • WebSphere - 无法加载 Logmanager“org.apache.logging.log4j.jul.LogManager”

    我有一个运行 Web 应用程序的 WebSphere 应用程序服务器 我从 Eclipse 启动服务器 该应用程序中的主要日志记录框架是 log4j2 但也有一些使用 java util logging 的第三方库 我想将这些日志重定向到
  • 取消选中单选按钮[重复]

    这个问题在这里已经有答案了 该应用程序是一个步进音序器应用程序 具有 16 个无线电组 每组有 8 个按钮 它工作得很好 除非一个组选择了一个按钮 否则我无法将其关闭 除非我使用我创建的清除按钮来清除所有无线电组 我想添加的是一些代码 它表
  • Go:是否有可以在模板内使用的模数

    我的问题如标题所述 我正在尝试做类似的事情 range index element Products if index 4 0 div class row end div class columns small 3 product img
  • GitLab CI 启用 SCP

    我目前正在使用 GitLab com 上的共享运行器之一 是否可以设置 gitlab ci yaml 文件 以便构建可以将 SCP 文件从远程服务器传输到运行器上 我的目标是 SCP 文件 这些文件是我的构建所必需的依赖项 但它们不会在任何
  • C 数组中的指针递增

    我试图理解下面的程序 具体来说 定义cur name以及指针的递增cur age在 printf 语句中 cur age i 必须索引数组中的每个整数 但我希望它指向内存中的连续地址 而不是给定 int 的下一个整数是 4 个字节 即为什么
  • ASP.NET MVC:可用路由数据的 Uri

    我的问题很简单 我有一个 Uri 我想弄清楚它映射到哪个路由 这样我就可以对路由的各个部分进行一些检查 控制器 操作等 如何从 Uri 转到 RouteData 或 Route 根据 tvanfosson 的指导 我想出了一个可以满足我需要
  • 测试 Bash 函数返回值的正确方法是什么?

    我想测试 Bash 函数的返回值if像这样的声明 if func arg then 但我收到如下错误消息 conditional binary operator expected 这样做的正确方法是什么 是下面这个吗 if func arg
  • 字符串未被识别为有效的日期时间

    我收到此错误 字符串未被识别为有效的日期时间 代码如下 DateTimeOffSet dt new DateTimeOffset Convert ToDateTime DateTime Now ToString dd MM yyyy hh
  • 使用 Service Worker 和推送通知做出反应

    一些初步考虑 react 16 8 2 react scripts 2 1 5 我创建了一个新的反应应用程序 我需要实现推送通知 下列的this https developers google com web fundamentals co
  • Go 保证地址不变吗?

    给定一个对象obj有保证吗 uintptr unsafe Pointer obj 无论何时调用 都会计算出相同的值 当然 Go 保证如果你使用两个指向同一个对象的指针 它们总是比较相等 不过 实现可能会移动内存中的对象并透明地更新指向它的所
  • 什么是会话和会话变量?

    您能指导我什么是会话和会话变量吗 我不需要比较 ASP 会话和 ASP NET 会话 因为我对 ASP 一无所知 我也看过很多关于会话类型的文章 但我仍然无法正确理解 ASP NET 中什么是会话以及什么是会话变量 会话 是跟踪每个用户的请
  • PHP:Html 以 html 格式发送电子邮件

    我正在遵循教程http css tricks com sending nice html email with php http css tricks com sending nice html email with php 以 html
  • 获取 RFECV scikit-learn 中的功能

    受此启发 http scikit learn org stable auto examples feature selection plot rfe with cross validation html sphx glr auto exam
  • 如何在 Rails 3.1 中初始化 ActionDispatch::ParamsParser?

    我的应用程序为其 Rest 接口定义了一个自定义 Mime 类型 所以我将其注册在mime types rb初始化器 Mime Type register application vnd example app v1 xml xml v1
  • 当所有线程完成时

    这是我第一次真正尝试使用多线程 我想知道如何判断所有任务组何时完成运行 for int i 0 i lt taskGroups Count i ThreadStart t delegate RunThread taskGroups i ne
  • 自定义 jQuery-File-Upload(基本插件)

    我碰到jQuery 文件上传 https github com blueimp jQuery File Upload在谷歌搜索中 我发现它很简洁 正是我所需要的 但我遇到了一个小问题 即使用基本插件按照我希望的方式获取几个功能 我认为基本插
  • 如何将日期输入和时间输入视为当地时间,而不是世界时间?

    用户输入的日期输入2019 12 22给出这些值 input value 2019 12 22 input valueAsNumber 1576972800000 input valueAsDate Sat Dec 21 2019 16 0
  • 多个构建风格的 applicationId 清单占位符不起作用

    我正在修改当前的 android 项目 以便它可以安装在同一设备上以实现多种风格和构建配置 构建 gradle defaultConfig applicationId com myapp manifestPlaceholders manif