尝试使用GCM从Windows服务向IOS设备发送推送通知

时间:2016-01-27 13:46:06

标签: c# ios notifications google-cloud-messaging

您好

我想与您分享我现在面临的推送通知问题,我有两个移动应用程序,一个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() + "&registration_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断开连接

我将不胜感激任何帮助

1 个答案:

答案 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或成功/失败次数?

enter image description here

此工具可能会显示您的消息发生了什么。它并不完美,但可以提供帮助。也许GCM认为你的消息发送正常,但是在Apple到达你的iOS设备之前,它在Apple手中失败了吗?

您可能需要注意的一点是,GCM有两种配置有效负载的方法(我使用JSON做什么,你使用&data.message=" + value做什么),你可能想尝试使用{{1}而是。请参阅https://developers.google.com/cloud-messaging/concept-options上的“有效载荷”部分,我承认我还不完全理解!

相关问题