2017-10-05 6 views
0

EDIT 2: Ozgur Vatansever est absolument correct! Fermeture.Swift UIApplication.shared.open à partir de l'application en arrière-plan ne fonctionne pas

Détails:

Le lien ci-dessous est correct si vous lisez ce qu'il dit à quelques reprises. Aussi c'est un bon lien:

iOS: Deeplinking in the background

d'Apple Docs:

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

Si vous lisez la documentation d'Apple, ils sonnent comme vous êtes autorisé à le faire - mais ce qu'ils disent vraiment c'est que vous pouvez faire en sorte que l'application en arrière-plan exécute le code correctement, mais elle ne quittera jamais le sandbox de l'application en arrière-plan.

Ainsi, les seules choses qui peuvent être exécutées en arrière-plan pour d'autres applications sont les 9 éléments répertoriés dans les documents, car ils sont sécurisés.

Autres messages:

j'ai réalisé que ce que les autres postes sont en train de dire est que si (lien sur Android) vous laissiez simplement envoyer des messages à d'autres applications de cette façon vous également être en mesure d'ouvrir un numéro d'applications et de créer une attaque de l'homme dans le milieu.

Il est donc logique que vous ne puissiez pas le faire à moins que vous ne figuriez dans le groupe des opérations autorisées listées en blanc.

Merci pour la patience. Toutes les notes à Ozgur Vatansever.

EDIT: Je pense que je comprends ce que Ozgur Vatansever dit un peu mieux maintenant.

Je pense que ce qu'ils disaient que le type d'action que je suis en train de faire est pas dans la liste blanche fourni par Apple: https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html#//apple_ref/doc/uid/TP40007072-CH4-SW23

On m'a dit que cela était possible dans mon cas. Je vais donc enquêter et fermer/mettre à jour cette question comme il convient aujourd'hui.

Merci

J'essaie d'envoyer un message à une application (APPA) d'une autre application qui est en arrière-plan (AppB).

On dirait que cela vient des documents Apple (https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html) que c'est possible. Ce que je vois, cependant, c'est que je peux lancer appA à partir d'appB quand appB est au premier plan.

Lorsque AppB est en arrière-plan les méthodes feu (je vois les déclarations d'impression dans Xcode), mais ils ne sont pas reçus dans le

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

dans le délégué de l'application de l'APPA

Est-ce comportement interdit?

J'ai même ajouté les modes d'arrière-plan pour appB dans le plist.

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


} 

Merci pour l'aide.

+4

C'est vrai. Vous n'êtes pas autorisé à mettre une application à l'avant-plan de cette façon lorsqu'elle est en arrière-plan. Pensez à cette façon: vous jouez avec une application sur votre appareil et soudainement une autre application est lancée. Souhaitez-vous que cela arrive? – ozgur

+0

Copie possible de [fond d'OpenURL UIApplication] (https://stackoverflow.com/questions/4170254/uiapplication-openurl-background) – ozgur

+0

L'application avec laquelle je communique * EST * au premier plan. Je souhaite envoyer un message de l'application de base à l'application de premier plan appA. Les méthodes que j'utilise fire sur appB (background) mais ne sont jamais reçues par appA (premier plan) – addzo

Répondre

0

Ozgur Vatansever avait raison. Voir les modifications.