iOS
Multitasking API'leri ile Uygulama İçeriğini Tazeleme
iOS 7 öncesi uygulamalar arka plana aldığında yapabilecekleri çok sınırlıydı. Bir önceki yazımda arka planda neler yapabileceğimize kısaca kısaca değinmiştim. VoIP ve konum belirleme-izleme dışında, arkaplan görevi tanımlayarak birkaç dakika çalışmanıza devam ede...
iOS 7 öncesi uygulamalar arka plana aldığında yapabilecekleri çok sınırlıydı. Bir önceki yazımda arka planda neler yapabileceğimize kısaca kısaca değinmiştim. VoIP ve konum belirleme-izleme dışında, arkaplan görevi tanımlayarak birkaç dakika çalışmanıza devam edebiliyordunuz.
iOS 7 ile birlikte arka planda çalışma konusunda birkaç leziz özellik geldi. Amaç, uygulamanızın içeriğini taze tutmak ve ilgi çekici kılmak. Uygulamanız arka planda iken içeriğinizi güncellemek istiyorsanız, yeni özellikler ilginizi çekecek demektir. Örneğin uygulamanızda newsfeed, e-posta listesi, sohbet veya kampanya listesi gibi ekranlar var; bu ekrandan çıktınız, oyun oynadınız veya telefonu uyku moduna aldınız diyelim. Uygulamanıza döndüğünüzde eski sohbet mesajlarınız yerine yenilerini görmek istemez misiniz? Bu blogda, iOS 7 ile gelen yeni API'leri kullanarak içeriğinizi nasıl taze tutabileceğinizin ipuçlarını bulabileceksiniz.
Bu API'lerden biri olan “Background Fetch”, belli aralıklarla ağ üzerinden yeni içerik alabilmenize izin veriyor. Bir diğeri “Silent Push”, remote notification (uzaktan bildirim) ile uygulamanıza bir bildirim yollayarak, yeni durumdan haberdar edip aksiyon almasını sağlayabiliyor. Bu iki yeni özellik ile arayüzünüzü güncel tutabilirsiniz. Yeni bir özellik olan “Background Transfer Service” ile herhangi bir görev tanımı yaparak ağ üzerinden uygulamadan bağımsız içerik indirme veya yükleme de yapabilirsiniz.
“Background Transfer Service” ve “NSURLSession” konusu biraz uzun olacağı için kafa karıştırmamak için bir sonraki bloğumda değineceğim. iOS 7’deki yeniliklere derinlemesine bir göz atalım.
Background fetch
Örneğin bir sosyal medya, hava durumu veya e-posta uygulamasına sahipsiniz. Uygulamanızdaki news feed, hava durumu veya e-postalarınızı güncellemek için uygulamayı arka plandan öne getirmek gerekir. Diğer bir yöntem öne getirdiğiniz uygulama üzerinde bir kullanıcı etkileşimi beklemektir ki, bu da yeni bir içeriği görmeniz için beklemek demek.
Yeni background fetch API ile uygulamanız arka planda iken güncellemeniz mümkün olabiliyor. Böylece uygulamayı açtığınızda yeni içeriği beklemeden görebilirsiniz. Bu özellik sizin uygulama kullanım tarzınızı öğrenip, cihazın buna adapte olmasını sağlıyor. Örneğin, her sabah hava durumuna saat 7'de göz atıyorsanız, uygulama uyarılıp siz daha uygulamayı açmadan hava durumunuz hazırlanmış oluyor.
Uygulamanızda öncelikli yapmanız gereken, Background Fetch özelliğini açmanız.
Böylece info plist dosyanızda UIBackgroundModes (Required Background Modes) anahtarını tanımlamış olursunuz.
Daha sonra ne sıklıkta çalışmasını istediğinizi belirleyin.
[cpp]- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [application setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum]; return YES; }[/cpp]
Eğer belirlemez iseniz bu değer varsayılan UIApplicationBackgroundFetchIntervalNever olacaktır ve uygulamanız arka planda iken çağrılmayacaktır. UIApplicationBackgroundFetchIntervalMinimum değeri ile sistem uygulamanızı ne sıklıkla ve hangi aralıklarla kullanıldığınıza göre bir çağrılma planı uygulanır.
Son olarak eklemeniz gereken aşağıdaki kod parçacığı ile uygulamanız arka planda çalışmak için çağrıldığında çalışacaktır. Bu kod parçacığını Application Delegate sınıfına koymalısınız.
[cpp]-(void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
UINavigationController *navigationController = (UINavigationController*)self.window.rootViewController;
id topViewController = navigationController.topViewController;
if ([topViewController isKindOfClass:[ViewController class]]) {
[(ViewController*)topViewController insertNewObjectForFetchWithCompletionHandler:completionHandler];
} else {
NSLog(@"Doğru sınıf değil %@.", [topViewController class]);
completionHandler(UIBackgroundFetchResultFailed);
}
}[/cpp]
completionHandler objesini daha sonra kullanacağınız için bunu metotlarınıza iletmeniz gerekir.
[cpp][(ViewController*)topViewController insertNewObjectForFetchWithCompletionHandler:completionHandler]; [/cpp]
Sistem tarafından bu bölümde uygulamanız ayağa kalkar ve yaklaşık kısa bir süre çalışmanıza izin verir ki bu çoğunlukla bir dakikadan azdır. Bu ağ üzerinden verinizi ve birkaç küçük resim indirmeniz için yeterli olacaktır. Ayrıca bu zaman “Background Transfer Service” ile yeni bir ağ görevi tanımlamak için yeterli.
Unutulmaması gereken bir konu da uygulamanızda güncellemeyi yaptıktan sonra completionHandler metodunu çağırmanız. Completion handlerın iki görevi vardır. Sisteme uygulamanın yaptığı güncelleme ve kullandığı kaynak hakkında bilgi verir. İkincisi; uygulamanız yeni veriler ile güncellendikten sonra anlık resmini (snapshot) günceller. Snapshotun güncellenmesinin neden önemli olduğunu bir sonraki başlıkta açıklamaya çalıştım.
[cpp]completionHandler(UIBackgroundFetchResultFailed);// Güncelleme yapılamadı.
completionHandler(UIBackgroundFetchResultNewData);//Yeni veriler ile güncellendi
completionHandler(UIBackgroundFetchResultNoData);//Yeni veri yok[/cpp]
Test etmek için Xcode > Debug > Simulate Background Fetch seçeneğini seçmeniz yeterli.
App Switcher, Uygulamalar Arası Geçiş Ekranı
Yeni arayüzde Android'de olduğu gibi, App Switchter'da uygulamaların anlık resimlerinin (snapshot) tutulduğunu görüyoruz.
Bu durumda uygulamanızın arka plana alındığında nasıl görüneceği önem kazanıyor. Çünkü kullanıcı uygulamalar arasında dolaşırken ilgi çekici bir içerik gördüğünde uygulamanıza tekrar dönecektir ki bu hepimizin istediği bir davranış. Yeni kütüphaneler aynı zamanda uygulama arka planda iken anlık resmini güncelleme yeteneğini sağlıyor.
Bu özellik doğru kullanıldığında uygulamayı kullanma grafiğine olumlu etki edecektir. Önerim, bu tip kullanım yeniliklerini uygulamalarınıza çabucak adapte ederek fark yaratmak. Eninde sonunda Apple getirdiği yeniliği standart haline getirmekte geç kalmayacaktır. Uygulamanızın snapshotunu güncellemek için yukarıda bahsettiğim completion handler metodunu kullanmanız yeterli.
Silent Push
Bu API kullanıcıya herhangi bir uyarı göstermeden veya hemen göstermeden önce arka planda uygulamanızda güncelleme yapma şansı sağlıyor.
Kullanım şekillerinden bir tanesi; kullanıcıya push mesajını göstermek istiyorsanız, push mesajı paketine “content-available: 1” satırını eklemeniz yeterli. Böylece kullanıcıya uyarı gösterilmeden hemen önce bildirimi alıp güncelleme yapabiliyorsunuz. Daha sonra push mesajını açıp uygulamanıza geldiğinizde beklemeden güncellenmiş içeriği görmüş oluyorsunuz.
[cpp]{ "aps" : {
"content-available" : 1,
"alert" : "yepyeni yerli filmler"
},
"content-name" : "yerli filmler"
}[/cpp]
Kullanım alanlarına örnek;
- Instant messaging
- Picture messaging
- Video messaging
- E-posta
Diğer kullanım şekli olarak, yukarıdaki alert kısmını kaldırdığınızda kullanıcıya push mesajını göstermeden uygulamanızı güncelleme şansına sahipsiniz.
[cpp]{ "aps" : {
"content-available" : 1,
},
"content-name" : "yerli filmler"
}[/cpp]
Kullanım alanlarına örnek olarak şunlar gösterilebilir;
- TV uygulamanızda kampanya ve yeni filmlerin güncellenmesi
- Dergi uygulamasında yeni dergilerin veya mevcut olanların güncellenmesi
- Satın alma senkronizasyonu
- Dosya senkronizasyonu
Bu bildirimleri uygulamanızda doğru değerlendirmek için yapmanız gerekenlerden biri, bildirimi aldığınızda bunu arka planda karşılayacak metodu uygulamak.
[cpp]- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
NSLog(@"Remote Notification userInfo is %@", userInfo);
NSString *contentName = userInfo[@"content-name"];
// Content name ile bir şeyler yap, yerli filmleri indirip güncelle
completionHandler(UIBackgroundFetchResultNewData);// yeni datanın indiğini haber verir. Snapshotu günceller.
}[/cpp]
bildirim geldiğinde tetiklenen didReceiveNotificationResponse metodu çalışmıyor. Yani uygulamadan çıktıktan sonra bildirim geldiğinde tetiklenmesi gereken metod çalışmıyor. Acaba problem neden kaynaklanıyor ?
Uygulamadan çıktıktan sonra bildirimi geldiğinde tetiklenecek başka bir metod varmı acaba?