推送通知不起作用 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 的模拟器上不起作用