Здравствуйте, я использую webview для отображения своего содержимого в своем приложении. Я успешно зарегистрировался в firebase. Теперь я хочу передать токен регистрации через URL-адрес для хранения в БД для настраиваемого уведомления.
appdelegate.swift
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
let token = deviceToken.map {String (format: "%02.2hhx", $0)}.joined()
print(token)
}
Firebase
extension AppDelegate: MessagingDelegate {
func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String) {
print("Firebase registration token: \(fcmToken)")
//Saving fcmToken to pass to the url
let preferences = UserDefaults.standard
preferences.setValue(fcmToken, forKey: "token")
preferences.synchronize()
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.
}
а это для viewcontroller.swift
override func viewDidLoad() {
super.viewDidLoad()
//Retrieving the fcmToken
let prefs = UserDefaults.standard
let token = prefs.string(forKey: "token")
//?token= \(token as Optional)&device=ios
webView.load(URLRequest(url: URL(string: "https://instaglamexpress.com/app/customer/?device=ios&token=\(String(describing: token))")!))
}
Я не могу отправить токен в URL..
пожалуйста, предложите решение.
Вам не нужно использовать synchronize





Здесь вам нужна необязательная привязка с if let, потому что prefs.string(forKey: "token") вернет необязательное значение.
Рассмотрим ниже код:
let prefs = UserDefaults.standard
if let token = prefs.string(forKey: "token") {
//token is not optional anymore
webView.load(URLRequest(url: URL(string: "https://instaglamexpress.com/app/customer/?device=ios&token=\(token))")!))
}
Или вы можете использовать guard let, который сделает ту же работу.
Теперь у меня пустой экран... когда я пытаюсь запустить симулятор и реальное устройство...
Вы проверили этот URL в браузере?
[C1.1:2][0x7fd37a80fa30] не удалось получить выходные кадры, состояние 8196... Я получаю это в информационной панели...
можешь распечатать "https://instaglamexpress.com/app/customer/?device=ios&token=\(token))" и поделиться результатом?
Где и как печатать...?? Я получаю сообщение «ошибка получения выходного кадра, состояние 8196» во всех выходных данных.
let prefs = UserDefaults.standard //var token : String! let token = prefs.string(forKey: "токен") //?token= (токен необязателен)&device=ios print("Доступ к токену: (строка(описание: токен))") webView.load(URLRequest(url: URL(string: "instaglamexpress.com/app/customer/…: token)))")!)) } когда я использую этот код, приложение загружается нормально, но не получает токен. он показывает ноль на моей странице ..
Это означает, что вы не сохраняете его правильно. Так что проверяйте, когда вы его сохраняете.
Привет, проверил ваш код и изменил, и он работает
модификация последней части
override func viewDidLoad() {
super.viewDidLoad()
//Retrieving the fcmToken
let prefs = UserDefaults.standard
let token = prefs.string(forKey: "token") ?? ""
webView.load(URLRequest(url: URL(string: "https://instaglamexpress.com/app/customer/?device=ios&token = "+token)!))
}
Это просто строка, и Xcode предлагает объединить
let token = prefs.string(forKey: "token") ?? ""
и просто используйте токен как обычную переменную без всяких причудливых вещей "url"+token и вуаля
;)
Примечание: когда вы нажимаете кнопку воспроизведения, и xcode компилирует его, он пуст (но только в первый раз), вы выходите из приложения и снова открываете его в обычном режиме, и все в порядке.
Вы можете отправить его следующим образом: stackoverflow.com/q/1142562/2323806