Ios Swift UIApplication.shared.open从后台应用程序不工作
我正在尝试从后台的另一个应用程序(appB)向应用程序(appA)发送消息 从苹果文档()看来这是可能的 然而,我看到的是,当appB在前台时,我可以从appB启动appA 当appB在后台时,方法会触发(我在Xcode中看到print语句),但在Ios Swift UIApplication.shared.open从后台应用程序不工作,ios,swift,background-process,deep-linking,Ios,Swift,Background Process,Deep Linking,我正在尝试从后台的另一个应用程序(appB)向应用程序(appA)发送消息 从苹果文档()看来这是可能的 然而,我看到的是,当appB在前台时,我可以从appB启动appA 当appB在后台时,方法会触发(我在Xcode中看到print语句),但在 application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool appA应用程序代
application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool
appA应用程序代理中的函数
这种行为是不允许的吗
我甚至在plist中添加了appB的背景模式
class ViewController: UIViewController {
let kUrlSceme = "customScheme://?hello"
@IBOutlet weak var logTxtView: UITextView!
var runningLog: String = ""
var executionTimer: Timer!
var backgroundTask: UIBackgroundTaskIdentifier = UIBackgroundTaskInvalid
override func viewDidLoad() {
super.viewDidLoad()
self.openOtherApp()
executionTimer = Timer.scheduledTimer(timeInterval: 5.0, target: self, selector: #selector(self.openOtherAppFromTimer), userInfo: nil, repeats: true)
registerBackgroundTask()
}
func registerBackgroundTask() {
let str: String = "Background task started."
print(str)
runningLog.append(str)
logTxtView.text = runningLog
backgroundTask = UIApplication.shared.beginBackgroundTask(expirationHandler: {
[unowned self] in
self.endBackgroundTask()
})
assert(backgroundTask != UIBackgroundTaskInvalid)
}
func endBackgroundTask() {
let str: String = "Background task ended."
print(str)
runningLog.append(str)
logTxtView.text = runningLog
// UIApplication.shared.endBackgroundTask(backgroundTask)
// backgroundTask = UIBackgroundTaskInvalid
}
@objc func openOtherAppFromTimer() {
// executionTimer.invalidate()
var str: String = "Attempting to call fromt he timer."
runningLog.append(str)
logTxtView.text = runningLog
//
// self.openOtherApp()
let theURLSceme = URL(string: kUrlSceme)!
if UIApplication.shared.canOpenURL(theURLSceme) {
UIApplication.shared.open(theURLSceme)
str = "We have permission to open the URL (\(kUrlSceme)).\n"
print(str)
runningLog.append(str)
logTxtView.text = runningLog
} else {
str = "Looks like we don't have permission to open \(kUrlSceme).\n"
print(str)
runningLog.append(str)
logTxtView.text = str
}
}
func openOtherApp() {
var str: String = ""
if openDeepLinkScheme(customURLScheme: kUrlSceme) {
str = "app was opened with the URL: \(kUrlSceme)\n\n"
print(str)
runningLog.append(str)
logTxtView.text = runningLog
} else {
str = "app was not opened\n"
print(str)
runningLog.append(str)
logTxtView.text = runningLog
}
}
func openDeepLinkScheme(customURLScheme: String) -> Bool {
let theURLSceme = URL(string: customURLScheme)!
var str: String = ""
if UIApplication.shared.canOpenURL(theURLSceme) {
UIApplication.shared.open(theURLSceme)
str = "We have permission to open the URL (\(kUrlSceme)).\n"
print(str)
runningLog.append(str)
logTxtView.text = runningLog
return true
}
str = "Looks like we don't have permission to open \(kUrlSceme).\n"
print(str)
runningLog.append(str)
logTxtView.text = str
return false
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
谢谢你的帮助。没错。当应用程序处于后台时,不允许以这种方式将其带到前台。请这样想:您正在设备上玩一个应用程序,突然又启动了另一个应用程序。你希望这样吗?我正在与之通信的应用程序的可能副本在前台。我想从后台appB向前台appA发送一条消息。我在appB(后台)上使用fire的方法,但appA(前台)从未收到过。我看到您建议的方法是重复的()。很遗憾,情况真的不一样了。如果是的话,那就太好了。主线程/非主线程在此实例中不计算,因为我不在同一个应用程序中。整个应用程序都是以背景为基础的。除非你是说另一篇文章证明了这是不可能的——但我不这么认为。谢谢。我似乎不被允许提供一个令人满意的答案,所以我将在这里的评论中提供一个答案,以帮助其他可能有相同问题的人:Ozgur Vatansever是正确的。请参见编辑。当应用程序处于后台时,不允许以这种方式将其带到前台。请这样想:您正在设备上玩一个应用程序,突然又启动了另一个应用程序。你想这样吗?没错。当应用程序处于后台时,不允许以这种方式将其带到前台。请这样想:您正在设备上玩一个应用程序,突然又启动了另一个应用程序。你希望这样吗?我正在与之通信的应用程序的可能副本在前台。我想从后台appB向前台appA发送一条消息。我在appB(后台)上使用fire的方法,但appA(前台)从未收到过。我看到您建议的方法是重复的()。很遗憾,情况真的不一样了。如果是的话,那就太好了。主线程/非主线程在此实例中不计算,因为我不在同一个应用程序中。整个应用程序都是以背景为基础的。除非你是说另一篇文章证明了这是不可能的——但我不这么认为。谢谢。我似乎不被允许提供一个令人满意的答案,所以我将在这里的评论中提供一个答案,以帮助其他可能有相同问题的人:Ozgur Vatansever是正确的。请参见编辑。当应用程序处于后台时,不允许以这种方式将其带到前台。请这样想:您正在设备上玩一个应用程序,突然又启动了另一个应用程序。你希望这样吗?