Пользовательская схема URL с приложением, работающим в фоновом режиме - PullRequest
0 голосов
/ 19 мая 2019

Я создал собственную схему URL для запуска моего приложения из других приложений.Это работает из Safari, если приложение не открыто.Он загружает AppDelegate с функцией:

func application(_ app: UIApplication, open url: URL, options:  [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool

Проблема в том, что, когда у меня открыто приложение, и помещаю его в фоновый режим, нажав кнопку домой.Переменная, которую я установил для получения текста в AppDelegate, больше не попадет.У меня есть основной уведомитель, который работает, когда я возвращаю приложение на передний план, но переменная, на которую я ссылаюсь в viewDidLoad, пуста, так как она читает его из AppDelegate.Согласно документации Apple, при создании настраиваемой схемы URL-адресов она попадет в указанную выше функцию.

Система доставит URL-адрес вашего приложения, вызвав приложение делегата приложения (_: open: options:) метод.

Есть функция для applicationWillEnterForeground, но я не уверен, как получить пользовательский URL в эту функцию, если метод не вызывается.

Здесьэто то, что у меня есть:

AppDelegate:

class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?
    var receivedURL: URL?

    func application(_ app: UIApplication, open url: URL, options:  [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {

        receivedURL = url
        return true
    }

В MainViewController:

    let appDelegate = UIApplication.shared.delegate as? AppDelegate

    override fun viewDidLoad() {
       if appDelegate?.receivedURL != nil {
           urlToDecodeTextView.text = appDelegate?.receivedURL?.absoluteString
        }

NotificationCenter.default.addObserver(self, selector: #selector(handleLinks), name: UIApplication.willEnterForegroundNotification, object: nil)


    }

   @objc func handleLinks(notification: Notification) {
        print("made it back")  <-- This prints
        let test = appDelegate?.receivedURL <-- this is always nil
        urlToDecodeTextView.text = test?.absoluteString
    }

Это оригинальный код, который у меня был.Этот код прекрасно работает, если приложение не открыто, но не если приложение работает в фоновом режиме.Я заметил, что функция appdelegate запускается каждый раз, но когда происходит уведомление, значение равно нулю - даже если оно было установлено в appdelegate.

В конечном итоге я пытаюсь скопировать URL-адрес из электронного письма (текст или URL-адрес) и поделиться им с моим приложением.Когда оно будет опубликовано, мое приложение должно открыться с URL-адресом в соответствующем текстовом представлении.Я подумал, что может быть проще использовать собственную схему URL и обрабатывать переписывание ссылки, но это оказалось проблемой.

1 Ответ

0 голосов
/ 21 мая 2019

вместо этого уведомления

NotificationCenter.default.addObserver(self, selector: #selector(handleLinks), name: UIApplication.willEnterForegroundNotification, object: nil)

Вы можете сделать что-то вроде этого

Некоторое общедоступное уведомление NSNotification.Name

let customNotifKey = NSNotification.Name("InterAppURLReceived")

Затем сменить прослушиватель

var receivedURL: URL? {
    didSet {
        if receivedURL != nil {
            NotificationCenter.default.post(name: customNotifKey, object: nil)
        }
    }
}

наконец-то перехватил уведомление в VC

        NotificationCenter.default.addObserver(self, selector: #selector(handleMethod(_:)), name: customNotifKey, object: nil)

Теперь ваш VC будет знать, когда установлена ​​переменная.

Сначала проверьте переменную в методе viewWillAppear.если он не получен, ожидайте, что он уведомит вас о получении

...