迅速な3.0データから文字列へ?


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

deviceToken文字列にしたい

だが:

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

str です nil

swift 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 2017

回答:


155

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 application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data)ますが、動作しません。理由はわかりませんか?
weijia.wang 2017年

デバイストークンはutf8文字列ではなく、生のバイナリです
Hogdotmac 2017

それで、それが生のバイナリである場合はどうすればよいですか?
Kingalione 2017

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)
    }
}

これは非常に悪いコーディングです。エンコードは常に失敗する可能性があり、アプリがクラッシュする可能性があるため、これを強制的にアンラップしないでください。代わりに、非常に正当な理由でAppleAPIが行うようにオプションの文字列を返します。
ウォルターホワイト

@WalterWhiteええ、アプリケーションではオプションの文字列を返します。しかし、コメントをありがとう、この答えを更新しないでください
luhuiya 2018年

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 2017

SwiftでNSDataを使用することは避けましょう。
ブレナン

この方法は使用しないでください。安全ではありません。
ボグダン

2

これは、Swift3以降では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

4redwingsの答えのSwift4バージョン:

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.