在iOS中处理自定义URL方案的技巧和教程不乏不足。 ALL所做的全部实际上是向您展示了如何将这些URL解析的数据传递给您的应用程序/视图。是的,我可以使用全局变量,但这不是“正确”的方法,而且如果您希望Swift视图对该全局变量的更改做出反应,则不能。
例如,我有,
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>){
let urlContext = URLContexts.first // Because I don't know how to properly deal with Sets
if let url = urlContext?.url{
guard let components = NSURLComponents(url: url, resolvingAgainstBaseURL: true),
let params = components.queryItems else {
print("Invalid URL or album path missing")
return
}
if let token = params.first(where: { $0.name == "token" })?.value {
print("Token: \(token)")
MyGlobalToken = token
}
}
}
您会在其中看到有效的MyGlobalToken
选项,但我无法响应该变量的更改。我是否需要对self.window?.rootViewController
做些事情,但是找不到有关该怎么做的任何文档。还是您设置了“通知”,以便您查看响应?还是在SwiftUI中尚未实现?
FWIW我是iOS开发的新手。
我在这个问题上有很多麻烦。我对IOS并不了解很多。但是没有答案。我写如果不使用sceneDelegate,则可以使用全局变量。(我不知道为什么它不起作用)
为此,我喜欢以下。
initialLize检查变量
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
UserDefaults.check = ""
return true
}
在Appdelegate中添加行以设置全局变量。
open func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
//set Global variable
// ... You should add check url for your application ...
UserDefaults.check = "checked"
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
if let uservc = self.storyboard?.instantiateViewController(withIdentifier: "MainViewController") as? MainViewController
{
if #available(iOS 13.0, *) {
uservc.isModalInPresentation = true
}
uservc.debugText.text = "This is openUrl State"
self.present(uservc, animated: false) {
}
}
}
制作IntroViewController和MainViewController
IntroViewController是rootviewcontroller。
并且MainViewController是第二个视图控制器。
如果检查变量被“检查”,则不会执行IntroView中的Viewdidload。
这次是应用程序打开,使用野生动物园或Chrome浏览器。
//IntroViewController
class IntroViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
DispatchQueue.main.asyncAfter(deadline: .now() + 3.0) {
if UserDefaults.check.elementsEqual("") {
if let uservc =
self.storyboard?.instantiateViewController(withIdentifier: "MainViewController") as? MainViewController
{
if #available(iOS 13.0, *) {
uservc.isModalInPresentation = true
}
uservc.debugText.text = "This is normal State"
self.present(uservc, animated: false) {
}
}
}
}
6。全局变量
//UserDefaults.swift
import Foundation
fileprivate let keyCheck = "keyCheck"
extension UserDefaults {
static var check: String {
get {
return UserDefaults.standard.string(forKey: keyCheck) ?? ""
}
set(value) {
UserDefaults.standard.set(value, forKey: keyCheck)
UserDefaults.standard.synchronize()
}
}
}
当我在scenedelegate中使用此逻辑时,它不能很好地工作。(我无法检查“检查变量”。)