Swift 3-장치 토큰이 이제 '32BYTES'로 구문 분석됩니다.
방금 Xcode 7에서 8 GM으로 업데이트했으며 Swift 3 호환성 문제 중에 장치 토큰이 작동을 멈췄다는 것을 알았습니다. 이제는 '32BYTES'만 읽습니다.
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)
}
다음은 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
'program tip' 카테고리의 다른 글
거의 모든 라이브러리를 설치하는 pip 문제 (0) | 2020.08.31 |
---|---|
Notepad ++에서 특정 줄을 어떻게 삭제합니까? (0) | 2020.08.31 |
활동 / 서비스 / 수신자에서 프로그래밍 방식으로 위젯 업데이트 (0) | 2020.08.31 |
Ubuntu를 13.10으로 업그레이드 한 후 mCrypt가 없음 (0) | 2020.08.31 |
프로그래밍 방식으로 UIImage보기를 만드는 방법-Swift (0) | 2020.08.31 |