загрузка URL из схемы не обрабатывается в первый раз - appdelegate vs viewcontroller - PullRequest
0 голосов
/ 27 апреля 2019

Мое приложение успешно открывает и устанавливает параметры (из URL-схемы, т.е. myApp: // sometextToPrint) в переменную в классе AppDelegate, но всякий раз, когда я хочу обработать их, в первый раз происходит сбой, когда приложение открыт с этого URL. У меня есть приложение в программе проверки переднего плана, которое вызывает функцию для печати заданных параметров, но почему-то похоже, что AppDelegate загружается позже, чем представление, почему представление не может распечатать параметры при первой загрузке.

Мой код выглядит следующим образом:

AppDelegate.m

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

let geturl = url.host?.removingPercentEncoding;
UserDefaults.standard.set(geturl, forKey: "DeepLinkUrl")
return true
}

ViewController.m

override func viewDidLoad() {
    super.viewDidLoad()
    NotificationCenter.default.addObserver(self, selector: #selector(appWillEnterForeground),name: UIApplication.willEnterForegroundNotification, object: nil)

}

@objc func appWillEnterForeground() {
    print("app on foreground")
    let user = UserDefaults.standard
    if user.url(forKey: "DeepLinkUrl") != nil {

    let str = user.value(forKey: "DeepLinkUrl") as! String
    print(str) //this is printed on the second time when I click home button and open app again
    }
}

Например, если я захожу в Safari и нажимаю следующий URL: myApp: // printthistext, текст не печатается. Он печатается, когда я нажимаю кнопку «Домой» и снова нажимаю на приложение.

P.s. Я новичок в Swift и точно не знаю, какой класс (AppDelegate или ViewContoller) загружается / обрабатывается первым. Я уже почти 5 часов пытаюсь это исправить, все еще продолжаю печатать во второй раз.

Ответы [ 2 ]

0 голосов
/ 27 апреля 2019

@ SalihanPamuk Я думаю, это связано с методом appWillEnterForeground().UIApplication.willEnterForegroundNotification - это первое уведомление о том, что приложение выходит на передний план.

Поскольку вы уже зарегистрировали наблюдателя для прослушивания этого уведомления, метод appWillEnterForeground() будет вызываться до того, как

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

appDelegate попытается реализовать

func applicationWillEnterForeground(_ application: UIApplication) {
    // Do your stuffs here 
}

из appDelegate.Или, если вы хотите показать какой-либо конкретный ViewController после открытия приложения с помощью любого URL-адреса, настройте код для отображения этого ViewController внутри

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

// implemet your code here 

}
0 голосов
/ 27 апреля 2019

Скопируйте код из

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

в

func application(_ application: UIApplication, 
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) 
    -> Bool {

. В этом методе отметьте launchOptions.Если он содержит клавишу url, возьмите это значение и верните false.

if let url = launchOptions[.url] as? URL {
    let geturl = url.host?.removingPercentEncoding
    UserDefaults.standard.set(geturl, forKey: "DeepLinkUrl")
    return false
}
...