我创建了一个自定义URL方案以从其他应用程序启动我的应用程序。如果该应用未打开,则可从Safari使用。它使用以下功能加载AppDelegate:
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool
问题是,当我打开应用程序时,通过单击“主页”按钮将其放置在后台。我设置为在AppDelegate中接收文本的变量不再受到攻击。我在主VC中设置了一个通知程序,当将应用程序重新放回前台时,该通知程序可以工作,但是我在viewDidLoad上引用的变量为空,因为它是从AppDelegate读取的。根据Apple的文档,创建自定义网址方案后,它将达到上面的功能。
系统通过调用应用程序代表的application(_:open:options :)方法将URL传递给您的应用程序。
有一个用于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函数每次都运行,但是当通知程序发生时,该值为nil-即使它是在appdelegate中设置的。
我最终想要做的是能够从电子邮件中复制URL(文本或URL),并与我的应用共享。共享时,我的应用程序应在相应的textview中使用url打开。我认为使用自定义URL方案和处理重写链接可能会更容易,但是事实证明这是一个挑战。
答案 0 :(得分:0)
代替此通知
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
方法中检查变量。如果未收到,希望它在收到时通知您