迅速3.0数据到字符串?


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

我想deviceToken

但:

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

strnil

迅捷3.0

我怎么才能让datastring

在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'4

Answers:


155

我来寻找Swift 3数据到字符串问题的答案,但从来没有一个好的答案。经过一番鬼混之后,我想到了这个:

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).fun中不工作。我不知道为什么?
weijia.wang

设备令牌不是utf8字符串,它是原始二进制文件
Hogdotmac

那么如果它是原始二进制文件怎么办?
Kingalione

String.Encoding.utf8.rawValue-适用于最新Swift中的任何人
Stephen J

1
令牌使用解码didRegisterForRemoteNotificationsWithDeviceToken看到这一点:stackoverflow.com/questions/37956482/...
PW2

33

这是我的数据扩展名。添加它,您可以调用data.ToString()

import Foundation

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

这是非常糟糕的编码-您永远不要强行解开包装,因为编码总是会失败,这会导致应用崩溃。取而代之的是,像苹果API一样返回可选字符串,这有很好的理由。
沃尔特·怀特

@WalterWhite是的,在应用程序中,我返回可选字符串。但未更新此答案,谢谢您的评论
luhuiya

1
如果您将编码作为参数传递,则可以根据需要将其默认为.utf8,然后可以将其用于多个编码类型。
米哈·蒙托亚


7

我找到了方法。您需要转换DataNSData

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一起使用。
布伦南

不要使用此方法。不安全
博格丹

2

在Swift 3和以后使用reduce的情况下,这要容易得多:

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

Swift 4版本的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)


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")
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.