source

원격 알림의 빠른 읽기 userInfo

manysource 2023. 2. 8. 19:46

원격 알림의 빠른 읽기 userInfo

다음과 같은 원격 알림을 받으면 Alert View를 여는 기능을 구현했습니다.

func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]){
        var notifiAlert = UIAlertView()
        var NotificationMessage : AnyObject? =  userInfo["alert"]
        notifiAlert.title = "TITLE"
        notifiAlert.message = NotificationMessage as? String
        notifiAlert.addButtonWithTitle("OK")
        notifiAlert.show()
}

그러나 Notification Message는 항상 제로입니다.

json payload는 다음과 같습니다.

{"aps":{"alert":"Testmessage","badge":"1"}}

Xcode 6, Swift를 사용하고 있으며 iOS8용으로 개발 중입니다.몇 시간 동안 찾아봤지만 유용한 정보를 찾을 수 없었다.알림은 완벽하게 작동합니다.클릭하면 Alert View가 열립니다.문제는 userInfo에서 데이터를 가져올 수 없다는 것입니다.

의 루트 레벨 항목userInfo사전은"aps",것은 아니다."alert".

다음을 시도해 보십시오.

if let aps = userInfo["aps"] as? NSDictionary {
    if let alert = aps["alert"] as? NSDictionary {
        if let message = alert["message"] as? NSString {
           //Do stuff
        }
    } else if let alert = aps["alert"] as? NSString {
        //Do stuff
    }
}

"Push Notification Documentation(를 참조하십시오.

스위프트 5

struct Push: Decodable {
    let aps: APS
    
    struct APS: Decodable {
        let alert: Alert
        
        struct Alert: Decodable {
            let title: String
            let body: String
        }
    }
    
    init(decoding userInfo: [AnyHashable : Any]) throws {
        let data = try JSONSerialization.data(withJSONObject: userInfo, options: .prettyPrinted)
        self = try JSONDecoder().decode(Push.self, from: data)
    }
}

사용방법:

guard let push = try? Push(decoding: userInfo) else { return }
let alert = UIAlertController(title: push.aps.alert.title, message: push.aps.alert.body, preferredStyle: .alert)

방법(Swift 4):

func extractUserInfo(userInfo: [AnyHashable : Any]) -> (title: String, body: String) {
    var info = (title: "", body: "")
    guard let aps = userInfo["aps"] as? [String: Any] else { return info }
    guard let alert = aps["alert"] as? [String: Any] else { return info }
    let title = alert["title"] as? String ?? ""
    let body = alert["body"] as? String ?? ""
    info = (title: title, body: body)
    return info
}

사용방법:

let info = self.extractUserInfo(userInfo: userInfo)
print(info.title)
print(info.body)

저는 Accenage에서 메시지를 보낼 때 다음 코드가 작동합니다.

private func extractMessage(fromPushNotificationUserInfo userInfo:[NSObject: AnyObject]) -> String? {
    var message: String?
    if let aps = userInfo["aps"] as? NSDictionary {
        if let alert = aps["alert"] as? NSDictionary {
            if let alertMessage = alert["body"] as? String {
                message = alertMessage              
            }
        }
    }
    return message
}

크레이잉 스탠포드의 대답과 다른 점은key나는 메시지를 추출하곤 했다고요alert즉,body그건 좀 다르죠.자세한 내용은 아래를 참조하십시오.

if let alertMessage = alert["message"] as? NSString

if let alertMessage = alert["body"] as? String

이것이 내 objC용 버전입니다.

if (userInfo[@"aps"]){
    NSDictionary *aps = userInfo[@"aps"];
    if (aps[@"alert"]){
        NSObject *alert = aps[@"alert"];
        if ([alert isKindOfClass:[NSDictionary class]]){
            NSDictionary *alertDict = aps[@"alert"];
            if (alertDict[@"message"]){
                NSString *message = alertDict[@"message"];
            }
        }
        else if (aps[@"alert"]){
            NSString *alert = aps[@"alert"];
        }
    }
}

앱이 활성 상태인 동안 경고가 표시됩니다.상태가 활성인지 여부를 확인합니다.

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
    if application.applicationState == .active {
      if let aps = userInfo["aps"] as? NSDictionary {
        if let alertMessage = aps["alert"] as? String {
          let alert = UIAlertController(title: "Notification", message: alertMessage, preferredStyle: UIAlertControllerStyle.alert)
          let action = UIAlertAction(title: "Ok", style: .default, handler: nil)
          alert.addAction(action)
          self.window?.rootViewController?.present(alert, animated: true, completion: nil)
        }
      }
    }
    completionHandler(.newData)
  }

이를 통해 사용자가 메시지가 필요한 경우 경보 메시지를 받을 수 있습니다.

APN 프로바이더와 json payload를 다음과 같이 사용합니다.

{
  "aps" : {
    "alert" : {
      "title" : "I am title",
      "body" : "message body."
    },
  "sound" : "default",
  "badge" : 1
  }
}

프로바이더가 JSON 정의 딕셔너리로 시작했기 때문에 iOS는 JSON 정의 딕셔너리로 변환합니다.NSDictionary객체, 예를 들어 첨자 없음Dictionary를 사용할 수 있습니다.value(forKey:)

여기서부터의 레퍼런스

이게 스위프트4를 위한 내 길이야

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
    guard application.applicationState == .active else { return }
    guard let alertDict = ((userInfo["aps"] as? NSDictionary)?.value(forKey: "alert")) as? NSDictionary,
        let title = alertDict["title"] as? String,
        let body = alertDict["body"] as? String
        else { return }
    let alertController = UIAlertController(title: title, message: body, preferredStyle: .alert)
    let okAct = UIAlertAction(title: "Ok", style: .default, handler: nil)
    alertController.addAction(okAct)
    self.window?.rootViewController?.present(alertController, animated: true, completion: nil)
    completionHandler(UIBackgroundFetchResult.noData)
}

언급URL : https://stackoverflow.com/questions/28596295/swift-read-userinfo-of-remote-notification