web-dev-qa-db-ja.com

iOS 13にはデバイス通知トークンを取得する新しい方法がありますか?

だから私の友人はOneSignalからこのメールを受け取りました

今後のiOS 13リリースの一部として発生する可能性がある変更のため、Xcode 11でアプリをビルドする前に、iOS SDKの最新バージョンに更新する必要がありますReactを含むすべてのOneSignalのラッパーSDK = Native、Unity、Flutterも更新されました。この理由は、iOS 13と一緒にリリースされるXcode 11が、OneSignalなどのアプリやライブラリがデバイスのプッシュトークンを取得するために使用していた一般的な手法を破壊するためです新しいSDKを使用しない場合、新しいユーザーはアプリからの通知をサブスクライブできなくなります。

そして私はそれについて知りました。

これは、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)")
}

IOS 13でそれを取得する適切な方法は何ですか?現在開発中のアプリに新しい方法を実行する必要がありますか、それとも古い方法で問題ありませんか?

24
Alfi

これを行う方法は問題なく、iOS 13でも引き続き機能するはずですが、一部の開発者は this のように行います。 Dataを16進数の文字列に変換するには、descriptionを呼び出します。

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

そして、それらは<および>とスペースを削除します。

IOS 13では、トークンデータで呼び出されたdescriptionは次のようなものを返します

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

これは明らかにこの方法を壊します。

別の例 間違った実装(正しい実装も含むように編集済み)。

さらにいくつかの例が this thread にあります。

22

このメソッドを使用して、iOS 13以降でデバイストークンをフェッチできます。

Objective-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(未テスト)

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
}

OneSignalブログ から取得

33
atulkhatri

Swift 5と同じコードですが、少し短いバリアントです。iOS13で検証されています。

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

私もこの問題に悩まされていたので、以下のコードを確認してください。以下は、iOS 13以降でデバイストークンを取得するためのコードです。

    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