3

Google 的 Firebase 网站上,为了发送下游消息,我必须执行 HTTP Post 请求。这就是它所说的:

从服务器发送下游消息:

为了解决或“定位”下游消息,应用服务器设置为使用接收客户端应用的注册令牌。您可以发送带有预定义字段的通知消息,或自定义数据消息;有关有效负载支持的详细信息,请参阅消息有效负载中的通知和数据。本页中的示例展示了如何在 HTTP 和 XMPP 协议中发送数据消息。

HTTP POST 请求

https://fcm.googleapis.com/fcm/send
Content-Type:application/json
Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA

{ "data": {
   "score": "5x1",
   "time": "15:10"
  },
  "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1..."
}

我如何在 Swift 2 中做到这一点?

4

2 回答 2

4

人们对这个问题投了反对票,这是一种耻辱。我已经研究这个主题超过 4 个月了,没有其他 stackoverflow 问题/答案对我有帮助。

无论如何,我已经找到了专门针对 Google 的 Firebase Cloud 下游消息传递的解决方案。这会向 Google 服务器发送一条消息,该服务器通过 HTTP POST 请求将通知推送给所有用户。

在执行以下任何代码之前,请务必按照步骤为 Firebase 设置 iOS 客户端、安装所有正确的 pod 并在此处获取您的证书、配置文件等。

视图控制器:

override func viewDidLoad() {
    super.viewDidLoad()

    let url = NSURL(string: "https://fcm.googleapis.com/fcm/send")
    let postParams: [String : AnyObject] = ["to": "<Your registration token>", "notification": ["body": "This is the body.", "title": "This is the title."]]

    let request = NSMutableURLRequest(URL: url!)
    request.HTTPMethod = "POST"
    request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type")
    request.setValue("key=<Your Firebase Server Key>", forHTTPHeaderField: "Authorization")

    do 
    {
        request.HTTPBody = try NSJSONSerialization.dataWithJSONObject(postParams, options: NSJSONWritingOptions())
        print("My paramaters: \(postParams)")
    }
    catch
    {
        print("Caught an error: \(error)")
    }

    let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { (data, response, error) in 

        if let realResponse = response as? NSHTTPURLResponse
        {
            if realResponse.statusCode != 200
            {
                print("Not a 200 response")
            }
        }

        if let postString = NSString(data: data!, encoding: NSUTF8StringEncoding) as? String
        {
            print("POST: \(postString)")
        }
    }

    task.resume()
}

应用代表:

var window: UIWindow?

func displayAlert(title: String, message: String) {

    let alert = UIAlertController(title: title, message: message, preferredStyle: .Alert)
    alert.addAction(UIAlertAction(title: "Okay", style: .Default, handler: nil))
    self.window?.rootViewController?.presentViewController(alert, animated: true, completion: nil)
}

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    FIRApp.configure()

    let notificationTypes: UIUserNotificationType = [.Alert, .Badge, .Sound]
    let pushNotifSettings = UIUserNotificationSettings(forTypes: notificationTypes, categories: nil)

    application.registerUserNotificationSettings(pushNotifSettings)
    application.registerForRemoteNotifications()

    return true
}

func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {

    print("Device Token = \(deviceToken)")
    FIRInstanceID.instanceID().setAPNSToken(deviceToken, type: FIRInstanceIDAPNSTokenType.Sandbox)
    print("Registration token: \(FIRInstanceID.instanceID().token()!)")
}

func application(application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: NSError) {

    print(error)
}

func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) {

    // For push notifications sent from within the Firebase console
    if userInfo["google.c.a.c_l"] != nil
    {
        if let title = userInfo["google.c.a.c_l"] as? String
        {
            if let body = userInfo["aps"]!["alert"] as? String
            {
                self.displayAlert(title, message: body)
            }
         }
     }
     // For push notifications sent from within the app via HTTP POST Request
     else
     {
        if let title = userInfo["aps"]!["alert"]!!["title"] as? String
        {
            if let body = userInfo["aps"]!["alert"]!!["body"] as? String
            {
                self.displayAlert(title, message: body)
            }
        }
     }
}

func applicationDidEnterBackground(application: UIApplication) {

    FIRMessaging.messaging().disconnect()
    print("Disconnected from FCM")
}

如果有人有任何问题,请随时提问!我也知道如何发送到主题。

谢谢!

于 2016-05-27T12:52:07.553 回答
1

Solution Update

Swift 4 + further insight on how to tweak the FCM in Swift

Locate your server key at Project Settings > Cloud Messaging > Server Key

enter image description here

func swiftHttpPostRequest(){ 


let serverKey = <Server Key> // AAAA8c3j2...
let partnerToken = <Receiver Token> // eXDw9S52XWoAPA91....  
let topic = "/topics/<your topic here>"  // replace it with partnerToken if you want to send a topic 
let url = NSURL(string: "https://fcm.googleapis.com/fcm/send") 

let postParams = [
                   "to": partnerToken,
                   "notification": [
                   "body": "This is the body.",
                   "title": "This is the title.",
                   "sound" : true, // or specify audio name to play
                   "click_action" : "", // action when user click notification (categoryIdentifier)
                  ]] as [String : Any]

   let request = NSMutableURLRequest(url: url! as URL)
    request.httpMethod = "POST"
    request.setValue("key=\(serverKey)", forHTTPHeaderField: "Authorization")
    request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type")

  do {
        request.httpBody = try JSONSerialization.data(withJSONObject: postParams, options: JSONSerialization.WritingOptions())
        print("My paramaters: \(postParams)")
    } catch {
        print("Caught an error: \(error)")
    } 


let task = URLSession.shared.dataTask(with: request as URLRequest) { (data, response, error) in
    if let realResponse = response as? HTTPURLResponse {
        if realResponse.statusCode != 200 {
            print("Not a 200 response")
        }
    }

    if let postString = NSString(data: data!, encoding: String.Encoding.utf8.rawValue) as String? {
        print("POST: \(postString)")
    }
}

     task.resume()
}
于 2018-08-13T17:46:15.897 回答