在后台使用 App 运行 的自定义 URL 方案
Custom URL Scheme with App running in background
我创建了一个自定义 URL 方案来从其他应用程序启动我的应用程序。如果应用程序未打开,这可以在 Safari 中使用。它用函数加载 AppDelegate:
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool
问题是当我打开应用程序并通过点击主页按钮将其置于后台时。我已设置为在 AppDelegate 中接收文本的变量不会再次被击中。我在 main VC 中设置了一个通知程序,当我将应用程序带回前台时它可以工作,但是我在 viewDidLoad 上引用的变量是空的,因为它是从 AppDelegate 读取的。根据 Apple 的文档,当自定义 url scheme 创建时,它会触发上面的函数。
The system delivers the URL to your app by calling your app delegate’s application(_:open:options:) method.
有一个 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,并与我的应用程序共享。共享后,我的应用程序应在相应的文本视图中以 url 打开。我认为使用自定义 URL 方案并处理重写 link 可能更容易,但这已被证明是一个挑战。
而不是这个通知
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
方法中的变量。如果没有收到,希望它在收到时通知您
我创建了一个自定义 URL 方案来从其他应用程序启动我的应用程序。如果应用程序未打开,这可以在 Safari 中使用。它用函数加载 AppDelegate:
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool
问题是当我打开应用程序并通过点击主页按钮将其置于后台时。我已设置为在 AppDelegate 中接收文本的变量不会再次被击中。我在 main VC 中设置了一个通知程序,当我将应用程序带回前台时它可以工作,但是我在 viewDidLoad 上引用的变量是空的,因为它是从 AppDelegate 读取的。根据 Apple 的文档,当自定义 url scheme 创建时,它会触发上面的函数。
The system delivers the URL to your app by calling your app delegate’s application(_:open:options:) method.
有一个 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,并与我的应用程序共享。共享后,我的应用程序应在相应的文本视图中以 url 打开。我认为使用自定义 URL 方案并处理重写 link 可能更容易,但这已被证明是一个挑战。
而不是这个通知
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
方法中的变量。如果没有收到,希望它在收到时通知您