Я новичок в iOS / Swift и не могу получить уведомления pu sh. Я сконфигурировал свой серверный бэкэнд для уведомлений pu sh в мое приложение, когда происходит какое-либо действие. Я настроил уведомление данных через FCM, потому что мне нужны некоторые пользовательские данные в уведомлении, чтобы открыть одно действие / представление или другое. Это код, используемый для отправки уведомления (python / django):
registration_id = profiletarget.device_token
message_title = "Ha llegado tu turno"
message_body = "Entra y escribe en el relato para el que estás en cola"
data_message = {
"title" : "¿Listo para escribir?",
"body" : "Ha llegado tu turno para escribir en el relato. Recuerda que tienes un minuto para aceptar tu turno y 3 para escribir.",
"bookid" : booktarget.pk,
"multimediaurl" : multimediaused.url
}
result = push_service.notify_single_device(registration_id=registration_id, data_message=data_message)
Все внутри этого кода работает, потому что я правильно получаю их на Android. Но на iOS ... я не могу заставить его работать.
У меня есть токен уведомлений, я отправляю его на свой сервер, я использую отправителя уведомлений на консоли FCM для отправки тестового пу Уведомления sh (iPhone получают их), но не те, что были в моем пользовательском методе. Ничего не отображается. Что-то не так в методе сервера или я что-то упустил?
Это код swift:
import UIKit
import KeychainSwift
import Firebase
import FirebaseMessaging
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate, MessagingDelegate {
var window : UIWindow?;
var storyboard : UIStoryboard?;
var token = ""
let gcmMessageIDKey = "gcm.message_id"
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
self.storyboard = UIStoryboard(name: "Main", bundle: Bundle.main);
UITabBarItem.appearance().setTitleTextAttributes([NSAttributedString.Key.font: UIFont(name: "PT Sans", size: 12)!], for: .normal)
UITabBarItem.appearance().setTitleTextAttributes([NSAttributedString.Key.font: UIFont(name: "PT sans", size: 12)!], for: .selected)
let keychain = KeychainSwift()
token = keychain.get("token") ?? ""
if (token != ""){
print("log-token: ", token)
print("log-redirection: ", "no redirection needed!")
FirebaseApp.configure()
Messaging.messaging().delegate = self
if #available(iOS 10.0, *) {
// For iOS 10 display notification (sent via APNS)
UNUserNotificationCenter.current().delegate = self
let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
UNUserNotificationCenter.current().requestAuthorization(
options: authOptions,
completionHandler: {_, _ in })
} else {
let settings: UIUserNotificationSettings =
UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
application.registerUserNotificationSettings(settings)
}
application.registerForRemoteNotifications()
} else {
print("log-token: ", "noToken")
print("log-redirection: ", "redirection to LoginController")
window?.rootViewController = self.storyboard?.instantiateViewController(withIdentifier: "loginView");
}
return true
}
func application(
_ application: UIApplication,
didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data
) {
let tokenParts = deviceToken.map { data in String(format: "%02.2hhx", data) }
let token = tokenParts.joined()
print("Device Token: \(token)")
postNotificationToken(token: token)
}
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.
}
func postNotificationToken(token:String) {
var request = URLRequest(url: URL(string: "https://myurl?myparam="+token)!)
request.httpMethod = "GET"
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("Bearer "+self.token, forHTTPHeaderField: "myauth")
let session = URLSession.shared
let task = session.dataTask(with: request, completionHandler: { data, response, error -> Void in
let httpURLResponse = response as? HTTPURLResponse;
if (httpURLResponse?.statusCode == 200){
let string = String.init(data: data!, encoding: String.Encoding.utf8)
print(string)
} else {
print(httpURLResponse?.statusCode)
}
})
task.resume()
}
func messaging(_ messaging: Messaging, didReceive remoteMessage: MessagingRemoteMessage) {
print("Received data message: \(remoteMessage.appData)")
}
@available(iOS 10.0, *)
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void)
{
completionHandler([.alert, .badge, .sound])
}
// MARK: UISceneSession Lifecycle
}
Это мои целевые возможности:
И это мой ключ для уведомлений APN в моей учетной записи разработчика:
С консолью FCM, уведомления Все в порядке:
Спасибо за чтение этого длинного поста. Все поможет!