web-dev-qa-db-ja.com

3.0データを文字列に変換する

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でプッシュ通知を登録するには? が機能せず、数か月前の回答ですが、試してみました。

enter image description here

印刷します。

enter image description here

75
weijia.wang

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!
132
4redwings

これが私のデータ拡張です。これを追加すればdata.ToString()を呼び出せます。

import Foundation

extension Data
{
    func toString() -> String?
    {
        return String(data: self, encoding: .utf8)
    }
}
27
luhuiya
let str = deviceToken.map { String(format: "%02hhx", $0) }.joined()
14
Hogdotmac

私はそれをする方法を見つけました。 DataNSDataに変換する必要があります。

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

これは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
Gargoyle

4redwingsの答えの4バージョンをSwift:

let testString = "This is a test string"
let somedata = testString.data(using: String.Encoding.utf8)
let backToString = String(data: somedata!, encoding: String.Encoding.utf8)
1
Abhishek Jain

データがbase64でエンコードされている場合.

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

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
Markus

アップルの公式文書によると、デバイストークンはデコードできません。だから、私がするべき最善のことはそれをそのままにしておくことだと思います。

LINK:セクションセキュリティアーキテクチャの https://developer.Apple.com/library/content/documentation/NetworkingInternet /Conceptual/RemoteNotificationsPG/APNSOverview.html

enter image description here

0
Kyle Bing