รวดเร็ว 3.0 Data เป็น String?


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

ฉันต้องการdeviceTokenสตริง

แต่:

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

str คือ nil

รวดเร็ว 3.0

จะปล่อยdataไปได้stringอย่างไร?

กำลังลงทะเบียนสำหรับการแจ้งเตือนแบบพุชใน Xcode 8 / Swift 3.0 หรือไม่ ไม่ทำงานและคำตอบคือไม่กี่เดือนที่ผ่านมาฉันได้ลองแล้ว:

ใส่คำอธิบายภาพที่นี่

และพิมพ์:

ใส่คำอธิบายภาพที่นี่


18
ครั้งต่อไปที่คุณขอให้ใครบางคนลองใช้รหัสของคุณอย่าวางเป็นภาพ ..
Desdenova

ถ้ามีคนมาเจอนี้เมื่ออ่านไฟล์ให้ตรวจสอบว่าไฟล์เป็น UTF8 file -I /path/to/file.txtเข้ารหัส: หากไม่แปลงโดยใช้ iconv:iconv -f UTF-16LE -t UTF-8 /path/to/file.txt > /path/to/utf8/file.txt
Pulkit Goyal

คำตอบ:


157

ฉันกำลังมองหาคำตอบสำหรับคำถาม Swift 3 Data to String และไม่เคยได้รับคำตอบที่ดี หลังจากหลอกๆฉันก็คิดสิ่งนี้:

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
ฉันลองให้คุณตอบ มันใช้งานได้ใน func อื่น ๆ แต่ไม่ทำงานfunc application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data)ฉันไม่รู้ว่าทำไม?
weijia.wang

โทเค็นอุปกรณ์ไม่ใช่สตริง utf8 แต่เป็นไบนารีดิบ
Hogdotmac

แล้วจะทำอย่างไรถ้ามันเป็นไบนารีดิบ?
Kingalione

String.Encoding.utf8.rawValue - สำหรับทุกคนใน Swift ล่าสุด
Stephen J

1
สำหรับการถอดรหัสโทเค็นโดยใช้ didRegisterForRemoteNotificationsWithDeviceToken ดูสิ่งนี้: stackoverflow.com/questions/37956482/…
pw2

34

นี่คือส่วนขยายข้อมูลของฉัน เพิ่มสิ่งนี้และคุณสามารถเรียก data ToString ()

import Foundation

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

นี่เป็นการเข้ารหัสที่ไม่ดีมาก - คุณไม่ควรบังคับแกะสิ่งนี้เนื่องจากการเข้ารหัสอาจล้มเหลวได้เสมอและจะทำให้แอปขัดข้อง ส่งคืนสตริงที่เป็นทางเลือกแทนเช่น Apple API ด้วยเหตุผลที่ดีมาก
Walter White

@WalterWhite ใช่ในแอปพลิเคชันฉันส่งคืนสตริงที่เป็นทางเลือก แต่ไม่ได้อัปเดตคำตอบนี้ขอบคุณสำหรับความคิดเห็น
luhuiya

1
หากคุณผ่านการเข้ารหัสเป็นพารามิเตอร์อาจตั้งค่าเริ่มต้นเป็น. utf8 หากต้องการคุณสามารถใช้สิ่งนี้กับการเข้ารหัสมากกว่าหนึ่งประเภท
Micah Montoya


7

ฉันพบวิธีที่จะทำมัน คุณต้องแปลงDataเป็นNSData:

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

2
characterSet นี้คืออะไร?
Kingalione

หลีกเลี่ยงการใช้ NSData กับ Swift
Brennan

อย่าใช้วิธีนี้ มันไม่ปลอดภัย
Bogdan

2

สิ่งนี้ง่ายกว่ามากใน Swift 3 และใหม่กว่าโดยใช้การลด:

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 เวอร์ชัน Swift 4:

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:

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

ใช้กับ deviceToken.hexString()


0

หากข้อมูลของคุณเข้ารหัส base64

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

0

ตามเอกสารของ Apple ด้านล่างนี้โทเค็นอุปกรณ์ไม่สามารถถอดรหัสได้ ดังนั้นฉันคิดว่าสิ่งที่ดีที่สุดที่จะทำคือปล่อยให้มันเป็น

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

สถาปัตยกรรมความปลอดภัย

โทเค็นอุปกรณ์คืออินสแตนซ์ NSData แบบทึบที่มีตัวระบุเฉพาะที่ Apple กำหนดให้กับแอพเฉพาะบนอุปกรณ์เฉพาะ เฉพาะ APN เท่านั้นที่สามารถถอดรหัสและอ่านเนื้อหาของโทเค็นอุปกรณ์ได้ แต่ละอินสแตนซ์ของแอปจะได้รับโทเค็นอุปกรณ์เฉพาะเมื่อลงทะเบียนกับ APN จากนั้นจะต้องส่งต่อโทเค็นไปยังผู้ให้บริการตามที่อธิบายไว้ในการกำหนดค่าการสนับสนุนการแจ้งเตือนระยะไกล ผู้ให้บริการจะต้องรวมโทเค็นอุปกรณ์ในคำขอการแจ้งเตือนแบบพุชแต่ละรายการที่กำหนดเป้าหมายไปยังอุปกรณ์ที่เกี่ยวข้อง APN ใช้โทเค็นของอุปกรณ์เพื่อให้แน่ใจว่าการแจ้งเตือนจะถูกส่งไปยังชุดอุปกรณ์แอปเฉพาะที่ตั้งใจไว้เท่านั้น


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

เพื่อความรวดเร็ว 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")
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.