Phonegap 插件推送在 iOS 13 及更高版本上返回奇怪格式的 iOS 设备令牌

Posted

技术标签:

【中文标题】Phonegap 插件推送在 iOS 13 及更高版本上返回奇怪格式的 iOS 设备令牌【英文标题】:Phonegap plugin push returns strange format of iOS device token on iOS 13 and higher 【发布时间】:2019-12-05 10:21:20 【问题描述】:

我在 ionic 3 应用程序中使用 phonegap-plugin-push。

但是最近随着越来越多的手机更新到 ios 13 及更高版本,设备注册将不再起作用。

设备调用我们这边的 api,然后将手机注册到 azure push hub。

这就是我设置离子注册过程的方式。

   const options: PushOptions = 
      android: 
        senderID: "58846546653626",
        icon: 'pushicon',
        iconColor: '#7BC3AD' //light blue green thingy
      ,
      ios: 
        alert: "true",
        badge: "true",
        sound: "true"
      

    ;

    this.pushObject = this.push.init(options);

    this.pushObject.on('registration').subscribe(data => 
      this.pushRegister(data);
    );

  pushRegister(data: any) 
    // Get the native platform of the device.
    let platform: any = device.platform;
    // Get the handle returned during registration.
    let handle: any = data.registrationId;
    // Set the device-specific message template.
    let infoToRegister: any = 
      "Platform": (platform == 'android' || platform == 'Android') ? 'gcm' : 'apns',
      "DeviceToken": handle,
      "Tags": [] //set serverside based on authorization
    
    let url = (globalVars.serverurl+ 'api/Register');

    let options = this.dataService.getRequestOptions();

    let body: string = JSON.stringify(infoToRegister);

    this.httpClient.post(url, body, options).subscribe(successResponse => 
      console.log(successResponse);
    , errorResponse => 
      console.log(errorResponse);
    );
  

这一切都适用于运行 iOS 13 以下的手机。

但是在 iOS 13 中,registrationId 看起来完全不同,注册到 azure push hub 的 api 方法会抛出错误:设备令牌中的一个或多个字符不是十六进制数字。

iOS 13 发布的失败数据示例:

"Platform":"apns","DeviceToken":"length=32,bytes=0xc0d97379b07611f8e4e7529e3ee02e1d...d0a4e98468524d88","Tags":[]

有什么方法可以得到正确的令牌吗?如上所示,字节也被截断,所以我想我也不能注册。

【问题讨论】:

我确实从 iOS 13.1.2 => 13.2.3 更新了手机,现在再次注册。但是我不确定这是解决问题的方法。或许可以通过其他方式解决。 【参考方案1】:

问题

这是因为这 4 个损坏的更改:https://onesignal.com/blog/ios-13-introduces-4-breaking-changes-to-notifications/

解决方案 - 1

这里有很好的解释:Does iOS 13 has new way of getting device notification token?

解决方案 - 2

如果您使用的是 Objective-C 或 Swift 3x,请点击此链接:Get device token for push notification

解决方案 - 3

如果您使用的是 Ionic - OneSignal,请点击此链接:Ionic - OneSignal doesn't work on iOS 13.x

解决方案 - 4

如果您在使用 Ionic Cordova 构建移动应用程序时使用 phone-gap 插件解决此问题,请点击此链接:https://github.com/phonegap/phonegap-plugin-push/issues/2819

【讨论】:

【参考方案2】:

如果有人遇到这个问题并且没有使用 Ionic,而是使用普通的 Cordova,解决方案是将您的 phonegap-plugin-push 插件更新到 2.3.0 或更高版本(包含修复的拉取请求在这里:@987654321 @)。

您可以通过运行以下命令来验证您是否安装了正确版本的插件:cordova plugins

为了更好地衡量,请确保在更新推送通知插件后运行cordova platform remove ioscordova platform add ios,以确保更新的插件正确内置到编译的应用程序中。旧版本的插件可以通过多种方式保留在已编译的应用程序中。

【讨论】:

我最终升级了项目中的基本 cordova 包。这当然也会导致几乎所有其他软件包的升级。但首先在这样做之后我可以更新到更新的phonegap-plugin-push。 “cordova-android”:“^9.0.0”,“cordova-ios”:“^6.0.0”,“phonegap-plugin-push”:“^2.3.0”,

以上是关于Phonegap 插件推送在 iOS 13 及更高版本上返回奇怪格式的 iOS 设备令牌的主要内容,如果未能解决你的问题,请参考以下文章

Phonegap 推送插件:构建 iOS 模板错误

PhoneGap 推送插件不注册 iOS 8 设备

推送通知不适用于 iOS9 及更高版本

不使用 APNS 的 iOS 4.0 及更高版本的推送服务器

离子推送通知自定义声音无法在 Android Oreo 及更高版本上播放

Icenium/phonegap ios 推送通知和 php 处理