推送通知到达 ios (apns) 但未到达 android (gcm) 设备
Push notification reaching ios (apns) but not android (gcm) device
所以我有一个简单的 Ruby 应用程序,它使用 Rpush 向我的 iphone 和 android phone 发送推送通知。现在它所做的就是将它发送到 iphone。我不确定问题是出在我的脚本上(即 registration_id
、app_name
或 auth_key
的值不正确),还是问题出在我的 Android 应用已配置。
该代码的相关部分在这里(为安全起见更改了值 - 但 format/length 键保持不变以确保它们 "look right" 给有经验的人)
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
我通过查看我的 google 开发人员控制台 here 并注意到所需项目的 "Project Name" 是 "MyApp" 来确定我的应用程序的名称=50=].
我通过导航到 API & Auth -> Credentials -> API Key
和 copy/pasting 那里的 API 密钥,确定了同一站点上的授权密钥。
我在我的 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 清单设置为拥有所有必要的权限
<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>
那个class很简单,看起来像这样:
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);
}
}
我希望这些消息在发送推送通知后注销。但是没有任何反应(服务器或应用程序上没有抛出异常)。
有人看到我做错了什么了吗?
自己 Google 尝试 运行 这里的示例。
https://developers.google.com/cloud-messaging/android/start
https://github.com/googlesamples/google-services/tree/master/android/gcm
我觉得您的清单文件中可能缺少某些内容。
希望对您有所帮助。
为什么要使用从 Android 设备 ID 生成的 UUID 作为 Google 云消息传递的注册 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);
为了让上面的代码工作,你需要有一个 google-services.json 配置文件(由 com.google.gms.google-services gradle 插件解析,你还需要)在你的 app/ 目录中,你需要 gcm_defaultSenderId 这是你从 Google 开发者控制台获得的项目 ID(编号)。
您可以轻松生成该文件并通过单击“Get a configuration file”按钮并按照此处提到的步骤接收上述详细信息。
获取注册 ID 的代码需要在 IntentService 中,如所述here, and you need to define the service in the AndroidManifest.xml file as outlined here
为了让 GCM 能够与您的应用程序通信,您还需要在清单文件中定义一个 com.google.android.gms.gcm.GcmReceiver which has an intent filter with an action name "com.google.android.c2dm.intent.RECEIVE" and a category name with your package name. Look here 作为示例。
以防其他人遇到这个问题,问题是我没有在 developers.google.com 上将我的 IP 地址列入白名单。我现在已将其设置为所有 IP 都列入白名单,而且效果很好。
所以我有一个简单的 Ruby 应用程序,它使用 Rpush 向我的 iphone 和 android phone 发送推送通知。现在它所做的就是将它发送到 iphone。我不确定问题是出在我的脚本上(即 registration_id
、app_name
或 auth_key
的值不正确),还是问题出在我的 Android 应用已配置。
该代码的相关部分在这里(为安全起见更改了值 - 但 format/length 键保持不变以确保它们 "look right" 给有经验的人)
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
我通过查看我的 google 开发人员控制台 here 并注意到所需项目的 "Project Name" 是 "MyApp" 来确定我的应用程序的名称=50=].
我通过导航到 API & Auth -> Credentials -> API Key
和 copy/pasting 那里的 API 密钥,确定了同一站点上的授权密钥。
我在我的 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 清单设置为拥有所有必要的权限
<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>
那个class很简单,看起来像这样:
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);
}
}
我希望这些消息在发送推送通知后注销。但是没有任何反应(服务器或应用程序上没有抛出异常)。
有人看到我做错了什么了吗?
自己 Google 尝试 运行 这里的示例。
https://developers.google.com/cloud-messaging/android/start https://github.com/googlesamples/google-services/tree/master/android/gcm
我觉得您的清单文件中可能缺少某些内容。
希望对您有所帮助。
为什么要使用从 Android 设备 ID 生成的 UUID 作为 Google 云消息传递的注册 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);
为了让上面的代码工作,你需要有一个 google-services.json 配置文件(由 com.google.gms.google-services gradle 插件解析,你还需要)在你的 app/ 目录中,你需要 gcm_defaultSenderId 这是你从 Google 开发者控制台获得的项目 ID(编号)。
您可以轻松生成该文件并通过单击“Get a configuration file”按钮并按照此处提到的步骤接收上述详细信息。
获取注册 ID 的代码需要在 IntentService 中,如所述here, and you need to define the service in the AndroidManifest.xml file as outlined here
为了让 GCM 能够与您的应用程序通信,您还需要在清单文件中定义一个 com.google.android.gms.gcm.GcmReceiver which has an intent filter with an action name "com.google.android.c2dm.intent.RECEIVE" and a category name with your package name. Look here 作为示例。
以防其他人遇到这个问题,问题是我没有在 developers.google.com 上将我的 IP 地址列入白名单。我现在已将其设置为所有 IP 都列入白名单,而且效果很好。