Unescape XML entities in notification body
This commit is contained in:
parent
5c5677507b
commit
015172b719
|
@ -50,6 +50,7 @@
|
||||||
D059373425AAEA7000754FDF /* CompositionPollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D059373225AAEA7000754FDF /* CompositionPollView.swift */; };
|
D059373425AAEA7000754FDF /* CompositionPollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D059373225AAEA7000754FDF /* CompositionPollView.swift */; };
|
||||||
D059373E25AB8D5200754FDF /* CompositionPollOptionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D059373D25AB8D5200754FDF /* CompositionPollOptionView.swift */; };
|
D059373E25AB8D5200754FDF /* CompositionPollOptionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D059373D25AB8D5200754FDF /* CompositionPollOptionView.swift */; };
|
||||||
D059373F25AB8D5200754FDF /* CompositionPollOptionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D059373D25AB8D5200754FDF /* CompositionPollOptionView.swift */; };
|
D059373F25AB8D5200754FDF /* CompositionPollOptionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D059373D25AB8D5200754FDF /* CompositionPollOptionView.swift */; };
|
||||||
|
D059376125ABE2E800754FDF /* XMLUnescaper.swift in Sources */ = {isa = PBXBuildFile; fileRef = D059376025ABE2E800754FDF /* XMLUnescaper.swift */; };
|
||||||
D0625E59250F092900502611 /* StatusListCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0625E58250F092900502611 /* StatusListCell.swift */; };
|
D0625E59250F092900502611 /* StatusListCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0625E58250F092900502611 /* StatusListCell.swift */; };
|
||||||
D0625E5D250F0B5C00502611 /* StatusContentConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0625E5C250F0B5C00502611 /* StatusContentConfiguration.swift */; };
|
D0625E5D250F0B5C00502611 /* StatusContentConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0625E5C250F0B5C00502611 /* StatusContentConfiguration.swift */; };
|
||||||
D06BC5E625202AD90079541D /* ProfileViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D06BC5E525202AD90079541D /* ProfileViewController.swift */; };
|
D06BC5E625202AD90079541D /* ProfileViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D06BC5E525202AD90079541D /* ProfileViewController.swift */; };
|
||||||
|
@ -202,6 +203,7 @@
|
||||||
D05936FE25AA94EA00754FDF /* MarkAttachmentsSensitiveView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MarkAttachmentsSensitiveView.swift; sourceTree = "<group>"; };
|
D05936FE25AA94EA00754FDF /* MarkAttachmentsSensitiveView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MarkAttachmentsSensitiveView.swift; sourceTree = "<group>"; };
|
||||||
D059373225AAEA7000754FDF /* CompositionPollView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CompositionPollView.swift; sourceTree = "<group>"; };
|
D059373225AAEA7000754FDF /* CompositionPollView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CompositionPollView.swift; sourceTree = "<group>"; };
|
||||||
D059373D25AB8D5200754FDF /* CompositionPollOptionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CompositionPollOptionView.swift; sourceTree = "<group>"; };
|
D059373D25AB8D5200754FDF /* CompositionPollOptionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CompositionPollOptionView.swift; sourceTree = "<group>"; };
|
||||||
|
D059376025ABE2E800754FDF /* XMLUnescaper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XMLUnescaper.swift; sourceTree = "<group>"; };
|
||||||
D0625E58250F092900502611 /* StatusListCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusListCell.swift; sourceTree = "<group>"; };
|
D0625E58250F092900502611 /* StatusListCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusListCell.swift; sourceTree = "<group>"; };
|
||||||
D0625E5C250F0B5C00502611 /* StatusContentConfiguration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusContentConfiguration.swift; sourceTree = "<group>"; };
|
D0625E5C250F0B5C00502611 /* StatusContentConfiguration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusContentConfiguration.swift; sourceTree = "<group>"; };
|
||||||
D0666A2124C677B400F3F04B /* Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
D0666A2124C677B400F3F04B /* Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
|
@ -563,6 +565,7 @@
|
||||||
D0E5361D24E3EB4D00FB1CE1 /* Info.plist */,
|
D0E5361D24E3EB4D00FB1CE1 /* Info.plist */,
|
||||||
D0E5362824E4A06B00FB1CE1 /* Notification Service Extension.entitlements */,
|
D0E5362824E4A06B00FB1CE1 /* Notification Service Extension.entitlements */,
|
||||||
D0E5361B24E3EB4D00FB1CE1 /* NotificationService.swift */,
|
D0E5361B24E3EB4D00FB1CE1 /* NotificationService.swift */,
|
||||||
|
D059376025ABE2E800754FDF /* XMLUnescaper.swift */,
|
||||||
);
|
);
|
||||||
path = "Notification Service Extension";
|
path = "Notification Service Extension";
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
|
@ -911,6 +914,7 @@
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
D0E5361C24E3EB4D00FB1CE1 /* NotificationService.swift in Sources */,
|
D0E5361C24E3EB4D00FB1CE1 /* NotificationService.swift in Sources */,
|
||||||
|
D059376125ABE2E800754FDF /* XMLUnescaper.swift in Sources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
|
|
@ -32,7 +32,7 @@ final class NotificationService: UNNotificationServiceExtension {
|
||||||
}
|
}
|
||||||
|
|
||||||
bestAttemptContent.title = pushNotification.title
|
bestAttemptContent.title = pushNotification.title
|
||||||
bestAttemptContent.body = pushNotification.body
|
bestAttemptContent.body = XMLUnescaper(string: pushNotification.body).unescape()
|
||||||
|
|
||||||
let fileName = pushNotification.icon.lastPathComponent
|
let fileName = pushNotification.icon.lastPathComponent
|
||||||
let fileURL = URL(fileURLWithPath: NSTemporaryDirectory(), isDirectory: true).appendingPathComponent(fileName)
|
let fileURL = URL(fileURLWithPath: NSTemporaryDirectory(), isDirectory: true).appendingPathComponent(fileName)
|
||||||
|
|
|
@ -0,0 +1,37 @@
|
||||||
|
// Copyright © 2021 Metabolist. All rights reserved.
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
final class XMLUnescaper: NSObject {
|
||||||
|
private let rawString: String
|
||||||
|
private let parser: XMLParser
|
||||||
|
private var unescaped = ""
|
||||||
|
private static let containerTag = "com.metabolist.metatext.container-tag"
|
||||||
|
private static let openingContainerTag = "<\(containerTag)>"
|
||||||
|
private static let closingContainerTag = "</\(containerTag)>"
|
||||||
|
|
||||||
|
init(string: String) {
|
||||||
|
rawString = Self.openingContainerTag
|
||||||
|
.appending(string)
|
||||||
|
.appending(Self.closingContainerTag)
|
||||||
|
parser = XMLParser(data: Data(rawString.utf8))
|
||||||
|
|
||||||
|
super.init()
|
||||||
|
|
||||||
|
parser.delegate = self
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
extension XMLUnescaper {
|
||||||
|
func unescape() -> String {
|
||||||
|
parser.parse()
|
||||||
|
|
||||||
|
return unescaped
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
extension XMLUnescaper: XMLParserDelegate {
|
||||||
|
func parser(_ parser: XMLParser, foundCharacters string: String) {
|
||||||
|
unescaped.append(string)
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue