extension Data { // Encode `self` with URL escaping considered. var base64URLEncoded: String { let base64Encoded = base64EncodedString() return base64Encoded .replacingOccurrences(of: "+", with: "-") .replacingOccurrences(of: "/", with: "_") .replacingOccurrences(of: "=", with: "") } } extension String { // Returns the data of `self` (which is a base64 string), with URL related characters decoded. var base64URLDecoded: Data? { let paddingLength = 4 - count % 4 // Filling = for %4 padding. let padding = (paddingLength < 4) ? String(repeating: "=", count: paddingLength) : "" let base64EncodedString = self .replacingOccurrences(of: "-", with: "+") .replacingOccurrences(of: "_", with: "/") + padding return Data(base64Encoded: base64EncodedString) } }