2016-09-21 17 views
35
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {} 

Tôi muốn deviceToken chuỗiswift 3.0 Dữ liệu vào 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ể để cho data để string?

enter link description here

không làm việc và câu trả lời là cách đây vài tháng, tôi đã thử nó: enter image description here

và in: enter image description here

xin vui lòng !!! Hãy thử đầu tiên, sau đó trả lời

+6

Lần sau bạn hỏi ai đó để thử mã của bạn chắc chắn rằng nó không dán như hình ảnh .. – Desdenova

+0

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

Trả lời

9

Tôi đã tìm ra cách để thực hiện. Bạn cần phải chuyển đổi 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

mà characterSet là cái này? – Kingalione

65

tôi đi tìm câu trả lời cho 3 Dữ liệu Swift để String câu hỏi và không bao giờ có một câu trả lời tốt. Sau khi một số lừa xung quanh tôi đến với đ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! 
+3

Tôi đã thử bạn trả lời. Nó hoạt động trong func khác, nhưng không làm việc trong ứng dụng 'func (_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data)' .Tôi không biết tại sao? –

+0

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

+0

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

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

Cố gắng sử dụng:

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { 
    var deviceToken: String = token.description() 
    deviceToken = deviceToken.replacingOccurrences(of: "<", with: "") 
    deviceToken = deviceToken.replacingOccurrences(of: ">", with: "") 
    deviceToken = deviceToken.replacingOccurrences(of: " ", with: "") 

    print("Token: \(deviceToken)") 
} 
0

Để mở rộng trên 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()

1

Điều này dễ dàng hơn nhiều trong Swift 3 và mới hơn bằng cách sử dụng lệnh 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() 
    } 
} 
6

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

import Foundation 

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

@Moritz cảm ơn bạn đã chỉnh sửa – luhuiya

Các vấn đề liên quan