dati rapidi 3.0 a stringa?


88
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {}

Voglio deviceTokenstringere

ma:

let str = String.init(data: deviceToken, encoding: .utf8)

str è nil

swift 3.0

come posso lasciare dataa string?

Ti stai registrando per le notifiche push in Xcode 8 / Swift 3.0? non funziona e la risposta è qualche mese fa, l'avevo provato:

inserisci qui la descrizione dell'immagine

e stampa:

inserisci qui la descrizione dell'immagine


18
La prossima volta che chiedi a qualcuno di provare il tuo codice assicurati che non sia incollato come immagine ..
Desdenova

Se qualcuno si imbatte in questo durante la lettura di un file, controllare che il file è codificato UTF8: file -I /path/to/file.txt. Se non converti usando iconv:iconv -f UTF-16LE -t UTF-8 /path/to/file.txt > /path/to/utf8/file.txt
Pulkit Goyal

Risposte:


155

Sono venuto a cercare la risposta alla domanda Swift 3 Data to String e non ho mai avuto una buona risposta. Dopo un po 'di scherzi ho pensato a questo:

var testString = "This is a test string"
var somedata = testString.data(using: String.Encoding.utf8)
var backToString = String(data: somedata!, encoding: String.Encoding.utf8) as String!

4
Ho provato a rispondere. Ha funzionato in altre funzioni, ma non funziona func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data). Non so perché?
weijia.wang

il token del dispositivo non è una stringa utf8, è binario grezzo
Hogdotmac

quindi cosa fare se è binario grezzo?
Kingalione

String.Encoding.utf8.rawValue - per chiunque abbia l'ultimo Swift
Stephen J

1
per la decodifica di token utilizzando didRegisterForRemoteNotificationsWithDeviceToken vedere questo: stackoverflow.com/questions/37956482/...
pw2

33

ecco la mia estensione dati. aggiungi questo e puoi chiamare data.ToString ()

import Foundation

extension Data
{
    func toString() -> String?
    {
        return String(data: self, encoding: .utf8)
    }
}

Questa è una codifica pessima: non dovresti mai forzare lo scartamento poiché la codifica può sempre fallire e questo bloccherebbe l'app. Restituisci invece una stringa facoltativa come fa l'API di Apple per ottime ragioni.
Walter White

@WalterWhite yeah nell'applicazione restituisco una stringa opzionale. ma non aggiornare questa risposta, grazie per il commento
luhuiya

1
Se si passa la codifica come parametro, magari l'impostazione predefinita è .utf8 se lo si desidera, è quindi possibile utilizzarla per più di un singolo tipo di codifica.
Micah Montoya

18
let str = deviceToken.map { String(format: "%02hhx", $0) }.joined()

7

Ho trovato il modo per farlo. Devi convertire Datain NSData:

let characterSet = CharacterSet(charactersIn: "<>")
let nsdataStr = NSData.init(data: deviceToken)
let deviceStr = nsdataStr.description.trimmingCharacters(in: characterSet).replacingOccurrences(of: " ", with: "")
print(deviceStr)

2
quale set di caratteri è questo?
Kingalione

Evitiamo di usare NSData con Swift.
Brennan

Non utilizzare questo metodo. Non è sicuro.
Bogdan

2

Questo è molto più semplice in Swift 3 e versioni successive utilizzando reduce:

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    let token = deviceToken.reduce("") { $0 + String(format: "%02x", $1) }

    DispatchQueue.global(qos: .background).async { 
        let url = URL(string: "https://example.com/myApp/apns.php")!

        var request = URLRequest(url: url)
        request.addValue("application/json", forHTTPHeaderField: "Content-Type")
        request.httpMethod = "POST"
        request.httpBody = try! JSONSerialization.data(withJSONObject: [
            "token" : token, 
            "ios" : UIDevice.current.systemVersion,
            "languages" : Locale.preferredLanguages.joined(separator: ", ")
            ])

        URLSession.shared.dataTask(with: request).resume()
    }
}

2

Versione Swift 4 della risposta di 4redwings:

let testString = "This is a test string"
let somedata = testString.data(using: String.Encoding.utf8)
let backToString = String(data: somedata!, encoding: String.Encoding.utf8)


0

Per estendere la risposta di weijia.wang:

extension Data {
    func hexString() -> String {
        let nsdataStr = NSData.init(data: self)
        return nsdataStr.description.trimmingCharacters(in: CharacterSet(charactersIn: "<>")).replacingOccurrences(of: " ", with: "")
    }
}

usalo con deviceToken.hexString()


0

Se i tuoi dati sono codificati in base64.

if ( dataObj != nil ) {
    let encryptedDataText = dataObj!.base64EncodedString(options: NSData.Base64EncodingOptions())
    NSLog("Encrypted with pubkey: %@", encryptedDataText)
}

0

Secondo il documento Apple di seguito, il token del dispositivo non può essere decodificato. Quindi, penso che la cosa migliore da fare sia lasciarla stare.

https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/APNSOverview.html

Architettura di sicurezza

Un token del dispositivo è un'istanza NSData opaca che contiene un identificatore univoco assegnato da Apple a un'app specifica su un dispositivo specifico. Solo gli APN possono decodificare e leggere il contenuto di un token del dispositivo. Ogni istanza dell'app riceve il proprio token di dispositivo univoco quando si registra con gli APN e deve quindi inoltrare il token al proprio provider, come descritto in Configurazione del supporto per le notifiche remote. Il provider deve includere il token del dispositivo in ogni richiesta di notifica push che ha come destinazione il dispositivo associato; Gli APN utilizzano il token del dispositivo per garantire che la notifica venga recapitata solo alla combinazione univoca app-dispositivo per la quale è destinata.


0
let urlString = baseURL + currency

    if let url = URL(string: urlString){
        let session = URLSession(configuration: .default)        
        let task = session.dataTask(with: url){ (data, reponse, error) in
            if error != nil{
                print(error)
                return
            }


            let dataString = String(data: data!, encoding: .utf8)
            print(dataString)

        }

        task.resume()

    }

0

per swift 5

let testString = "This is a test string"
let somedata = testString.data(using: String.Encoding.utf8)
let backToString = String(data: somedata!, encoding: String.Encoding.utf8) as String?
print("testString > \(testString)")
//testString > This is a test string
print("somedata > \(String(describing: somedata))")
//somedata > Optional(21 bytes)
print("backToString > \(String(describing: backToString))")
//backToString > Optional("This is a test string")
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.