问题描述
实现 iOS 开发中常见的一种情景:A App 打开 B App,B App 执行某些操作后再返回 A App。
实现方式
方式一
- A App 配置 URL Scheme 为
appA
,并且注册白名单appB
。 - B App 配置 URL Scheme 为
appB
,并且注册白名单appA
。 - A App 跳转到 B App。
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .red
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
if let url = URL(string: "appB://") {
if UIApplication.shared.canOpenURL(url) {
UIApplication.shared.open(url, options: [:], completionHandler: nil)
}
}
}
}
- B App 接收 A App 的 URL Scheme,并且在任务完成之后跳回 A App。
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
if let url = URL(string: "appA://") {
if UIApplication.shared.canOpenURL(url) {
DispatchQueue.main.asyncAfter(wallDeadline: .now() + 1) {
UIApplication.shared.open(url, options: [:], completionHandler: nil)
}
}
}
}
方式二
- A App 配置 URL Scheme 为
appA
,并且注册白名单appB
。 - B App 配置 URL Scheme 为
appB
,但不注册白名单appA
。 - A App 跳转到 B App。
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .red
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
if let url = URL(string: "appB://?param=appA://AcallB") {
if UIApplication.shared.canOpenURL(url) {
UIApplication.shared.open(url, options: [:], completionHandler: nil)
}
}
}
}
- B App 接收 A App 的 URL Scheme,并且在任务完成之后跳回 A App。
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
if let url = URLContexts.first?.url,
let param = url.query?.split(separator: "=").last,
let returnURL = URL(string: String(param)) {
DispatchQueue.main.asyncAfter(wallDeadline: .now() + 1) {
UIApplication.shared.open(returnURL, options: [:], completionHandler: nil)
}
}
}
注意:方式一与方式二最大的区别是方式二中 B App 没有将 A App 的 URL Scheme 注册为白名单。