在iOS 13上无法获取APNS设备令牌

15

我有一个与APNS设备令牌相关的问题。之前我使用的是Xcode 10.2和iOS 12.1。在那时,我会在委托方法中获取设备令牌。

-(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken

我是这样注册APNS的,之前它一直工作得很好。

UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
    center.delegate = self;
    [center requestAuthorizationWithOptions:(UNAuthorizationOptionSound | UNAuthorizationOptionAlert | UNAuthorizationOptionBadge) completionHandler:^(BOOL granted, NSError * _Nullable error){
                if(!error){
                    [[UIApplication sharedApplication] registerForRemoteNotifications];
                }
    }];
现在,当我将iOS 13安装到我的iPhone设备上并使用Xcode 11时,委托方法didRegisterForRemoteNotificationsWithDeviceToken没有被调用。无法理解这个问题。 我已经对此进行了研究,我知道从委托方法获取令牌有一些变化,但在我的情况下,委托方法甚至没有被调用。同样,在iOS 12上正常工作。

现在问题已解决。必须从开发者门户网站创建 Xcode 11 的所有证书,这样就可以解决问题了。 - IOS Dev
1
@IOSDev 请记录下你所做的事情。我现在也遇到了同样的问题;我认为这里有好的因果报应。 - Darren Black
2
你找到解决方案了吗?我也遇到了同样的问题。 - Aman.Samghani
1
@Aman.Samghani:是的,当推送通知生成警报时,它不会第一次出现。我不得不再次调用相同的推送通知注册代码,然后才获得设备令牌。因此,在两次或三次尝试中,我获得了令牌。 - IOS Dev
6个回答

21

只需重新启动您的iPhone。就是这么简单,在90%的情况下,它将解决您的问题。


1
真希望我早点看到这个评论。浪费了5个多小时来调试和疯狂地盯着那个配置文件等。 - zuyao88
1
适用于我,iOS 13.3.1。 - Jhonattan
这是一件奇怪的事情,我花了3个小时来找出问题所在。 - fakiho
哇,这个问题我调了2.5小时,但终于被解决了。谢谢你。 - daihovey
还有一件事,检查通知权限是否被允许。 - swiftache

2

首先,在https://appleid.apple.com/上登录,然后打开网址 "https://developer.apple.com/account/ios/identifier/bundle" 或 "https://developer.apple.com/account/resources/certificates/list"。

接着,创建两个新证书: (1) Apple Development 用于签署 iOS、macOS、tvOS 和 watchOS 应用程序的开发版本。适用于 Xcode 11 及更高版本。 (2) Apple Distribution 用于签署提交到 App Store 或进行 Ad Hoc 分发的应用程序。适用于 Xcode 11 及更高版本。

然后,通过网址 "https://developer.apple.com/account/resources/identifiers/list" 找到菜单“标识符”。 编辑您的应用程序标识符,确保将开发 SSL 证书和生产 SSL 证书添加到推送通知中。

接下来,通过网址 "https://developer.apple.com/account/resources/profiles/list" 打开菜单“配置文件”。 确保证书类型为“Distribution”,可在 Xcode 11 及更高版本中使用,并保存。

最后,将生成的配置文件和 CA 证书文件下载到您的 MAC 上,并通过双击各个文件将它们添加到 XCode 和密钥链应用程序中。

此外,请记得重新启动您的手机,并确保已正确设置远程通知。


1
我也遇到了同样的问题。我尝试了很多情况,但在以下步骤后成功了:
  1. 重新启动设备
  2. 在主线程中调用registerForRemoteNotifications方法。
在我的情况下,我得到了设备令牌,但是响应有延迟(我认为是由于在后台线程中注册远程通知)。但是将[[UIApplication sharedApplication] registerForRemoteNotifications]移动到主线程后,一切都正常工作。
这是我的代码:
    [UIApplication sharedApplication].applicationIconBadgeNumber = 0;
    UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
    center.delegate = delegate;
    [center requestAuthorizationWithOptions:(UNAuthorizationOptionSound | UNAuthorizationOptionAlert | UNAuthorizationOptionBadge) completionHandler:^(BOOL granted, NSError * _Nullable error){
        if(!error){
            dispatch_async(dispatch_get_main_queue(), ^{
                [[UIApplication sharedApplication] registerForRemoteNotifications];
                [self callCompletion:TRUE completion:completion];
            });
        }
    }];

希望这会有所帮助。

0

我是这样解决这个问题的,按照以下步骤进行操作:

在didRegisterForRemoteNotificationsWithDeviceToken方法中添加一些打印信息,并保持设备连接。

  1. 进入目标功能。

  2. 关闭推送通知。

  3. 在设备上构建和运行应用程序并等待。

  4. 然后检查控制台,您会得到推送通知失败的错误消息。

  5. 停止运行应用程序。

  6. 再次开启推送通知。

  7. 转到https://developer.apple.com/选择帐户->证书、标识符和选择您的项目ProvisionalProfiles->Keys->单击编辑并保存,然后下载provisonal profile并双击它。

  8. 在设备上构建和运行应用程序。

  9. 然后它就可以正常工作了。

    我希望这能帮助到某些人。


-2

试试这个。

  1. 卸载你的应用程序。
  2. 重启你的手机。
  3. 在你的设备上构建和运行(重新安装你的应用程序)。

对我有用。


-2

这与您的XCode安装中缺少DeviceSupport有关,该设备使用的平台版本相关。

在我的情况下,缺少了13.1平台。 要解决此问题,只需将DeviceSupport添加到文件夹中即可。

Xcode.app/Contents/Develper/Platforms/iPhoneOS.platform/DeviceSupport

您可以从以下链接下载缺失的DeviceSupport: https://github.com/iGhibli/iOS-DeviceSupport/tree/master/DeviceSupport


现在已经解决了。必须为Xcode 11创建所有证书,然后它就可以工作了。 - IOS Dev
我创建了两个证书,但仍然无法正常工作。我还检查了DeviceSupports,13.1也在其中。我正在使用xcode 11.1,在iOS 13.1上测试iPhone 7。有什么建议吗? - Ugo Chirico
1
我添加了后台模式:获取、处理和远程通知,然后重新启动了我的 iPhone,现在它可以工作了。真的,我不明白为什么,但现在它可以工作了。 - Ugo Chirico
设备对仿真器的支持如何与实际设备有关系? - Vyachaslav Gerchicov

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