swift 3.0 Data to String?


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

İstediğim deviceTokendizeye

fakat:

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

str dır-dir nil

hızlı 3.0

nasıl izin dataverebilirim string?

Xcode 8 / Swift 3.0'da Anlık Bildirimler için Kaydolma? çalışmıyor ve cevap birkaç ay önce denedim:

görüntü açıklamasını buraya girin

ve yazdır:

görüntü açıklamasını buraya girin


18
Bir dahaki sefere birinden kodunuzu denemesini istediğinizde, kodun resim olarak yapıştırılmadığından emin olun ..
Desdenova

Bir dosyayı okurken birisi bu rastlarsa dosyası UTF8 kodlanmış olup olmadığını kontrol edin: file -I /path/to/file.txt. iconv -f UTF-16LE -t UTF-8 /path/to/file.txt > /path/to/utf8/file.txt
İconv

Yanıtlar:


157

Swift 3 Data to String sorusunun cevabını aramaya geldim ve hiç iyi bir cevap alamadım. Biraz dalga geçtikten sonra şunu buldum:

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
Cevap vermeyi denedim. Diğer işlevlerde çalıştı, ama çalışmıyor. func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data)Neden bilmiyorum?
weijia.wang

aygıt belirteci bir utf8 dizesi değil, ham ikili
Hogdotmac

peki ham ikili ise ne yapmalı?
Kingalione

String.Encoding.utf8.rawValue - en son Swift'deki herkes için
Stephen J

1
didRegisterForRemoteNotificationsWithDeviceToken kullanarak jetonu çözmek için şuna bakın: stackoverflow.com/questions/37956482/…
pw2

34

işte benim veri uzantım. bunu ekleyin ve verileri çağırabilirsiniz.ToString ()

import Foundation

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

Bu çok kötü bir kodlamadır - kodlama her zaman başarısız olabileceğinden ve bu uygulamanın çökmesine neden olacağından bunu açmaya asla zorlamamalısınız. Bunun yerine, Apple API'nin çok iyi nedenlerle yaptığı gibi isteğe bağlı bir dize döndür.
Walter White

@WalterWhite evet uygulamada isteğe bağlı string döndürüyorum. ancak bu yanıtı güncelleme değil, yorum için teşekkürler
luhuiya

1
Kodlamayı bir parametre olarak iletirseniz, isterseniz varsayılan olarak .utf8 olarak iletirseniz, bunu birden fazla kodlama türü için kullanabilirsiniz.
Micah Montoya

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

7

Bunu yapmanın bir yolunu buldum. Şuna dönüştürmeniz Datagerekiyor NSData:

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

2
Bu hangi karakter kümesi?
Kingalione

NSData'yı Swift ile kullanmaktan kaçınalım.
Brennan

Bu yöntemi kullanmayın. Güvensiz.
Bogdan

2

Bu, Swift 3 ve sonrasında azaltma işlevini kullanarak çok daha kolaydır:

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

4redwings'in cevabının Swift 4 versiyonu:

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

Weijia.wang'ın cevabını genişletmek için:

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

ile kullan deviceToken.hexString()


0

Verileriniz base64 kodluysa.

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

0

Aşağıdaki Apple belgesine göre, aygıt jetonunun kodu çözülemiyor. Bu yüzden, bence yapılacak en iyi şey, öyle bırakmaktır.

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

Güvenlik Mimarisi

Bir aygıt belirteci, Apple tarafından belirli bir aygıttaki belirli bir uygulamaya atanan benzersiz bir tanımlayıcıyı içeren opak bir NSData örneğidir. Yalnızca APN'ler bir cihaz belirtecinin içeriğini çözebilir ve okuyabilir. Her uygulama örneği, APN'lere kaydolduğunda benzersiz cihaz belirtecini alır ve ardından belirteci, Uzaktan Bildirim Desteğini Yapılandırma bölümünde açıklandığı gibi sağlayıcısına iletmelidir. Sağlayıcı, ilgili cihazı hedefleyen her push bildirim isteğine cihaz kodunu dahil etmelidir; APN'ler, bildirimin yalnızca amaçlanan benzersiz uygulama-cihaz kombinasyonuna teslim edilmesini sağlamak için cihaz jetonunu kullanır.


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

hızlı 5 için

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")
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.