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.