在某些设备上获取推送通知后我的iPhone应用程序崩溃(尤其是ios_10.3.1)

时间:2017-05-12 05:39:26

标签: swift swift2 apple-push-notifications

我刚刚想出如何在我的应用中正确发送推送通知。但是当它开始正常工作时,就会出现一种新的错误。收到推送通知后,我的应用程序在启动时崩溃。我在5台设备上进行了测试,其中2台由于问题而崩溃(两台设备都在iOS_10.3.1上运行)。奇怪的部分是在iOS 10.2和9.3.1上运行的其他3个设备。我真的不认为这是与操作系统相关的东西。

Apple发送了这样的崩溃日志,但是当我点击项目中的open时,它只会打开我的启动屏幕xib enter image description here

我的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设备正常运行

**如果重新安装该应用程序,一切正常。

3 个答案:

答案 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]){ }