Открытие URL в моем приложении для просмотра веб-страниц из уведомления, не работающего, когда приложение закрывается - PullRequest
0 голосов
/ 03 января 2019

У меня есть приложение webview ios, которое получает уведомления, и я передаю URL-адрес, чтобы при щелчке пользователя на уведомлении он открывал веб-просмотр по этому URL-адресу.

Когда приложение находится на переднем плане и в фоне, оно работает нормально. Если пользователь получает уведомление, когда приложение закрыто и в данный момент не запущено, приложение открывается, но не переходит на этот URL

В моем didReceiveRemoteNotification я обнаруживаю различные состояния приложения, но я думал, что .background будет работать так же, как не работает, но я думаю, что нет. Как я могу получить уведомление об открытии URL-адреса, когда приложение закрывается?

AppDelegate.swift

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {

    let data = userInfo as! [String: AnyObject]
    let state = UIApplication.shared.applicationState
    if state == .background {
        // background
        //print("==== Active Running ====")
        if let aps = data["aps"] {
            let url = aps["url"]
            viewController?.loadRequestnotification(for: url as! String)
        }
    }
    else if state == .inactive {
        // inactive
        //print("==== Inactive Running ====")
        if let aps = data["aps"] {
            let url = aps["url"]
            viewController?.loadRequestnotification(for: url as! String)
        }
    }

}

UPDATE

Так что с некоторой помощью я смог использовать didFinishLaunchingWithOptions для вызова моего веб-просмотра, но уведомление при нажатии все еще не открывается для URL.

Я использую viewController?.loadRequestnotification(for: url as! String) в некоторых других областях моего делегата, который работает нормально. Я подозреваю, что return true может конфликтовать с вызовом.

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    UNUserNotificationCenter.current().delegate = self
    ConnectionManager.sharedInstance.observeReachability()
    // Override point for customization after application launch.
    FirebaseApp.configure()
    registerForPushNotifications()

    if launchOptions != nil {
        // opened from a push notification when the app is closed
        let userInfo = launchOptions?[.remoteNotification] as? [AnyHashable : Any]
        if userInfo != nil {
            if let object = userInfo?["aps"] as? [String : AnyObject] {
                let url = object["url"]
                viewController?.loadRequestnotification(for: url as! String)
            }
        }
    }
    return true
}

Ответы [ 3 ]

0 голосов
/ 03 января 2019

Существует один сценарий , например, если ваше приложение не запущено, и пользователь нажимает на уведомление вашего приложения, а затем, как вы можете его получить.

Вот код, который вы можете получить

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {


    if let notification = launchOptions?[.remoteNotification] as? [String: Any] {
        if let dictionary:NSDictionary = notification as? NSDictionary{
            print("Dictionary Print in didFinishLaunching :: \(dictionary)")
        }
    }

}

Ваше приложение может получить некоторое уведомление, и оно находится в центре уведомлений, но пользователь не может щелкнуть по любому уведомлению, но они откроют ваше приложение, как обычно, тогда, как описано ниже, вы можете получить все уведомления, которыеполучено вашим приложением.

UNUserNotificationCenter.current().getDeliveredNotifications { (notification) in
        print(notification.count)

    }
0 голосов
/ 03 января 2019

Эта функция вызывается, когда приложение получает какое-либо уведомление. Я использовал это в своем приложении чата.

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
    if application.applicationState == .active {
        //Application is currently active and user receive the notification
    } else if application.applicationState == .background {
        //app is in background, but not killed
    } else if application.applicationState == .inactive {
        //app is transitioning from background to foreground (user taps notification), do what you need when user taps here
        //Load your URL into webView from here
    }
}

Если приложение открыто и вы хотите выполнить какое-то действие при получении уведомления Используйте этот метод

func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
    completionHandler(UNAuthorizationOptions.alert.rawValue | UIUserNotificationType.sound.rawValue | UIUserNotificationType.badge.rawValue)
}

Вы также можете проверить погоду приложение открыто из уведомления или нет в AppDelegate's didFinishLaunchingWithOptions

Но рекомендуется держать этот метод didFinishLaunchingWithOptions как можно более легким. Я надеюсь, что это будет работать для вас

0 голосов
/ 03 января 2019
  • didReceiveRemoteNotification не будет вызываться при закрытии приложения.

    Попробуйте этот код, когда приложение закрыто, чтобы получить данные уведомления.

      func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
         if launchOptions != nil {
           // opened from a push notification when the app is closed
            let userInfo = launchOptions?[.remoteNotification] as? [AnyHashable : Any]
           if userInfo != nil {
           if let object = userInfo?["aps"] {
               let url = object["url"]")
              // Now set root controller here
           }
         }
      } else {
         // opened app without a push notification.
             }
      }
    
...