it-swarm.com.ru

Как получить данные из Push-ответа на ответ Swift 3/iOS

Я использую следующую библиотеку для генерации push-уведомлений.

https://github.com/edamov/pushok

У меня работают Push-уведомления, но я не знаю, как извлечь ответ в Swift 3.

Вот что у меня есть.

// Push notification received
    func application(_ application: UIApplication, didReceiveRemoteNotification data: [AnyHashable : Any]) {
        // Print notification payload data
        print("Push notification received: \(data)")

        let aps = data[AnyHashable("aps")]!

        print(aps)
    }

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

Push notification received: [AnyHashable("samplekey"): samplevalue, AnyHashable("aps"): {
    alert =     {
        body = hey;
        title = "Hello!";
    };
    sound = default;
}]
{
    alert =     {
        body = hey;
        title = "Hello!";
    };
    sound = default;
}

Итак, мой вопрос: как мне получить доступ к данным внутри оповещения для «body» и «title»?

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

3
Joseph Astrahan

Я думаю, что это более безопасный способ сделать то, что нашел Джозеф.

guard
    let aps = data[AnyHashable("aps")] as? NSDictionary,
    let alert = aps["alert"] as? NSDictionary,
    let body = alert["body"] as? String,
    let title = alert["title"] as? String
    else {
        // handle any error here
        return
    }

print("Title: \(title) \nBody:\(body)")
14
ffabri

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

 let alert = aps["alert"]! as! NSDictionary
 let body = alert["body"] as! String
 let title = alert["title"] as! String

приложение будет аварийно завершать работу при отсутствии какого-либо из указанных выше значений. 

Вместо этого сначала давайте представим модель уведомления.

class MTNotification {
    let alert: [String: AnyHashable]
    var title: String?
    var body: String?

    init(alert: [String: AnyHashable]) {
        self.alert = alert
    }
}

Используйте что-то для отслеживания ошибок, которые могут возникнуть при обработке необработанных данных уведомлений. Лучше, если вы сделаете так, чтобы он соответствовал протоколу Error

enum MTError: Error {
    // Observe your transformation and extend error cases
    case missingProperty(id: String)
}

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

class MTNotificationBuilder {

     /// Build a notification from raw data
     ///
     /// - Parameter data: Classic notification payload, received from app delegate
     /// - Returns: customized MTNotification
     /// - Throws: error while building a valid MTNotification object
    static func build(from data: [AnyHashable : Any]) throws -> MTNotification {
        guard let aps = data["aps"] as? [String: AnyHashable] else {
            // Do some error handlig
            throw MTError.missingProperty(id: "aps")
        }

        guard let alert = aps["alert"] as? [String: AnyHashable] else {
            // Do some error handlig
            throw MTError.missingProperty(id: "aps")
        }

        let notification = MTNotification(alert: alert)
        // Assign values read as optionals from alert dictionary
        notification.title = alert["title"] as? String
        notification.body = alert["body"] as? String

        return notification
    } 
}

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

func application(_ application: UIApplication, didReceiveRemoteNotification data: [AnyHashable : Any]) {

    do {
        let notification = try MTNotificationBuilder.build(from: data)
        print(notification.alert)
    } catch let error {
        print(error)
    }
}
2
dirtydanee

Убедитесь, что вы включили «Фоновые режимы» в «Возможностях» проекта и отметили «Удаленные уведомления» . Добавьте следующий метод в класс AppDelegate. Этот метод будет вызываться во время представления уведомления.

func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        print(notification.request.content.userInfo)
        completionHandler([ .alert,.badge, .sound])

}
1
Pranit

Хорошо, я узнал ответ. Вы делаете это, как показано ниже.

let aps = data[AnyHashable("aps")]! as! NSDictionary

        let alert = aps["alert"]! as! NSDictionary

        let body = alert["body"] as! String
        let title = alert["title"] as! String

Если у кого-то есть более безопасный ответ, я буду признателен, если он отредактирует это или опубликует.

1
Joseph Astrahan