Acabei de atualizar do Xcode 7 para o 8 GM e em meio aos problemas de compatibilidade do Swift 3, percebi que os tokens do meu dispositivo pararam de funcionar. Eles agora lêem apenas '32BYTES'.
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data)
{
print(deviceToken) // Prints '32BYTES'
print(String(data: deviceToken , encoding: .utf8)) // Prints nil
}
Antes da atualização, eu era capaz de simplesmente enviar o NSData ao meu servidor, mas agora estou tendo dificuldade em analisar o token.
O que estou perdendo aqui?
Edit: Acabei de testar a conversão de volta para NSData e estou vendo os resultados esperados. Agora estou confuso sobre o novo tipo de dados.
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
}
NSData
simplesmente imprime odescription
deNSData
. Você ainda não entendeu nada disso.Respostas:
fonte
%02x
está bem também.%02.2hhx
e%02x
nshipster.com/apns-device-tokens/#overturned-in-ios-13Eu tive o mesmo problema. Esta é a minha solução:
fonte
NSData
em uma string. Sugeri usar a codificação base64 em minha resposta. Isso usa codificação base16.Aqui está minha extensão Swift 3 para obter uma string hexadecimal codificada em base 16:
fonte
O token do dispositivo nunca foi uma string e certamente não uma string codificada em UTF-8. São dados. São 32 bytes de dados opacos.
A única maneira válida de converter os dados opacos em uma string é codificá-los - normalmente por meio de uma codificação base64.
No Swift 3 / iOS 10, basta usar o
Data base64EncodedString(options:)
método.fonte
NSData
ouData
não importa. Os bytes dos dados não são e nunca foram uma string. A documentação afirma claramente que se trata de um conjunto opaco de dados. O fato de seu código funcionar é uma sorte. Sempre foi a maneira incorreta de lidar com isso. Basta converter os dados em uma string codificando os dados em base64. Essa é a solução adequada agora e antes.Experimente isto:
fonte
tente isso
fonte
A maneira melhor e mais fácil.
fonte
Esta não foi declarada como uma resposta oficial (vi em um comentário), mas foi o que fiz para colocar meu token de volta em ordem.
fonte
as NSData
lá. quando você coloca como NSData, não os dados retornam o valor correto mesmo no iOS 10fonte
Eu acabei de fazer isso,
deu o mesmo resultado que,
fonte
Obtenha o token do dispositivo com o formato adequado.
fonte