2016-07-31 14 views
5

Funkcja UNUserNotificationCenter nie jest wywoływana po kliknięciu Przycisk działania Czat w powiadomieniu po 3D Dotknij, jeśli aplikacja nie jest aktywna (nawet w tle lub wypowiedzenie zostało zakończone). Użyłem "dołącz do procesu według nazwy" w Xcode do debugowania aplikacji po zakończeniu aplikacji. Oto kod:UNUserNotificationCenter didRecieve Odpowiedź nie jest wywoływana, jeśli aplikacja została zakończona

import UIKit 
import Mixpanel 
import UserNotifications 

@UIApplicationMain 

class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate { 

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

     self.handlePushNotificationWithUserInfo(launchOptions: launchOptions) 

     //ask for push notification perms 
     return true 
    } 

Kiedy powiadomień Pop-up (Wysłane z MixPanel) funkcja ta nazywa się pierwszy,

Połączenie 1:

func handlePushNotificationWithUserInfo(launchOptions: [NSObject: AnyObject]?) { 
     //Handle PushNotification when app is opened 
    } 

następnie idzie tu

Call 2:

//register for notification 
    func application(_ application: UIApplication, didRegister notificationSettings: UIUserNotificationSettings) { 

     if #available(iOS 10.0, *) { 
      let center = UNUserNotificationCenter.current() 
      center.requestAuthorization(options: [.alert, .sound]) { (granted, error) in 
       // Enable or disable features based on authorization. 
      } 
      center.delegate = self 

      let actionChat = UNNotificationAction(identifier: Constants.ActionType.CHAT.rawValue, title: "Chat", options: [.foreground]) 
      let categoryOptions = UNNotificationCategoryOptions(rawValue: 0) 
      let customerSupportCategory = UNNotificationCategory(identifier: Constants.NotificationType.CUSTOMER_SUPPORT.rawValue, actions: [actionChat], intentIdentifiers: [], options: categoryOptions) 
      center.setNotificationCategories([customerSupportCategory]) 
     } 

     application.registerForRemoteNotifications() 
    } 

Połączenie 3:

// remote notification 
    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { 
     ....Some Code.... 
    } 

Ale poniżej funkcji nie nazywa. Ale jeśli aplikacja jest uruchomiona w tle, to poniżej wywoływana jest funkcja i wszystko działa poprawnie INNEJ aplikacji przychodzi na pierwszy plan i czat nie po tym.

// action buttons in enhanced Notification 
    @available(iOS 10, *) 
    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler:() -> Void) { 
     guard let action = Constants.ActionType(rawValue: response.actionIdentifier) else { 
      completionHandler() 
      return 
     } 
     switch action { 
     case .CHAT: 
      _ = self.handleRemoteUrl(NSURL(string: "chat") as? URL) 
     default: 
      _ = self.handleRemoteUrl(NSURL(string: "chat") as? URL) 
     } 
     completionHandler() 
    } 

    @available(iOS 10.0, *) 
    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: (UNNotificationPresentationOptions) -> Void) { 
     completionHandler([.alert, .sound]) 
    } 
} 

Funkcja ta nigdy nie jest wywoływana może być, ponieważ jest amortyzowane w ciągu 10 userNotificationCenter iOS(), nie jestem pewien. Proszę to wyjaśnić także ..

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) { 
     ....Some Code.... 
    } 

używam iPhone 6s iOS 10 jako urządzenie debugowania. XCode 8 beta-3

+0

Gdy aplikacja nie jest uruchomiony lub zabite przez użytkownika, a zgłoszenie jest odbierany następnie w takim scenariuszu trzeba obsłużyć w didFinishLaunchingWithOptions i sprawdzić, czy aplikacja jest otwierana za pomocą notyfikacji i aktu odpowiednio. – user1140780

Odpowiedz

6

Z własnego eksperymentowania, odbieranie lokalnych powiadomień w Swift 3 & Xcode 8 przedstawiają się następująco:

Zgodność

  • Zgodne z UNUserNotificationCenterDelegate

    class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate { .... } 
    
  • Rejestracja jako pełnomocnika centrum powiadomień w:

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 
    
        let center = UNUserNotificationCenter.current() 
        center.delegate = self 
    
        return true 
    } 
    

którym przekazano Metody

  • Reakcja pominięcia powiadomień (np aplikacja wyświetlająca użytkownika po wysłaniu powiadomienia)

    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: (UNNotificationPresentationOptions) -> Void) { 
        print(notification.request.content.userInfo) 
    } 
    
  • Odpowiedz na powiadomienia o działaniu (np.użytkownik otworzył zgłoszenie)

    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler:() -> Void) { 
        print(response.notification.request.content.userInfo) 
    } 
    
+0

Tak, faktycznie zrobiłem wszystkie te kroki. Później znalazłem swój błąd, ale nie dodałem jeszcze odpowiedzi i ekspiacji, więc właśnie dodałem ** RegisterNotification.sharedHandler.registerFor3dTouchInNotification (appDelegate: self) ** w ** func handlePushNotificationWithUserInfo (launchOptions: [NSObject: AnyObject]?) **, która rejestruje kategorię za każdym razem, gdy otrzymujemy powiadomienie, Nie jestem pewien, czy jest to poprawny sposób, ale Rozwiązał mój problem .. –

0

Gdy aplikacja nie jest uruchomiony lub zabite przez użytkownika, a następnie otrzymała zgłoszenie jest w takiej sytuacji trzeba obsłużyć w didFinishLaunchingWithOptions i sprawdzić, czy aplikacja jest otwierana poprzez ogłoszenia i działają prawidłowo.

// Sprawdź, czy uruchomiona od powiadomienia

if let notification = launchOptions?[UIApplicationLaunchOptionsRemoteNotificationKey] as? [String: AnyObject] { 
     notificationReceived(notification) 
    } 
+0

już nie w przypadku "UNUserNotificationCenter", delegat jest zawsze nazywany. . –

1

Swift 3.1 Aktualizacja

  • Zgodne z UNUserNotificationCenterDelegate

  • Rejestracja jako delegat centrum powiadomień za:

UNUserNotificationCenter.current().delegate = self 
  • Delegowanie Metody
public func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping() -> Void) { 
    print(response.notification.request.content.categoryIdentifier) 
} 

public func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { 
    print(notification.request.content.categoryIdentifier) 
} 
Powiązane problemy