2013-04-16 19 views
5

Sto provando a consentire alla mia app di funzionare in background per più di 10 minuti, in base a questo e al mio bene di seguito. (Voglio utilizzare un lungo background in esecuzione per tenere traccia di una posizione, il mio codice qui semplicemente basta usare un contatore per scopi di test) Chiunque può aiutare a indicare qual è il problema?Applicazione iOS in background per più di 10 minuti

realizzazione di compiti di lungo corso sfondo

Per le attività che richiedono più tempo di esecuzione per attuare, è necessario richiesta autorizzazioni specifiche per farli funzionare in background senza loro essere sospesi. In iOS, tipi app solo specifici sono autorizzati a eseguire in background:

Apps che giocano contenuti udibile per l'utente, mentre sullo sfondo, come ad esempio un lettore musicale app

applicazioni che mantengono gli utenti informati la loro posizione in ogni momento, come ad esempio un'applicazione di navigazione

applicazioni che supportano Voice over Internet Protocol (VoIP)

app Edicola che hanno bisogno di scaricare ed elaborare nuove applicazioni di contenuti che ricevono aggiornamenti regolari da accessori esterni

Le app che implementano questi servizi devono dichiarare i servizi che supportano e utilizzare i framework di sistema per implementare gli aspetti rilevanti di tali servizi. La dichiarazione dei servizi consente al sistema di sapere quali servizi di si utilizzano, ma in alcuni casi sono le strutture di sistema che impediscono effettivamente la sospensione dell'applicazione.

- (void)viewDidLoad { 
      [super viewDidLoad]; 

     counterTask = [[UIApplication sharedApplication] 
         beginBackgroundTaskWithExpirationHandler:^{ 

         }]; 
       count=0; 

     theTimer=[NSTimer scheduledTimerWithTimeInterval:0.1 
                target:self 
               selector:@selector(countUp) 
               userInfo:nil 
               repeats:YES]; 
     } 
    - (void)countUp { 

     { 
      count++; 
      NSString *currentCount; 
      currentCount=[[NSString alloc] initWithFormat:@"%ld",count]; 
      theCount.text=currentCount; 
      [currentCount release]; 
     } 
     } 

un'altra domanda: posso avere un App iOS eseguito in background per sempre?

---- Codice modificato per aggiungere posizione, non funziona ancora per più di 10 minuti, qualsiasi aiuto a ciò che sto facendo male?

- (void)viewDidLoad { 
    [super viewDidLoad]; 

count=0; 

locationManager = [[CLLocationManager alloc] init]; 
locationManager.delegate = self; 
locationManager.distanceFilter = kCLDistanceFilterNone; 
locationManager.desiredAccuracy = kCLLocationAccuracyBest; 

[locationManager startUpdatingLocation]; 

counterTask = [[UIApplication sharedApplication] 
       beginBackgroundTaskWithExpirationHandler:^{ 
        // If you're worried about exceeding 10 minutes, handle it here 

        [locationManager startUpdatingLocation]; 
       }]; 
theTimer=[NSTimer scheduledTimerWithTimeInterval:0.1 
              target:self 
             selector:@selector(countUp) 
             userInfo:nil 
             repeats:YES]; 

} 



    (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { 
NSLog(@"OldLocation %f %f", oldLocation.coordinate.latitude, oldLocation.coordinate.longitude); NSLog(@"NewLocation %f %f", newLocation.coordinate.latitude, newLocation.coordinate.longitude); 

    count++; NSString *currentCount; 
currentCount=[[NSString alloc] initWithFormat:@"%ld",count]; 
theCount.text=currentCount; [currentCount release]; 
} 

    (void)countUp { [locationManager startUpdatingLocation]; 
{ count++; NSString *currentCount; 
currentCount=[[NSString alloc] initWithFormat:@"%ld",count]; 
theCount.text=currentCount; 
[currentCount release]; } } 
+0

Hai specificato quali applicazioni possono essere eseguite in background se l'app non rientra in una di queste categorie, quindi sei fuori se la fortuna. Non c'è modo di far sì che l'app venga eseguita in background per sempre. Apple non lo permetterà perché ucciderà la durata della batteria. Neanch'io, come utente, desidero mai un'applicazione come questa. Perché la tua app deve essere sempre in esecuzione ??? – rckoenes

+0

appartiene specificamente alle categorie specificate (le app che tengono gli utenti sempre informati della loro posizione, come un'app di navigazione) quando eseguo il test delle attività in background del codice rimangono solo per 10 minuti, dovrei usare la posizione anche per test invece del solo contatore? – Ahmad

+0

Se l'app utilizza la posizione in background, è necessario avviare 'CLLocationManager' per ricevere le principali modifiche alla posizione. Quindi la tua app verrà informata quando l'utente cambia posizione. – rckoenes

risposta

4

Così la tua app utilizza i servizi di localizzazione. Quindi leggi lo Location Awareness Programming Guide.

È necessario apportare alcune modifiche al Info.plist:

  • Se la vostra applicazione si basa su servizi di localizzazione per funzionare correttamente, aggiungere location-services-UIRequiredDeviceCapabilities
  • se la vostra applicazione richiede hardware GPS, aggiungi gps a UIRequiredDeviceCapabilities
  • se è necessario eseguire l'app più a lungo di 10 minuti in background, aggiungere location a UIBackgroundModes. Quindi il tuo responsabile della posizione fornirà posizioni oltre il limite di 10 minuti.
  • È inoltre necessario impostare NSLocationUsageDescription (può anche essere localizzate)

il recupero della posizione Eventi in fondo

Se la vostra applicazione ha bisogno di aggiornamenti di posizione consegnato se l'applicazione è in primo piano o sfondo, ci sono più opzioni per farlo. L'opzione preferita di consiste nell'utilizzare il servizio di cambio di posizione significativo su e riattivare l'app nei momenti appropriati per gestire nuovi eventi. Tuttavia, se l'app deve utilizzare il servizio di posizione standard, è possibile dichiarare l'app come necessaria per i servizi di localizzazione in background.

Un'app deve richiedere servizi di localizzazione in background solo se l'assenza di tali servizi comprometterebbe la sua capacità di operare. Inoltre, qualsiasi app che richiede servizi di localizzazione in background dovrebbe utilizzare tali servizi per fornire un beneficio tangibile all'utente. Ad esempio, un'app di navigazione turn-by-turn sarebbe un probabile candidato per lo sfondo servizi di localizzazione a causa della sua necessità di tracciare la posizione dell'utente e rapporto quando è il momento di fare il giro successivo.

+0

Grazie per la risposta, ho fatto i cambiamenti che hai scritto, ma non sapevo come fare l'ultimo punto (si dovrebbe anche impostare NSLocationUsageDescription (può anche essere localizzato)) Si prega di controllare il mio codice di cui sopra Grazie molto per il tuo aiuto – Ahmad

+0

Grazie mille, il problema è risolto: D – Ahmad

+0

@ahmadNazmi fai riferimento a questa risposta http://stackoverflow.com/a/12582916/550177 – Felix

1

s' See phix23 risposta (e la documentazione) per i dettagli, ma qui voglio spiegare che cosa ci si può aspettare che accada.

Questo è tutto più o meno coperti nella documentazione che è stato citato da.

Qualsiasi applicazione può essere eseguita in background per un massimo di dieci minuti. Questo è ciò che fa il metodo beginBackgroundTaskWithExpirationHandler:. Indipendentemente da quali flag e opzioni hai impostato, è tutto ciò che otterrai usando quel metodo.

Per le applicazioni che hanno bisogno di tenere traccia della posizione si può usare CLLocationManager. Ciò non consente alla tua app di essere eseguita in background finché lo desideri. Invece ti avvisa quando succede qualcosa di interessante - questo è ciò che il delegato è per. Quindi non puoi garantire che il tuo metodo countUp venga chiamato ogni dieci minuti, ma tu puoi chiamare il quando l'utente sposta il telefono a una determinata distanza.

+0

Grazie mille, il problema è risolto: D – Ahmad

0

Tra l'altro, nel plist è possibile alos impostare Required background modes e poi in item0 App registers for location updates

+0

grazie mille molto :) – Ahmad

1

Aggiungendo il seguente nel metodo applicationDidEnterBackground, sembra che si può eseguire per sempre:

[app beginBackgroundTaskWithExpirationHandler:^{}]; 

Poi si annulla l'attività lunga nello willEnterForeground.

riesco a iOS 6 di recente, ma non sono sicuro che sarebbe stato approvato per l'archivio.

+0

Definitivamente NON sarebbe approvato per il negozio. Bel compromesso però! – braden

Problemi correlati