신속한 3.0 데이터를 문자열로?


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

나는 deviceToken끈을 원한다

그러나:

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

str 이다 nil

스위프트 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 고얄

답변:


157

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 - 최신 스위프트의 사람을위한
스티븐 J

1
didRegisterForRemoteNotificationsWithDeviceToken을 사용하여 토큰을 디코딩하려면 다음을 참조하십시오. stackoverflow.com/questions/37956482/…
pw2

33

여기 내 데이터 확장이 있습니다. 이것을 추가하면 data.ToString ()을 호출 할 수 있습니다.

import Foundation

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

이것은 매우 나쁜 코딩입니다. 인코딩이 항상 실패 할 수 있고 앱이 충돌 할 수 있으므로이를 강제로 풀면 안됩니다. 대신 Apple API와 같은 선택적 문자열을 반환합니다.
Walter White

@WalterWhite 예 응용 프로그램에서 선택적 문자열을 반환합니다. 하지만, 주석에 대한 감사를이 답변을 업데이트하지
luhuiya

1
인코딩을 매개 변수로 전달하는 경우 원하는 경우 기본값을 .utf8로 설정 한 다음이를 단일 인코딩 유형 이상에 사용할 수 있습니다.
Micah Montoya

18
let str = deviceToken.map { String(format: "%02hhx", $0) }.joined()

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

Swift와 함께 NSData를 사용하지 않도록합시다.
Brennan

이 방법을 사용하지 마십시오. 안전하지 않습니다.
Bogdan

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

4redwings의 답변의 Swift 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

보안 아키텍처

기기 토큰은 Apple이 특정 기기의 특정 앱에 할당 한 고유 식별자를 포함하는 불투명 한 NSData 인스턴스입니다. 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.