swift2 我的iPhone应用程序崩溃后,在一些设备(特别是ios_10.3.1)获得推送通知

uqjltbpv  于 2022-11-06  发布在  Swift
关注(0)|答案(4)|浏览(232)

我刚刚弄清楚如何在我的应用程序中正确发送推送通知。然而,当它开始正常工作时,出现了一种新的错误类型。我的应用程序在收到推送通知后启动时崩溃。我在5台设备上进行了测试,其中2台由于该问题而崩溃奇怪的是其他3个设备都运行在iOS 10.2和9.3.1上。我真的不认为这与操作系统有关。
苹果已经发送了一个崩溃日志像这样,但当我点击打开在项目中,它只是打开我的启动屏幕xib x1c 0d1x
我的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设备工作正常
**如果重新安装了应用程序,则一切正常。

lndjwyie

lndjwyie1#

如果我理解正确,您的应用程序正在移动到后台,并在返回前台时崩溃。
这看起来不像是UNUserNotifications的问题。更像是通知只是在这种情况下触发了你的应用程序崩溃。堆栈显示崩溃发生在你的应用程序中。这意味着当你返回前台时,你正在某个地方运行一个空指针引用。
瞎猜:
您是否正在收听UI应用程序已成为活动通知或UI应用程序将进入前景通知?
如果是的话,监听这些通知的每个类都需要在它们遇到垃圾收集器之前取消订阅,最好在dealloc/deinit中取消订阅。
由于您使用Swift:

deinit {
    NotificationCenter.default.removeObserver(self)
}

Objective-C ARC看起来像这样:

- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

如果它没有监听通知,那么它仍然是一个被释放的引用。它没有立即崩溃的原因可能是一个简单的僵尸。一个即将被释放的对象示例,但在一些设备上运行时还没有被释放。

wb1gzix0

wb1gzix02#

  • 这段代码可以解决您的问题::-
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()
}
}
ylamdve6

ylamdve63#

请检查您在此中写入的内容,因为此函数在接收推式通知时调用。请对此进行调试。
函数应用程序(_ application:UI应用程序,是否接收远程通知用户信息:[任何哈希:任何]){ }

5cnsuln7

5cnsuln74#

对我来说,它是在请求授权之前设置UNUserNotificationCenter.current()的委托,这导致了崩溃。这是我修复它的方法。希望它能帮助其他人。

func registerForPushNotifications() {
    let center = UNUserNotificationCenter.current()
    center.requestAuthorization(options: [.sound, .alert, .badge]) { [weak self] granted, _ in
        print("Permission granted: \(granted)")
        guard granted else { return }
        center.delegate = self
        self?.getNotificationSettings()
    }
}

func getNotificationSettings() {
  UNUserNotificationCenter.current().getNotificationSettings { settings in
    print("Notification settings: \(settings)")
      guard settings.authorizationStatus == .authorized else { return }
      DispatchQueue.main.async {
        UIApplication.shared.registerForRemoteNotifications()
      }
  }
}

相关问题