推送通知不起作用 Xcode 11.3.1

Posted

技术标签:

【中文标题】推送通知不起作用 Xcode 11.3.1【英文标题】:Push notifications don't work Xcode 11.3.1 【发布时间】:2020-02-10 19:27:35 【问题描述】:

这是我的情况:我生成了生产推送通知证书。在 Apple Developer Portal 上,证书显示为:

我有一个 Apple 开发证书和一个 Apple 分发证书:

我使用 Xcode 11.3.1 创建一个存档并通过 Ad Hoc 分发我的应用程序。以下是特别摘要:

我已启用推送通知,但它们不起作用。当应用程序在后台时,我无法收到通知。当我在 Xcode 10.3 中使用 iPhone 分发证书时,通知使用相同的代码。我错过了什么?谢谢!!

【问题讨论】:

请使用您尝试接收的推送通知内容(即 APNS JSON)更新您的问题。 【参考方案1】:

这里是集成推送通知的过程,一步一步来:

首先登录您的苹果开发者帐户 -> 标识符 -> 点击您的应用标识符并启用推送通知。 启用通知后,它会询问您 CertificateSigningRequest.certSigningRequest,您需要打开 Keychain 访问并打开 单击证书助手 -> 从证书颁发机构请求证书

创建该证书后,您需要在苹果帐户中添加该证书。并从那里下载 development.cer 和 aps.cer 证书。

下载这些证书后,只需单击两个证书,这将打开您的钥匙串访问权限。现在左键单击这些证书并导出 .p12 证书,它将要求您为该证书生成密码。

现在打开您的 firebase 帐户并转到设置 -> 云消息传递 -> 在此处添加您的 production.p12 和 development.p12 证书。

现在回到 xcode 转到应用目标 -> 登录和功能 -> 添加推送通知并添加后台模式,检查后台获取和远程通知。

现在来代码添加 pod 并安装

pod 'Firebase/Analytics' 
pod 'Firebase/Messaging'

打开你的 AppDelegate 导入这些

import FirebaseAnalytics
import Firebase
import FirebaseMessaging

添加代理MessagingDelegate

发起let gcmMessageIDKey = "gcm.message_id"

didFinishLaunchingWithOptions 方法中添加这些

       FirebaseApp.configure()

        Messaging.messaging().delegate = self
        //Added push notification

        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: _, _ in )
          else 
             let settings: UIUserNotificationSettings =
                 UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
             application.registerUserNotificationSettings(settings)
         

         application.registerForRemoteNotifications()

         Messaging.messaging().isAutoInitEnabled = true

在应用委托中添加这些方法后,您就可以接收推送通知了:

//Push Notifications

   func application(application: UIApplication,
                       didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) 
          Messaging.messaging().apnsToken = deviceToken as Data
      
      func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any]) 

          InstanceID.instanceID().instanceID  (result, error) in
              if let error = error 
                  print("Error fetching remote instance ID: \(error)")
               else if let result = result 
                  print("Remote instance ID token: \(result.token)")
                  //  self.instanceIDTokenMessage.text  = "Remote InstanceID token: \(result.token)"
              
          

          print(userInfo)
      

      func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any],
                       fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) 

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

          print(userInfo)

          completionHandler(UIBackgroundFetchResult.newData)
      

    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)")
           

           completionHandler([])
       

       func userNotificationCenter(_ center: UNUserNotificationCenter,
                                   didReceive response: UNNotificationResponse,
                                   withCompletionHandler completionHandler: @escaping () -> Void) 
           let userInfo = response.notification.request.content.userInfo

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

           print(userInfo)

           completionHandler()
       


       func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String) 
           print("Firebase registration token: \(fcmToken)")
           let dataDict:[String: String] = ["token": fcmToken]


           NotificationCenter.default.post(name: Notification.Name("FCMToken"), object: nil, userInfo: dataDict)

           UserDefaults.standard.set(fcmToken, forKey: "FCMToken")
           UserDefaults.standard.synchronize()

       

       func messaging(_ messaging: Messaging, did remoteMessage: MessagingRemoteMessage) 
           print("Received data message: \(remoteMessage.appData)")
       

       func messaging(_ messaging: Messaging, didReceive remoteMessage: MessagingRemoteMessage) 
           print("Received data message: \(remoteMessage.appData)")
       

       func application(_ application: UIApplication,
                        didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) 
           Messaging.messaging().apnsToken = deviceToken as Data

       

       func messaging(_ messaging: Messaging, didRefreshRegistrationToken fcmToken: String) 
           print("Firebase registration token: \(fcmToken)")

           let dataDict:[String: String] = ["token": fcmToken]



       

【讨论】:

在后台模式中我已启用:IP 语音、后台获取、远程通知、音频、AirPlay 和画中画。我真的需要火力基地吗?当我从 Xcode 10.3 部署应用程序 Ad Hoc 时,我的通知在没有 firebase 的情况下工作。这是与 Xcode 本身有关的问题吗? 没有推送通知,您需要配置 firebase 帐户或套接字编程。没有其他选项可以将推送通知与这两件事集成。而对于通知,只需要启用 In Background Modes -> 检查后台获取和远程通知。 为什么注释掉这一行: // self.instanceIDTokenMessage.text = "Remote InstanceID token: (result.token)"。我正在从旧版本升级,这个“instanceIDTokenMessage”似乎不再存在。不需要?

以上是关于推送通知不起作用 Xcode 11.3.1的主要内容,如果未能解决你的问题,请参考以下文章

从 xcode 推送通知运行应用程序时正在运行,但是在安装 ipa 时它不起作用

iOS Firebase 推送通知在 Xcode 11.5 和 iOS 13 的模拟器上不起作用

如果应用程序是通过 iTunes 安装的,推送通知不起作用,但如果通过 XCode 安装,它们会起作用

静默推送通知不起作用

门户更改后推送通知不起作用

上传到 TestFlight 时推送通知不起作用