ios使用GCM设备向设备发送推送通知

时间:2015-06-11 12:11:12

标签: ios apple-push-notifications google-cloud-messaging

我希望能够在设备之间向主题发送推送通知。如果我从服务器发送通知,我已经能够收到通知,但最后我不希望服务器与我的应用程序进行交互。

我编写了一个发送如下通知的方法:

-(void)sendNotif {
    NSDictionary *message = @{
                          @"notification" : @"{ \"text\" : \"test\", \"title\" : \"test\"}",
                          @"to" : @"/topics/test"
                          };
    // kSenderID is the senderID you want to send the message to
    NSString *kSenderID = @"X";
    NSString *to = [NSString stringWithFormat:@"%@@gcm.googleapis.com", kSenderID];
    DLOG(@"dict %@,  to : %@",message, to);
    [[GCMService sharedInstance] sendMessage:message to:to withId:@"id1"];   
}

但似乎没有发送任何内容。

所以我有两个问题: 我该如何编写我的方法? 如何实现回调方法?

2 个答案:

答案 0 :(得分:1)

我找到的解决方案是在谷歌示例中创建自己的HTTPRequest:

-(void)sendNotif {
NSString *sendUrl = @"https://android.googleapis.com/gcm/send";
NSString *subscriptionTopic = @"/topics/test";
NSString *title = notifTitle.text;
NSString *body = notifBody.text;
NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:sendUrl ]];
req.HTTPMethod = @"POST";
[req setValue:@"application/json" forHTTPHeaderField: @"Content-Type"];
[req setValue:@"key=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" forHTTPHeaderField: @"Authorization"];
NSDictionary *message = [self getMessageTo:subscriptionTopic withTitle:title withBody:body];
NSError *jsonError;
NSMutableString *jsonString;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:message options:NSJSONWritingPrettyPrinted error:&jsonError];
if (! jsonData) {
    NSLog(@"Got an error: %@", jsonError);
} else {
     jsonString = [[NSMutableString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
}
DLOG(@"json string%@", jsonString);
req.HTTPBody = jsonData;
[NSURLConnection sendAsynchronousRequest:req queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
    {
        if (error != nil) {
            DLOG(@"truc error %@",error);
        } else {
            DLOG(@"Success! Response from the GCM server:");
            DLOG(@"%@",response);
        }
    }];
}

-(NSDictionary *) getMessageTo:(NSString *) to withTitle:(NSString *)   title withBody:(NSString *) body{
// [START notification_format]
NSDictionary *message = @{
                          @"notification" : @{@"title" : title,@"text" : body},
                          @"to" : to
                          };
return message;
// [END notification_format]
}

答案 1 :(得分:1)

没有正常方式从客户端向主题发布消息。问题作者自己提出的问题基本上是一个黑客攻击,需要将API密钥保存在非常不安全的客户端上。

不允许这样做的主要原因是它会让对手篡改客户端并向其他用户发送垃圾邮件。