Programování pro iOS - 24. Zbývající drobnosti - MujMAC.cz - Apple, Mac OS X, Apple iPod

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:

Seriály

Více seriálů



Informace

Programování pro iOS - 24. Zbývající drobnosti

12. ledna 2011, 00.00 | Možnosti a omezení tzv. multitaskingu v iOS 4 zbývá doplnit o ukázku deklarace aplikace jako "více multitaskové, než ostatní". Připomeneme také několik potenciálních podrazů, na něž při využívání těchto služeb můžeme narazit.

Operační systém iOS sice – jak víme z minulých dílů – v podstatě neumožňuje aplikacím běžet na pozadí déle, než asi deset minut (a i to jen pokud využijí služby beginBackgroundTaskWithExpirationHandler:, jinak by to byly pouhé sekundy); můžeme si ale explicitně vyžádat, aby aplikaci, která je na pozadí suspendovaná, probudil ve chvíli, kdy dojde k některé specifické předem definované události.

Minule jsme si ukázali velmi specifický případ takové události, totiž uplynutí daného času (definovaného prostřednictvím tzv. lokálních notifikací); nevýhodou tohoto přístupu je to, že aplikace není aktivována automaticky, ale jen po explicitním potvrzení uživatelem.

V některých speciálních situacích se ale můžeme obejít i bez toho.

Změna polohy

Dosud jsme se nezabývali tím, jak se v iOSu pracuje se zařízením, umožňujícím detekovat zeměpisnou polohu – v zásadě tedy s přijímačem GPS, ačkoli systém podporuje i další možnosti (např. zjišťování polohy pomocí aktivních buněk sítě GSM). Podrobněji se tím budeme zabývat později; prozatím ale stačí vědět, že po správné konfiguraci systém automaticky našemu zvolenému objektu posílá zprávu locationManager:didUpdateToLocation:fromLocation: kdykoli se poloha změní.

Za normálních okolností tuto zprávu dostává pouze aplikace, jež je aktivní a patří jí obrazovka. Pokud ale chceme, můžeme si vyžádat, aby systém tuto zprávu posílal i aplikacím, jež jsou momentálně suspendovány v pozadí (a po změně polohy je tedy také automaticky aktivoval): stačí do souboru Info.plist přidat položku UIBackgroundModes; její hodnotou je pole textových řetězců, a jeden z nich musí být location – např. takto:

<key>UIBackgroundModes</key>
<array>
<string>location</string>
</array>

Poznamenejme, že Xcode dokáže jako obvykle zobrazovat obsah souboru Info.plist v "lépe čitelné" – ale někdy poněkud matoucí – formě; klíč se pak zobrazuje jako "Required background modes" a hodnota location jako "App registers for location updates".

VoIP

Aplikace pro síťovou telefonii patrně bude psát poměrně málokdo; spíše jen pro úplnost tedy poznamenejme, že další hodnotou v poli UIBackgroundModes může být voip ("App provides Voice over IP services").

V takovém případě bude podle dokumentace aplikace automaticky probuzena při aktivitě na socketu, jehož prostřednictvím pracuje se sítí (pokud je socket korektně zkonfigurovaný); navíc má k dispozici speciální handler, jehož prostřednictvím může po určeném čase obnovit spojení se serverem (setKeepAliveTimeout:handler:).

Přehrávání audia

Poslední ze specifických hodnot, jež lze uložit do pole UIBackgroundModes, je audio ("App plays audio"): toto nastavení aplikaci umožňuje přehrávat audio – např. (ale zdaleka nejen) pomocí standardních služeb třídy AVAudioPlayer, zhruba takto:

    AVAudioPlayer *player=[[AVAudioPlayer alloc] 
        initWithContentsOfURL:
        [NSURL fileURLWithPath:@"..."] error:NULL];
    [player prepareToPlay];
    [player play];

i když aplikace je zrovna na pozadí – systém v tomto případě aplikaci nesuspenduje a nechá ji volně běžet.

Je zde ale několik triků a podrazů, jež je třeba znát a dát si na ně pozor.

Především, v tomto případě musíme změnit standardní nastavení tzv. "audio session". Aplikace v iOSu totiž vždy přehrává audio uvnitř "session", jež má řadu atributů; ty určují kromě jiného způsob, jakým se se zvukem nakládá. Operační systém session vytvoří a inicializuje automaticky; přidělí jí ale typ AVAudioSessionCategorySoloAmbient, který znamená "zvuk je jen doprovodný, a po deaktivaci aplikace se může klidně vypnout". Chceme-li slyšet zvukový doprovod i když je aplikace zrovna na pozadí, musíme typ session změnit na AVAudioSessionCategoryPlayback, nějak takto:

    NSError *err=nil;
    if (![[AVAudioSession sharedInstance]
        setCategory:AVAudioSessionCategoryPlayback error:&err])
        ... report problem ...

Druhý podraz spočívá v tom, že "výjimka" platí pouze tak dlouho, dokud aplikace skutečně hraje. Jakmile přehrávání zastavíme, aplikace je a zůstane suspendována. Není tedy možné na pozadí střídavě chvilku hrát a chvilku ne.

Třetí podraz je spíše drobnost, ale poměrně nepříjemná pro toho, kdo o ní neví: tato podpora nefunguje korektně v simulátoru.

Obsah seriálu (více o seriálu):

Tématické zařazení:

 » Rubriky  » Informace  

 » Rubriky  » Agregator  

 » Rubriky  » Tipy a Triky  

 » Rubriky  » Začínáme s  

 » Rubriky  » Software  

 

 

 

Nejčtenější články
Nejlépe hodnocené články
Apple kurzy

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: