iOS 13上推送通知未注册到应用程序

15

我构建了我的应用程序,并在didRegisterForRemoteNotificationsWithDeviceToken中设置了断点,但它没有被触发。

在其他版本的iOS上运行良好。

这是iOS 13的一个bug还是我错过了iOS 13的一些新内容?

我使用的是Xcode Beta 6和iOS 13 beta 8。


我已经实现了didRegisterForRemoteNotificationsWithDeviceToken。它可以在iOS 12或11上运行。 - Halil İbrahim YILMAZ
1
那么,您能否将didRegisterForRemoteNotificationsWithDeviceToken的实现添加到问题中呢?如果我们看不到您的代码,很难说出问题所在。 - Eugene Berdnikov
你好,这个问题有任何更新吗? - blyabtroi
1
嗨@blyabtroi,我重新安装了iOS 13测试版,现在可以使用了。 - Halil İbrahim YILMAZ
4个回答

10

通过重新连接WiFi或在WiFi和蜂窝数据之间切换也可以解决上述问题。

此外,iOS 13的更改会影响推送通知的实现。

iOS 13之前,许多人都这样做。

(deviceToken as NSData).description 
// Used to return as follows

"<965b251c 6cb1926d e3cb366f dfb16ddd e6b9086a 8a3cac9e 5f857679 376eab7C>"

let tokenData = deviceToken as NSData
let token = tokenData.description

let token = "\(deviceToken)".replacingOccurrences(of: " ", with: "")
                            .replacingOccurrences(of: "<", with: "")
                            .replacingOccurrences(of: ">", with: "")
在iOS 13中,苹果更改了NSData类的description方法的实现方式。因此,它返回:

"{length = 32, bytes = 0x965b251c 6cb1926d e3cb366f dfb16ddd ... 5f857679 376eab7c }" // in iOS 13.

这最终导致许多应用程序的推送通知功能出现故障。

从现在开始,如果您需要将推送通知注册设备令牌转换为Base16编码/十六进制字符串表示形式,则应按以下方式操作Swift语言。

let deviceTokenString = deviceToken.map { String(format: "%02x", $0) 
}.joined()

对于Objective C,请使用以下代码

- (NSString *)hexadecimalStringFromData:(NSData *)deviceToken {
  NSUInteger dataLength = deviceToken.length;
  if (dataLength == 0) {
    return nil;
  }

  const unsigned char *dataBuffer = (const unsigned char *)deviceToken.bytes;
  NSMutableString *hexString  = [NSMutableString stringWithCapacity:(dataLength * 2)];
  for (NSInteger index = 0; index < dataLength; ++index) {
    [hexString appendFormat:@"%02x", dataBuffer[index]];
  }
  return [hexString copy];
}

我发现了一篇关于特定主题的全面文章https://nshipster.com/apns-device-tokens/


4
感谢您的建议,但请求不同。为什么在iOS13上不再调用 didRegisterForRemoteNotificationsWithDeviceToken 方法?我现在也遇到了同样的问题。 - Ugo Chirico
1
你尝试重新连接WiFi了吗? 我们遇到了类似的问题,重新连接WiFi对我们有用。 - Mihir
@Mihir提供的解决方案适用于使用token.description获取iOS13 + Xcode11上的无效设备令牌。如果我们使用Xcode 10.1构建应用程序并在iOS13上运行,则可以从token.description获得正确的值。 - Abhay
2
这与所提出的问题完全无关。如果didRegisterForRemoteNotificationsWithDeviceToken从未被调用,则传递给该调用的数据格式是无关紧要的。 - Kendall Helmstetter Gelner

2
我理解的关于这个问题的情况是:有时iOS会强制使用某种连接方式来向苹果服务器注册设备令牌。
如果您处于WI-FI环境下,即使您确定了远程通知流程的实现,但didRegisterForRemoteNotificationsWithDeviceToken没有被调用,请尝试切换到3G或4G。如果不可能(例如测试设备没有SIM卡),请尝试进入飞行模式并启用无线网络(这解决了我们的问题)。
如果您正在使用3G - 4G,请尝试切换到无线连接(如果您使用VPN、代理等可能会出现问题,请先禁用它们)。
如果以上方法都行不通,其他Stackoverflow用户建议删除应用程序,然后重新启动设备。

1
如果didRegisterForRemoteNotificationsWithDeviceToken没有触发,请尝试以下方法。我尝试了很多方法来解决我的wifi网络问题,但是都没有成功。所以我将网络切换到蜂窝数据,didRegisterForRemoteNotificationsWithDeviceToken又开始触发了。
此外,如果您在MAC上使用互联网连接共享USB,请关闭它并使用普通的wifi或移动数据连接您的iPhone。

很遗憾,这个解决方案没有成功。 - Yedy
它对我起作用了。但是,如果您在MAC上使用互联网连接来通过USB共享,请关闭它并使用普通的WiFi或移动数据连接将您的iPhone连接上。 - Amal T S

0
如果你使用测试设备(没有SIM卡),请尝试插入SIM卡并安装应用程序,然后再运行,对我来说有效。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接