cepat 3.0 Data ke String?


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

Saya ingin deviceTokenmerangkai

tapi:

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

str adalah nil

swift 3.0

bagaimana saya bisa membiarkan datake string?

Mendaftar untuk Pemberitahuan Push di Xcode 8 / Swift 3.0? tidak berfungsi dan jawabannya beberapa bulan yang lalu, saya sudah mencobanya:

masukkan deskripsi gambar di sini

dan cetak:

masukkan deskripsi gambar di sini


18
Lain kali Anda meminta seseorang untuk mencoba kode Anda, pastikan kode itu tidak ditempel sebagai gambar ..
Desdenova

Jika seseorang datang di ini ketika membaca file, periksa bahwa file tersebut UTF8 encoded: file -I /path/to/file.txt. Jika tidak mengonversi menggunakan iconv:iconv -f UTF-16LE -t UTF-8 /path/to/file.txt > /path/to/utf8/file.txt
Pulkit Goyal

Jawaban:


157

Saya datang mencari jawaban untuk pertanyaan Swift 3 Data to String dan tidak pernah mendapatkan jawaban yang bagus. Setelah beberapa bermain-main saya menemukan ini:

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
Saya telah mencoba Anda menjawab. Ini bekerja di func lain, tetapi tidak bekerja di. func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data)Saya tidak tahu mengapa?
weijia.wang

token perangkat bukan string utf8, ini adalah biner mentah
Hogdotmac

jadi apa yang harus dilakukan jika itu adalah biner mentah?
Kingalione

String.Encoding.utf8.rawValue - untuk siapa pun yang menggunakan Swift terbaru
Stephen J

1
untuk decoding token menggunakan didRegisterForRemoteNotificationsWithDeviceToken lihat ini: stackoverflow.com/questions/37956482/…
pw2

34

ini ekstensi data saya. tambahkan ini dan Anda dapat memanggil data.ToString ()

import Foundation

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

Ini adalah pengkodean yang sangat buruk - Anda tidak boleh memaksa membuka bungkus ini karena pengkodean selalu bisa gagal dan ini akan merusak aplikasi. Alih-alih, kembalikan string opsional seperti yang dilakukan Apple API untuk alasan yang sangat bagus.
Walter White

@WalterWhite ya dalam aplikasi saya mengembalikan string opsional. tetapi tidak memperbarui jawaban ini, terima kasih atas komentarnya
luhuiya

1
Jika Anda meneruskan encoding sebagai parameter, mungkin default ke .utf8 jika Anda mau, Anda kemudian dapat menggunakan ini untuk lebih dari satu jenis encoding.
Micah Montoya

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

7

Saya menemukan cara untuk melakukannya. Anda perlu mengubah Datake NSData:

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

2
yang characterSet ini?
Kingalione

Mari hindari menggunakan NSData dengan Swift.
Brennan

Jangan gunakan metode ini. Tidak aman.
Bogdan

2

Ini jauh lebih mudah di Swift 3 dan yang lebih baru dengan menggunakan pengurangan:

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

Jawaban Swift 4 versi 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

Untuk memperluas jawaban weijia.wang:

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

gunakan dengan deviceToken.hexString()


0

Jika data Anda dikodekan base64.

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

0

Menurut dokumen Apple di bawah, token perangkat tidak dapat didekodekan. Jadi, saya pikir hal terbaik untuk dilakukan adalah membiarkannya saja.

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

Arsitektur Keamanan

Token perangkat adalah instance NSData buram yang berisi pengenal unik yang ditetapkan oleh Apple ke aplikasi tertentu di perangkat tertentu. Hanya APN yang dapat mendekode dan membaca konten token perangkat. Setiap instance aplikasi menerima token perangkat uniknya ketika mendaftar dengan APN, dan kemudian harus meneruskan token tersebut ke penyedia, seperti yang dijelaskan dalam Mengonfigurasi Dukungan Notifikasi Jarak Jauh. Penyedia harus menyertakan token perangkat di setiap permintaan notifikasi push yang menargetkan perangkat terkait; APN menggunakan token perangkat untuk memastikan notifikasi hanya dikirimkan ke kombinasi perangkat aplikasi unik yang dimaksudkan.


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

untuk cepat 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")
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.