16
import Firebase
import FirebaseInstanceID
import FirebaseMessaging
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    registerForPushNotifications(application)
    FIRApp.configure()

    // Add observer for InstanceID token refresh callback.
    NSNotificationCenter
     .defaultCenter()
     .addObserver(self, selector: #selector(AppDelegate.tokenRefreshNotificaiton),
                                                     name: kFIRInstanceIDTokenRefreshNotification, object: nil)

    // Override point for customization after application launch.
    return true
  }

func registerForPushNotifications(application: UIApplication) {
      let settings: UIUserNotificationSettings =
        UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: nil)
      application.registerUserNotificationSettings(settings)
      application.registerForRemoteNotifications()
  }


  func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject],
                   fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) {
    print("===== didReceiveRemoteNotification ===== %@", userInfo)
  }


 func tokenRefreshNotificaiton(notification: NSNotification) {
    let refreshedToken = FIRInstanceID.instanceID().token()!
    print("InstanceID token: \(refreshedToken)")

    // Connect to FCM since connection may have failed when attempted before having a token.
     connectToFcm()
  }

  func connectToFcm() {
    FIRMessaging.messaging().connectWithCompletion { (error) in
      if (error != nil) {
        print("Unable to connect with FCM. \(error)")
      } else {
        print("Connected to FCM.")
      }
    }
  }

还要在 Info.plist FirebaseAppDelegateProxyEnabled = NO 中完成

我现在不知道,但我在 didReceiveRemoteNotification 中得到了 print(...) 但没有得到弹出窗口。我从 Firebase -> Console -> Notification -> Single device 发送消息,并在此处复制我从 xCode Console -> func tokenRefreshNotificaiton 获得的令牌

在控制台中获取下一个,但不要弹出

<FIRAnalytics/INFO> Firebase Analytics enabled
InstanceID token: TOKEN_ID
Connected to FCM.
===== didReceiveRemoteNotification ===== %@ [notification: {
    body = test;
    e = 1;
}, collapse_key: com.pf.app, from: 178653764278]

还有应用程序配置 在此处输入图像描述

4

6 回答 6

11

在 AppDelegate.m 中设置以下代码

   - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {

    // for development 
        [[FIRInstanceID instanceID] setAPNSToken:deviceToken type:FIRInstanceIDAPNSTokenTypeSandbox];

    // for production 
   //     [[FIRInstanceID instanceID] setAPNSToken:deviceToken type:FIRInstanceIDAPNSTokenTypeProd];


    }
于 2016-07-17T06:49:03.247 回答
1

我猜您的应用在测试时处于前台。当您的应用程序处于前台时,不会触发可见通知,而是会收到对didReceiveRemoteNotification. 有关更多信息,请参阅文档

要验证,请将您的应用程序置于后台并尝试再次发送推送通知。

于 2016-06-01T11:14:57.183 回答
0

首先检查 Firebase 通知控制台以查看通知是否正在发送。如果是成功,那么问题出在代码端;否则,请检查 Firebase 中出现了什么错误。如果您收到 APNs 缺失的错误消息,您需要检查项目设置->云消息选项卡中的开发/生产 .p12 文件。

于 2016-12-01T09:39:30.313 回答
0

我有与您相同的配置,它的工作方式与 AdamK 所说的一样。(在后台模式下,会出现通知。)还要检查您的证书。

于 2016-06-07T21:57:15.647 回答
0

只需在您的应用程序委托沙箱中使用此功能进行开发 prod for prodction

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {

    FIRInstanceID.instanceID().setAPNSToken(deviceToken, type: FIRInstanceIDAPNSTokenType.sandbox)

    FIRInstanceID.instanceID().setAPNSToken(deviceToken, type: FIRInstanceIDAPNSTokenType.prod)
}
于 2017-05-08T11:10:19.833 回答
0

您是否使用https://pushtry.com来测试 FCM 通知然后不要使用,因为我对这个网站有很多问题来测试通知,有时它工作,有时不工作。它没有给出一致的结果,它可能会在 FCM 流程中起作用并完全阻止接收通知。

我建议使用https://fcm.snayak.dev来测试通知。

于 2020-07-25T06:45:42.507 回答