【问题标题】:Push notifications being sent but not received iOS - Cloud functions推送通知正在发送但未收到 iOS - 云功能
【发布时间】:2020-10-01 01:27:20
【问题描述】:

我正在尝试向我用于测试的 iPhone 6s 发送推送通知。我已经阅读了 Firebase 文档,但我似乎无法收到通知到达手机。当我尝试使用注册后获得的 FCM 令牌发送测试通知时,它在 firebase 控制台上被归类为“已发送”,而不是“已接收”。

该应用的最低软件版本为 iOS 13,因此我没有为通知服务添加已弃用的功能。

我试过了:

  • 在 xcode 中禁用和重新启用推送通知和后台任务功能
  • 使用功能创建了新证书和配置文件
  • 从手机中卸载应用并重新安装
  • 在 Info.plist 文件中将 FirebaseAppDelegateProxyEnabled 设置为 NO 和 YES
  • 编写并运行云函数,用于发送根据 Firebase 控制台运行为“ok”的通知
  • 清理构建文件夹
  • 使用注册时返回的所有令牌

任何帮助将不胜感激, 在此先感谢:)

应用代理:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

    // Override point for customization after application launch.
    FirebaseApp.configure()
    db = Firestore.firestore()

    UNUserNotificationCenter.current().delegate = self

    UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound]) { (granted, error) in
        print("granted: (\(granted)")
    }
    application.registerForRemoteNotifications()
    Messaging.messaging().delegate = self

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

    GIDSignIn.sharedInstance().clientID = FirebaseApp.app()?.options.clientID
    GIDSignIn.sharedInstance().delegate = self

    GADMobileAds.sharedInstance().start(completionHandler: nil)

    self.window = UIWindow(frame: UIScreen.main.bounds)
    let mainStoryboard = UIStoryboard(name: "Main", bundle: nil)

    UserDefaults.standard.setValue(false, forKey: "backing_up")
    let user = Auth.auth().currentUser
    let email = user?.email
    let password = UserDefaults.standard.string(forKey: "password")
    let setup = UserDefaults.standard.bool(forKey: "accountSetup")
    let credential = EmailAuthProvider.credential(withEmail: email ?? "", password: password ?? "")
    user?.reauthenticate(with: credential)
    if (user?.isEmailVerified ?? false) && setup {
        let homeVC = mainStoryboard.instantiateViewController(withIdentifier: "MainViewController")
        self.window?.rootViewController = homeVC
        self.window?.makeKeyAndVisible()
    } else {
        do {
            try Auth.auth().signOut()
        } catch let signOutError as NSError {
            print ("Error signing out: %@", signOutError)
        }
        let loginVC = mainStoryboard.instantiateViewController(withIdentifier: "LoginViewController")
        self.window?.rootViewController = loginVC

        self.window?.makeKeyAndVisible()
    }

    return true
}

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    let token = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
    Messaging.messaging().apnsToken = deviceToken
    Messaging.messaging().setAPNSToken(deviceToken, type: .prod)
    Messaging.messaging().setAPNSToken(deviceToken, type: .sandbox)
    UserDefaults.standard.synchronize()
    print("token: \(token)")
}

func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
    print("failed to register for remote notifications with with error: \(error)")
}

// If in foreground
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
    let userInfo = notification.request.content.userInfo
    // Print message ID.
    print("Message ID: \(userInfo["gcm.message_id"]!)")

    // Print full message.
    print("%@", userInfo)

    completionHandler([.alert, .sound])
}

// If in background
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
    print("handling notification")
    if let notification = response.notification.request.content.userInfo as? [String:AnyObject] {
        let message = parseRemoteNotification(notification: notification)
        print(message as Any)
    }
    completionHandler()
}

private func parseRemoteNotification(notification:[String:AnyObject]) -> String? {
    if let identifier = notification["identifier"] as? String {
        return identifier
    }

    return nil
}

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)
    // TODO: If necessary send token to application server.
    // Note: This callback is fired at each app startup and whenever a new token is generated.
}

【问题讨论】:

  • 您确定应用使用的是沙盒模式吗?为什么不在 testflight 上发布它,看看它是否有效?
  • 感谢您的回复,我已将其发布到 testflight,而我伴侣的手机(作为测试员连接到 testflight)没有将 FCM 令牌发送到数据库,所以我假设它有问题首先注册推送通知?

标签: ios swift firebase push-notification firebase-cloud-messaging


【解决方案1】:

终于!我试图通过从头开始并开始创建另一个应用程序来解决这个问题。在该过程进行到一半时,我发现我没有将 .p8 文件上传到 Firebase 以用于我试图获取通知的应用程序(我以为我有,但显然没有)。

如果您有同样的问题,请检查您的应用是否已在控制台上正确注册 Firebase 以进行云消息传递!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 2016-03-08
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    相关资源
    最近更新 更多