원격 알림의 빠른 읽기 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
'source' 카테고리의 다른 글
Wordpress - 포스트 편집 페이지의 카테고리 목록 순서 (0) | 2023.02.08 |
---|---|
리액트에 SVG 삽입JS (0) | 2023.02.08 |
고객이 이미 WooCommerce에서 무언가를 구입했는지 확인 (0) | 2023.02.08 |
AngularJS 부트스트랩오브젝트 및 선택 기능을 갖춘 UI 자동 검색 (0) | 2023.02.08 |
명명된 튜플의 이름을 직렬화된 JSON 응답에 표시 (0) | 2023.02.08 |