Передать токен через URL-адрес в Webview IOS Swift

Здравствуйте, я использую 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..

пожалуйста, предложите решение.

Вы можете отправить его следующим образом: stackoverflow.com/q/1142562/2323806

Vinaykrishnan. 20.02.2019 08:59

Вам не нужно использовать synchronize

Dharmesh Kheni 20.02.2019 09:05
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
1 530
2

Ответы 2

Здесь вам нужна необязательная привязка с 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, который сделает ту же работу.

Теперь у меня пустой экран... когда я пытаюсь запустить симулятор и реальное устройство...

Umar Shekh 22.02.2019 09:58

Вы проверили этот URL в браузере?

Dharmesh Kheni 22.02.2019 10:13

[C1.1:2][0x7fd37a80fa30] не удалось получить выходные кадры, состояние 8196... Я получаю это в информационной панели...

Umar Shekh 22.02.2019 10:17

можешь распечатать "https://instaglamexpress.com/app/customer/?device=ios&token‌​=\(token))" и поделиться результатом?

Dharmesh Kheni 22.02.2019 10:18

Где и как печатать...?? Я получаю сообщение «ошибка получения выходного кадра, состояние 8196» во всех выходных данных.

Umar Shekh 22.02.2019 11:29

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)))")!)) } когда я использую этот код, приложение загружается нормально, но не получает токен. он показывает ноль на моей странице ..

Umar Shekh 22.02.2019 11:32

Это означает, что вы не сохраняете его правильно. Так что проверяйте, когда вы его сохраняете.

Dharmesh Kheni 22.02.2019 12:08

Привет, проверил ваш код и изменил, и он работает

модификация последней части

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 компилирует его, он пуст (но только в первый раз), вы выходите из приложения и снова открываете его в обычном режиме, и все в порядке.

Другие вопросы по теме