Significant Location Change ile kill edilmiş uygulamayı ayağa kaldırmak

En son güncellendiği tarih: 20 saat önce

Significant Location Changes Apple'ın sunduğu önemli konum servislerinden bir tanesi. Bilindiği gibi GPS tabanlı konum servislerinde en büyük problem enerji tüketimi. Navigasyon ve harita özelliği olmayan bir uygulamanızın olduğunu düşünelim. İhtiyacınız kullanıcının konumunu, fazla enerji tüketmeden toplamak/saklamak veya belli konuma geldiğinde aksiyon almak olsun. Hatta konum izni alınan kullanıcılar, uygulamayı kill etseler dahi konum toplama işi devam etsin. İşte bu gibi senaryolarda iOS'de kullanmanız gereken teknoloji SignificantLocationChange.



Hedef

1. Kullanıcının konumunu SignificantLocationChange ile ön yüzde ve arka planda yakalamak.

2. Testleri Xcode simulator'de UserNotification ile gerçekleştirmek.

3. Kill edilmiş uygulamayı SignificantLocationChange ile ayağa kaldırmak, konum toplamaya devam etmek ve simulatorde başarılı çalıştığını test etmek.


Başlarken


Significant Location Changes

Başlamadan önce SignificantLocationChanges ile ilgili bazı temel bilgileri paylaşmamız gerekli.


- GPS'i kullanmak yerine Wi-Fi ve hücresel veri üzerinden konumu alır.

- Konum sadece hücresel baz istasyonları geçişinde alınır, genellikle 500 metre ve daha fazla hareket gerektirir. Bu nedenle anlık konuma ihtiyacınız var ise kullanışsızdır. Bununla birlikte çok düşük enerji kullanılmış olur.

- Konumunu değiştirmeyen sabit bir kullanıcının sadece uygulama açılışında konumu alınabilir. En az 500 metre yer değişikliği yapmadığı sürece yeni konum algılanmaz.

Detaylı bilgi


Giriş


Demo'muzu swift dili ile oluşturacağız. Elinizde basit bir boş uygulama olduğunu düşünerek ilerleyeceğiz. (Çalışan demoyu postun sonunda paylaşılan github linkinden indirebilirsiniz.)


Konum servisini kullanabilmek için öncelikle aşağıdaki şekilde info.plist dosyasına

Privacy - Location Always and When In Use Usage Description

Privacy - Location Always Usage Description

Privacy - Location When In Use Usage Description

property'lerini eklememiz gerekiyor. Value kısımlarına kullanıcıdan konum izni isterken gösterilecek metni girebilirsiniz.



Ayrıca significant location change ile uygulamayı arkaplanda lokasyon ile ayağa kaldırabilmek için Required background modes property'sine App registers for location updates item'ını eklemelisiniz.



AppDelegate


Şimdi sırada CLLocationManager'ı nasıl kullanacağımızda. Bunun için singleton bir LocationManager sınıfı yaratıp bunu AppDelegate üzerine bağalayacağız. LocationManager sınıfı CLLocationManager'ı yönetecek ve aldığı konum bilgisini

LocationManagerDelegate'e bağlanan controller'lara iletiyor olacak.


LocationManager


LocationManager'ın init edilmesiyle birlikte CLLocationManager'ı aşağıdaki özelliklerle oluşturuyoruz.

- requestAlwaysAuthorization() ile kullanıcıdan popup ile konum izni istiyoruz.

- allowsBackgroundLocationUpdate parametresini uygulama arka planda askıya alındığında konum alabilmek için true set etmemiz gerekiyor.

- Son olarak startMonitoringSignificantLocationChanges() metodunu call ederek konum toplamaya başlayabiliriz.


- SignificantLocationChanges ile yakalanan konumlar didUpdateLocations metoduna düşüyor olacak.



Simulator Testi


Geldiğimiz noktada uygulama ön yüzdeyken, arka plandayken ve kill edilmişken doğru çalışıyor mu kontrol etmemiz gerekecek. Bunu simulator üzerinden yapmaya çalıştığımızda didUpdateLocations metoduna koyacağımız bir breakpoint bize yardımcı olacaktır. Ancak kill ettiğimiz uygulamayı significant location change ile ayağa kaldırmayı denediğimizde simulator debug'ını kaybedeceğimiz için ya kill sonrası attach to process yapmamız gerekiyor ya da konum yakaladıkça UserNotification atarak simulator ekranından konumun geldiğinden emin olmamız gerekiyor. Bu demo'da gelen her konumu, uygulama arka plandayken veya kill edilmişken UserNotification ile ekrana basıyor olacağız.


UserNotification


UserNotification için yukarıda kodunu paylaştığımız LocationManager sınıfının init metodunda aşağıdaki şekilde kullanıcıdan notification iznini istiyoruz.



Ardından didUpdateLocations metodunun içinde her konum yakalama sonrası aşağıdaki

scheduleNotification metodunu call ediyoruz. UNMutableNotificationContent body'sine aldığımız konumun latitude ve longitude bilgilerini yazdırıyoruz. Böylece konum değişikliklerini notif üzerinden gözlemliyor olabileceğiz.



FreewayDrive


Test'e başlamadan önce son olarak dikkat etmemiz gereken şey simulator'de konum servislerini aktif etmek ve simulatorun dolaşım modunda olduğundan emin olmak.

Debug -> Location -> Freeway Drive


Neden FreewayDrive; çünkü significant location changes en az 500 metre konum değişikliği gerektirdiğinden, en hızlı konum değiştirebilen simulator modunu seçmemiz gerekiyor.

Bu modda bile ancak 20 saniyede bir konum alabileceğimizi sonuç videosunda göreceksiniz.




Kill edilmiş Uygulama'nın Ayağa Kalkması


Sonuca geçmeden önce kill ettiğimiz bir uygulamanın significant location changes ile nasıl ayağa kalktığını anlamamız gerekiyor. Öncelikle uygulama son açılışında (kill edilmeden önce)

1 - Kullanıcıdan konum iznini almış olmalı,

2 - Yukarıda bahsettiğimiz entegrasyona sahip olmalı ve cllocationmanager'ın startMonitoringSignificantLocationChanges metodu çalıştırılmış olmalı.


Bunlar sağlanıyorsa uygulama kill işleminden sonra kullanıcının 500 metreden fazla yer değiştiriyor olması gerekiyor. Bu yer değişikliği olana kadar uygulama ayağa kalkmamış olacaktır. Kullanıcı 500 metre yer değişimini yaptığı zaman significant location changes aktif olduğu için işletim sistemi konumu alır ve uygulamayı ayağa kaldırır. AppDelegate'de bulunan

didFinishLaunchingWithOptions metodu alınan bu konumla birlikte bir kere çalışır ve ardından konum locationmanager'ın didUpdateLocations metoduna düşer. Bu noktadan sonra uygulama kullanıcının gözlemleyemeyeceği bir state'de ayağa kalkmış olur. (bu state'de kullanıcı menü üzerinden uygulama icon'u ile uygulamayı başlatırsa, tekrar didFinishLaunchingWithOptions metodu çalışmaz. Çünkü uygulama zaten ayaktadır.)


İlk 500 metre konumu ile uygulama arka planda ayağa kalktığı zaman didFinishLaunchingWithOptions bir kere çalışır dedik. Bu noktadan sonra kullanıcı her 500 metre değişiminde didUpdateLocations metodu çağrılmış olacak. Biz demomuzda bu noktalarda UserNotification atarak başarılı konum aldığımızı gözlemliyor olacağız. Senaryonuza göre, konum algılandığı an arkaplanda backend servisinize gidip konuma göre data toplama işlemi yapabilir veya konuma göre aksiyon alabilirsiniz.


Ek bir not : Kullanıcı uygulamayı kill ettiği durumda, uygulamanın arka planda ayağa kalktığını gözlemlemenin bir yolu daha var. iPhone menu butonuna çift basarak arkaplanda çalışan uygulamaları kontrol edebiliyoruz. Kill ettikten bir süre sonra konum ile ayağa kalkan uygulamanızı, burada görebilirsiniz.


Sonuç


Hazırladığımız sonuç video'sunda öncelikle uygulamayı ayağa kaldırıp gerekli izinleri verdik. Demo içinde kullandığımız MapViewController ile kullanıcının konumunu haritadan gösterdik.


Attığımız UserNotification'lar uygulama arka plandayken yada kill edilmişken görünebileceğinden öncelikle uygulamayı arka plana atıp notification'ın geldiğini gözlemledik.

Ardından 2.teste (kill edilme testine) geçtik. Uygulamayı kill ettik. Simulator'de freeway drive özelliği sayesinde 500 metre yer değişikliği olmasını bekledik.

Yaklaşık 20 saniye sonra uygulamayı kill etmemize rağmen konum ile attığımız UserNotification'ı gözlemleyebildik, böylece kill edilmiş uygulamayı başarılı şekilde ayağa kaldırdığımızı test etmiş olduk.



Github : https://github.com/dogukantizer/significant-location-change-with-usernotification


#significantlocationchange #ios #swift #locationservices #usernotification #wakeupiosapp #apple

Komünite

Platform

Mobiler.dev Anasayfa
  • Twitter
  • Instagram
  • development_düzenlendi_düzenlendi
  • Youtube
  • slack-icon-black_edited_edited_edited
  • Gri LinkedIn Simge
JetBrains Hakkında Detaylı Bilgi Alın

© 2020 by mobiler.dev

mobilerdevLogo.jpg
Yazarlık Başvurusu Hakkında Bilgi Alın, Başvuru Yapın.
Topluluk Yazarlarını Tanıyın