Hoşgeldin. Soru sormak veya cevaplamak için hemen üye ol.
+1 oy
462 kez görüntülendi
ios development kategorisinde tarafından
İpad de yüklü oyunlar, internete bağlı değilken çeşitli bildirimlerde bulunuyorlar.

Arkaplanda çalışmadıklarına göre bu işi nasıl yapıyorlar?

1 cevap

+3 oy
tarafından

bunun için UILocalNotification kullanmanız gerekiyor.
UILocalNotifications adı üzerinde sizin uygulamanız içerisinde set edebileceğiniz veya bir evente tanımlayabileceğiniz notificationlardır ve hemen hemen remote notificationlar gibi çalışırlar.
Localnotificationlar bir süre sonra çağrılmaları için set edilebildikleri gibi , geo position veya düzenli aralıklarla tekrarlayan şekilde de çağırılabilirler.

apple'ın sunduğu class reference dokümantasyonunu inceleyebilirsiniz.

basitçe local notification'ları swift üzerinde nasıl konfigure edeceğimize bir bakalım;

remoteNotification'larda olduğu gibi öncelikle uygulamanızı kullanıcılarınızın notification'ları alabilmesi için appDelegate didFinishlaunchingWithOptions metodu içerisinde notification'lar için register etmelisiniz.

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
   application.registerUserNotificationSettings(UIUserNotificationSettings(forTypes: (.Badge | .Sound | .Alert), categories: nil))

   return true
}

daha sonra uygulamanız içerisinde berlirli bir event'e veya misal uygulama background'a giderken set edilmesi için appDelegate metodlarından birinin içerisine local notificationu set ediyoruz.

örneğin kullanıcı uygulamadan kendi isteğiyle çıktığında otomatik olarak bir local notification set edilmesini ve kullanıcıyı belli bir süre sonra uygulamayı açması için uyarmasını istiyor olduğumuzu farz edelim.

bunun için appDelegate içerisinde yer alan applicationDidEnterBackground metodumuzu aşağıdaki gibi düzenliyoruz.

func applicationDidEnterBackground(application: UIApplication) {

        var localNotification:UILocalNotification = UILocalNotification()
        localNotification.fireDate = NSDate(timeIntervalSinceNow: 10)
        localNotification.alertBody = "my notification"
        localNotification.applicationIconBadgeNumber = 1
        localNotification.soundName = "default"
        UIApplication.sharedApplication().scheduleLocalNotification(localNotification)

    }

gördüğünüz gibi bir local notificaion tanımladık kod kendini anlatıyor zaten herhalde çok fazla detaylandırmaya gerek yoktur. fireDate'ile localNotification set edildiği andan itibaren 10 saniye sonra çağrılmasını belirttik. alertBody, applicationIconBadgeNumber ve soundName aynı remote notificationlarda olduğu gibi push notification payload'ımızdaki değerler.
ve son olarak scheduleLocalNotification ile localNotification'umuzu set ettik.

kullanıcının bu 10 saniyelik süre dolmadan uygulamayı yeniden açtığını farz edelim. Bu durumda set ettiğimiz localNotification'umuzu kullanıcı zaten uygulamayı süre dolmadan açtığı için iptal etmek isteyebiliriz.
bunu için yine appDelegate içerisinde applicationDidBecomeActive metodu aşağıdaki gibi düzenleyelim.

func applicationDidBecomeActive(application: UIApplication) {

        for local in UIApplication.sharedApplication().scheduledLocalNotifications as [UILocalNotification] {
            if local.alertBody == "my notification" {
                UIApplication.sharedApplication().cancelLocalNotification(local)
            }
        }

    }

görüdğünüz gibi bir loop'la scheduledLocalNotifications'lar içerisinde alertBody'si "my notification" olan localNotification'umuzu bulduk ve iptal ettik. Dilersek hiç loop kullanmadan basitçe, UIApplication.sharedApplication().cancelAllLocalNotifications() 'da kullanabilirdik ama bu biz bu örnekte her nekadar bir notification set etmiş olsak da başka senaryolarda kullanılabilirliğini görmemiz açısından sadece set ettiğimiz local notification'umuzu silmek için loop kullandık.

son olarak, appDelegate içerisinde uygulamamız açıkken bir notification gelirse (yukarıdaki verdiğim örnekde bu mümkün değil çünkü kullanıcı uygulamaya geri döndüğünde local notification'ları siliyoruz :D ) trigger metodu olarak "didReceiveLocalNotification" delegate metodunu kullanmalıyız. biliyorsunuz remoteNotification'ları uygulama açıkken almak için "didReceiveRemoteNotification" delegate metodunu kullanıyoruz.

tarafından
Teşekkürler. Denedim çalışıyor.
tarafından
Teşekkür ederim.  local notification'ların ateşlenmesi için illa ki uygulama açık mı olmalı ? Yani uygulama foreground veya background modda mı olmalı ?
tarafından
hayır, uygulamanın illa ki background modda olması gerekmez, uygulama not running state'deyken de local notification'lar gösterilebilir.
sadece  foreground mod'da yani uygulama kullanımdayken local notification gösterilmez.
...