#ios #swift #firebase #apple-push-notifications
#iOS #swift #firebase #apple-push-уведомления
Вопрос:
Я уже написал много кода, в котором я устанавливаю уведомления и пытаюсь отправить уведомление от пользователя другому, но теперь вот в чем моя проблема, на устройстве другого пользователя не появляется никаких уведомлений. Приложение не вылетает, и у меня не произошло сбоя сборки, поэтому я действительно не знаю, где я ошибаюсь. Заранее спасибо за ваши ответы, вот мой код…
// Части о push-уведомлениях в AppDelegate.swift
static let NOTIFICATION_URL = "https://gcm-http.googleapis.com/gcm/send"
static var DEVICEID = String()
static let SERVERKEY = "AAAAuIcRiYI:APA91bHA8Q4IJBG9dG4RY9YOZ3v4MlcVZjmYs3XhiMY3xpQm3bTSjrINUiImaE0t17Y6mghR2vN1ezJTMSVFmHlgOUBX8KQZEckgwCkc1tlMdpm_UjxobmrHf3GbvwrKtHVZsJR-v1GG"
#available(iOS 10.0, *){
UNUserNotificationCenter.current().delegate = self
// Request Autorization.
let option : UNAuthorizationOptions = [.alert,.badge,.sound]
UNUserNotificationCenter.current().requestAuthorization(options: option) { (bool, err) in
}
}
else{
let settings : UIUserNotificationSettings = UIUserNotificationSettings(types: [.alert,.badge,.sound], categories: nil)
application.registerUserNotificationSettings(settings)
}
application.registerForRemoteNotifications()
UIApplication.shared.applicationIconBadgeNumber = 0
func messaging(_ messaging: Messaging, didRefreshRegistrationToken fcmToken: String) {
guard let newToken = InstanceID.instanceID().token() else {return}
AppDelegate.DEVICEID = newToken
connectToFCM()
}
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
let notification = response.notification.request.content.body
print(notification)
completionHandler()
}
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
guard let token = InstanceID.instanceID().token() else {return}
AppDelegate.DEVICEID = token
print(token)
connectToFCM()
}
func connectToFCM()
{
Messaging.messaging().shouldEstablishDirectChannel = true
}
// Части об уведомлениях в сообщениях.swift, я вызываю эту функцию после отправки пользователем сообщения таким образом, чтобы человек, получающий сообщение, одновременно получал уведомление.
fileprivate func setupPushNotification(fromDevice:String)
{
Database.database().reference().child("users").child(userID).observeSingleEvent(of: .value, with: { (snapshot) in
let value = snapshot.value as? NSDictionary
let device = value?["device"] as? String ?? ""
guard let message = self.authorText else {return}
let title = "You received a new message !"
let body = "from (message)"
let toDeviceID = device
var headers:HTTPHeaders = HTTPHeaders()
headers = ["Content-Type":"application/json","Authorization":"key=(AppDelegate.SERVERKEY)"
]
let notification = ["to":"(toDeviceID)","notification":["body":body,"title":title,"badge":1,"sound":"default"]] as [String:Any]
Alamofire.request(AppDelegate.NOTIFICATION_URL as URLConvertible, method: .post as HTTPMethod, parameters: notification, encoding: JSONEncoding.default, headers: headers).responseJSON { (response) in
print(response)
}
})
}
Комментарии:
1. Дважды проверьте, что
(toDeviceID)
или любое другое подобное не выдаетOptional(toDeviceID)
.2. Убедитесь, что вы используете последнюю версию Firebase 5.18.0 с FirebaseInstanceID 3.7.0
3.
["body": "from Sean Conlan", "badge": 1, "sound": "default", "title": "You received a new message !"]] SUCCESS: { "canonical_ids" = 0; failure = 1; "multicast_id" = 4813942347357942695; results = ( { error = InvalidApnsCredential; } ); success = 0; } 2019-03-08 19:58:25.388270 0100 onenseven[8421:279462] [Assert] Cannot be called with asCopy = NO on non-main thread.
Я проверил, что toDeviceID не является необязательным, но это ничего не изменило, поэтому я напечатал уведомление, которое я получил, в области отладки @MwcsMac4. Как я могу проверить, что у меня установлены последние версии? Спасибо за ваш ответ. @PaulBeusterien
5. Проверьте содержимое Podfile.lock