我刚刚想出如何在我的应用中正确发送推送通知。但是当它开始正常工作时,就会出现一种新的错误。收到推送通知后,我的应用程序在启动时崩溃。我在5台设备上进行了测试,其中2台由于问题而崩溃(两台设备都在iOS_10.3.1上运行)。奇怪的部分是在iOS 10.2和9.3.1上运行的其他3个设备。我真的不认为这是与操作系统相关的东西。
Apple发送了这样的崩溃日志,但是当我点击项目中的open时,它只会打开我的启动屏幕xib
我的appDelegate类APNS服务调用部分 - >
func registerForPushNotifications(application: UIApplication)
{
if #available(iOS 10.0, *){
UNUserNotificationCenter.currentNotificationCenter().delegate = self
UNUserNotificationCenter.currentNotificationCenter().requestAuthorizationWithOptions([.Badge, .Sound, .Alert], completionHandler: {(granted, error) in
if (granted)
{
UIApplication.sharedApplication().registerForRemoteNotifications()
}
else{
CommonViewController.alertViewUI("Alert", message: "Push notification is enabled")
}
})
}
else{ //If user is not on iOS 10 use the old methods we've been using
let notificationSettings = UIUserNotificationSettings(
forTypes: [.Badge, .Sound, .Alert], categories: nil)
application.registerUserNotificationSettings(notificationSettings)
}
}
我的应用功能 - >在发布时-----------------------
用于了解用户版本的版本检查类。从那里重定向到主(主页)。
在主页上 - > 1.加载视图。 2.异步调用链接,并在警报符号附近显示可用通知的计数。(我很确定在调用此链接或获取通知时没有错误)------------ -------------
注意: **当双击iPhone主页按钮菜单时,应用程序在后台显示为打开主屏幕打开的屏幕(崩溃后)。
**一台10.3.1设备正常运行
**如果重新安装该应用程序,一切正常。
答案 0 :(得分:4)
如果我理解你的错误,你的应用程序将移动到后台并在返回前台时崩溃。
这看起来不像UNUserNotifications的问题。更像是通知只会在这种情况下触发应用中的崩溃。堆栈显示您的应用中发生了崩溃。这意味着当你返回前台时,你正在某处运行一个空指针引用
盲目猜测:
你在听UIApplicationDidBecomeActiveNotification或UIApplicationWillEnterForegroundNotification吗?
如果是,那么收听这些通知的每个类在遇到垃圾收集器之前都需要取消订阅。 dealloc / deinit是个好地方。
因为你使用Swift:
deinit {
NotificationCenter.default.removeObserver(self)
}
Objective-C ARC看起来像:
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
如果它没有收听通知,那么它仍然是一个被取消分配的引用。它不立即崩溃的原因将是一个简单的僵尸。一个即将被释放的对象实例,但在某些设备的运行时尚未解析。
答案 1 :(得分:1)
此代码解决您的问题:: -
func registerPushNotifications() {
if #available(iOS 10.0, *) {
let center = UNUserNotificationCenter.current()
center.delegate = self
center.requestAuthorization(options: [.sound, .alert, .badge]) { (granted, error) in
if error == nil{
UIApplication.shared.registerForRemoteNotifications()
}
}
}
else {
UIApplication.shared.registerUserNotificationSettings(UIUserNotificationSettings(types: [.sound, .alert, .badge], categories: nil))
UIApplication.shared.registerForRemoteNotifications()
}
}
答案 2 :(得分:0)
请检查您在此处写的内容,因为在接收推送通知时会调用此功能。请调试一下。
func application(_ application:UIApplication,didReceiveRemoteNotification userInfo:[AnyHashable:Any]){ }