27 Şubat 2016 Cumartesi

WWDC 2015 - Apple Push Bildirimlerinde Büyük Değişim!

            Bu yıl yapılan WWDC ‘de şu anda uygulamalarda push notifikasyon kullanan herkesin büyük değişimlerden etkileneceği duyuruldu. Yapılan bir çok WWDC duyurularının aksine, bu değişimler her iOS ve OSX sürümlerini (iOS 9 ve OSX El Capitan dışında) etkileyecek.

Duyurulan ve yapılması planlanan 3 büyük değişim ise şöyle:

1.     Push bildirim eylemleri
2.      APNS token uzunlukları
3.     API

İsterseniz her birini teker teker birlikte inceleyelim.

Metin Giriş Eylemi (Test Input Action)

            Geçen senelerde Apple bize gelen bildirimleri daha hızlı ve kolay bir şekilde cevaplandırabileceğimizden bahsetmişti. Şimdiye kadar, Messages.app ‘ın ilave servislere erişimi mevcuttu fakat tam anlamıyla kullanıcılara sunulmamıştı. Şöyle ki, vermek istediğiniz cevabı bir paragrafa alınmış şekilde ya da emojilerle kısıtlı bir şekilde verebiliyordunuz. Nihayet iOS 9 ‘a giriş ile birlikte her hangi bir uygulama artık “TextInput Action” yani yazı giriş eylemi kullanabilir duruma geldi.





            watchOS 2 ‘de de bu durum Mesajlar kısmında incelendiği üzere düzeltilmeye çalışılmış ve giriş eylemi üzerinde durulmuş.

            Şunu da eklemekte fayda var, yazının başında bahsettiğimiz gibi bu sadece iOS 9 yeniliğidir ve eğer uygulamanız iOS 8 ‘i destekliyor ise bunu kontrol etmelisiniz. 

APNS Token Git Gide Büyüyor

            Bir cihaz token'i (iOS ve Mac cihazları için tanımlanan ve push bildirimleri destekleyen) 32 karakterli hexadecimal dizidir. WWDC 2015’te Apple — APNS’i nasıl kullanılırız adlı tarih dersinin yarısında gömülmüş olarak — çok lanse etmeden bir duyuru yapmış ve cihaz tokenlerinin önümüzdeki sene 32 byte’tan 100 byte’a çıkarılacağını belirtmiştir. Ayrıca kullanışsız bir güncelleme gibi görünen bu değişiklik bir çoğumuzun veritabanı içinde oluşturduğumuz tablolardaki token sütunu kontrol etmemizi gerektirecektir.

Yeni API

            Geçmişte push bildirimleri iş akışı olarak istek talep/cevap istemeyen modası geçmiş modellere sahipti. Her push bildirimi göndermek istediğimizde, APNS Geri Bildirim servisinden bilgi talep ediyorduk.  (Şemada gösterildiği üzere)


            Neyse ki bu durum artık tarih olmak üzere. Üstelik bu değişim sadece iOS 9 ve OSX 10.11 için değil, tüm yeni çıkan iOS ve OS X versiyonları için geçerlidir.

            Yeni API’ler HTTP/2 üzerine kurulmuş olup, birer talep/cevap modelidir ve dahası tekrarlanabilir (bir çok talep için aynı bağlantıyı kullanabilen) bir sistemi kullanır. Eminiz ki geliştirilen yeni sistem daha etkili olup ihtiyaçlara daha rahat karşılık verecektir.

            Hali hazırda bulunan sistemi göz önüne alacak olursak, eminim ki neden bu yeni API’yi kullanmalıyım gibi sorular merak konusudur. İlk olarak, Apple’ın eski API versiyonlarında yaptığı hataları bir kenara bırakıp son çıkan API’de yeniliklere daha fazla yer vereceği söz konusu.

Yenilik 1 : Geri Bildirimler

            Server’a her istek yapıldığında anında geri bildirim almak mümkün ve mevcut geri bildirim servisi artık gereksiz olacak.





Yenilik 2 : Tek Sertifika

            Push göndermek için eskiden hem developer hem de production sertifikalarına sahip olmamız gerekirdi ve bu biraz kafa karıştırabiliyordu. Sonunda Apple bunun da kolaylığını sağladı ve yeni API için sadece tek bir sertifika talep etmekte.

Yenilik 3 : Veri Yükü Büyüklüğü

            Sonunda gönderilebilen veri yükü büyüklüğü 2 KB’tan 4KB’a yükseldi.

Özetleyecek Olursak


            Bu büyük değişimler oturumun sonlarına doğru yapılmış olup, gözden kaçması muhtemel yeniliklerdir. Her ne kadar sonlarda duyurulsa da, uygulamanız için önemli olup entegrasyonu biraz zaman alabilir. Eğer duyuru’yu izlemek isterseniz, ilk 10 dakikayı geçerek “Text Input” ‘a ulaşabilir, arkasından 16:45’e geçerek yeni API sağlayıcılarına ulaşabilirsiniz.

Yazının orjinali için tıklayınız.

25 Şubat 2016 Perşembe

Application Transport Security

Application Transport Security (Uygulama Taşıma Güvenliği) nedir?

WWDC 2015 konferasında; Apple, iOS 9 ve OSX 10.11 El Capitan için “Uygulama Taşıma Güvenliği”ni duyurdu. Konferansta sunulan “iOS’taki yenilikler neler” kılavuzunda konuyla ilgili olarak aşağıdaki bilgiler yer alıyordu:

App Transport Security (ATS) lets an app add a declaration to its Info.plist file that specifies the domains with which it needs secure communication. ATS prevents accidental disclosure, provides secure default behavior, and is easy to adopt. You should adopt ATS as soon as possible, regardless of whether you’re creating a new app or updating an existing one.
If you’re developing a new app, you should use HTTPS exclusively. If you have an existing app, you should use HTTPS as much as you can right now, and create a plan for migrating the rest of your app as soon as possible.

Kısaca özetlemek gerekirse, mobil uygulamalar yüksek ihtimalle HTTP protokolü ile çalışan bir sunucuya bağlanırlar (örneğin seninsunucun.com). Eğer bu sunucu en son SSL teknolojisini desteklemiyorsa (TLS v1.2 ve üzeri) bağlantı aşağıdaki gibi bir hata mesajı verir ve istek başarısız olur;

CFNetwork SSLHandshake failed (-9801)
Error Domain=NSURLErrorDomain Code=-1200 "An SSL error has occurred and a secure connection to the server cannot be made." UserInfo=0x7fb080442170 {NSURLErrorFailingURLPeerTrustErrorKey=, NSLocalizedRecoverySuggestion=Would you like to connect to the server anyway?, _kCFStreamErrorCodeKey=-9802, NSUnderlyingError=0x7fb08055bc00 "The operation couldn’t be completed. (kCFErrorDomainCFNetwork error -1200.)", NSLocalizedDescription=An SSL error has occurred and a secure connection to the server cannot be made., NSErrorFailingURLKey=https://yourserver.com, NSErrorFailingURLStringKey=https://yourserver.com, _kCFStreamErrorDomainKey=3}

İlginç bir şekilde kod siz http yazmış olmanıza rağmen bağlantıyı https olarak dener. Burada Apple bize derinden bir mesaj vermektedir, http kullanarak kullanıcıyı tehlikeye atmak ancak dikkatsizlik sonucu olabilir. Yoksa bu çağda http kullanmak kesinlikle gariptir :)

UYARI : ATS sizin ve kullanıcılarınız için iyi birşey ve bunu iptal etmemeniz önerilir!

Apple’ın burada herkesi zorla https’e çekmesinin tek sebebi bunun son kullanıcı için iyi bir şey olmasıdır. HTTPS kişisel datanın güvenli olmayan bir bağlantı üzerinden ele geçirilmesini önler ve kullanıcılar için harikadır. Tabii bu şekilde kuralların varolması sizin onları kullanmak zorunda olduğunuzu göstermez.

Eğer uygulamanız kontrolünüz dışında bir 3. parti API’ye bağlanıyorsa ya da bir RSS kaynağı gibi güvenliğin çok da gerekli olmadığı bir siteden veri çekiyorsa aşağıdaki yöntemleri kullanabilirsiniz.

Tabii eğer sunucu size aitse asıl yapmanız gereken sunucuya SSL desteği yüklemektir.

ATS‘i nasıl atlatırız?

Domain Bazında Hariç Tutma

Güvenli olmayan (TLS 1.2 altı) bir sunucuya bağlanmak için aşağıdaki kodu Info.plist dosyanıza eklemeniz gerekmektedir.

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSExceptionDomains</key>
  <dict>
    <key>yourserver.com</key>
    <dict>
      <!--Include to allow subdomains-->
      <key>NSIncludesSubdomains</key>
      <true/>
      <!--Include to allow HTTP requests-->
      <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
      <true/>
      <!--Include to specify minimum TLS version-->
      <key>NSTemporaryExceptionMinimumTLSVersion</key>
      <string>TLSv1.1</string>
    </dict>
  </dict>
</dict>
Peki ya Güvensiz Domain adreslerini bilmiyorsam?

Eğer uygulamanızın içinde birden fazla SDK mevcutsa ve siz bu SDK’lerin nerelere bağlantı açtığını bilmiyorsanız (örneğin bir reklam SDK’sı ya da analitik çözümü) aşağıdaki kodu kullanarak ATS’yi tamamen ortadan kaldırabilirsiniz. Ancak Apple’ın yakın dönem içinde AppStore kabul sürecinde bu kullanıma kuşkucu yaklaşacağını düşünüyorum;

<key>NSAppTransportSecurity</key>
<dict>
  <!--Include to allow all connections (DANGER)-->
  <key>NSAllowsArbitraryLoads</key>
      <true>
</true></dict>