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

weijia.wang
quelle
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!
4redwings
quelle
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)
    }
}
luhuiya
quelle
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()
Hogdotmac
quelle
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)
weijia.wang
quelle
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()
    }
}
Wasserspeier
quelle
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)
Abhishek Jain
quelle
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.

Kyle Bing
quelle
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()

Markus
quelle
0

Wenn Ihre Daten base64-codiert sind.

if ( dataObj != nil ) {
    let encryptedDataText = dataObj!.base64EncodedString(options: NSData.Base64EncodingOptions())
    NSLog("Encrypted with pubkey: %@", encryptedDataText)
}
jeet.chanchawat
quelle
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()

    }
user12739102
quelle
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")
Zgpeace
quelle