【问题标题】:C2DM - role sender accountC2DM - 角色发件人帐户
【发布时间】:2012-02-06 15:29:34
【问题描述】:

一个简单的问题,一个更难的问题:

1) 发件人 ID(Gmail 帐户)能否与我们需要在手机上的 Settings-->Account 下添加的不同?

2)我必须自动添加一个帐户(编码..),我正在尝试解决它,但是否可以在设置-->帐户下隐藏我要添加的帐户的邮件?我不希望人们知道电子邮件地址。

谢谢。

【问题讨论】:

  • 第一个可能会有所不同。您在手机的“设置”-->“帐户”下注册 C2dm 时使用的内容。
  • 那么我可以在设置-->帐户下使用mail1@gmail.com 作为发件人ID 和mail2@gmail.com 吗?在我看来,在手机上拥有一个 gmail 帐户很重要,甚至之前还补充过:我说的对吗?
  • 您在手机上注册推送通知时使用的发件人 ID 绝对应该与手机上登录的 google 帐户不同。为什么你需要偷偷在手机上添加一个帐户?
  • 我会让你了解我的应用程序应该如何工作。安装应用程序时,我必须确保手机上有谷歌帐户,否则 c2dm 将无法正常工作。由于我计算了很多下载的应用程序,我想通过代码添加一个 Gmail 帐户,以防止应用程序无法正常工作的情况,而不是明确要求添加一个 Gmail 帐户(你知道,更好的用户体验)。问题是这样几个用户可以同步我提供的电子邮件:而且,他们可以在上面发送垃圾邮件,并且一些用户会收到关于这一切的通知.. 清楚吗?
  • 我绝对不建议这样做。这种方法固有的各种安全隐患。在我看来,您可以接受某些人由于从 c2dm 继承的限制而无法使用您的应用程序,或者尝试推出自己的通知系统,这样您就不必担心在登录的谷歌上捎带像 c2dm 这样的帐户。

标签: android settings account android-c2dm sender-id


【解决方案1】:

手机上的 GMail 帐户在内部用于识别 C2DM 消息的收件人。首先客户端注册自己,然后(当发送 C2DM 消息时)所有注册的客户端都会收到 C2DM 消息。多个客户端可以将它们自己注册为 C2DM 消息的配方。

来自 Google C2DM 网站(请参阅 Registering):

Intent registrationIntent = new Intent("com.google.android.c2dm.intent.REGISTER");
registrationIntent.putExtra("app", PendingIntent.getBroadcast(this, 0, new Intent(), 0));
registrationIntent.putExtra("sender", emailOfSender);
startService(registrationIntent);

参数 app 标识注册过程使用的包名称以及发件人 ID(在 var emailOfSender 上方的代码中)。您会看到代码中没有使用设备上的 GMail 帐户,但将在内部用于识别 C2DM 服务器上的移动设备(Android 实现直接提供客户端 GMail 帐户或链接到 GMail 帐户的 ID )。

Google 说:它要求运行 Android 2.2 或更高版本的设备也安装了 Market 应用程序。 这是因为 Market 应用程序维护与 C2DM 服务器的连接。所有设备的注册 ID 都不同。在从服务器发送 C2DM 消息之前,客户端必须告诉服务器注册 ID。

当您想要创建一个发送 C2DM 消息的应用程序(在服务器端)时,您还需要一个 GMail 帐户(我们在设备上使用的 SenderID)。通常使用“每个应用程序一个 GMail 帐户”模式。当您注册 C2DM 时,您必须在注册表中输入 SenderID 和接收 Android 应用程序的命名空间 - 与在客户端注册设备时使用的信息完全相同。

这两个 GMail 帐户都不是公开的。关系是 n-1-m,这意味着 n 个客户端和 m 个服务器在一个 C2DM 服务器上自行注册它们。只有 Google(C2DM 服务器)知道使用了哪些 GMail 帐户。

我有一个在我的手机上使用的真实 GMail 地址。我在调试我在模拟器上使用的 GMail 地址。然后,我编写的每个支持 C2DM 的应用程序都有 3 个 GMail 帐户。

【讨论】:

  • 所以你说当我必须检索registrationId时,我必须指定发件人ID(我之前在表单中指定以访问c2dm)和(或其中之一)gmail帐户用在手机上?
  • 我更新了上面的答案,并在客户端插入了注册代码。答案是否定的——您只使用 SenderId。在内部(在 Android C2DM 代码中)必须识别每个客户端,我假设为此使用了手机上的 gmail 帐户,但您没有在任何 SDK 功能中使用它,并且它不会发布给任何发件人。跨度>
  • 该死,我快疯了:C2DM 怎么会识别手机?在注册阶段,您说对于每个应用程序,我只需在“emailOfSender”字段中指定发件人 ID(而不是手机上的 Gmail 帐户)。注册 ID 仅与此信息相关联,然后(我猜)它“应该”对于每部手机都相同,不是吗?或者每个请求它的设备的注册 ID 是否不同?
  • 编辑了文本。每个设备上的注册 ID 都不同。 C2DM 不是广播,它是点对点消息服务。即使您没有在 API 中使用手机上的 GMail 帐户,这并不意味着它没有被使用。市场应用执行注册,此应用非常了解您的帐户数据。
【解决方案2】:

对不起,如果我的问题有点(甚至很多)愚蠢,但据我所知:

registrationIntent.putExtra("sender", emailOfSender);

我应该输入一些真实的电子邮件地址来满足 C2DM 的需求,而不是 emailOfSender,但如果安装在不同设备上的每个应用程序的电子邮件地址不同,我的意思是我应该从设备设置的某个地方获取这封电子邮件,还是我可以硬编码它?

我在重复 http://www.vogella.com/articles/AndroidCloudToDeviceMessaging/article.html 的教程并注意到:

// Sender currently not used
intent.putExtra("sender", "nonsenses@gmail.com");

所以我就这样离开了,在开发服务器测试部分之后我放了:

public class SecureStorage {
    public static final String USER = "your_registeredUser";
    public static final String PASSWORD = "your_password";
}

这里是真正的凭据,当我尝试向应用程序发送消息时,我收到响应 200 但设备上没有消息,只要我将 nonsenses@gmail.com 更改为服务器端应用程序中使用的电子邮件帐户 - 我收到了通知一次。

【讨论】:

  • 没有愚蠢的问题。 emailOfSender 必须是您注册 C2DM 的人。对于安装在不同设备上的每个应用程序,它都是独一无二的。关于未收到的通知,即使您收到了 200 响应代码,我读到这取决于两个因素:首先,模拟器(它可能在设备上更好地工作);其次,C2DM 是尽力而为的服务,因此它可能会丢失一些数据..
猜你喜欢
  • 2012-04-12
  • 1970-01-01
  • 2014-08-09
  • 1970-01-01
  • 1970-01-01
  • 2011-04-27
  • 1970-01-01
  • 2015-06-23
  • 1970-01-01
相关资源
最近更新 更多