Ios Swift UIApplication.shared.open从后台应用程序不工作

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应用程序代

我正在尝试从后台的另一个应用程序(appB)向应用程序(appA)发送消息

从苹果文档()看来这是可能的

然而,我看到的是,当appB在前台时,我可以从appB启动appA

当appB在后台时,方法会触发(我在Xcode中看到print语句),但在

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是正确的。请参见编辑。当应用程序处于后台时,不允许以这种方式将其带到前台。请这样想:您正在设备上玩一个应用程序,突然又启动了另一个应用程序。你希望这样吗?