推送通知已发送但未收到iOS-云功能

时间:2020-06-11 11:52:49

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

我正在尝试向我用于测试的iPhone 6s发送推送通知。我已经阅读了Firebase文档,但似乎无法收到电话通知。当我尝试使用注册后收到的FCM令牌发送测试通知时,在Firebase控制台上将其分类为“已发送”,但未分类为“已接收”。

该应用的最低软件版本为iOS 13,因此我尚未为通知服务添加不推荐使用的功能。

我尝试过:

  • 在xcode中禁用和重新启用推送通知和后台任务功能
  • 使用功能创建新的证书和配置文件
  • 从手机上卸载应用程序,然后重新安装
  • 在Info.plist文件中将FirebaseAppDelegateProxyEnabled设置为“否”和“是”
  • 编写并运行用于发送通知的云功能,根据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.
}

1 个答案:

答案 0 :(得分:0)

最后!我试图从头开始解决问题,然后开始创建另一个应用程序。整个过程的一半,我发现我没有将.p8文件上传到Firebase上想要尝试使用的应用程序(我以为我有,但显然没有)。

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