【友盟+】开发者社区

友盟安卓推送的“多包名”怎么用?

友盟PUSH 发表于 2016-10-21 14:06:28 |

友盟PUSH
友盟PUSH 发表于 2015-7-10 21:50:09 | 显示全部楼层 |阅读模式
我们分几个层次来讨论这个问题:

1. App开发者为什么会有多包名的需求?

  • 首先我们先来说说包名(一般是http://com.company.xxx的形式),包名这个概念是出现在Android生态系统里面的,对于Android系统来说,包名是App的唯一标识。这个对技术人员来说很好理解,对于非技术人员,稍微再啰嗦一下: 如果两个安卓App,A和B包名一样的话,如果先安装A,再安装B,那么会出现B覆盖A的情况,最终只会是B会安装在系统上,即使这是两个完全不同的App。其实在安卓设备上一个App的升级过程就是包名相同,覆盖安装的例子。
  • 接着我们来聊聊多包名的需求,对于一些游戏App来说,如果他们要和市场渠道(诸如91,安智、豌豆荚,360等)做联运的话,那么就必须得使用不同的包名来做区分了,这个其实也是渠道强制要求的,因为这要涉及到最终的流量推广、下载结算等。感兴趣的读者可以看一下我之前回答过的一个问题: 为什么有的安卓App在不同市场渠道发版的时候使用不同的包名呢? - 沙漠的回答, 解释的比较详细。这种场景占绝大多数,所以我们网站的用户引导语也说得是“若一个APP针对不同渠道有不同的包名,则可通过开通多包名支持一个appkey对应多个包名发送消息
  • 最后,再补充一种小众的需求,这种场景不是太常见,但是和我们在下文提出的友盟推送提供“多包名”关系比较大,所以还是提一下。有些App是系列App,比如小说类的,或者明星类App。开发者在开发这些App的时候其实是有一个代码模板的,大部分时候只需要改改App的Icon,Name等就可以生成一个新的App,但是既然是不同的App,那么包名部分还是要去变换一下的(包名是安卓系统上对App的唯一标识)。这种场景大多出现在一些外包类的公司里面。

2. 为什么要在友盟推送中提供“多包名”功能?
  • 首先来说说“包名”在消息推送系统中的作用,安卓推送从原理上来说是设备与后台服务器建立一条长连接通道,通过这条长连接通道,服务器端将要下发的消息发送到设备上。注意,这里的下发到达的是设备,但是最终要将消息/通知展示出来,必须得把消息路由给设备上的App,App的“包名”就是路由的依据,因为包名是App在安卓系统的唯一标识。所以说“包名”在安卓推送里面是一个至关重要的环节,开发者在友盟推送后台创建App的时候,需要填写包名信息。服务器端做消息下发的时候,也会将包名的信息附带上,目的是将消息最终投递给这个包名对应的App本身。如果大家也集成过其它第三方推送服务商(如极光、信鸽等),就会发现安卓推送包名是必须的,这个不是友盟推送独创的,而是Android系统的设计就是这样要求的。
  • 再来说说“Appkey”在友盟平台中的作用:Appkey是友盟对App的唯一标识,这个只是友盟平台的约束。如果开发者在两个完全不同的应用中使用同一个Appkey的话(当然一般不会有这样的情况),那么友盟平台会认为这是同一个App,因为appkey是相同的。对于上文中我们提到的两种case,一种是同一个App在不同渠道使用不同的包名,本质上,这是同一个App,所以在友盟后台使用同一个Appkey是合理的;对于第二种情况,同一份代码生成的形式上稍微有些变化的多个App,开发者在友盟后台一般也会把这些Apps设置成一个Appkey了,比如开发者弄了很多个娱乐明星App,其实他最后想了解的是这么多个娱乐明星App一共有多少下载,有多少新增,有多少日活等,而不是专门关注某一个明星App的数据量。
  • 有了前面两点的铺垫,最后我们来讲讲友盟推送为什么提供“多包名”功能:如果我们严格限制一个appkey只能有一个包名的话,那么对于上述两种需求的开发者,他们得在友盟推送后台创建多个App,牵涉到推送消息的时候,得到每个App下面都去推一次消息。显然这是一种非常不合理的做法,且会给开发者带来很多麻烦,这个时候如果我们能放开限制,提供一个App对应多个包名的功能的话,那么上述的问题就迎刃而解了。这个就是友盟推送提供“多包名”的原因。毕竟给开发者提供方便,是友盟推送追求的目标,尽管很多功能需要我们在技术层面上做非常大的调整,后续有时间的话,我会和大家聊聊我们几次技术架构升级的痛点:)

3. 如何使用多包名?
  • 这个大家在友盟推送的网站上是能看到的,首先需要去“申请开通多包名”,申请开通多包名之后,就可以添加多个包名了,我们不限制添加包名的个数多少,但是所有包名总长度加起来不能超过4K(按照平均包名长度来看,这大概是200~300个包名),对于大多数开发者来说,这个应该能满足需求了。需要注意的一点是,如果开通多包名之后,第一个添加的包名,我们称之为主包名,就不能再改变了(如果没有开通多包名的话,主包名在测试阶段是可以修改的)。主包名是默认的包名,一经确定下来就不允许再修改了。
1.png

2.png



4. 使用多包名有什么需要注意的地方?
  • 开发者在测试使用多包名的时候,一定要注意在App层面把包名(配置文件Mainfest,以及代码中的包名)都改成你要测试的另一个包名,很多时候开发者反馈在测试阶段多包名不生效,或者收不到消息,经过我们排查,绝大部分都是因为开发者没有把包名改过来。
  • 开发者在渠道上线之后,一定要记得在友盟推送后台也把渠道新增的包名添加进去。否则会导致新增的渠道包在安装之后无法和服务器建立长连接,进而导致推送不生效。这个是开发者比较容易忽略的,特别是在一些新拓展的渠道市场上打包的时候,所以当前友盟推送会定期去分析这类错误日志,如果发现后,我们会通过EDM、站内信、商务人肉通知等方式告知开发者去添加包名(这里稍微夸下自家产品: 友盟在开发者服务方面做得非常到位)。
  • 如果一台设备上安装了同一个App在多个渠道的安装包的话,那么友盟推送的处理逻辑是只有最后一个安装的App能收到推送消息,之前安装的App是收不到通知的,这是因为我们后端服务器以客户端最后一次上报的包名为准的。在真实使用场景中,这种case应该是不会发生的,只不过在测试阶段的时候,开发者比较容易碰到和问到这个问题。

欢迎大家关注我们的新浪微博账号"友盟推送": Sina Visitor System




上一篇:为什么ios推送消息不支持emoji表情啊
下一篇:服务器推送报2004错误


Bug媛
Bug媛 发表于 2016-4-19 19:15:32 | 显示全部楼层


Morphine
Morphine 发表于 2016-4-20 23:42:26 | 显示全部楼层
2个包名只有一个能接收到推送(只装1个的情况下), 接不到推送的那个可以在Logcat上看到推送的信息.求解决

友盟PUSH
友盟PUSH 发表于 2016-4-21 11:54:12 | 显示全部楼层
Morphine 发表于 2016-4-20 23:42
2个包名只有一个能接收到推送(只装1个的情况下), 接不到推送的那个可以在Logcat上看到推送的信息.求解决 ...

看下这个帖子里面使用多包名需要注意的地方

Morphine
Morphine 发表于 2016-4-21 12:49:41 | 显示全部楼层
(配置文件Mainfest,以及代码中的包名) 是指package吗?
[AppleScript] 纯文本查看 复制代码
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.xxxx.xxxx">

但是我在gradle里有配置
[AppleScript] 纯文本查看 复制代码
productFlavors {
        xxxxDemo {
            applicationId "com.xxxx.xxxx.demo"
        }
        xxxx{
            applicationId "com.xxxx.xxxx"
        }
    }

友盟PUSH
友盟PUSH 发表于 2016-4-21 13:20:24 | 显示全部楼层
Morphine 发表于 2016-4-21 12:49
(配置文件Mainfest,以及代码中的包名) 是指package吗?  
但 ...

包名只能有1个啊。

多包名的含义是,你在不同渠道发版的时候,要打多个包,每个包采取不同的包名。 在同一个工程中,你保证只有1个。

Morphine
Morphine 发表于 2016-4-21 13:57:34 | 显示全部楼层
友盟PUSH 发表于 2016-4-21 13:20
包名只能有1个啊。

多包名的含义是,你在不同渠道发版的时候,要打多个包,每个包采取不同的包名。 在同 ...

package是包名. 那么gradle里的applicationId 是什么? 因为我打包出来的应用 包名是applicationId的,但是com.xxxx.xxxx.demo这个包名就接收不到推送...com.xxxx.xxxx却能接收到..同一个工程代码

友盟PUSH
友盟PUSH 发表于 2016-4-22 10:58:17 | 显示全部楼层
Morphine 发表于 2016-4-21 13:57
package是包名. 那么gradle里的applicationId 是什么? 因为我打包出来的应用 包名是applicationId的,但是 ...

在Android Studio的Gradle构建系统中,applicationId是设备上的这个应用程序的唯一标识,也是在Google Play上的唯一标识,package是用来引用R类的。Android Studio这样做对多渠道打包提供了很好的支持。如果你用到了多渠道打包,那么你需要在推送初始化的时候自定义资源包名,mPushAgent.setResourcePackageName(String packageName),保证你的代码是通过package来引用R类的。



QQ刘
QQ刘 发表于 2016-5-3 16:35:15 | 显示全部楼层

soonlen
soonlen 发表于 2016-5-18 10:46:19 | 显示全部楼层
在控件台里面添加了多包名,我把applicationId更换了,然后在启动页也设置了
PushAgent mPushAgent = PushAgent.getInstance(this);
                mPushAgent.setResourcePackageName("com.***.android");
                mPushAgent.onAppStart();
                //开启推送并设置注册的回调处理
                mPushAgent.enable(mRegisterCallback);
                mPushAgent.setPushCheck(true);

结果打印日志显示为:/com.umeng.message.UmengRegistrar: isRegisteredToUmeng: empty registration id
而且弹出toast提示为:Please replace'[应用名].intent.action.COMMAND' with application's packageName for RegistrationReceiver in AndroidManifest!


友盟PUSH
友盟PUSH 发表于 2016-10-15 10:21:50 | 显示全部楼层

lightom
lightom 发表于 2016-10-19 15:30:52 | 显示全部楼层
友盟PUSH 发表于 2016-10-15 10:21
那就是已经存在了,可能你之前添加过。

你看了我的贴图了呀,只有一个包名:com.talkweb.cloudcampus
再增加了一个com.talkweb.cloudcampus.debug
就报错了。

友盟PUSH
友盟PUSH 发表于 2016-10-21 14:06:28 | 显示全部楼层
lightom 发表于 2016-10-19 15:30
你看了我的贴图了呀,只有一个包名:com.talkweb.cloudcampus
再增加了一个com.talkweb.cloudcampus.debu ...

你可以是集成过阿里云的推送吧? 如果集成过的话,你需要现在阿里云那边先修改一个不同的包名,完后再在友盟这边添加新的包名。
您需要登录后才可以发帖 登录 | 立即注册

本版积分规则

发表主题

精彩推荐

最新版推送SDK收不到消息
设备已经连接上,工具检查在线状态是在线的。但是添加测试设备显示的 无法检测有效性,推送消息也收不到
消息推送问题,华为和部分离线收不到推送消息
已经集成了友盟提供的聚合推送并且按照文档配置了小米通道和华为通道,但是进程杀死的情况下没有收到推送
上海快3计划裙1111-276-上海快3计划专业方案裙1111-276 友盟推荐
惊喜!上海快3计划裙1111-276上海快3计划专业方案裙1111-276 友盟推荐 年前,老家人人传说处处谣言,开口闭

关注我们

新浪微博
微信

欢迎关注友盟官方微博微信!

在线客服
返回顶部 返回列表