2017-10-05 3 views
0

EDIT 2: Ozgur Vatansever ist absolut richtig! Schließen.Swift UIApplication.shared.open von Hintergrund-App funktioniert nicht

Details:

Der Link unten ist richtig, wenn Sie durch lesen, was es ein paar Mal sagen. Auch dies ist eine gute Verbindung:

iOS: Deeplinking in the background

Apple-Docs:

https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html

Wenn Sie die Apple-docs lesen sie klingen wie Sie dies tun dürfen - aber was sie wirklich sagen ist, dass Sie die Hintergrund-App den Code ausführen lassen können, aber es wird nie die Sandbox der Hintergrund-App verlassen.

Die einzigen Dinge, die im Hintergrund ausgeführt werden dürfen, sind die 9 Dinge, die in den Dokumenten aufgelistet sind - weil sie sicher sind.

Weitere Beiträge:

erkannte ich, dass die anderen Beiträge, was wirklich sagen, ist, dass, wenn (Link auf Android) Sie nur Nachrichten an andere Anwendungen auf diese Weise senden durften Sie auch eine beliebige Anzahl zu öffnen wäre in der Lage von Apps und erstellen Sie einen Man-in-the-Middle-Angriff.

So macht es Sinn, dass Sie es nicht tun können, es sei denn, Sie befinden sich in der Liste der erlaubten Operationen in der weißen Liste.

Danke für die Geduld. Volle Punktzahl für Ozgur Vatansever.

EDIT: Ich denke, dass ich zu verstehen, was Ozgur Vatansever ein wenig besser jetzt sagt.

Ich denke, dass das, was sie sagen, ist, dass die Art der Aktion, die ich zu tun versuche, ist nicht in der Whitelist von Apple zur Verfügung gestellt: https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html#//apple_ref/doc/uid/TP40007072-CH4-SW23

Ich wurde gesagt, dass dies möglich war, in meinem Fall. Also werde ich diese Frage untersuchen und abschließen/aktualisieren, wie es heute angebracht ist.

Dank

Ich versuche, eine Nachricht an eine App (appA) von einer anderen App zu senden, die (AppB) im Hintergrund ist.

Scheint wie aus dem Apple Docs (https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html), dass es möglich ist.

Was ich jedoch sehe, ist, dass ich AppA von AppB starten kann, wenn appB im Vordergrund ist.

Wenn AppB ist im Hintergrund die Methoden Feuer (I die print-Anweisungen in Xcode sehen), aber sie sind in der

application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool 

Funktion in dem App Delegierten der appA

Ist dieses Verhalten nicht empfangen nicht erlaubt?

Ich habe sogar die Hintergrund-Modi für appB im Plist hinzugefügt.

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. 
} 


} 

Danke für die Hilfe.

+4

Das stimmt. Es ist nicht erlaubt, eine App so in den Vordergrund zu stellen, wenn sie im Hintergrund ist. Denken Sie so: Sie spielen mit einer App auf Ihrem Gerät herum und plötzlich wird eine andere App gestartet. Möchtest du, dass das passiert? – ozgur

+0

Mögliches Duplikat von [UIApplication openURL background] (https://stackoverflow.com/questions/4170254/uiapplication-openurl-background) – ozgur

+0

Die App, mit der ich kommuniziere, steht * IS * im Vordergrund. Ich möchte eine Nachricht von der Hintergrund-AppB an die Vordergrund-AppA senden. Die Methoden, die ich benutze, feuern auf appB (Hintergrund), werden aber nie von appA (Vordergrund) empfangen. – addzo

Antwort

0

Ozgur Vatansever war korrekt. Siehe Bearbeitungen.