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

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

Markus
sumber
0

Jika data Anda dikodekan base64.

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

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

    }
pengguna12739102
sumber
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")
Zgpeace
sumber