programing

Swift 3 - 장치 토큰이 '32B'로 구문 분석 중입니다.YTES'

lovejava 2023. 8. 12. 09:39

Swift 3 - 장치 토큰이 '32B'로 구문 분석 중입니다.YTES'

방금 Xcode 7에서 8GM으로 업데이트했는데 Swift 3 호환성 문제 중에 장치 토큰이 작동하지 않는 것을 발견했습니다.그들은 이제 '32B'만 읽습니다.YTES'.

    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data)
{
    print(deviceToken) // Prints '32BYTES'
    print(String(data: deviceToken , encoding: .utf8)) // Prints nil
}

업데이트 전에는 NSData를 서버로 간단히 전송할 수 있었지만, 지금은 토큰을 실제로 구문 분석하는 데 어려움을 겪고 있습니다.

내가 여기서 뭘 놓쳤지요?

편집: NSData로 다시 변환하는 것을 테스트하고 예상되는 결과를 보고 있습니다.그래서 지금은 새로운 데이터 유형에 대해 혼란스러울 뿐입니다.

    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data)
{
    print(deviceToken) // Prints '32BYTES'
    print(String(data: deviceToken , encoding: .utf8)) // Prints nil

    let d = NSData(data: deviceToken)
    print(d) // Prints my device token
}
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    let token = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
    print(token)
}

저도 같은 문제가 있었습니다.이것이 제 해결책입니다.

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    var token = ""
    for i in 0..<deviceToken.count {
        token = token + String(format: "%02.2hhx", arguments: [deviceToken[i]])
    }
    print(token)
}

다음은 Base-16 인코딩 16진수 문자열을 얻기 위한 Swift 3 확장자입니다.

extension Data {
    var hexString: String {
        return map { String(format: "%02.2hhx", arguments: [$0]) }.joined()
    }
}

장치 토큰은 문자열이 아니었고 UTF-8로 인코딩된 문자열이 아닙니다.데이터입니다.32바이트의 불투명한 데이터입니다.

불투명 데이터를 문자열로 변환하는 유일한 유효한 방법은 일반적으로 base64 인코딩을 통해 인코딩하는 것입니다.

Swift 3/iOS 10에서는 단순히 다음을 사용합니다.Data base64EncodedString(options:)방법.

사용해 보십시오.

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

   let token = String(data: deviceToken.base64EncodedData(), encoding: .utf8)?.trimmingCharacters(in: CharacterSet.whitespaces).trimmingCharacters(in: CharacterSet(charactersIn: "<>")) 
}

이것을 먹어보세요.

if #available(iOS 10.0, *) {
   let deviceTokenString = deviceToken.reduce("", {$0 + String(format: "%02X", $1)})
}

스위프트 3

가장 좋고 쉬운 방법.

deviceToken.base64EncodedString()

이것은 공식적인 답변(댓글에서 본 것)으로 명시되지 않았지만, 결국 토큰을 다시 정리하기 위해 제가 한 일입니다.

let tokenData = deviceToken as NSData
let token = tokenData.description

// remove any characters once you have token string if needed
token = token.replacingOccurrences(of: " ", with: "")
token = token.replacingOccurrences(of: "<", with: ""
token = token.replacingOccurrences(of: ">", with: "")
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {

    let token = deviceToken.map({ String(format: "%02.2hhx", $0)}).joined()
     print("TOKEN: " + token)


}

방금 한 일인데,

let token = String(format:"%@",deviceToken as CVarArg).components(separatedBy: CharacterSet.alphanumerics.inverted).joined(separator: "")

결과는 다음과 같습니다.

let token = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()

올바른 형식의 장치 토큰을 가져옵니다.

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) 
{
            var formattedToken = ""
            for i in 0..<deviceToken.count {
                formattedToken = formattedToken + String(format: "%02.2hhx", arguments: [deviceToken[i]])
            }
            print(formattedToken)
}

언급URL : https://stackoverflow.com/questions/39495391/swift-3-device-tokens-are-now-being-parsed-as-32bytes