Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Firebase推送通知不适用于iOS_Ios_Swift_Firebase_Firebase Cloud Messaging_Apple Push Notifications - Fatal编程技术网

Firebase推送通知不适用于iOS

Firebase推送通知不适用于iOS,ios,swift,firebase,firebase-cloud-messaging,apple-push-notifications,Ios,Swift,Firebase,Firebase Cloud Messaging,Apple Push Notifications,我想使用Firebase云消息传递实现推送通知 我已经设置了我的项目并上传了APN证书 我正在使用fcmtoken向我的真实设备发送测试消息 我在AppDelegate中的配置如下 func应用程序(application:UIApplication,didFinishLaunchingWithOptions launchOptions:[UIApplication.launchOptions键:任意])->Bool{ FirebaseApp.configure() registerForPus

我想使用Firebase云消息传递实现推送通知

我已经设置了我的项目并上传了APN证书 我正在使用
fcmtoken
向我的真实设备发送测试消息

我在AppDelegate中的配置如下

func应用程序(application:UIApplication,didFinishLaunchingWithOptions launchOptions:[UIApplication.launchOptions键:任意])->Bool{
FirebaseApp.configure()
registerForPushNotifications(应用程序:应用程序)
返回真值
}
func注册表形式通知(应用程序:UIApplication){
UnuseNotificationCenter.current().delegate=self
Messaging.Messaging().delegate=self
let authOptions:UNAuthorizationOptions=[.alert、.badge、.sound]
UNUserNotificationCenter.current().requestAuthorization(选项:authOptions){(已授权,错误)在中
如果let error=error{
打印(错误。本地化描述)
返回
}
如获授权{
打印(“授权”)
DispatchQueue.main.async{
UIApplication.shared.registerForRemoteNotifications()
}
}否则{
打印(“拒绝”)
}
}
附录.注册处相关信息()
}
func消息传递(u消息传递:消息传递,didReceiveRegistrationToken fcmToken:String){
打印(“Firebase注册令牌:\(fcmToken)”)
let dataDict:[String:String]=[“token”:fcmToken]
NotificationCenter.default.post(名称:Notification.name(“FCMToken”),对象:nil,用户信息:dataDict)
//TODO:如有必要,将令牌发送到应用程序服务器。
//注意:每次应用程序启动时以及每当生成新令牌时,都会触发此回调。
}
func应用程序(u应用程序:ui应用程序,
DidReceiveMemotentification通知:[AnyHashable:Any],
fetchCompletionHandler completionHandler:@escaping(UIBackgroundFetchResult)->Void{
打印(“已发送标识”)
如果Auth.Auth()可以处理通知(通知){
completionHandler(.noData)
返回
}
//此通知与身份验证无关,开发人员应处理它。
}

它应该会看到
已发出的声名
,但它也没有设置喙点似乎这部分永远不会被原谅,因此消息不会出现

除非您已启用Swizzling,否则我不会在您的AppDelegate中看到这一点

func application(application: UIApplication,
                     didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
      Messaging.messaging().apnsToken = deviceToken
    }

此代码将您的APNs设备令牌映射到FCM令牌,这是必需的,因为APNs令牌是您发送推送通知的唯一方式。

@Eilon使用我的设备的fcmToken从FCM控制台发送测试消息,我使用这是唯一的“DidReceiveMemotentification”未调用或您根本没有收到通知?@KonstantinOznobihin是的,它只是未调用的通知。您是否在Firebase控制台/项目设置/云消息中添加了APNs身份验证密钥或证书?@KonstantinOznobihin是的,我检查了它没有解决我的问题始终建议为给定的问题提供解释代码,你写的细节越多,答案就越有用
func sendPushNotification(to token: String, title: String, body: String, userInfo: [String: Any]) {
    let payload: [String: Any] = ["title": title, "body": body, "sound": "sound.caf"]
    let paramString: [String: Any] = ["to": token, "notification": payload, "data": userInfo]
    
    let urlString = "https://fcm.googleapis.com/fcm/send"
    let url = NSURL(string: urlString)!
    let request = NSMutableURLRequest(url: url as URL)
    request.httpMethod = "POST"
    request.httpBody = try? JSONSerialization.data(withJSONObject:paramString, options: [.prettyPrinted])
    request.setValue("application/json", forHTTPHeaderField: "Content-Type")
    request.setValue("key=\(Keys.gmsServerKey)", forHTTPHeaderField: "Authorization")

    let task =  URLSession.shared.dataTask(with: request as URLRequest)  { (data, response, error) in
        do {
            if let data = data {
                if let object  = try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.allowFragments) as? [String: Any] {
                    NSLog("Received data: \(object))")
                }
            }
        } catch let err as NSError {
            print(err.debugDescription)
        }
    }
    task.resume()
}