2012-06-15 10 views
21

In iOS, wie würde ich das Betriebssystem anweisen, meine App laufen zu lassen, auch wenn es nicht mehr im Vordergrund ist?iOS: Halten Sie eine App wie einen Dienst ausgeführt

Und viele weitere Anwendungen tut dies.

+2

iOS nur bestimmte Art von Anwendung ermöglicht es, das zu tun. Welche Art von Anwendung werden Sie schreiben, die im Hintergrund ausgeführt werden muss? – nhahtdh

+1

Duplizieren: http://stackoverflow.com/questions/6287989/running-apps-in-background – nhahtdh

+1

Wenn Ihre Frage voip-app betrifft (da Sie Skype erwähnen), werfen Sie einen Blick auf Links hier: http: // stackoverflow. com/a/11033929/653513 Aber Service und App-Hintergrund sind nicht genau dasselbe. –

Antwort

34

Grundsätzlich gibt es in iOS keine Service-App oder Funktionalität. Auch die "Hintergrund" -Apps (UIBackgroundMode) können nicht völlig frei und ohne Einschränkungen wie ein Dienst oder Daemon usw. auf anderen Betriebssystemen laufen.

Hier ist die Situation in Bezug auf die Ausführung im Hintergrund und Benachrichtigungen und Timer usw.

1) Eine Anwendung kann nicht im Hintergrund ausgeführt werden, es sei denn:

a) es zusätzliche Zeit vom OS fordert, dies zu tun. Dies geschieht mit beginBackgroundTaskWithExpirationHandler. Es ist nicht (absichtlich) von Apple angegeben, wie lange diese zusätzliche Zeit ist, aber in der Praxis sind es etwa 10 Minuten.

b) Eine App hat einen Hintergrundmodus, die Modi sind: voip, audio, location, newstand. Selbst wenn es einen dieser Typen gibt, kann eine App nicht ohne Einschränkungen ausgeführt werden. Der Rest dieser Diskussion geht davon aus, dass die App keinen Hintergrundmodus hat. Wenn Sie versuchen, einen dieser Hintergrundmodi zu verwenden, damit Ihre App im Hintergrund ausgeführt werden kann, aber Ihre App die spezifischen Funktionen nicht legitim nutzt, wird Ihre App nach der App Store-Übermittlung abgelehnt (dh um einen UIBackgroundMode zu haben) Es muss entweder sein: eine VoIP-App, müssen ständig Standort-Updates haben, die Fähigkeit, Audio im Hintergrund kontinuierlich zu spielen ist ein grundlegendes Merkmal, oder eine Newstand App).

2) Wenn eine App suspendiert ist, kann sie nichts tun, um sich direkt zu wecken. Es kann zuvor keinen NSTimer eingeplant haben, es kann nicht etwas wie performSelector verwenden: afterDelay. usw.

Der einzige Weg, wie die App wieder aktiv werden kann, ist, wenn der USER etwas unternimmt, um es aktiv zu machen. Der Benutzer kann dies tun, aus über die folgenden Möglichkeiten:

a) Starten Sie die App direkt von seinem Symbol

b) Starten Sie die App in Reaktion auf eine lokale Meldung, die zuvor von der App geplant wurde, während es aktiv war .

c) Starten Sie die App als Reaktion auf eine Remote-Benachrichtigung, die von einem Server gesendet wird.

d) Ein paar andere: wie URL-Start, wenn die App für den Start über eine URL registriert ist; oder wenn es registriert ist, um mit einer bestimmten Art von Inhalt umgehen zu können.

Wenn eine App im Vordergrund ist, wenn eine lokale/Remote-Benachrichtigung ausgelöst wird, empfängt die App sie direkt.

Wenn die App derzeit nicht im Vordergrund ist, wenn eine lokale/Remote-Benachrichtigung ausgelöst wird, empfängt die App sie nicht. Es gibt keinen Code, der ausgeführt wird, wenn die Benachrichtigung ausgelöst wird!

Nur wenn der Benutzer die Benachrichtigung auswählt, wird die App aktiv und kann ausgeführt werden.

Beachten Sie, dass der Benutzer Benachrichtigungen entweder für das gesamte Gerät oder nur für eine bestimmte Anwendung deaktivieren kann. In diesem Fall wird der Benutzer sie nie sehen. Wenn das Gerät ausgeschaltet wird, wenn eine Benachrichtigung ausgelöst wird, ist es verloren.

UPDATE FÜR IOS 7

1) gibt es einige neue Hintergrund-Modi wie Hintergrund Abrufs (man kann immer noch nicht durch das Betriebssystem in einer determinis)

2) gibt es nun aber geweckt werden ein Hintergrund Push-Benachrichtigung

3) beginBackgroundTaskWithExpirationHandler Zeit wurde von 10 Minuten reduziert bis etwa 3

+0

voip apps können im Hintergrund laufen (mit gewissen Einschränkungen) - sie müssen sich nur bei OS als voip app anmelden (und sie müssen tatsächlich voip-Funktionalität bereitstellen oder sie werden den Genehmigungsprozess nicht bestehen) –

+0

Wie Skype und andere Anwendungen kontinuierlich arbeiten ? –

+0

Jetzt, wenn ich keine fortlaufenden Standortaktualisierungen benötige, sondern eher periodisch, würde es die App für die Verwendung von Hintergrunddiensten ablehnen oder gibt es eine andere Möglichkeit, die App alle 5-10 Minuten oder so zu aktivieren? – selytch

2

Die Dinge änderten sich jetzt in iOS7, ist es jetzt Beta.

von Apple's developer portal:

den Inhalt Ihrer App Bleiben Sie up-to-date durch das neue Multitasking-APIs in iOS Annahme 7. Die neuen Dienste ermöglichen App Informationen und Download von Inhalten in dem aktualisieren Hintergrund ohne Ablassen die Batterie unnötig. Die Updates können bei opportunistischen mal stattfinden und werden intelligent entsprechend der Verwendung geplant, so dass Ihre App Inhalte im Hintergrund aktualisieren kann, nur wenn Ihre Benutzer es brauchen.

0

Ja wir dies tun können,

erstellen ein privates Feld unseren Status zu verfolgen:

UIBackgroundTaskIdentifier _bgTask; 

nun diese Methode aufrufen, Ihre App wie ein Dienst ausgeführt werden soll

if ([[UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupported)]) 
{ 
   _bgTask = UIBackgroundTaskInvalid; 
   [[NSNotificationCenter defaultCenter] addObserver:self 
selector:@selector(doBackground:) 
name:UIApplicationDidEnterBackgroundNotification object:nil]; 
} 

Nun einen Selektor erstellen:

- (void) doBackground:(NSNotification *)aNotification 
{ 
   UIApplication *app = [UIApplication sharedApplication]; 

   if ([app respondsToSelector:@selector(beginBackgroundTaskWithExpirationHandler:)]) 
   { 
      _bgTask = [app beginBackgroundTaskWithExpirationHandler:^ 
      { 
         dispatch_async(dispatch_get_main_queue(),^
         { 
            if (_bgTask != UIBackgroundTaskInvalid) 
            { 
               [app endBackgroundTask:_bgTask]; 
               _bgTask = UIBackgroundTaskInvalid; 
            } 
         }); 
      }]; 
   } 
} 

Wenn Sie Ihre Aufgabe beendet, rufen Sie unter Code-

UIApplication *app = [UIApplication sharedApplication]; 
if ([app respondsToSelector:@selector(endBackgroundTask:)]) 
{ 
   if (_bgTask != UIBackgroundTaskInvalid) 
   { 
      [app endBackgroundTask:_bgTask]; 
      _bgTask = UIBackgroundTaskInvalid; 
   } 
}