android - 推送通知到达 ios (apns) 但不是 android (gcm) 设备

标签 android push-notification google-cloud-messaging

所以我有一个简单的 Ruby 应用程序,它使用 Rpush 将推送通知发送到我的 iphone 和我的 android 手机。现在它所做的就是将它发送到 iphone。我不确定问题是否出在我的脚本上(即 registration_idapp_nameauth_key 的值不正确),或者问题是否出在这就是我配置 Android 应用程序的方式。

该代码的相关部分在这里(为了安全更改了值 - 但 key 的格式/长度保持不变以确保它们对有经验的人“看起来正确”)

API SETUP/RATIONALE(发送通知)

# GCM
app = Rpush::Gcm::App.new
app.name = "MyApp"
app.auth_key = "POfaSyfghilK3l-ueSvRLmbawcRThCWkwmcYGeM"
app.connections = 1
app.save

n = Rpush::Gcm::Notification.new
n.app = Rpush::Gcm::App.find_by_name("MyApp")
n.registration_ids = ["derGV80JK-s:APA91bHgerskBnrhHndes947nMKxI116tC3-k-tGd-hT5NzVc8QAWEkvCrMwrvs78RUL8-vvhp2ultoevqzZnn8gsr9t6WDXDYpGfCliqaJzj0XByBgbi0bm-rYufjcxfCc_5lEL381F"]
n.data = { message: "testing!" }
n.save!

Rpush.push

我通过查看我的谷歌开发者控制台确定我的应用程序的名称是“MyApp”here并注意到所需项目的“项目名称”是“MyApp”。

我通过导航到 API & Auth -> Credentials -> API Key 并从那里复制/粘贴 API key ,确定了同一站点上的 Auth Key。

我在我的 Android 应用程序的主要 Activity 中使用此代码确定了我的设备的注册 ID:

public static String getDeviceID(Context context) {
    final TelephonyManager tm = (TelephonyManager) context
            .getSystemService(Context.TELEPHONY_SERVICE);

    final String tmDevice, tmSerial, tmPhone, androidId;
    tmDevice = "" + tm.getDeviceId();
    tmSerial = "";// + tm.getSimSerialNumber();
    androidId = ""
            + android.provider.Settings.Secure.getString(
            context.getContentResolver(),
            android.provider.Settings.Secure.ANDROID_ID);

    UUID deviceUuid = new UUID(androidId.hashCode(),
            ((long) tmDevice.hashCode() << 32) | tmSerial.hashCode());
    String deviceId = deviceUuid.toString();

    return deviceId;
}

登录后,getDeviceID 显示我在上面的 ruby​​ 代码中指定的注册 ID。

APP SETUP/RATIONALE(接收通知)

首先,我将我的 Android Manifest 设置为拥有所有必要的权限

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="com.johncorser.myapp.permission.RECEIVE" />
<permission android:protectionLevel="signature"
    android:name="com.johncorser.myapp.permission.C2D_MESSAGE" />
<uses-permission android:name="com.johncorser.myapp.permission.C2D_MESSAGE" />

然后,我设置了一个监听器服务来响应推送通知:

    <service
        android:name="com.johncorser.myapp.services.GcmListenerService"
        android:exported="false" >
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
        </intent-filter>
    </service>

那个类很简单,看起来像这样:

public class GcmListenerService extends com.google.android.gms.gcm.GcmListenerService {
    public void onMessageReceived(String from, Bundle data) {
        String message = data.getString("message");
        Log.d("push", "From: " + from);
        Log.d("push", "Message: " + message);
    }
}

我希望这些消息在发送推送通知后注销。但是什么也没有发生(服务器或应用程序上没有抛出异常)。

有人看到我在这里做错了什么吗?

最佳答案

为什么要使用从 Android 设备 ID 生成的 UUID 作为 Google Cloud Messaging 的注册 ID? 这不是您获得注册 ID 的方式。

要获得注册 ID,您必须在设备上向 GCM 注册并接收回注册 ID/ token ,如 Cloud Messaging for Android Quickstart 中所述。 :

InstanceID instanceID = InstanceID.getInstance(this);
String token = instanceID.getToken(getString(R.string.gcm_defaultSenderId),
        GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);

为了让上面的代码工作,你需要在你的应用程序/目录,您需要 gcm_defaultSenderId,它是您从 Google Developers Console 获得的项目 ID(编号)。

您可以轻松生成该文件并通过单击“Get a configuration file”按钮并按照此处提到的步骤接收上述详细信息。

获取注册 ID 的代码需要在 IntentService 中,如 here 所述,并且您需要按照概述在 AndroidManifest.xml 文件中定义服务 here
为了让 GCM 能够与您的应用程序通信,您还需要在 list 文件中定义一个 com.google.android.gms.gcm.GcmReceiver它有一个带有 Action 名称“com.google.android.c2dm.intent.RECEIVE”的 Intent 过滤器和一个带有您的包名称的类别名称。看here举个例子。

关于android - 推送通知到达 ios (apns) 但不是 android (gcm) 设备,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30825094/

相关文章:

android - 在运行 Google Play Services < 7.5.0 的设备上使用 GcmNetworkManager

java - GCM 到 FCM - 在哪里添加服务器 key 并处理 MessageException

android - 如何为 Android 中的所有屏幕设置屏幕转换?

java - 随时间改变文字颜色

ios - 更新后,iOS应用程序从通知中心消失

ios - Parse 推送通知是否非常不可靠?我的只收到了50%

从任务管理器中终止时,Android GCM 未收到消息

java - 从 Google Play 服务 jar 文件中剥离一些文件是否有问题?

android - 为什么 getNetworkOperator 对于 CDMA 不可靠?

java - 在某些设备上录制音频时出现 Android IllegalStateException