เริ่มจากเราจะมาสร้าง project ios ไว้เทสรับ notification จาก firebase cloud messaging กัน ด้วยการไปตั้งชื่อ bundle ต่างๆให้เรียบร้อย
จากนั้นเราจะทำการ login เข้าไป set apple identifier key ที่ https://developer.apple.com
จากนั้น download key มันลงมาเก็บไว้ แล้วไปที่ firebase เข้าไปที่ project setting ของเรา ทำการ config ios app ใหม่ และตั้งชื่อ bundle identifer ให้ตรงกับ ios ของเรา
ต่อไปเราจะเอา key ที่ download มา เอาไป upload ใส่ firebase ของเรา และทำการใส่ค่า key และ team id ลงไป
จากนั้นเราจะไปที่ xcode แล้วทำการ add Swift package ของ firebase ลงไป
จากนั้นเราจะลาก plist ที่เรา download จาก firebase มาใน xcode project
เมื่อเรา add plist แล้ว เราจะ copy REVERSE_CLIENT_ID จาก google service มาใส่ใน url type
ต่อมาเราจะทำ AppDelegate ใน Swift เพื่อให้รองรับ Firebase Cloud Messaging
//// TestFCMApp.swift// TestFCM//// Created by Aofiee on 25/11/2564 BE.//import SwiftUIimport Firebase@mainstruct TestFCMApp: App {@UIApplicationDelegateAdaptor(AppDelegate.self) var delegatevar body: some Scene {WindowGroup {ContentView()}}}//Initclass AppDelegate: NSObject,UIApplicationDelegate {let gcmMessageIDKey = "gcm.message_id"func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions:[UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {FirebaseApp.configure()Messaging.messaging().delegate = selfif #available(iOS 10.0, *) {// For iOS 10 display notification (sent via APNS)UNUserNotificationCenter.current().delegate = selflet authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]UNUserNotificationCenter.current().requestAuthorization(options: authOptions,completionHandler: { _, _ in })} else {let settings: UIUserNotificationSettings =UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)application.registerUserNotificationSettings(settings)}application.registerForRemoteNotifications()return true}func application(_ application: UIApplication,didReceiveRemoteNotification userInfo: [AnyHashable: Any],fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult)-> Void) {if let messageID = userInfo[gcmMessageIDKey] {print("Message ID: \(messageID)")}// Print full message.print(userInfo)completionHandler(UIBackgroundFetchResult.newData)}func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error){}func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data){}}extension AppDelegate: MessagingDelegate {func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String?) {print("Firebase registration token: \(String(describing: fcmToken))")let dataDict: [String: String] = ["token": fcmToken ?? ""]print(dataDict)}}extension AppDelegate: UNUserNotificationCenterDelegate {func userNotificationCenter(_ center: UNUserNotificationCenter,willPresent notification: UNNotification,withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {let userInfo = notification.request.content.userInfoMessaging.messaging().appDidReceiveMessage(userInfo)// Change this to your preferred presentation optioncompletionHandler([[.banner,.badge,.sound]])}func userNotificationCenter(_ center: UNUserNotificationCenter,didReceive response: UNNotificationResponse,withCompletionHandler completionHandler: @escaping () -> Void) {let userInfo = response.notification.request.content.userInfoMessaging.messaging().appDidReceiveMessage(userInfo)completionHandler()}}
จากนั้นเราจะทำการ code บน go กันให้ส่ง message ไปยัง firebase cloud messaging กันดังนี้ โดยเราจะไปดึง registration_token จาก table user ที่ทำการ ติดตั้ง app ios ที่เราทำไว้เมื่อกี้ และทำการส่งข้อความผ่าน MulticastMessage เพื่อส่งให้ผู้ใช้งานหลายคนพร้อมกัน ผ่าน firebase cloud messaging ไปยัง มือถือที่ติดตั้ง application ไว้อีกที ก็เป็นอันเรียบร้อย
func (c *contentRepository) SendNotification(content *[]models.Content) error {var users []models.Usersif err := c.conn.Where("registration_token != ''").First(&users).Error; err != nil {return err}var tokens []stringfor _, user := range users {tokens = append(tokens, user.RegistrationToken)}for _, ct := range *content {var summary stringsummary = strip.StripTags(ct.Content)if len(ct.Content) > 255 {summary = strip.StripTags(ct.Content[:255])}ctx := context.Background()message := &messaging.MulticastMessage{Notification: &messaging.Notification{Title: ct.Title,Body: summary,},Tokens: tokens,}br, err := c.client.SendMulticast(ctx, message)if err != nil {log.Println(err)}if br.FailureCount > 0 {var failedTokens []stringfor idx, resp := range br.Responses {if !resp.Success {failedTokens = append(failedTokens, tokens[idx])}}log.Printf("List of tokens that caused failures: %v\n", failedTokens)}err = c.SetSendNotificationCompleted(&ct)if err != nil {return err}}return nil}
Quick Links
Legal Stuff