швидкі дані 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?

Реєстрація для push-сповіщень у Xcode 8 / Swift 3.0? не працює, і відповідь кілька місяців тому, я спробував:

введіть тут опис зображення

і роздрукувати:

введіть тут опис зображення


18
Наступного разу, коли ви попросите когось спробувати ваш код, переконайтесь, що він не вставлений як зображення ..
Десденова

Якщо хто - то стикався з цим при читанні файлу, переконайтеся , що файл 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

Відповіді:


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

маркер пристрою не є рядком utf8, він є необробленим двійковим
Hogdotmac

так що робити, якщо це сирий двійковий файл?
Kingalione

String.Encoding.utf8.rawValue - для тих, хто в останній версії Swift
Стівен Дж

1
для декодування маркерів з допомогою didRegisterForRemoteNotificationsWithDeviceToken подивитися: stackoverflow.com/questions/37956482 / ...
pw2

32

ось моє розширення даних. додайте це, і ви зможете викликати дані.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 з Swift.
Бреннан

Не використовуйте цей метод. Це небезпечно.
Вичерпано

2

Це набагато простіше в Swift 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

Відповідь 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, а потім повинен переслати маркер своєму постачальнику, як описано в Налаштування підтримки віддаленого сповіщення. Постачальник повинен включати маркер пристрою до кожного запиту push-сповіщення, який націлений на відповідний пристрій; 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")
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.