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

Chcę deviceToken na ciągswift 3.0 Data to String?

ale:

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

str jest nil

Swift 3.0

jak mogę pozwolić data do string?

enter link description here

nie działa, a odpowiedź znajduje się kilka miesięcy temu, miałem spróbować: enter image description here

i druk: enter image description here

proszę !!! Spróbuj najpierw, a następnie odpowiedzieć

+6

Następnym razem poprosić kogoś, by wypróbować swój kod upewnić się, że nie jest wklejony jako obraz .. – Desdenova

+0

Jeśli ktoś napotka to podczas czytania pliku, sprawdź, plik jest zakodowany w UTF8: 'file -I/path/to/file.txt'. Jeśli nie dokonasz konwersji za pomocą iconv: 'iconv -f UTF-16LE -t UTF-8/ścieżka/do/plik.txt>/ścieżka/do/utf8/file.txt' –

Odpowiedz

9

Znalazłem sposób na zrobienie tego. Trzeba konwertować Data do NSData:

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

który characterSet to jest? – Kingalione

65

Szukałem odpowiedzi na SWIFT 3 Dane na pytanie String i nigdy nie ma dobrej odpowiedzi. Po pewnym fooling wymyśliłem to:

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

Próbowałem ci odpowiedzieć. Działa w innych funkcjach, ale nie działa w aplikacji "func" (_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) '.I nie wiem dlaczego? –

+0

token urządzenia nie jest ciągiem utf8, to jest surowy plik binarny – Hogdotmac

+0

, więc co zrobić, jeśli jest surowy plik binarny? – Kingalione

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

spróbuje użyć:

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

Aby przedłużyć na odpowiedź z weijia.wang:

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

wykorzystać go z deviceToken.hexString()

1

Jest to znacznie łatwiejsze w Swift 3 i późniejsze wykorzystanie redukcji:

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

tutaj jest moje rozszerzenie danych. dodatek ten można nazwać data.ToString()

import Foundation 

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

@Moritz dziękuję za poprawkę – luhuiya