Como posso codificar uma string para Base64 no Swift?

Eu quero converter uma string para Base64. Eu encontrei respostas em vários lugares, mas isso não funciona mais no Swift. Estou usando o Xcode 6.2. Eu acredito que a resposta pode ser trabalho nas versões anteriores do Xcode e não no Xcode 6.2.

Alguém poderia me guiar para fazer isso no Xcode 6.2?

A resposta que encontrei foi esta, mas não funciona na minha versão do Xcode:

var str = "iOS Developer Tips encoded in Base64" println("Original: \(str)") // UTF 8 str from original // NSData! type returned (optional) let utf8str = str.dataUsingEncoding(NSUTF8StringEncoding) // Base64 encode UTF 8 string // fromRaw(0) is equivalent to objc 'base64EncodedStringWithOptions:0' // Notice the unwrapping given the NSData! optional // NSString! returned (optional) let base64Encoded = utf8str.base64EncodedStringWithOptions(NSDataBase64EncodingOptions.fromRaw(0)!) println("Encoded: \(base64Encoded)") // Base64 Decode (go back the other way) // Notice the unwrapping given the NSString! optional // NSData returned let data = NSData(base64EncodedString: base64Encoded, options: NSDataBase64DecodingOptions.fromRaw(0)!) // Convert back to a string let base64Decoded = NSString(data: data, encoding: NSUTF8StringEncoding) println("Decoded: \(base64Decoded)") 

ref: http://iosdevelopertips.com/swift-code/base64-encode-decode-swift.html

Eu não tenho 6.2 instalado, mas eu não acho que o 6.3 é diferente neste aspecto:

dataUsingEncoding retorna um opcional, então você precisa desdobrar isso.

NSDataBase64EncodingOptions.fromRaw foi substituído por NSDataBase64EncodingOptions(rawValue:) . Um pouco surpreendentemente, este não é um inicializador fiável, então você não precisa desembrulhá-lo.

Mas como o NSData(base64EncodedString:) é um inicializador fiável, você precisa desdobrar isso.

Btw, todas essas mudanças foram sugeridas pelo migrador Xcode (clique na mensagem de erro na medianiz e tem uma sugestão de correção).

O código final, reescrito para evitar força-unwraps, se parece com isto:

 import Foundation let str = "iOS Developer Tips encoded in Base64" println("Original: \(str)") let utf8str = str.dataUsingEncoding(NSUTF8StringEncoding) if let base64Encoded = utf8str?.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0)) { println("Encoded: \(base64Encoded)") if let base64Decoded = NSData(base64EncodedString: base64Encoded, options: NSDataBase64DecodingOptions(rawValue: 0)) .map({ NSString(data: $0, encoding: NSUTF8StringEncoding) }) { // Convert back to a string println("Decoded: \(base64Decoded)") } } 

(se estiver usando o Swift 1.2, você pode usar vários if-lets em vez do mapa)

Swift 3

 import UIKit extension String { func fromBase64() -> String? { guard let data = Data(base64Encoded: self) else { return nil } return String(data: data, encoding: .utf8) } func toBase64() -> String { return Data(self.utf8).base64EncodedString() } } 

Swift 2.3

 import UIKit extension String { func fromBase64() -> String? { guard let data = NSData(base64EncodedString: self, options: NSDataBase64DecodingOptions(rawValue: 0)) else { return nil } return String(data: data, encoding: NSUTF8StringEncoding) } func toBase64() -> String? { guard let data = self.dataUsingEncoding(NSUTF8StringEncoding) else { return nil } return data.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0)) } } 

Você poderia apenas fazer uma extensão simples como:

 import UIKit // MARK: - Mixed string utils and helpers extension String { /** Encode a String to Base64 :returns: */ func toBase64()->String{ let data = self.dataUsingEncoding(NSUTF8StringEncoding) return data!.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0)) } } 

iOS 7 e superior

Após uma pesquisa completa, encontrei a solução

Codificação

  let plainData = (plainString as NSString).dataUsingEncoding(NSUTF8StringEncoding) let base64String =plainData.base64EncodedStringWithOptions(NSDataBase64EncodingOptions.fromRaw(0)!) println(base64String) // bXkgcGxhbmkgdGV4dA== 

Decodificação

  let decodedData = NSData(base64EncodedString: base64String, options:NSDataBase64DecodingOptions.fromRaw(0)!) let decodedString = NSString(data: decodedData, encoding: NSUTF8StringEncoding) println(decodedString) // my plain data 

Mais sobre isso http://creativecoefficient.net/swift/encoding-and-decoding-base64/

Xcode 8.3.2 • Swift 3.1

 extension String { var data: Data { return Data(utf8) } var base64Encoded: Data { return data.base64EncodedData() } var base64Decoded: Data? { return Data(base64Encoded: self) } } extension Data { var string: String? { return String(data: self, encoding: .utf8) } } 

 let original = "iOS Developer Tips encoded in Base64" let utf8Data = original.data // 36 bytes let base64EncodedString = utf8Data.base64EncodedString() // aU9TIERldmVsb3BlciBUaXBzIGVuY29kZWQgaW4gQmFzZTY0\n" let base64EncodedData = utf8Data.base64EncodedData() // 48 bytes" print("base64EncodedData:", original.base64Encoded) // 48 bytes print("base64EncodedString:", original.base64Encoded.string ?? "") // "aU9TIERldmVsb3BlciBUaXBzIGVuY29kZWQgaW4gQmFzZTY0" print("base64DecodedData:", original.base64Encoded.string?.base64Decoded ?? "") // 36 bytes print("base64DecodedString:", original.base64Encoded.string?.base64Decoded?.string ?? "") // iOS Developer Tips encoded in Base64 

Swift 4.0.3

 import UIKit extension String { func fromBase64() -> String? { guard let data = Data(base64Encoded: self, options: Data.Base64DecodingOptions(rawValue: 0)) else { return nil } return String(data: data as Data, encoding: String.Encoding.utf8) } func toBase64() -> String? { guard let data = self.data(using: String.Encoding.utf8) else { return nil } return data.base64EncodedString(options: Data.Base64EncodingOptions(rawValue: 0)) } } 

Swift 3

Aqui está uma extensão String simples atualizada para o Swift 3, permitindo a preservação de opções em caso de erro na decodificação.

 extension String { /// Encode a String to Base64 func toBase64() -> String { return Data(self.utf8).base64EncodedString() } /// Decode a String from Base64. Returns nil if unsuccessful. func fromBase64() -> String? { guard let data = Data(base64Encoded: self) else { return nil } return String(data: data, encoding: .utf8) } } 

Exemplo:

 let testString = "A test string." let encoded = testString.toBase64() // "QSB0ZXN0IHN0cmluZy4=" guard let decoded = encoded.fromBase64() // "A test string." else { return } 

Depois de toda luta eu fiz assim.

 func conversion(str:NSString) { if let decodedData = NSData(base64EncodedString: str as String, options:NSDataBase64DecodingOptions(rawValue: 0)), let decodedString = NSString(data: decodedData, encoding: NSUTF8StringEncoding) { print(decodedString)//Here we are getting decoded string 

Depois eu estou chamando outra function para converter string decodificada para dictionary

  self .convertStringToDictionary(decodedString as String) } }//function close 

// para string para dictionary

 func convertStringToDictionary(text: String) -> [String:AnyObject]? { if let data = text.dataUsingEncoding(NSUTF8StringEncoding) { do { let json = try NSJSONSerialization.JSONObjectWithData(data, options: []) as? [String:AnyObject] print(json) if let stack = json!["cid"] //getting key value here { customerID = stack as! String print(customerID) } } catch let error as NSError { print(error) } } return nil } 

Para o SWIFT 3.0

 let str = "iOS Developer Tips encoded in Base64" print("Original: \(str)") let utf8str = str.data(using: String.Encoding.utf8) if let base64Encoded = utf8str?.base64EncodedString(options: NSData.Base64EncodingOptions(rawValue: 0)) { print("Encoded: \(base64Encoded)") if let base64Decoded = NSData(base64Encoded: base64Encoded, options: NSData.Base64DecodingOptions(rawValue: 0)) .map({ NSString(data: $0 as Data, encoding: String.Encoding.utf8.rawValue) }) { // Convert back to a string print("Decoded: \(base64Decoded)!") } } 

Swift 3 ou 4

 let base64Encoded = Data("original string".utf8).base64EncodedString() 

SwiftyBase64 (divulgação completa: eu escrevi) é uma codificação Swift Base64 nativa (sem biblioteca de decodificação. Com ele, você pode codificar a Base64 padrão:

 let bytesToEncode : [UInt8] = [1,2,3] let base64EncodedString = SwiftyBase64.EncodeString(bytesToEncode) 

ou URL e nome de arquivo Safe Base64:

 let bytesToEncode : [UInt8] = [1,2,3] let base64EncodedString = SwiftyBase64.EncodeString(bytesToEncode, alphabet:.URLAndFilenameSafe) 

Resposta @Airspeed Velocity no Swift 2.0:

 let str = "iOS Developer Tips encoded in Base64" print("Original: \(str)") let base64Encoded = str.dataUsingEncoding(NSUTF8StringEncoding)!.base64EncodedStringWithOptions([]) print("Encoded: \(base64Encoded)") let base64DecodedData = NSData(base64EncodedString: base64Encoded, options: [])! var base64DecodedString = String(data: base64DecodedData, encoding: NSUTF8StringEncoding)! print("Decoded: \(base64DecodedString)") 
    Intereting Posts