2017-03-03 3 views
1

Hey Ich versuche, Push-Benachrichtigungen von Firebase und anpassen sie nach Bedarf, aber es gibt mir immer Standard-Push-Benachrichtigung, auch wenn ich Benachrichtigungskategorie in Anwendung Startoptionen festgelegt haben. Also bitte sag mir, wie ich in diesem Fall eine angepasste Push-Benachrichtigung() anzeigen kann. Hier ist meine AppDelegate-Datei: -Push-Benachrichtigung zeigt keine benutzerdefinierte Benachrichtigung

// 
// AppDelegate.swift 
// FireBasePostNotification 
// 
// Created by Rajat Bhatt on 2/16/17. 
// Copyright © 2017 Rajat Bhatttixdo. All rights reserved. 
// 

import UIKit 
import UserNotifications 

import Firebase 
import FirebaseInstanceID 
import FirebaseMessaging 

@UIApplicationMain 
class AppDelegate: UIResponder, UIApplicationDelegate { 

    var window: UIWindow? 
    let gcmMessageIDKey = "gcm.message_id" 

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 
     if let lo = launchOptions { 
      let notification_details: NSDictionary = lo[UIApplicationLaunchOptionsKey.remoteNotification] as! NSDictionary 
      debugPrint(notification_details) 
      self.scheduleNotification(userInfo: notification_details as! [AnyHashable : Any]) 
     } 
     // Register for remote notifications. This shows a permission dialog on first run, to 
     // show the dialog at a more appropriate time move this registration accordingly. 
     // [START register_for_notifications] 
     if #available(iOS 10.0, *) { 
      let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound] 
      configureUserNotification() 
      UNUserNotificationCenter.current().requestAuthorization(
       options: authOptions, 
       completionHandler: {_, _ in }) 

      // For iOS 10 display notification (sent via APNS) 
      UNUserNotificationCenter.current().delegate = self 
      // For iOS 10 data message (sent via FCM) 
      FIRMessaging.messaging().remoteMessageDelegate = self 
     } else { 
      let settings: UIUserNotificationSettings = 
       UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil) 
      application.registerUserNotificationSettings(settings) 
     } 

     application.registerForRemoteNotifications() 

     // [END register_for_notifications] 
     FIRApp.configure() 

     // [START add_token_refresh_observer] 
     // Add observer for InstanceID token refresh callback. 
     NotificationCenter.default.addObserver(self, 
               selector: #selector(self.tokenRefreshNotification), 
               name: .firInstanceIDTokenRefresh, 
               object: nil) 
     // [END add_token_refresh_observer] 
     return true 
    } 

    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { 
     print("APNs token retrieved: \(deviceToken)") 
     let deviceTokenString = deviceToken.reduce("", {$0 + String(format: "%02X", $1)}) 
     print("Device token string: \(deviceTokenString)") 
     FIRMessaging.messaging().subscribe(toTopic: "/topics/post") 
     print("Subscribed to news topic") 
     // With swizzling disabled you must set the APNs token here. 
     FIRInstanceID.instanceID().setAPNSToken(deviceToken, type: FIRInstanceIDAPNSTokenType.sandbox) 
    } 

    func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) { 
     print("Unable to register for remote notifications: \(error.localizedDescription)") 
    } 

    // [START receive_message] 
    func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any]) { 

     // Let FCM know about the message for analytics etc. 
     FIRMessaging.messaging().appDidReceiveMessage(userInfo) 
     // handle your message 

     // If you are receiving a notification message while your app is in the background, 
     // this callback will not be fired till the user taps on the notification launching the application. 
     // TODO: Handle data of notification 
     // Print message ID. 
     if let messageID = userInfo[gcmMessageIDKey] { 
      print("Message ID: \(messageID)") 
     } 

     // Print full message. 
     print(userInfo) 
     //scheduleNotification(userInfo: userInfo) 
    } 

    func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any], 
        fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { 
     print("didReceiveRemoteNotification") 
     // If you are receiving a notification message while your app is in the background, 
     // this callback will not be fired till the user taps on the notification launching the application. 
     // TODO: Handle data of notification 
     // Print message ID. 
     if let messageID = userInfo[gcmMessageIDKey] { 
      print("Message ID: \(messageID)") 
     } 

     // Print full message. 
     print(userInfo) 
     //scheduleNotification(userInfo: userInfo) 

     completionHandler(UIBackgroundFetchResult.newData) 
    } 

    func applicationWillResignActive(_ application: UIApplication) { 
     // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 
     // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. 
    } 

    func applicationDidEnterBackground(_ application: UIApplication) { 
     FIRMessaging.messaging().disconnect() 
     print("Disconnected from FCM.") 
    } 

    func applicationWillEnterForeground(_ application: UIApplication) { 
     // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. 
    } 

    func applicationDidBecomeActive(_ application: UIApplication) { 
     connectToFcm() 
    } 

    func applicationWillTerminate(_ application: UIApplication) { 
     // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 
    } 

    func tokenRefreshNotification(_ notification: Notification) { 
     if let refreshedToken = FIRInstanceID.instanceID().token() { 
      print("InstanceID token: \(refreshedToken)") 
     } 

     // Connect to FCM since connection may have failed when attempted before having a token. 
     connectToFcm() 
    } 

    private func configureUserNotification() { 
     if #available(iOS 10.0, *) { 
      let action = UNNotificationAction(identifier: "dismiss", title: "Cancel", options: []) 
      let category = UNNotificationCategory(identifier: "myNotificationCategory", actions: [action], intentIdentifiers: [], options: []) 
      UNUserNotificationCenter.current().setNotificationCategories([category]) 
     } else { 
      // Fallback on earlier versions 
     } 

    } 

    func scheduleNotification(userInfo: [AnyHashable : Any]) { 
     //  let calendar = Calendar(identifier: .gregorian) 
     //  let components = calendar.dateComponents(in: .current, from: date) 
     //  let newComponents = DateComponents(calendar: calendar, timeZone: .current, month: components.month, day: components.day, hour: components.hour, minute: components.minute) 

     if #available(iOS 10.0, *) { 
      let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 02, repeats: false) 
      let content = UNMutableNotificationContent() 
      content.categoryIdentifier = "myNotificationCategory" 
      //let notification = userInfo["notification"] as! [String: Any] 
      content.title = userInfo["title"] as! String 
      content.body = userInfo["text"] as! String 
      content.sound = UNNotificationSound.default() 
      content.userInfo = userInfo 

      //   //if let path = Bundle.main.path(forResource: "logo", ofType: "png") { 
      //   let url = URL(fileURLWithPath: userInfo["image"] as! String) 
      // 
      //   do { 
      //    let attachment = try UNNotificationAttachment(identifier: "myNotificationCategory", url: url, options: nil) 
      //    content.attachments = [attachment] 
      //   } catch { 
      //    print("The attachment was not loaded.") 
      //   } 
      //   //} 

      let request = UNNotificationRequest(identifier: "textNotification", content: content, trigger: trigger) 

      UNUserNotificationCenter.current().removeAllPendingNotificationRequests() 
      UNUserNotificationCenter.current().add(request) {(error) in 
       if let error = error { 
        print("Uh oh! We had an error: \(error)") 
       } 
      } 
     } else { 
      // Fallback on earlier versions 
     } 
    } 

    // [START connect_to_fcm] 
    func connectToFcm() { 
     // Won't connect since there is no token 
     guard FIRInstanceID.instanceID().token() != nil else { 
      return; 
     } 

     // Disconnect previous FCM connection if it exists. 
     FIRMessaging.messaging().disconnect() 

     FIRMessaging.messaging().connect { (error) in 
      if error != nil { 
       print("Unable to connect with FCM. \(error)") 
      } else { 
       print("Connected to FCM.") 
      } 
     } 
    } 
} 

// [START ios_10_message_handling] 
@available(iOS 10, *) 
extension AppDelegate : UNUserNotificationCenterDelegate { 

    // Receive displayed notifications for iOS 10 devices. 
    func userNotificationCenter(_ center: UNUserNotificationCenter, 
           willPresent notification: UNNotification, 
           withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { 
     let userInfo = notification.request.content.userInfo 
     // Print message ID. 
     if let messageID = userInfo[gcmMessageIDKey] { 
      print("Message ID: \(messageID)") 
     } 

     // Print full message. 
     print(userInfo) 
     //scheduleNotification(userInfo: userInfo) 
     // Change this to your preferred presentation option 
     completionHandler([.alert]) 
    } 

    func userNotificationCenter(_ center: UNUserNotificationCenter, 
           didReceive response: UNNotificationResponse, 
           withCompletionHandler completionHandler: @escaping() -> Void) { 
     print(response.actionIdentifier) 
     let userInfo = response.notification.request.content.userInfo 
     // Print message ID. 
     if let messageID = userInfo[gcmMessageIDKey] { 
      print("Message ID: \(messageID)") 
     } 

     // Print full message. 
     print(userInfo) 
     //scheduleNotification(userInfo: userInfo) 
     completionHandler() 
    } 
} 
// END ios_10_message_handling 
// START ios_10_data_message_handling 
extension AppDelegate : FIRMessagingDelegate { 
    // Receive data message on iOS 10 devices while app is in the foreground. 
    func applicationReceivedRemoteMessage(_ remoteMessage: FIRMessagingRemoteMessage) { 
     print(remoteMessage.appData) 
     scheduleNotification(userInfo: remoteMessage.appData) 
    } 
} 
// [END ios_10_data_message_handling] 

Und meine extention Datei enthält folgendes: -

Klasse NotificationViewController: UIViewController, UNNotificationContentExtension {

@IBOutlet var label: UILabel? 

var contentHandler: ((UNNotificationContent) -> Void)? 
var bestAttemptContent: UNMutableNotificationContent? 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any required interface initialization here. 
} 

func didReceive(_ notification: UNNotification) { 
    self.label?.text = notification.request.content.body 
} 

}

JSON i sende Durch fcm ist: -

{ 
    "to": "c0jlO4sWiog:APA91bGSlGYe27xA5DdyLcgm1xlSyxmWrfPOzNHnTv6Jp0QT0MnzqHoekSpnuNvppGDwQYB-jyV-gtxvYDdBjxsc_I1u1uvYqNHqXEB8ki-UnRNKqFJcwCSAljNOm2Ax0AuFFLy5qMq1", 
    "priority" : "high", 
    "notification" : { 
    "title": "adfsas", 
    "body" : "dasdfadf", 
    "category" : "myNotificationCategory", 
    "content_available": true, 
    "mutable_content": 1 
    }, 
    "data": { 
    "text": "fadsfa", 
    "title":"asfdafa", 
    "image":"http://feelgrafix.com/data/images/images-1.jpg" 
    } 
} 

Antwort

0

Für Kategorie in fcm müssen Sie click_action geben: Schlüssel anstelle der Kategorie.

{ 
    "to": "cVA176y69bk:APA91bFprDK2CeYG8W4P6Fu0bn7FrvlXqI-voZUrNv3MH-HLLl-toswFc1luwjASf5b1phk5fMuy1APd3QcIT9qzsPbiX_dTaxhoGx6y-h05aDxDdcmYiYEWu7e0vuvWeCc9uloZCp1e", 
    "priority" : "high", 
    "content_available": true, 
    "mutable_content": true, 

    "notification" : { 
    "title": "dsaasf", 
    "body" : "afaadfad", 
    "click_action" : "myNotificationCategory" 
    }, 
    "data": { 
    "text": "adsfaf", 
    "title":"asfads", 
    "image":"http://feelgrafix.com/data/images/images-1.jpg" 
    } 
} 
Verwandte Themen