web-dev-qa-db-fra.com

IOS 13 a-t-il une nouvelle façon d'obtenir un jeton de notification d'appareil?

Mon ami a donc reçu cet e-mail de OneSignal

En raison d'un changement qui peut se produire dans le cadre de la prochaine version d'iOS 13, vous devez mettre à jour vers la dernière version du SDK iOS avant de créer votre application avec Xcode 11. Tous les SDK de wrapper de OneSignal, y compris React = Native, Unity et Flutter ont également été mis à jour. La raison en est que Xcode 11, qui est publié avec iOS 13, brise une technique courante que les applications et les bibliothèques comme OneSignal utilisaient pour obtenir un jeton Push pour l'appareil Si vous n'utilisez pas notre nouveau SDK, les nouveaux utilisateurs ne pourront pas s'abonner aux notifications de votre application.

Et je suis devenu curieux à ce sujet.

C'est ainsi que nous avons obtenu le jeton de notification d'appareil sur iOS 12

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("Notification token = \(token)")
}

Quelle est la bonne façon de l'obtenir sur iOS 13? Dois-je faire la nouvelle méthode pour mes applications en cours de développement ou l'ancienne méthode est toujours correcte?

24
Alfi

La façon dont vous le faites est très bien et cela devrait continuer à fonctionner sur iOS 13. Mais certains développeurs le font comme this . Pour convertir Data en chaînes de base-16, ils appellent description, ce qui renvoie quelque chose comme

<124686a5 556a72ca d808f572 00c323b9 3eff9285 92445590 3225757d b83997ba>

Et puis ils coupent < et > et supprimez les espaces.

Sur iOS 13, le description appelé sur les données de jeton renvoie quelque chose comme

{ length = 32, bytes = 0xd3d997af 967d1f43 b405374a 13394d2f ... 28f10282 14af515f }

Ce qui rend évidemment ce chemin cassé.

n autre exemple de mauvaise implémentation (déjà édité pour inclure également une implémentation correcte).

D'autres exemples peuvent être trouvés dans ce fil .

22
Eugene Berdnikov

Vous pouvez utiliser cette méthode pour récupérer le jeton d'appareil sur iOS 13:

Objectif-C:

+ (NSString *)stringFromDeviceToken:(NSData *)deviceToken {
    NSUInteger length = deviceToken.length;
    if (length == 0) {
        return nil;
    }
    const unsigned char *buffer = deviceToken.bytes;
    NSMutableString *hexString  = [NSMutableString stringWithCapacity:(length * 2)];
    for (int i = 0; i < length; ++i) {
        [hexString appendFormat:@"%02x", buffer[i]];
    }
    return [hexString copy];
}

Swift 5.0 (non testé)

class func string(fromDeviceToken deviceToken: Data?) -> String? {
    let length = deviceToken?.count ?? 0
    if length == 0 {
        return nil
    }
    let buffer = UInt8(deviceToken?.bytes ?? 0)
    var hexString = String(repeating: "\0", count: length * 2)
    for i in 0..<length {
        hexString += String(format: "%02x", buffer[i])
    }
    return hexString
}

Tiré de blog OneSignal

33
atulkhatri

Le même code pour Swift 5 mais variante un peu plus courte. Vérifié sur iOS 13.

func getStringFrom(token:NSData) -> String {
    return token.reduce("") { $0 + String(format: "%02.2hhx", $1) }
}
0
DenisKirillov
func getStringFrom(deviceToken: Data) -> String {
    var token = ""
    for i in 0..<deviceToken.count {
        token += String(format: "%02.2hhx", arguments: [deviceToken[i]])
    }
    return token
}
0
Corey Pett

Vous pouvez avoir regarder dans le code ci-dessous car j'étais également coincé sur ce problème. Voici le code par lequel vous pouvez obtenir le jeton d'appareil sous iOS 13 et supérieur.

    NSString *str = [NSString stringWithFormat:@"%@", devTokendata]; // devTokendata is NSData
    str = [str stringByReplacingOccurrencesOfString:@" " withString:@""];
    str = [str stringByReplacingOccurrencesOfString:@"<" withString:@""];
    str = [str stringByReplacingOccurrencesOfString:@">" withString:@""];
    if (@available(iOS 13, *)) {
        str = [self hexadecimalStringFromData:devToken];
    NSLog(@"APNS Token: %@",str);
}

-(NSString *)deviceTokenFromData:(NSData *)data
{
    NSUInteger dataLength = data.length;
    if (dataLength == 0) {
        return nil;
    }
    const unsigned char *dataBuffer = (const unsigned char *)data.bytes;
    NSMutableString *hexString  = [NSMutableString stringWithCapacity:(dataLength * 2)];
    for (int i = 0; i < dataLength; ++i) {
        [hexString appendFormat:@"%02x", dataBuffer[i]];
    }
    return [hexString copy];
}
0
Bhoopi