schnelle 3.0 Daten zu String?


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

Ich möchte deviceTokenbespannen

aber:

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

str ist nil

schnell 3.0

wie kann ich lassen datazu string?

Registrieren für Push-Benachrichtigungen in Xcode 8 / Swift 3.0? funktioniert nicht und die Antwort ist vor ein paar Monaten, ich hatte es versucht:

Geben Sie hier die Bildbeschreibung ein

und drucken:

Geben Sie hier die Bildbeschreibung ein


18
— Wenn

Wenn jemand beim Lesen einer Datei darauf stößt, überprüfen Sie, ob die Datei UTF8-codiert ist : file -I /path/to/file.txt. Wenn nicht mit iconv konvertieren:iconv -f UTF-16LE -t UTF-8 /path/to/file.txt > /path/to/utf8/file.txt
— Pulkit Goyal

Antworten:


155

Ich suchte nach der Antwort auf die Frage Swift 3 Data to String und bekam nie eine gute Antwort. Nach einigem Herumalbern kam ich auf Folgendes:

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
Ich hatte versucht, dir zu antworten. Es hat in anderen Funktionen funktioniert, aber nicht in. func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data)Ich weiß nicht warum?
— weijia.wang

Das Geräte-Token ist keine utf8-Zeichenfolge, sondern eine rohe
— Binärzeichenfolge

Was tun, wenn es sich um eine rohe Binärdatei handelt?
— Kingalione

String.Encoding.utf8.rawValue - für jeden im neuesten Swift
— Stephen J

1
Informationen zum Dekodieren von Token mit didRegisterForRemoteNotificationsWithDeviceToken finden Sie hier: stackoverflow.com/questions/37956482/…
— pw2

32

Hier ist meine Datenerweiterung. Wenn Sie dies hinzufügen, können Sie data.ToString () aufrufen.

import Foundation

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

Dies ist eine sehr schlechte Codierung - Sie sollten das Entpacken niemals erzwingen, da die Codierung immer fehlschlagen kann und die App dadurch abstürzen würde. Geben Sie stattdessen eine optionale Zeichenfolge zurück, wie dies die Apple-API aus sehr guten Gründen tut.
— Walter White

@WalterWhite Ja, in der Anwendung gebe ich eine optionale Zeichenfolge zurück. aber nicht aktualisieren diese Antwort, danke für den Kommentar
— luhuiya

Wenn Sie die Codierung als Parameter übergeben, können Sie sie bei Bedarf standardmäßig auf .utf8 setzen. Sie können diese dann für mehr als einen einzelnen Codierungstyp verwenden.
— Micah Montoya

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

7

Ich habe den Weg dazu gefunden. Sie müssen konvertieren Datazu NSData:

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

2
Welches CharacterSet ist das?
— Kingalione

Vermeiden wir die Verwendung von NSData mit Swift.
— Brennan

Verwenden Sie diese Methode nicht. Es ist unsicher.
— eXhausted

2

Dies ist in Swift 3 und später mit reduct viel einfacher:

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

Swift 4-Version der Antwort von 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)

1

Laut dem folgenden Apple-Dokument kann das Gerätetoken nicht dekodiert werden. Ich denke, das Beste ist, es einfach stehen zu lassen.

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

Sicherheitsarchitektur

Ein Geräte-Token ist eine undurchsichtige NSData-Instanz, die eine eindeutige Kennung enthält, die Apple einer bestimmten App auf einem bestimmten Gerät zugewiesen hat. Nur APNs können den Inhalt eines Geräte-Tokens dekodieren und lesen. Jede App-Instanz erhält ihr eindeutiges Geräte-Token, wenn sie sich bei APNs registriert, und muss das Token dann an ihren Anbieter weiterleiten, wie unter Konfigurieren der Remote-Benachrichtigungsunterstützung beschrieben. Der Anbieter muss das Geräte-Token in jede Push-Benachrichtigungsanforderung aufnehmen, die auf das zugeordnete Gerät abzielt. APNs verwenden das Geräte-Token, um sicherzustellen, dass die Benachrichtigung nur an die eindeutige App-Geräte-Kombination gesendet wird, für die sie bestimmt ist.



0

Um die Antwort von weijia.wang zu erweitern:

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

benutze es mit deviceToken.hexString()


0

Wenn Ihre Daten base64-codiert sind.

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

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

für schnelle 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")
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.