dữ liệu nhanh chóng 3.0 sang chuỗi?


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

Tôi muốn deviceTokenxâu chuỗi

nhưng:

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

strnil

nhanh chóng 3.0

làm thế nào tôi có thể để datacho string?

Đăng ký Thông báo đẩy trong Xcode 8 / Swift 3.0? không hoạt động và câu trả lời là một vài tháng trước, tôi đã thử nó:

nhập mô tả hình ảnh ở đây

và in:

nhập mô tả hình ảnh ở đây


18
Lần sau bạn hỏi ai đó để thử ra mã làm cho bạn chắc chắn nó không phải dán như hình ảnh ..
Desdenova

Nếu ai đó đi qua này khi đọc một tập tin, kiểm tra xem các tập tin là UTF8 mã hóa: file -I /path/to/file.txt. Nếu không chuyển đổi bằng iconv:iconv -f UTF-16LE -t UTF-8 /path/to/file.txt > /path/to/utf8/file.txt
Pulkit Goyal,

Câu trả lời:


155

Tôi đã tìm kiếm câu trả lời cho câu hỏi Dữ liệu thành chuỗi của Swift 3 và không bao giờ nhận được câu trả lời chính xác. Sau một số trò lừa xung quanh, tôi đã nghĩ ra điều này:

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
Tôi đã thử bạn trả lời. Nó hoạt động trong func khác, nhưng không hoạt động. func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data)Tôi không biết tại sao?
weijia.wang

thiết bị thẻ không phải là một chuỗi utf8, nó là nhị phân thô
Hogdotmac

vậy phải làm gì nếu nó là nhị phân thô?
Kingalione

String.Encoding.utf8.rawValue - dành cho bất kỳ ai sử dụng Swift mới nhất
Stephen J

1
để giải mã mã thông báo bằng didRegisterForRemoteNotificationsWithDeviceToken xem điều này: stackoverflow.com/questions/37956482/…
pw2

33

đây là phần mở rộng dữ liệu của tôi. thêm cái này và bạn có thể gọi dữ liệu.ToString ()

import Foundation

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

Đây là cách mã hóa rất tệ - bạn không bao giờ được buộc mở nó ra vì mã hóa luôn có thể không thành công và điều này sẽ làm hỏng ứng dụng. Thay vào đó, trả về một chuỗi tùy chọn giống như API của Apple vì những lý do rất chính đáng.
Walter White

@WalterWhite vâng trong ứng dụng tôi trả về chuỗi tùy chọn. nhưng không cập nhật câu trả lời này, cảm ơn vì những nhận xét
luhuiya

1
Nếu bạn chuyển mã hóa dưới dạng tham số, có thể mặc định nó thành .utf8 nếu bạn muốn, sau đó bạn có thể sử dụng mã này cho nhiều loại mã hóa đơn lẻ.
Micah Montoya

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

7

Tôi đã tìm ra cách để làm điều đó. Bạn cần chuyển đổi Datathành NSData:

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

2
cái này là characterSet nào?
Kingalione

Hãy tránh sử dụng NSData với Swift.
Brennan

Không sử dụng phương pháp này. Nó không an toàn.
Bogdan

2

Điều này dễ dàng hơn nhiều trong Swift 3 và sau đó bằng cách sử dụng giảm:

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

Câu trả lời của 4redwings phiên bản 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

Để mở rộng câu trả lời của weijia.wang:

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

sử dụng nó với deviceToken.hexString()


0

Nếu dữ liệu của bạn được mã hóa base64.

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

0

Theo tài liệu của Apple bên dưới, mã thông báo thiết bị không thể được giải mã. Vì vậy, tôi nghĩ điều tốt nhất nên làm là cứ để nó như vậy.

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

Kiến trúc bảo mật

Mã thông báo thiết bị là một phiên bản NSData không rõ ràng có chứa một số nhận dạng duy nhất do Apple gán cho một ứng dụng cụ thể trên một thiết bị cụ thể. Chỉ APN mới có thể giải mã và đọc nội dung của mã thông báo thiết bị. Mỗi phiên bản ứng dụng nhận được mã thông báo thiết bị duy nhất của nó khi nó đăng ký với APN và sau đó phải chuyển tiếp mã thông báo đến nhà cung cấp của nó, như được mô tả trong Định cấu hình hỗ trợ thông báo từ xa. Nhà cung cấp phải bao gồm mã thông báo thiết bị trong mỗi yêu cầu thông báo đẩy nhắm mục tiêu đến thiết bị được liên kết; APN sử dụng mã thông báo thiết bị để đảm bảo thông báo chỉ được gửi đến kết hợp thiết bị-ứng dụng duy nhất mà nó dự định.


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

cho nhanh chóng 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")
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.