問題描述
實現(xiàn) iOS 開發(fā)中常見的一種情景:A App 打開 B App脯厨,B App 執(zhí)行某些操作后再返回 A App霉咨。
實現(xiàn)方式
方式一
- A App 配置 URL Scheme 為
appA
,并且注冊白名單appB
整份。 - B App 配置 URL Scheme 為
appB
腹泌,并且注冊白名單appA
套菜。 - A App 跳轉(zhuǎn)到 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 跳轉(zhuǎn)到 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)
}
}
}
注意:方式一與方式二最大的區(qū)別是方式二中 B App 沒有將 A App 的 URL Scheme 注冊為白名單。