2014-10-22 11 views
13

Sto tentando di tornare alla schermata iniziale in modo programmatico in un'app iOS8 utilizzando Swift. Voglio continuare l'applicazione in esecuzione in background però. Qualche idea su come fare questo?Come uscire dall'app e tornare alla schermata iniziale in iOS 8 utilizzando la programmazione Swift

Grazie in anticipo per l'aiuto.

+4

In termini di invio a livello di codice l'applicazione in secondo piano e tornare alla schermata iniziale, non è necessario. Vedi http://stackoverflow.com/q/5360846/1271826. Per quanto riguarda il mantenere l'app in esecuzione in background, ci sono diversi modi per farlo a seconda di ciò che l'app sta facendo in background. Vedi [Guida alla programmazione app per iOS: Esecuzione in background] (https://developer.apple.com/library/ios/documentation/iphone/conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html#//apple_ref/doc/uid/TP40007072- CH4-SW1). – Rob

+2

Ricordati anche che l'unico modo per tornare alla "schermata principale" è uccidere la tua app. Apple vedrà questo un arresto anomalo e rifiuterà la tua app. – rckoenes

+0

questo è troppo male - grazie per le risposte –

risposta

9

Per questo è necessario utilizzare codice seguente

 
import Darwin 
exit(0) 
0

Non v'è alcun modo di "programmazione tornare alla schermata iniziale" ad eccezione di crash, la chiusura del programma o chiamando API non ufficiali. Né è il benvenuto da Apple. Inoltre, le linee guida dell'interfaccia umana coprono anche questo.

23

Quando un'app viene avviata, il sistema chiama la funzione UIApplicationMain; tra le altre attività, questa funzione crea un oggetto singleton UIApplication. Successivamente, accedi all'oggetto chiamando il metodo della classe sharedApplication.

Per uscire con grazia (biblioteca sviluppatore iOS avverte esplicitamente di non utilizzare l'uscita (0), perché questo viene registrato come un incidente) è possibile utilizzare:

UIControl().sendAction(#selector(URLSessionTask.suspend), to: UIApplication.shared, for: nil) 

Per esempio, le mie uscite app quando l'utente scuote il dispositivo. Così, in ViewController.swift:

override func motionEnded(motion: UIEventSubtype, 
    withEvent event: UIEvent?) { 

     if motion == .MotionShake{ 

      //Comment: to terminate app, do not use exit(0) bc that is logged as a crash. 

      UIControl().sendAction(Selector("suspend"), to: UIApplication.sharedApplication(), forEvent: nil) 
     }} 
+2

xcode 7.3.1 auto suggerisce di cambiare 'Selettore ("suspend")' a '#selector (NSURLSessionTask.suspend)'. Sembra funzionare. Non sono sicuro di come verificare se c'è un crash nel simulatore. – rockhammer

+0

In realtà posso verificare che funzioni. Nell'app cronometro che sto costruendo, il codice di reinaH nasconde l'app quando il cronometro tiene il tempo e quando viene girato. Tocca due volte il pulsante Home per richiamare l'app e l'app ha continuato a tenere il tempo correttamente. – rockhammer

+1

Aggiornamento a Swift 3 UIControl(). SendAction (#selector (URLSessionTask.suspend), a: UIApplication.shared, per: nil) –

0

Per forzare la tua applicazione in secondo piano, si può legalmente lanciare un'altra applicazione, come ad esempio Safari, tramite un URL, in primo piano.

See: how to open an URL in Swift3

UIApplication.shared.open() (e il più vecchio openURL) sono documentate API pubbliche.

Se si imposta il tasto plist di uscita-su-sospensione, l'apertura di un'altra app tramite URL causerà anche la chiusura della propria app. L'uso di questa chiave è un uso legale documentato delle chiavi plist di app, disponibile per qualsiasi applicazione da utilizzare "legalmente".

Inoltre, se la tua app, per qualche scortese motivo, continua ad allocare e sporcare grandi quantità di memoria in background, senza rispondere agli avvisi di memoria, il sistema operativo molto probabilmente lo ucciderà.

10

Swift 4:

UIControl().sendAction(#selector(NSXPCConnection.suspend), 
         to: UIApplication.shared, for: nil) 
Problemi correlati