推送通知到达 ios (apns) 但未到达安卓 (gcm) 设备



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

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

API 设置/基本原理(发送通知)

# 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"来确定我的应用程序的名称是"MyApp"。

我通过导航到API & Auth -> Credentials -> API Key并从那里复制/粘贴 API 密钥来确定同一站点上的身份验证密钥。

我在 Android 应用的主要活动中使用以下代码确定了设备的注册 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。

应用设置/基本原理(接收通知)

首先,我将我的 Android 清单设置为具有所有必要的权限

<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/令牌,如适用于 Android 的云消息快速入门中所述:

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

为了使上述代码正常工作,您需要在app/目录中有一个google-services.json配置文件(由com.google.gms.google-services gradle插件解析,您也需要该文件),并且您需要gcm_defaultSenderId,即您从Google开发人员控制台获得的项目ID(编号)。

您可以通过单击"获取配置文件"按钮并按照其中提到的步骤轻松生成该文件并接收上述详细信息。

获取注册 ID 的代码需要位于 IntentService 中,如此处所述,并且您需要在 AndroidManifest.xml 文件中定义服务,如此处
所述为了使 GCM 能够与您的应用通信,您还需要在清单文件中定义一个 com.google.android.gms.gcm.GcmReceiver,其中包含一个带有操作名称"com.google.android.c2dm.intent.RECEIVE"的意图过滤器和一个包含您的软件包名称的类别名称。看这里的例子。

尝试通过

Google自己运行此处的示例。

https://developers.google.com/cloud-messaging/android/starthttps://github.com/googlesamples/google-services/tree/master/android/gcm

我觉得您的清单文件中可能缺少某些内容。

希望有帮助。

万一其他人遇到这种情况,问题是我没有将我的 IP 地址列入白名单 developers.google.com。我现在已将其设置为将所有IP列入白名单,并且它就像一个魅力。

最新更新