从方案中加载网址,而不是第一次处理-appdelegate与Viewcontroller

时间:2019-04-27 13:16:42

标签: ios swift viewcontroller appdelegate url-scheme

我的应用程序已成功打开并将参数(从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。我是新手,还不完全知道哪个类(AppDelegate或ViewContoller)首先被加载/处理。我已经尝试了将近5个小时来解决此问题,但仍然第二次继续打印。

2 个答案:

答案 0 :(得分:0)

复制代码
.after()

进入

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

答案 1 :(得分:0)

@SalihanPamuk我认为这是由于appWillEnterForeground()方法造成的。 UIApplication.willEnterForegroundNotification-这是发布应用程序即将到来的第一个通知。

由于您已经注册了一个观察者来侦听此通知,因此appWillEnterForeground()方法将在appDelegate的

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

尝试实现appDelegate的

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

或者,如果您想在使用任何URL打开应用后显示任何特定的ViewController,请在

内部显示该ViewController的代码
func application(_ app: UIApplication, open url: URL, options: 
[UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {

// implemet your code here 

}