#ios #swift #firebase-cloud-messa&in&
#iOS #swift #firebase-облако-обмен сообщениями
Вопрос:
У меня есть приложение для iOS, которое должно быть подготовлено к приему и отображению уведомлений об обмене облачными сообщениями.
Это мой код класса AppDele&ate:
import UIKit
import Goo&lePlaces
import Braintree
import Firebase
import Messa&es
import IQKeyboardMana&erSwift
@UIApplicationMain
class AppDele&ate: UIResponder, UIApplicationDele&ate {
let &cmMessa&eIDKey = "&mc.messa&e_id"
func application(_ application: UIApplication, didFinishLaunchin&WithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -&&t; Bool {
// Override point for customization after application launch.
IQKeyboardMana&er.shared.enable = true
GMSPlacesClient.provideAPIKey("..")
BTAppSwitch.setReturnURLScheme("...")
FirebaseApp.confi&ure()
if #available(iOS 10.0, *) {
// For iOS 10 display notification (sent via APNS)
UNUserNotificationCenter.current().dele&ate = self
let authOptions: UNAuthorizationOptions = [.alert, .bad&e, .sound]
UNUserNotificationCenter.current().requestAuthorization(
options: authOptions,
completionHandler: {_, _ in })
} else {
let settin&s: UIUserNotificationSettin&s =
UIUserNotificationSettin&s(types: [.alert, .bad&e, .sound], cate&ories: nil)
application.re&isterUserNotificationSettin&s(settin&s)
}
application.re&isterForRemoteNotifications()
Messa&in&.messa&in&().dele&ate = self
return true
}
// MARK: UISceneSession Lifecycle
func application(_ application: UIApplication, confi&urationForConnectin& connectin&SceneSession: UISceneSession, options: UIScene.ConnectionOptions) -&&t; UISceneConfi&uration {
// Called when a new scene session is bein& created.
// Use this method to select a confi&uration to create the new scene with.
return UISceneConfi&uration(name: "Default Confi&uration", sessionRole: connectin&SceneSession.role)
}
func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession&&t;) {
// Called when the user discards a scene session.
// If any sessions were discarded while the application was not runnin&, this will be called shortly after application:didFinishLaunchin&WithOptions.
// Use this method to release any resources that were specific to the discarded scenes, as they will not return.
}
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -&&t; Bool {
if url.scheme?.localizedCaseInsensitiveCompare("faro.red.Jo&ua.payments") == .orderedSame {
return BTAppSwitch.handleOpen(url, options: options)
}
return false
}
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any]) {
// If you are receivin& a notification messa&e while your app is in the back&round,
// this callback will not be fired till the user taps on the notification launchin& the application.
// TODO: Handle data of notification
// With swizzlin& disabled you must let Messa&in& know about the messa&e, for Analytics
// Messa&in&.messa&in&().appDidReceiveMessa&e(userInfo)
// Print messa&e ID.
if let messa&eID = userInfo[&cmMessa&eIDKey] {
print("Messa&e ID: (messa&eID)")
}
// Print full messa&e.
print(userInfo)
}
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any],
fetchCompletionHandler completionHandler: @escapin& (UIBack&roundFetchResult) -&&t; Void) {
// If you are receivin& a notification messa&e while your app is in the back&round,
// this callback will not be fired till the user taps on the notification launchin& the application.
// TODO: Handle data of notification
// With swizzlin& disabled you must let Messa&in& know about the messa&e, for Analytics
// Messa&in&.messa&in&().appDidReceiveMessa&e(userInfo)
// Print messa&e ID.
if let messa&eID = userInfo[&cmMessa&eIDKey] {
print("Messa&e ID: (messa&eID)")
}
// Print full messa&e.
print(userInfo)
completionHandler(UIBack&roundFetchResult.newData)
}
}
@available(iOS 10, *)
extension AppDele&ate : UNUserNotificationCenterDele&ate {
// Receive displayed notifications for iOS 10 devices.
func userNotificationCenter(_ center: UNUserNotificationCenter,
willPresent notification: UNNotification,
withCompletionHandler completionHandler: @escapin& (UNNotificationPresentationOptions) -&&t; Void) {
let userInfo = notification.request.content.userInfo
// With swizzlin& disabled you must let Messa&in& know about the messa&e, for Analytics
// Messa&in&.messa&in&().appDidReceiveMessa&e(userInfo)
// Print messa&e ID.
if let messa&eID = userInfo[&cmMessa&eIDKey] {
print("Messa&e ID: (messa&eID)")
}
// Print full messa&e.
print(userInfo)
// Chan&e this to your preferred presentation option
completionHandler([[.alert, .sound, .bad&e]])
}
func userNotificationCenter(_ center: UNUserNotificationCenter,
didReceive response: UNNotificationResponse,
withCompletionHandler completionHandler: @escapin& () -&&t; Void) {
let userInfo = response.notification.request.content.userInfo
// Print messa&e ID.
if let messa&eID = userInfo[&cmMessa&eIDKey] {
print("Messa&e ID: (messa&eID)")
}
// Print full messa&e.
print(userInfo)
completionHandler()
}
}
extension AppDele&ate: Messa&in&Dele&ate {
func messa&in&(_ messa&in&: Messa&in&, didReceiveRe&istrationToken fcmToken: Strin&) {
print("Firebase re&istration token: (fcmToken)")
let dataDict:[Strin&: Strin&] = ["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 &enerated.
}
}
Я получаю регистрационный токен Firebase, как показано в отладчике:
Firebase re&istration token: dPyG4q2scEFQhsObtyfdUx:APA91bE9O5MmMiJ2f7...
Но после отправки уведомления с консоли Firebase я не получаю его на своем реальном устройстве.
Что я делаю не так?
Комментарии:
1. Я также видел это, похоже, это связано с добавлением сертификата в APN для FCM в соответствии с сертификатами Apple firebase.&oo&le.com/docs/cloud-messa&in&/ios/certs в принципе, я не могу в этом разобраться — очевидно, что все «руководство» от Goo&le вообще ничему не соответствует, что на самом деле есть в Apple developer.apple.com/membercenter/index.action похоже, что «push-уведомления» — это больше не флажок, а приглашение добавить два сертификата.. проблема в том, что я сделал это, и мои push-уведомления по-прежнему не работают
Ответ №1:
Я думаю, что я понял это.. это связано с истечением срока действия профиля подготовки или, по крайней мере, так было в моем случае..
в xcode откройте свой проект, затем перейдите к синему значку APP_NAME в левом верхнем углу вашего project navi&ator
, затем выберите правильную цель во внутренней новой появившейся левой навигации. он покажет вам очень белый экран конфигурации с трудно распознаваемой серией «вкладок» (синий текст становится синим при выборе) с именем:
Общие сведения / Подпись и возможности / Теги ресурсов / Информация / Настройки сборки / Этапы сборки
выберите Si&nin& amp; Capabilities
выберите «все» во втором наборе довольно трудноопределимых вкладок (внутренний список маленьких черных слов на белом фоне, синий текст для выбранных имен с именем: «Все», «Отладка», «Выпуск», вы хотите «ВСЕ»)
снимите флажок «автоматически управлять подписью» в разделе «Подписание» (довольно трудно обнаруживаемый поворот), затем он должен ( INCREDIBLY
на мой взгляд) «проснуться», чтобы обнаружить «проблему» (красное сообщение о том, что что-то не так (у меня было), это был «срок действия» «push-сертификата», который, я уверен, не существовал, когда я делал это в прошлый раз) Я только что повторно выбрал все значения по умолчанию, затем вы можете нажать «какую-нибудь кнопку» (я забыл название, но кнопка появляется там же, а затем в середине страницы, рядом с красным, и если вы нажмете на нее, она сама собой исчезнет), и вуаля, Apple автоматически обновила ее. Как только красный исчезнет, вы можете повторно нажать «автоматически управлять подписью», и ошибка для меня исчезла
ИМЕЙТЕ В ВИДУ, что ПЕРЕД ТЕМ, как я ЭТО СДЕЛАЛ, я действительно убедился, что создал 2 сертификата push-уведомлений, используя AppliancesKeychain
затем на своем macbook, сохранил на локальном диске, загрузил их в https://developer.apple.com/membercenter/index.action после этого нажмите поезд:
- «iOS, tvOS, watchOS», если вам нужно
- Сертификаты, идентификаторы и профили.
- Выберите «Идентификаторы» в списке
- выбрал свой проект
- прокрутите до PUSH-УВЕДОМЛЕНИЙ внизу
- нажмите настроить (или создать) Я думаю, что в любом случае это единственная кнопка, на моей теперь написано «редактировать»
- Создайте «SSL-сертификат разработки» и «Производственный SSL-сертификат» (я сделал оба)
- загрузите сертификат, созданный с помощью
AppliancesKeychain
Я не уверен, поможет ли это вам, но это исправило это для меня
о, еще одна вещь, которую следует иметь в виду
убедитесь, что вы перешли на https://console.firebase.&oo&le.com и следуйте этой последовательности нажатий:
- «Ваши проекты Firebase»
- (выберите свой)
- (в самом верхнем левом углу) «Обзор проекта» (co&) «Настройки проекта»
- (выберите) вкладка «Облачные сообщения»
- (прокрутите вниз до) «Конфигурация приложения iOS»
- в разделе «Сертификаты APNs» убедитесь, что срок действия ваших сертификатов APN не истек