Estou implementando notificações push. Eu gostaria de salvar meu token APNS como uma string.
- (void)application:(UIApplication *)application
didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)newDeviceToken
{
NSString *tokenString = [NSString stringWithUTF8String:[newDeviceToken bytes]]; //[[NSString alloc]initWithData:newDeviceToken encoding:NSUTF8StringEncoding];
NSLog(@"%@", tokenString);
NSLog(@"%@", newDeviceToken);
}
A primeira linha de código imprime nulo. o segundo imprime o token. Como posso obter meu newDeviceToken como um NSString?
ios
objective-c
apple-push-notifications
nsstring
nsdata
Sheehan Alam
fonte
fonte
NSLog
, aquele que imprimenewDeviceToken
?Respostas:
usa isto :
fonte
Se alguém estiver procurando uma maneira de fazer isso no Swift:
Editar: Para Swift 3
Swift 3 apresenta o
Data
tipo, com semântica de valores. Para converterdeviceToken
em uma String, você pode fazer o seguinte:fonte
let token = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
qiita.com/mono0926/items/3cf0dca3029f32f54a09"%02.2hhx
faz?Alguém me ajudou com isso. Só estou passando
fonte
const unsigned *tokenBytes = [deviceToken bytes]; NSMutableString *hexToken = [NSMutableString string]; for (NSUInteger byteCount = 0; byteCount * 4 < [deviceToken length]; byteCount++) { [hexToken appendFormat:@"%08x", ntohl(tokenBytes[byteCount])]; }
Important: APNs device tokens are of variable length. Do not hard-code their size.
Apple diz.Você poderia usar isso
fonte
description
.[token appendFormat:@"%02.2hhx", data[i]];
como Amazon SNS requer letras minúsculas.Para quem deseja o Swift 3 e o método mais fácil
fonte
deviceToken.reduce("", {$0 + String(format: "%02X", $1)})
Explicação da resposta na
%02.2hhx
votação alta :%
: Apresenta ox
especificador de conversão.02
: A largura mínima do valor convertido é 2. Se o valor convertido tiver menos bytes que a largura do campo, deverá ser preenchido0
à esquerda..2
: Fornece o número mínimo de dígitos a serem exibidos para ox
especificador de conversão.hh
: Especifica que ox
especificador de conversão se aplica a um argumento de caractere assinado ou não assinado (o argumento será promovido de acordo com as promoções de números inteiros, mas seu valor será convertido em caractere assinado ou não assinado antes da impressão).x
: O argumento não assinado deve ser convertido para o formato hexadecimal não assinado no estilo "dddd"; as letras "abcdef" são usadas. A precisão especifica o número mínimo de dígitos a serem exibidos; se o valor que está sendo convertido puder ser representado em menos dígitos, ele será expandido com zeros à esquerda. A precisão padrão é 1. O resultado da conversão de zero com uma precisão explícita de zero não deve conter caracteres.Para mais detalhes, consulte a especificação IEEE printf .
Com base na explicação acima, acho melhor mudar
%02.2hhx
para%02x
ou%.2x
.Para o Swift 5, os seguintes métodos são todos viáveis:
O teste é o seguinte:
fonte
É a minha solução e funciona bem no meu aplicativo:
NSData
paraNSString
comstringWithFormat
fonte
-description
, por isso não é mais seguro que a resposta aceita.description
deviceToken, como jszumski diz.description
se você o chama diretamente ou usa-o através de outro método, porque o formato da string retornada pode ser alterado a qualquer momento. A solução correta está aqui: stackoverflow.com/a/16411517/108105Eu acho que converter deviceToken para string de bytes hexadecimais não faz sentido. Por quê? Você o enviará ao seu back-end, onde será transformado novamente em bytes para ser enviado ao APNS. Portanto, use o método NSData
base64EncodedStringWithOptions
, envie-o para o servidor e, em seguida, use dados decodificados base64 reversos :) Isso é muito mais fácil :)fonte
No iOS 13
description
será interrompido, use estePara maior clareza, vamos detalhar isso e explicar cada parte:
O método map opera em cada elemento de uma sequência. Como Data é uma sequência de bytes no Swift, o fechamento passado é avaliado para cada byte no deviceToken. O inicializador String (format :) avalia cada byte nos dados (representado pelo parâmetro anônimo $ 0) usando o especificador de formato% 02x, para produzir uma representação hexadecimal de 2 dígitos, preenchida com zero, do byte / número inteiro de 8 bits. Depois de coletar cada representação de bytes criada pelo método map, join () concatena cada elemento em uma única string.
O PS não usar descrição fornece uma sequência diferente no iOS 12 e iOS 13 e não é seguro conforme o escopo futuro. Os desenvolvedores não deveriam confiar em um formato específico para a descrição de um objeto.
Para mais informações, leia Isto .
fonte
No iOS 13, a descrição estará em formato diferente. Por favor, use o código abaixo para buscar o token do dispositivo.
fonte
length
no loop for deve ser alterado paralen
. Aparentemente, uma alteração muito pequena para eu fazer uma edição .. Mas, além disso, funciona perfeitamente!Esta é uma solução um pouco mais curta:
fonte
Versão Swift funcional
Um forro:
Aqui está um formulário de extensão reutilizável e auto-documentável:
Como alternativa, use em
reduce("", combine: +)
vez dejoinWithSeparator("")
ser visto como um mestre funcional por seus colegas.Edit: eu mudei String ($ 0, radix: 16) para String (formato: "% 02x", $ 0), porque os números de um dígito precisavam ter um preenchimento zero
(Ainda não sei como marcar uma pergunta como duplicada dessa outra , então acabei de postar minha resposta novamente)
fonte
2020
token como texto ...
ou se você preferir
(resultado é o mesmo)
fonte
Jogando minha resposta na pilha. Evite usar a análise de string; Não é garantido pelos documentos que o NSData.description sempre funcione dessa maneira.
Implementação do Swift 3:
fonte
Eu tentei testar dois métodos diferentes com formato
"%02.2hhx"
e"%02x"
e o resultado é que o mais rápido é,
"%02x"
em média, 2,0 vs 2,6 para a versão reduzida:fonte
O uso de updateAccumulatingResult é mais eficiente do que as várias outras abordagens encontradas aqui, então aqui está a maneira mais rápida de especificar seus
Data
bytes:fonte
Para Swift:
fonte
Que tal uma solução de linha?
Objetivo C
Rápido
fonte
Veja como você faz isso no Xamarin.iOS
fonte
fonte
Rápido:
fonte
fonte
Rápido
fonte
Use excelente categoria!
// arquivo .h
// arquivo .m
@fim
// AppDelegate.m
Funciona bem!
fonte
Swift 3:
Se alguém estiver procurando uma maneira de obter o token do dispositivo no Swift 3. Use o snippet modificado abaixo.
fonte
fonte
A solução @kulss postada aqui, embora sem elegância, mas com a virtude da simplicidade, não funciona mais no iOS 13, pois
description
funcionará de maneira diferente para o NSData. Você ainda pode usardebugDescription
.fonte
Tente este, a menos que os dados sejam nulos.
NSString* newStr = [[NSString alloc] initWithData:newDeviceToken encoding:NSUTF8StringEncoding];
fonte
fonte