तेजी से 3.0 स्ट्रिंग के लिए डेटा?


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

मैं deviceTokenस्ट्रिंग करना चाहता हूं

परंतु:

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

str है nil

तेजी से 3.0

मैं कैसे कर सकते हैं dataकरने के लिए string?

Xcode 8 / स्विफ्ट 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
पुलकित गोयल

जवाबों:


155

मैं स्विफ्ट 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 application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data)मुझे नहीं पता क्यों?
वीजिया.वांग

डिवाइस टोकन एक utf8 स्ट्रिंग नहीं है, यह कच्ची द्विआधारी है
हॉगोद्मैक

तो क्या होगा अगर यह कच्चा बाइनरी है?
किंगालियोन सेप

String.Encoding.utf8.rawValue - नवीनतम स्विफ्ट में किसी के लिए
स्टीफन जे

1
: का उपयोग कर टोकन डीकोड करने के लिए didRegisterForRemoteNotificationsWithDeviceToken यह देखने stackoverflow.com/questions/37956482/...
pw2

32

यहां मेरा डेटा एक्सटेंशन है। इसे जोड़ें और आप data.ToString () कॉल कर सकते हैं

import Foundation

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

यह बहुत खराब कोडिंग है - आपको इसे कभी भी नहीं खोलना चाहिए क्योंकि एन्कोडिंग हमेशा विफल हो सकता है और इससे ऐप क्रैश हो जाएगा। इसके बजाय एक वैकल्पिक स्ट्रिंग लौटाएं जैसे कि Apple API बहुत अच्छे कारणों से करता है।
वाल्टर व्हाइट

@WalterWhite हाँ आवेदन में मैं वैकल्पिक स्ट्रिंग लौटाता हूं। लेकिन इस उत्तर को अपडेट न करें, टिप्पणी के लिए धन्यवाद
luhuiya

1
यदि आप एक पैरामीटर के रूप में एन्कोडिंग पास करते हैं, तो शायद इसे .utf8 को डिफ़ॉल्ट करें यदि आप चाहें, तो आप इसे एक से अधिक एन्कोडिंग प्रकार के लिए उपयोग कर सकते हैं।
मीका मोंटोया


7

मुझे इसे करने का तरीका मिला। आपको इसे बदलने की आवश्यकता 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
कौन सा चरित्र है?
Kingalione

चलो स्विफ्ट के साथ NSData का उपयोग करने से बचें।
ब्रेनन

इस विधि का उपयोग न करें। यह असुरक्षित है।
एक्सटॉर्स्ड

2

यह स्विफ्ट 3 में बहुत आसान है और बाद में कम का उपयोग कर रहा है:

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 के जवाब के 4 संस्करण स्विफ्ट:

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 उदाहरण है जिसमें एक विशिष्ट डिवाइस पर ऐप्पल द्वारा निर्दिष्ट एक विशिष्ट पहचानकर्ता है। केवल APN डिवाइस टोकन की सामग्री को डिकोड और पढ़ सकते हैं। APNs के साथ पंजीकृत होने पर प्रत्येक ऐप इंस्टेंस को अपना अनूठा डिवाइस टोकन प्राप्त होता है, और उसके बाद उसके प्रदाता को टोकन अग्रेषित करना चाहिए, जैसा कि दूरस्थ सूचना समर्थन को कॉन्फ़िगर करने में वर्णित है। प्रदाता को प्रत्येक पुश अधिसूचना अनुरोध में डिवाइस टोकन शामिल करना होगा जो संबंधित डिवाइस को लक्षित करता है; APNs डिवाइस टोकन का उपयोग यह सुनिश्चित करने के लिए करता है कि अधिसूचना केवल अनन्य ऐप-डिवाइस संयोजन को वितरित की जाती है जिसके लिए यह इरादा है।


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")
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.