【问题标题】:Push Notifications Are Not working When I disconnect my device from Xcode当我断开设备与 Xcode 的连接时,推送通知不起作用
【发布时间】:2019-07-24 03:46:27
【问题描述】:

我正在使用 swift 语言开发一个 IOS 应用程序。我已将基于 Firebase 的推送通知添加到我的项目中。当我的设备连接到 xcode 或在我的设备上调试我的应用程序时,它们可以正常工作。但是,当我断开我的设备与 xcode 的连接或者我在没有调试推送通知的情况下使用应用程序时不起作用。我正在寻找解决方案

我在 App Delegate 文件中的代码

在 didFinishLaunchingWithOptions 函数中

if #available(iOS 10.0, *) {
        // For iOS 10 display notification (sent via APNS)
        UNUserNotificationCenter.current().delegate = self

        let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
        UNUserNotificationCenter.current().requestAuthorization(options: authOptions,
                                                                completionHandler: { (bool, err) in

        })

    } else {

        let settings: UIUserNotificationSettings = UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
        application.registerUserNotificationSettings(settings)

    }

    application.registerForRemoteNotifications()
    UIApplication.shared.applicationIconBadgeNumber = 0

在didregisterdevicewithtoken函数中

 func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    print("APNs token retrieved: \(deviceToken)")

    // With swizzling disabled you must set the APNs token here.
    if let refreshedToken = InstanceID.instanceID().token() {
        print("InstanceID token: \(refreshedToken)")

    }
    let tokenT = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
    print(tokenT)
    guard let token = InstanceID.instanceID().token() else {return}
    AppDelegate.DEVICEID = token
    print(token)
    UserDefaults.standard.set(token, forKey: "token")

    connectToFCM()


}

并生成通知

 func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any],
                 fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
    // If you are receiving a notification message while your app is in the background,
    // this callback will not be fired till the user taps on the notification launching the application.
    // TODO: Handle data of notification

    // With swizzling disabled you must let Messaging know about the message, for Analytics
    // Messaging.messaging().appDidReceiveMessage(userInfo)

    // Print message ID.
    if let messageID = userInfo[gcmMessageIDKey] {
        print("Message ID: \(messageID)")
    }

    if let msg = userInfo["desc"] as? String
    {
        let title = userInfo["noti_title"] as? String
        createNotification(message: msg, title: title ?? "" )

    }

    // Print full message.
    print(userInfo)

    completionHandler(UIBackgroundFetchResult.newData)
}


func createNotification(message: String, title: String) {

    let content = UNMutableNotificationContent()
    content.title =  title
    content.body = message


    let triger = UNTimeIntervalNotificationTrigger(timeInterval: 2, repeats: false )
    let request = UNNotificationRequest(identifier: "TextMessage", content: content, trigger: triger)



    UNUserNotificationCenter.current().add(request, withCompletionHandler: nil)
}

UNUserNotificationCenterDelegate

extension AppDelegate : UNUserNotificationCenterDelegate {

// Receive displayed notifications for iOS 10 devices.
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification,                            withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {

    let userInfo = notification.request.content.userInfo

    if let messageID = userInfo[gcmMessageIDKey] {
        print("Message ID: \(messageID)")
    }

    print(userInfo)

    // Change this to your preferred presentation option
    completionHandler([.alert,.badge,.sound])
}


func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
    let application = UIApplication.shared

    if(application.applicationState == .active){
        print("user tapped the notification bar when the app is in foreground")

        window = UIWindow(frame: UIScreen.main.bounds)
        window?.makeKeyAndVisible()

        //        let layout = UICollectionViewFlowLayout()
        window?.rootViewController = UINavigationController(rootViewController: NotificationViewController())


    }

    if(application.applicationState == .inactive)
    {
        print("user tapped the notification bar when the app is in background")
        window = UIWindow(frame: UIScreen.main.bounds)
        window?.makeKeyAndVisible()

        //        let layout = UICollectionViewFlowLayout()
        window?.rootViewController = UINavigationController(rootViewController: NotificationViewController())

    }

    /* Change root view controller to a specific viewcontroller */
    // let storyboard = UIStoryboard(name: "Main", bundle: nil)
    // let vc = storyboard.instantiateViewController(withIdentifier: "ViewControllerStoryboardID") as? ViewController
    // self.window?.rootViewController = vc

    completionHandler()
}

func connectToFCM()
{
    Messaging.messaging().shouldEstablishDirectChannel = true
}
func initializeNotificationServices() -> Void {
    let settings = UIUserNotificationSettings(types: [.sound, .alert, .badge], categories: nil)
    UIApplication.shared.registerUserNotificationSettings(settings)

    // This is an asynchronous method to retrieve a Device Token
    // Callbacks are in AppDelegate.swift
    // Success = didRegisterForRemoteNotificationsWithDeviceToken
    // Fail = didFailToRegisterForRemoteNotificationsWithError
    UIApplication.shared.registerForRemoteNotifications()

【问题讨论】:

  • 显示一些代码以便更好地理解您的问题。
  • 你没有实现 UNUserNotificationcenterdelegate 方法,所以你不会收到推送通知。请参阅此博客以获取完整信息medium.com/developerfly/…
  • 对不起,我忘了告诉你我已经更新了我的问题,请检查
  • 将该代码也添加到问题中。
  • 你把这段代码放到 FIRApp.configure() 中了吗?如果是,那么您的代码完全正确。那么问题出在其他地方。

标签: ios iphone push-notification apple-push-notifications swift4


【解决方案1】:

我已经解决了这个问题。现在我在firebase控制台中添加了生产apn证书,并从firebase控制台中删除了开发apn证书。对于那些有同样问题的人,请从 apple.developers 生成您的生产 apn,并在构建选项卡中将您的项目方案从调试更改为发布。

【讨论】:

    猜你喜欢
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-22
    • 1970-01-01
    • 2023-03-20
    相关资源
    最近更新 更多