您好
我想与您分享我现在面临的推送通知问题,我有两个移动应用程序,一个Android和另一个IOS。我需要根据数据库信息发送推送通知。对于Android应用,我使用了以下代码:
public string SendNotification(string deviceId, string message)
{
string GoogleAppID = "AIzaSyBvDvWXzvY38VyZN8M67YASQWK27ew7pY8";
var SENDER_ID = "305958970287";
var value = message;
WebRequest tRequest;
tRequest = WebRequest.Create("https://android.googleapis.com/gcm/send");
tRequest.Method = "post";
tRequest.ContentType = " application/x-www-form-urlencoded;charset=UTF-8";
tRequest.Headers.Add(string.Format("Authorization: key={0}", GoogleAppID));
tRequest.Headers.Add(string.Format("Sender: id={0}", SENDER_ID));
string postData = "collapse_key=score_update&time_to_live=108&delay_while_idle=1&data.message=" + value + "&data.time=" + System.DateTime.Now.ToString() + "®istration_id=" + deviceId + "";
Console.WriteLine(postData);
Byte[] byteArray = Encoding.UTF8.GetBytes(postData);
tRequest.ContentLength = byteArray.Length;
Stream dataStream = tRequest.GetRequestStream();
dataStream.Write(byteArray, 0, byteArray.Length);
dataStream.Close();
WebResponse tResponse = tRequest.GetResponse();
dataStream = tResponse.GetResponseStream();
StreamReader tReader = new StreamReader(dataStream);
String sResponseFromServer = tReader.ReadToEnd();
tReader.Close();
dataStream.Close();
tResponse.Close();
return sResponseFromServer;
}
这段代码非常合适,我收到了设备中的所有推送通知。
要将GCM用于IOS应用,请遵循以下所述的所有步骤:
GCM Documentation
发送通知的代码与Android应用程序完全相同,唯一的变化当然是API Key和sender参数。
问题是对于IOS应用程序我没有收到通知,当我运行Windows服务时,我从StreamReader tReader 获得了这个:
"id=0:1453902236602583%46569b4366d6cf16"
。我在代码中没有任何异常,一切似乎都没问题,但它不起作用。
注意:我没有在代码和任何异常中收到任何错误。
在IOS应用程序中,我获得了注册令牌和我需要的所有内容,因此我认为所有配置过程都是正确的。
IOS代码:
// [START_EXCLUDE]
// Configure the Google context: parses the GoogleService-Info.plist, and initializes
// the services that have entries in the file
var configureError:NSError?
GGLContext.sharedInstance().configureWithError(&configureError)
assert(configureError == nil, "Error configuring Google services: \(configureError)")
gcmSenderID = GGLContext.sharedInstance().configuration.gcmSenderID
print(gcmSenderID!)
// [END_EXCLUDE]
// Register for remote notifications
let settings: UIUserNotificationSettings =
UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: nil)
application.registerUserNotificationSettings(settings)
application.registerForRemoteNotifications()
// [END register_for_remote_notifications]
// [START start_gcm_service]
let gcmConfig = GCMConfig.defaultConfig()
gcmConfig.receiverDelegate = self
GCMService.sharedInstance().startWithConfig(gcmConfig)
// [END start_gcm_service]
获取注册令牌:
func registrationHandler(registrationToken: String!, error: NSError!) {
if (registrationToken != nil) {
self.registrationToken = registrationToken
let preferences = NSUserDefaults.standardUserDefaults()
let forKeyPath = SESSION_DATA + "_NOTIFICATIONTOKEN"
_ = preferences.setObject(registrationToken, forKey: forKeyPath)
_ = preferences.synchronize()
print("Registration Token: \(registrationToken)")
self.subscribeToTopic()
let userInfo = ["registrationToken": registrationToken]
NSNotificationCenter.defaultCenter().postNotificationName(
self.registrationKey, object: nil, userInfo: userInfo)
} else {
print("Registration to GCM failed with error: \(error.localizedDescription)")
let userInfo = ["error": error.localizedDescription]
NSNotificationCenter.defaultCenter().postNotificationName(
self.registrationKey, object: nil, userInfo: userInfo)
}
}
APN测试结果:
2016-02-02 15:07:43 +0000:加载文件aps_development.cer 2016-02-02 15:07:50 +0000:连接到服务器 gateway.sandbox.push.apple.com 2016-02-02 15:07:50 +0000:设置SSL 连接2016-02-02 15:07:50 +0000:设置对等域名 gateway.sandbox.push.apple.com 2016-02-02 15:07:50 +0000:钥匙扣 已打开2016-02-02 15:07:50 +0000:Apple的证书数据 开发IOS推送服务:com.jperera.RapidSentryMaster 已成功初始化2016-02-02 15:07:50 +0000:Sec Identity 创建2016-02-02 15:07:50 +0000:创建客户端证书 2016-02-02 15:07:58 +0000:已连接2016-02-02 15:07:58 +0000: 令牌:< 00000001 0000000c 000001bf bf010000 000001bf bf010000 000001bf bf010000 000001bf bf010000 000001bf bf010000 000001bf 000000d8 d8000000 000000d8 0000000f 0f000000 0000000f> 2016-02-02 15:07:58 +0000:写入92字节发送数据到gateway.sandbox.push.apple.com:2195 2016-02-02 15:07:58 +0000: 与服务器gateway.sandbox.push.apple.com:2195断开连接
我将不胜感激任何帮助
答案 0 :(得分:0)
啊哈!你得到的回应对我来说很熟悉。
当我使用HTTP POST
调用GCM发送一些JSON时,我会收到此JSON响应... {"multicast_id":5557NNN163626712336,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1451239821391315%e0bf69ABC9fd7ecd"}]}
......最后一部分看起来和你得到的答案一样。
我相信这是GCM告诉您一切正常,如果您愿意,这是您可以在GCM诊断工具中使用的Message ID
(Google Play开发者控制台的一部分)。您是否从Web请求中获取了任何标题,告诉您multicast_id
或成功/失败次数?
此工具可能会显示您的消息发生了什么。它并不完美,但可以提供帮助。也许GCM认为你的消息发送正常,但是在Apple到达你的iOS设备之前,它在Apple手中失败了吗?
您可能需要注意的一点是,GCM有两种配置有效负载的方法(我使用JSON做什么,你使用&data.message=" + value
做什么),你可能想尝试使用{{1}而是。请参阅https://developers.google.com/cloud-messaging/concept-options上的“有效载荷”部分,我承认我还不完全理解!