24Eyl/1361

IOS ‘da uzaktan bildirimler nam-ı diğer APNS (Apple Push Notification Service) remote notifications

IOS 'da uzaktan bildirimler nam-ı diğer APNS (Apple Push Notification Service) remote notifications

Merhaba, bu yazımda apple'ın sunduğu bir hizmet olan APNS (Apple Push Notification Service) hizmetini IOS uygulamalarımızda nasıl konfigure edeceğimizi basitçe anlaymaya çalışacağım. Ama gelin öncelikle APNS'in ne olduğundan biraz bahsedelim.
APNS, bir uygulama veya hizmet için, kullanıcılarımıza Apple'ın sunmuş olduğu APNS alt yapısını kullanarak uzaktan ve anlık bildirimler gönderebilmemizi sağlayan bir uyarı sistemidir.
Bu tanımı basit bir uygulama senaryosu üzerinde örneklememiz gerekirse, uzak bir sunucudan çektiği imaj dosyalarını bir galeri sistemi içerisinde gösteren bir uygulamamız olduğunu varsayalım.

APNS'i uygulamamızda kullanarak, sunucumuza yeni bir imaj dosyası eklediğimizde yeni eklenen bu içeriğin kullanıcılarımıza uygulama o an kapalı dahi olsa hemen bildirilmesini sağlayabiliriz. Bu sayede kullanıcının dikkatini uygulamaya hemen çekebilir ve uygulamamızın kullanım sıklığını arttırabiliriz.
Veya bu aralar çok popüler olan "Whatsapp" tarzı bir mesajlaşma uygulamamız olduğunu farzedelim. APNS tam da aradığımız araç.
Hatta, APNS'i yeni uygulamalarımızın AppStore'a yüklendiğini bildirmek için, bir reklam aracı olarak bile kullanabiliriz.
Gördüğünüz gibi APNS oldukça farklı amaçlar için tercih edilebilecek, hem bizim hem de kullanıcılarımız için oldukça faydalı bir özellik.

Ama tabiki APNS'inde bazı sınırları var. Mesela birçoğumuzun dikkat ettiği üzere, AppStore'dan IOS cihazımıza bir uygulama indirdiğimizde bazen "Bildirimlere izin vermek istiyormusunuz?" gibi bir uyarı mesajıyla karşılaşırız. İşte bu uyarı mesajı bize indirdiğimiz o uygulamanın APNS kullandığını ve ileride bize bildirimler gönderebileceğini belirtmektedir.
Eğer bu uyarıdaki "izin verme" seçeneğiniyle devam edersek, uygulamanın geliştiricisi APNS üzerinden bize bildirimler gönderemeyecektir.
Tabiki bu tercih uygulama ilk çalıştırıldığında olumlu veya olumsuz yönde kullanılsa dahi, daha sonradan cihazın ayarlar sayfasında yer alan "Bildirimler" alanından da açılıp, kapatılabilir.
Yani kısacası APNS'ile tüm kullanıcılara ulaşmak her zaman mümkün değildir. Ama tabi işin istatistiki boyutunu düşünecek olursak kendi gözlemlerime dayanarak ortalama bir uygulamada her 10 kullanıcıdan 4'ünün APNS bildirimlerine izin verdiğini söyleyebilirim.
Ama bu oran "whatsapp" gibi anlık mesajlaşma veya haber içeriği sunan uygulamalarda çok daha fazla olablieceği gibi, oyunlarda çok daha az da olabilir.

APNS'i dağıtım aşamasındaki uygulamalarımız için etkin bir şekilde kullanabilmek biraz kafa yormayı gerektiriyor bu nedenle bu yükünüzü 3rd party APNS hizmeti sunan UrbanAirship veya Parse gibi firmalardan hizmet alarak hafifletebilirsiniz pek tabi, ama maliyet hesabınızı iyi yapmanız gerek.

Neyse, bu kadar lakırdı yeter diyerek kolları sıvayalım ve APNS hizmetini uygulamalarımızda nasıl basitçe konfigure edebileceğimizi hep birlikte görelim.
Öncelike bu yazı boyunca neler yapacağımızı kısaca ana hatlarıyla özetleyelim:
1) ios provisioning portal üzerindeki uygulama appID'imizi konfigure edeceğiz ve APNS SSL sertifikası oluşturacağız.
Daha önceki apple developer / distribution provisioning profilleri yazımda anlattığım sertifika ve appID'yi kullanacağımı belirtmek istiyorum, o nedenle sizin de bu yazımı okuyup iyi anlayarak kendi sertifika ve appID'nizi oluşturduğunuzu varsayıyorum.
2) Uygulamamızı hazırlayacağız ve gerçek bir IOS cihazı üzerinde test edeceğiz.
APNS servisini ne yazık ki simülatör üzerinde test etme şansımız yok. Bu nedenle bir iPad veya iPhone'a ihtiyacımız var.
3) APNS bildirimlerini gönderebilmek için bir web sunucusuna ihtiyacımız olacak bunun için Mac'imiz kullanacağız.
Mac'lerde apache zaten kurulu geliyor, ayrıca PHP'ninde Mac'inizde kurulu olduğunu varsayıyorum.
Şu an ihtiyacımız olmayacak ama ek not olarak belirteyim; dağıtım aşamasındaki uygulamalarımız için SSL sertifikalarımızı kurabileceğimiz gerçek bir sunucuya ya da bir VPS'e ihtiyacımız olacak, paylaşımlı hostingler işimize yaramayacaktır. Şu sıralar gayet makul fiyatlara Digital Ocean veya Linode gibi sağlayacılardan VPS kiralanabiliyor.
IOS 'da uzaktan bildirimler nam-ı diğer APNS (adım 1)

Öncelikle uygulamamız için kullanacağımız provizyon dosyamızda push notification özelliğini etkinleştirmemiz ve bir adet APNS sertifikası oluşturmamız gerekiyor. Bunun için developer membercenter adresinden developer ID'mizle giriş yapıyoruz.
IOS 'da uzaktan bildirimler nam-ı diğer APNS (adım 2)

Giriş yaptıktan sonra "Certificates, Identifiers & Profiles" linkine tıklıyor ve provisioning portal'a gidiyoruz.
IOS 'da uzaktan bildirimler nam-ı diğer APNS (adım 3)

Yukarıda da belirttiğim gibi daha önceki apple developer / distribution provisioning profilleri yazımda önceden oluşturduğum development sertifikası ve appId'mi kullanacağım için mevcut appID'mi düzenlemek için direkt olarak "Identifiers" alanına tıklıyorum. Eğer siz daha önceden bir development sertifikası ve appID oluşturmadıysanız öncelikle bunları oluşturun.
IOS 'da uzaktan bildirimler nam-ı diğer APNS (adım 4)

"mySupperApp" adlı appID'mi bulup listeden seçiyorum, dikkat edeceğiniz üzere "Push Notifications" disabled olarak görünüyor, hemen "Edit" butonuna tıklıyorum.
IOS 'da uzaktan bildirimler nam-ı diğer APNS (adım 5)

Listeden "Push Notifications" kutucuğunu işaretliyor ve daha sonra aşağıda yer alan "Development SSL Certificate" butonuna tıklıyoruz. Şu an sadece development sertifikasını oluşturacağız.

Uygulamamızı appStore'a koyarken Production sertifikasını da ayrıca oluşturmamız gerekecek. Şu an oluşturduğumuz development sertifikasını uygulama appStore'dayken kullanamayız.
IOS 'da uzaktan bildirimler nam-ı diğer APNS (adım 6)

Daha önceki yazımızdan da hatırlayacağınız üzere sertifika isteğinde bulunabilmek için Mac'imiz üzerindeki anahtar zincir erişimi arayüzünü kullanarak bir istek dosyası oluşturmamız gerektiğinden bahsetmiştik.
Benim hali hazırda masaüstünde duran bir istek dosyam var eğer sizin istek dosyanız hazır değilse apple developer / distribution provisioning profilleri yazımda anlattığım şekilde bir istek dosyası hazırlayın. Continue butonuna tıklayarak bir sonraki istek dosyamızın isteneceği sayfaya geçiyoruz.
IOS 'da uzaktan bildirimler nam-ı diğer APNS (adım 7)

"Choose file" butonuna tıklayarak açılan pencereden masaüstünde duran istek dosyamı seçiyor ve ardından "Generate" butonuna tıklıyorum.
IOS 'da uzaktan bildirimler nam-ı diğer APNS (adım 8)

APNS Development sertifikamız oluştuktan sonra "Download" butonuyla sertifikayı Mac'imize indiriyor ve ardından "Done" butonuyla sayfadan çıkıp, Provizyon dosyamızı oluşturmak üzere soldaki menüde yer alan "Provisioning profiles" menusunun altında yer alan "Development" linkine tıklıyoruz.
IOS 'da uzaktan bildirimler nam-ı diğer APNS (adım 9)

Yeni development provizyonumuzu oluşturmak için açılan sayfada sağ üst köşede yer alan "+" butonuna tıklıyoruz.
IOS 'da uzaktan bildirimler nam-ı diğer APNS (adım 10)

Daha öncede belirttiğim gibi şu an uygulamamızı hemen appStore'a yollamak gibi bi derdimiz yok ve o nedenle "Distribution" provizyonunu oluşturmayı da şu an için es geçeceğiz. "IOS App Development" seçeneğini işaretleyip, "Continue" butonuyla devam ediyoruz.
IOS 'da uzaktan bildirimler nam-ı diğer APNS (adım 11)

Listeden appID'mizi seçiyor ve "Continue" butonuyla devam ediyoruz.
IOS 'da uzaktan bildirimler nam-ı diğer APNS (adım 12)

Açılan listeden Development sertifikamızı seçiyor ve "Continue" butonuyla devam ediyoruz.
IOS 'da uzaktan bildirimler nam-ı diğer APNS (adım 13)

Uygulamamızı test edeceğimiz cihazımızı listeden seçiyor ve "Continue" butonuyla devam ediyoruz.
IOS 'da uzaktan bildirimler nam-ı diğer APNS (adım 14)

Provizyon dosyamıza bir isim veriyor ve "Generate" butonuna tıklayarak provizyon dosyamızı oluşturuyoruz.
IOS 'da uzaktan bildirimler nam-ı diğer APNS (adım 15)

Oluşan provizyon dosyamızı "Download" butonuna tıklayarak "Mac'imize indiriyor ve "Done" butonuna tıklıyoruz.
Provisioning portalda işimiz bitti artık çıkabiliriz.
IOS 'da uzaktan bildirimler nam-ı diğer APNS (adım 16)

8. adımda oluşturduğumuz APNS sertifikamız masaüstünde duruyor. Üzerine çift tıklayarak anahtar zincirine kaydedilmesini sağlıyor ve açılan "Anahtar zincir erişimi" arayüzündeki listeden bularak üzerine tıklayıp satırı genişletiyoruz.
Örnek resimde "Yasin Türkoğlu" olarak gözüken ve yanında anahtar işareti olan satırın üzerinde sağ tıklayarak açılan menüden "Dışa Aktar" seçeneğine tıklıyoruz.
IOS 'da uzaktan bildirimler nam-ı diğer APNS (adım 17)

Dışa aktaracağımız anahtar için "myKey" adını veriyor, dosyanın aktarılacağı yer olarak "masaüstünü" seçili bırakıyor ardından dosya biçimi olarak ".p12"'yi seçiyor ve son olarak "kaydet" butonuna tıklıyoruz.
IOS 'da uzaktan bildirimler nam-ı diğer APNS (adım 18)

Dışa aktaracağımız anahtar için bir şifre girmemiz isteniyor, şifremizi giriyor, ardından doğrulamak için ikinci satıra tekrar giriyor ve "Tamam" butonuna tıklıyoruz. Verdiğimiz şifreyi bir kenara yazıyoruz, biraz sonra lazım olacak.
IOS 'da uzaktan bildirimler nam-ı diğer APNS (adım 19)

Mac'imize ait yönetici parolası isteniyor. Parolayı giriyor ve "izin ver" butonuna tıklıyoruz.
IOS 'da uzaktan bildirimler nam-ı diğer APNS (adım 20)

Anahtar dosyamız masaüstüne "myKey.p12" olarak kaydedildi. Şimdi Mac'imizin "Terminal" arayüzünü açıyoruz ve aşağıda detaylarını verdiğim işlemleri gerçekleştiriyoruz.
Export ve import edeceğimiz tüm dosyalarımız masaüstünde olacağı için masaüstü dizinine geçiyoruz.

Masaüstünde duran indirdiğimiz "aps_development-1.cer" isimli sertifikamızı "mySupperAppPushCert.pem" ismiyle pem dosyasına dönüştürüyoruz.

Masaüstünde duran, biraz önce anahtar zincir erişimi arayüzünden dışarı aktardığımız "myKey.p12" anahtarımızı da "myKey.pem" ismiyle pem dosyasına dönüştürüyoruz.
Dönüştürme sırasında bizden "myKey.p12" dosyamızı anahtar zincir erişimi arayüzünden dışarı aktarırken verdiğimiz şifre istenecektir. Şifremizi girdikten sonra oluşturulacak pem uzantılı yeni anahtar dosyamız için yeniden bir şifre girmemiz gerekecek. Yeni verdiğimiz şifreyi bir kenara yazıyoruz, biraz sonra lazım olacak.

Yeni oluşturduğumuz "mySupperAppPushCert.pem" ve "myKey.pem" dosyalarını birleştiriyoruz ve "combined.pem" adı altında tek bir pem dosyası haline getiriyoruz.

Yaptığımız tüm bu işlemlerin bir sonucu olarak masaüstünde 3 adet yeni dosya oluşturduk. Bu dosyalardan en son oluşturduğumuz "combined.pem" dosyasını kullanacağız.
Dilersek oluşturduğumuz "combined.pem" dosyamızla hemen APNS sandbox ortamına SSL bağlantısı kurabiliyormuyuz bir bakalım.
Bunun için "gateway.sandbox.push.apple.com" adresine "2195" portu üzerinden, bir SSL bağlantı açmayı deniyoruz.
Dikkat edeceğiniz üzere bağlantımızı "2195" portu üzerinden kuracağız, bağlantıyı açabilmek için bu port numarasının firewall veya router'da engellenmemiş olmaması lazım.
Bağlantıyı açarken biraz önce oluşturduğumuz "myKey.pem" dosyasına verdiğimiz şifre bizden istenecektir.

Eğer bağlantımızı başarılı bir şekilde açabildiysek "CONNECTED" ibaresini göreceğiz, daha sonra "bye" diyerek bağlantıyı sonlandırıyor ve terminalden çıkıyoruz.
Ek bilgi olarak paylaşayım, bu adreste yer alan "sandbox" ibaresi APNS'in development testleri için ayrılmış bir bağlantı olduğunu gösteriyor.
Dağıtım aşamasında yukarıdaki dönüştürme işlemlerinde APNS Production sertifikası kullanmamız gerektiğini ve "gateway.push.apple.com:2195" adresi üzerinden SSL bağlantısı kuracağımızı bir kez daha hatırlatırım.
IOS 'da uzaktan bildirimler nam-ı diğer APNS (adım 21)

Şimdi sıra geldi göndereceğimiz bildirimlerimizi alabilecek bir uygulama hazırlamaya.
Xcode'u açıyor ve "Create a new Xcode Project" alanına tıklıyoruz.
IOS 'da uzaktan bildirimler nam-ı diğer APNS (adım 22)

"Single View Application" seçeneğiyle devam ediyoruz.
IOS 'da uzaktan bildirimler nam-ı diğer APNS (adım 23)

Uygulama adımız "mySupperApp". "Company Identifier"'da appId'imde kullandığım ters domain adı.
Bu iki alanın birleşiminden oluşan "Bundle Identifier"'da dikkat edeceğiniz üzere "com.yasinturkoglu.mySupperApp" olarak kendiliğinden belirdi.
"Bundle identifier" daha önce provisioning portal oluşturduğumuz appId'imizde kullanığımız identifier'la aynı olmalı.
"Class Prefix"'i de uygulama adıyla aynı bırakıyor ve cihaz olarak iPhone'u seçiyor ve "Next" butonuyla devam ediyorum. Siz de elinizdeki cihaz türüne göre kendi seçimizi yapın.
IOS 'da uzaktan bildirimler nam-ı diğer APNS (adım 24)

Uygulama klasörünün kaydedileceği yer olarak masaüstünü seçiyor ve "Create" butonuna tıklayarak uygulamayı oluşturuyoruz.
IOS 'da uzaktan bildirimler nam-ı diğer APNS (adım 25)

Benim iPhone'umda IOS 6.0 yüklü olduğundan, uygulamayı cihazımda çalıştırabilmek için "IOS Deployment Target" listesinden 6.0'ı seçiyorum.
IOS 'da uzaktan bildirimler nam-ı diğer APNS (adım 26)

"Code signing" alanındaki "Code signing Identity" alanında "Debug" altından, development sertifikamızı seçiyoruz.
IOS 'da uzaktan bildirimler nam-ı diğer APNS (adım 27)

Biraz önce Provisioning portalda hazırlayıp masaüstüne indirdiğimiz provizyon dosyasına tıklayarak, provizyon dosyasının yüklenmesini sağlıyor ve ardından "Code Signing" alanında yer alan "Provisioning Profile" alanında "Debug" altından yüklediğimiz provizyon dosyamızı seçiyoruz.
IOS 'da uzaktan bildirimler nam-ı diğer APNS (adım 28)

Cihazımızı USB kablosu aracılığıyla Mac'imize bağlıyor ve "Oganizer" arayüzünden cihazımızı seçiyoruz.
Cihazın detaylarında yer alan "Provisioning Profiles" alanını açıyor ve biraz önce yüklediğimiz provizyon dosyamızın aynı şekilde cihazımızın "Provisioning Profiles" alanına sürüklüyoruz. "Status" alanında "Valid Profile" ibaresini görmemiz lazım.
IOS 'da uzaktan bildirimler nam-ı diğer APNS (adım 29)

Uygulamanın derlenerek çalıştırılacağı yer olarak listeden cihazımızı seçiyoruz.
IOS 'da uzaktan bildirimler nam-ı diğer APNS (adım 30)

Daha sonra uygulama dosyalarından, "MySupperAppAppDelegate.m" dosyasını açıyor ve yandaki ekran görüntüsünde işaretli kodları appDelegate dosyamıza ekliyoruz.
Tüm düzenlemeleri yaptıktan sonra sol üst köşede yer alan "Run" butonuna tıklıyor ve uygulamayı cihazda çalıştırıyoruz.
Uygulama cihazda çalıştığında ekranda beliren "mySupperApp size anında iletme bildirimleri göndermek istiyor" uyarısında yer alan "Tamam" butonuna tıklıyoruz.
İzin verdikten sonra, Xcode'da en altta yer alan log alanında deviceToken'ı görüyor olmamız lazım. Bu device token'ı kaydediyoruz, biraz sonra kullanacağız.
Ama gelin önce app delegate dosyasını içerisinde yaptığımız değişikliklerin neler olduğuna biraz daha yakından bakalım.
didFinishLaunchingWithOptions metodumuzun içerisine eklediğimiz registerForRemoteNotificationTypes koduyla, uygulamamızın bildirimleri alabilmesini sağlıyoruz. Bu kodun içerisinde yer alan;
UIRemoteNotificationTypeBadge, seçeneği uygulama ikonunu üzerinde bildirimle gelen "badge" numarasının görünmesini sağlayacak.
UIRemoteNotificationTypeSound seçeneği uygulamamız kapalıyken gelen bildirimlerde uyarı sesinin duyulmasını sağlayacak.
UIRemoteNotificationTypeAlert seçeneğiyse uygulamamız kapalıyken gelen bildirimlerde ekranda alert penceresinin görünmesini sağlayacak.
Uygulamamızın bildirimlerimizi alabilmesi için bu üç seçenekten en az birinin belirtilmesi gereklidir, aksi takdirde uygulama bildirimleri almaz ve kullanıcıya uygulamayı ilk defa çalıştırdığında "Bildirimlere izin vermek istiyormusunuz" seçeneği sorulmaz.
trimDeviceToken metodu kendi hazırladığım bir dize yalınlaştırıcısı, "didRegisterForRemoteNotificationsWithDeviceToken" metoduyla aldığımız deviceToken'ın başında ve sonunda yer alan "<" ve ">" işaretlerini ve aralardaki boşlukları temizlemek için kullanıyoruz.
didRegisterForRemoteNotificationsWithDeviceToken metodu bize uygulama çalıştırıldığında devicetoken'ı verecek olan metod. DeviceToken, uygulamamızı appStore'dan indirdikten sonra bildirimlere izin veren kullanıcılardan alacağımız bir tür tanımlama anahtarıdır. DeviceToken'lar unique'dir, yani hiçbir zaman aynı olamazlar ve eğer cihaz resetlenirse değişirler. Bir önceki paragrafta açıkladığım "trimDeviceToken" metodumuzu kullanarak "NSData" formatında dönen deviceToken'ı temizliyor ve string formatına dönüştürüp "NSLog" ile log alanına bastırıyoruz.
DeviceToken'ı kullanıcılarımızdan almak için aslında bu metodun içerisinde deviceToken'i bize yollayacak bir httpRequest'i oluşturmalı ve gönderilen deviceToken'ları bir database içerisinde saklamalıyız. Bunu nasıl yapacağımızı daha fazla kafa karışıklığına yol açmamak ve konumuzda sapmamak adına es geçiyorum o nedenle bu örnekte devicetoken'ı manuel olarak log alanına bastırıyoruz.
didFailToRegisterForRemoteNotificationsWithError metodu herhangi bir nedenden ötürü kullanıcı bildirimlere izin verdiği halde devicetoken'ın alınamadığı durumlarada bize veya kullanıcıya bilgi verilmesini sağlayacak bir fallback metodu. Şu andaki örneğimiz bunu nasıl kullanacağımıza dair bir seneryo barındırmadığı için es geçiyorum.
didReceiveRemoteNotification metodu uygulamamız açıkken gönderdiğimiz bildirimlerin uygulama arayüzünde tetiklenmesini sağlayacak metod. Kullanıcı uygulamayı kullanılırken herhangi bir bildirim gönderdiğmizde herhangi bir etkileşim olmayacak ve "didReceiveRemoteNotification" metodu tetiklenecektir. Uygulama kullanılırken alınacak bildirimler için yapılmasını istediğimiz aksiyornun tetiklenmesini bu metod'u kullanarak sağlayacağız. Şu anki örneğimiz bu kadar detaylı olmadığı için bu medtodu'da boş bırakıyoruz.
Evet, örneğimizin uygulama tarafında yapılacaklar bu kadar, şimdi bildirimlerimizi gönderebilmek için sunucumuzda çalışacak PHP kodunu yazabiliriz.
Bu kodla, cihazlarımızdan alacağımız "deviceToken" ları kullanarak bildirimlerimiz için JSON formatında veri katarları oluşturacağız ve açacağımız SSL bağlantısı üzerinden bildirimlerimizi APNS sunucusuna göndereceğiz, bildirimler APNS tarafından "deviceToken" larını belirttiğimiz cihazlara gönderilecek. Önce kodu görelim;
Bu kod ile ne yaptığımıza ait detayları zaten, kod içerisinde yeterince açıklıyorum tekrar açıklamama gerek yok sanırım.

Şu anda işin çok daha derinine girip kafa karışıklığına yol açmak istemiyorum ama, apple'ın APNS'i dağıtım ortamında kullanırken koyduğu bir kaç önemli kural var, bunlara uymak zorundayız;

Her bildirim için sakın teker teker soket bağlantısı açmayın
Yukarıda verdiğim örnek test amaçlı olduğundan ve APNS sandbox sunucusuna bağlandığından ardı ardına soket bağlantısı açıp kapatmamızın bir mahsuru yok. Fakat daha öncede belirttiğim gibi dağıtım ortamında "gateway.push.apple.com:2195" suncusunu kullanacağız, bu sunucuya çok kısa aralıklarla ardı ardına açacağınız soket bağlantıları, kara listeye alınmanızı ve APNS sunucusuna erişiminizin engellenmesine neden olabilir.
Göndereceğiniz bildirimleri yukarıdaki örnekte verdiğim gibi, yani soket bağlantısını bir kere açtıktan sonra bir döngüyle hepsini aynı anda göndererek yapmalı ve tüm bildirimlerinizi gönderdikten sonra soket bağlantınızı kapatmalısınız.
Kısacası APNS sunucusuyla kurduğunuz soket bağlantısını çok kısa aralıklarla açıp kapayan bir yapı kullanmayın.

Bildirimlere izin vererek size deviceToken'ini yollamış, fakat daha sonra uygulamanızı cihazından silmiş kullanıcılara ısrarla bildirim göndermeye çalışmayın.
Aslında uygulamanızı silmiş kullanıcılara bildirim göndermeye çalışmak APNS alt yapısını gereksiz yere meşgul etmek anlamına geldiğinden, bir kere uygulamanızı silmiş olan kullanıcıyı belirledikten sonra veritabnınızda tuttuğunuz ilgili kullanıcıya ait deviceToken'i silin.
Peki uygulamamızı silmiş olan kullanıcıyı nasıl belirleyeceğiz dediğinizi duyar gibiyim.
Bunun için her bildirim gönderiminizden önce manuel veya cron job ile belli aralıklarla otomatik olarak APNS feedback sunucusuna bağlanarak uygulamanızı kaldırmış olan kullanıcıları tespit edebilirsiniz.
Feedback sunucusu aslında kaldırılan uygulamaların kaydının tutulduğu bir sunucu değildir. Feedback sunucusuna bir kaydının düşebilmesi için öncelikle cihaza bir bildirimde bulunulmalıdır, eğer uygulamanız bildirimde bulunulan cihazdan kaldırılmışsa feedback sunucusuna bir kayıt düşecektir.
Kısacası bir feedback alabilmek için öncelikle bildirimde bulunmalısınız.
APNS feedback sunucusuna "feedback.sandbox.push.apple.com" adresinden "2196" portunu kullanarak daha önce oluşturduğumuz "combined.pem" dosyamızı kullanarak bağlanacağız. Dikkat edeceğiniz üzere bağlantımızı bu defa "2196" portu üzerinden kuracağız, dolayısıyla bağlantıyı açabilmek için bu port numarasının firewall veya router'da engellenmemiş olmaması lazım. Kodu görelim;
Evet, artık tüm adımları tamamladığımıza göre, sıra geldi uygulamamıza bildirimimizi göndermeye, uygulamamızı biraz önce cihazımıza yüklemiştik, şimdi push.php dosyamızı local sunucumuzda "http://localhost/push.php" adresi üzerinden çağırıyoruz ve "Bildirim, basarili bir sekilde APNS sunucusuna gönderildi" mesajını görüyoruz. Hemen ardından da cihazımızdan "Di-da-don" sesini duyuyoruz.
IOS 'da uzaktan bildirimler nam-ı diğer APNS (adım 31)
Gördüğünüz gibi cihazımın kilit ekranında bildirimimi görüyorum, bu uyarıyı sürükleyerek açtığımda direkt olarak uygulamam açılacaktır.
Aynı şekilde uygulama ikonumun üzerindeki badge'da "24" ibaresini görüyorum.

Evet, bu yazımda APNS'i uygulamalarımızda mümkün olduğunca basit bir şekilde nasıl kullanacağımızı anlatmaya çalıştım.
Konuyla alakalı soru, yorum veya eleştirilerinizi aşağıda bulunana yorum alanına bırakabilirsiniz.
Teşekkürler.
VN:F [1.9.22_1171]
Rating: 3.8/5 (16 votes cast)
IOS 'da uzaktan bildirimler nam-ı diğer APNS (Apple Push Notification Service) remote notifications, 3.8 out of 5 based on 16 ratings

Bu yazıyı beğendiniz mi?

RSS Kaynağımıza abone olun!

Yorumlar (61) Geri izlemeler (0)
  1. gerçekten güzel bir anlatım olmuş emeğine sağlık

  2. Öncelikle anlatım süper elinize sağlık hocam. Bir sorum olacaktı ,
    combined.pem dosyamı oluşturdum CONNECTED dedi sonrasında push.php sayfasını çalıştırdım
    “APNS sunucusuna baglanildi.
    Bildirim, basarili bir sekilde APNS sunucusuna gonderildi” dedi fakat bir türlü cihaza gelmedi.Çok kez sayfayı çalıştırdım acaba kara listeye mi aldılar beni 🙁

    • sandbox ortamında kara listeye alınma gibi bir durum olmaz, adı üstünde test ortamındayız istediğimizi yapabilmeliyiz.
      kaldı ki production ortamında da öyle hemen kara listeye alınmazsınız, ddos ataklarında olduğu gibi çok yoğun ve seri şekilde yapılan isteklerde sıkıntı yaşanabilir.
      push.php dosyasını çalıştırıp apns sunucusuna da başarılı bir şekilde bağlanmışsınız,

      öncelikle yazımda bahsettiğim gibi cihazınızın deviceToken’ini doğru bir şekilde alıp, push.php dosyasına ekledinizmi?

      daha sonra, uygulamanızın appDelegate dosyasını örnek kodlarda verdiğim gibi doğru bir şekilde yapılandırdınızmı?

      cihazınız internet’e bağlanabiliyormu?
      cihazınız internete bağlı olduğu router’da APNS bildirimlerinin cihazınıza ulaşabilmesi için 5223 ve 443 numaralı portların engellenmemiş olması lazım.

      ve son olarak uygulamanız, bildiriminizi gönderdiğiniz anda açık mı yoksa kapalımı?
      ben, verdiğim örnekte uygulama açıkken alınan bildirimleri nasıl değerlendireceğimize kafa karışıklığına yol açmamak için değinmedim,
      bu nedenle uygulamanız açıksa ekranda bir bildirim görmez ve ses duyamazsınız, ama aslında bildiriminiz iletilmiş olabilir.
      kısacası (bunu verdiğim örnek için söylüyorum) bildiriminizi gönderdiğnizde uygulamanızın o an kapalı olmasına dikkat edin.

  3. Öncelikle yazınız ve emeğiniz için çok teşekkür ederim.

    Dediklerinizi adım adım yaptım ve .Net üzerinden test mesajı gönderdim. Sıra geldi development ortamına. APNs tipinde bir production sertifikası yarattım. Provision profile sekmesinden Distribution ve App Store seçeneği ile devam ettiğimde No Certificates available diyor, production sertifikasından App store and Ad Hoc mu seçmemiz gerek öncelikle,

    Apple Push Notification service ssl sertifikası yeterli olmuyor mu, bu birinci sorum.

    İkincisi ise, app store a göndermeden gateway.push.apple.com gerçek ortamı deneyebiliyor muyuz. Yardımlarınız için şimdiden çok teşekkür ederim.

    • karşılaştığınız “No Certificates available” hatasının APNS sertifikalarıyla bir alakası yok. uygulamayı app store’a göndermek için kullanacağınız distribution sertifikasını oluşturmamışsınız. bu sertifikanın nasıl oluşturulacağını apple developer ve distribution provisioning profilleri yazımda detaylı bir şekilde anlatıyorum.

      ikinci sorunuza gelince, malesef production ortamında APNS’i ancak sandbox üzerinden test edebilirsiniz. gateway.push.apple.com adresine bağlantı kurabilir hatta bildirimlerinizi sunucuya başarıyla gönderebilirsiniz, ama gönderdiğiniz bildirimler development ortamında çalışan uygulamanıza gelmez. production ortamında alacağınız deviceToken’ile distribution ortamında alacağınız deviceToken birbirlerinden farklıdır ve development ortamında test ettiğiniz uygulamanızdan distribution deviceToken’ı alamazsınız.

  4. İlginiz için gerçekten çok teşekkür ederim Yasin Bey, verdiğiniz bilgiler doğrultusunda ilerliyorum. Beni endişelendiren bu konuda biraz daha netleşebilmem adına bir soru daha sormak istiyorum müsadenizle.

    didRegisterForRemoteNotificationsWithDeviceToken metodu ile deviceToken alıyorum, servisle gönderip veritabanına kaydediyorum ve sandbox ile mesajı gönderiyorum. Uygulamamı developerden distribution sertifikasına değiştirip yayınladığımda aynı method farklı bir deviceToken mı üretip gönderecek aynı cihaz için? Bu doğrultuda tek yapmam gereken developer serifikasından distribution serifikasına çekip yayınlamak ve mesaj gönderme uygulamamı gateway.sandbox.push.apple.com dan gateway.push.apple.com ‘ a çevirip mesajların gönderilmesini beklemek midir?

    Yardımlarınız için çok teşekkür ederim.

    • evet, aynen öyle.
      tek yapmanız gereken mesajlarınızı APNS distribution sertifikasıyla gateway.push.apple.com adresine yollamak.
      didRegisterForRemoteNotificationsWithDeviceToken metodu uygulamanız app store üzerinden indirildiğinde distribution ortamına uygun devicetoken’lar üretecektir.

  5. Merhaba Yasin Bey,

    Yönergelerinizi adım adım uyguladım, myKey.p12 dosyası yarattım. Asp.net C# ile yazdığım web servisini sunucuya taşıdım (myKey.p12 ile birlikte) Yazdığım web servisini kullanarak tanımlı cihazlara push mesaj gönderebiliyorum.

    Uygulama yayın aşamasında, bu aşamada developer sertifikasıyla yarattığım p12 dosyası ile appstore dan indirilecek olan uygulamama push mesaj gönderebilri miyim, yoksa myKey.p12 dosyamı distribution sertifikasına göre tekrar mı yaratmalıyım? Yayın öncesi benim yapmam gerekenler nelerdir push mesaj ile ilgili? Bu konularda bizleri bilgilendirirseniz seviniriz.

    • yayındaki uygulamanıza bildirim gönderebilmek için sizinde belirtiiğiniz gibi apns distribution sertifikasıyla aynen development sertifikalarını oluşturmak için anlattığım adımlarda olduğu gibi yeni sertifikalar oluşturmalı ve development ortamında bildirimlerinizi gönderdiğiniz “gateway.sandbox.push.apple.com” adresi yerine “gateway.push.apple.com” adresine 2195 no lu port üzerinden bağlanmalısınız.

  6. Çok Teşekkür ederim Yasin Bey,

    developer.apple.com / Identifiers bölümünde “Website Push IDs” adında bir link var, bu konuda bir bilginiz var mıdır ne işe yaradığı, nasıl kullanıldığı ve sizin anlattıklarınızdan farkı konusunda?

    • “Website Push IDs”’ aynen ios cihazlarındaki gibi ama bu defa sadece Mac Os işletim sistemi üzerinde çalışan safari tarayıcısıyla sitenizi ziyareteden kullanıcılara mac os’da bulunan notification center aracılığıyla bildirimler göndermek için kullanabileceğiniz bir sistem. IOS’ile bir alakası yok.

  7. Teşekküler Yasin bey;
    Başarılı bir şekilde mesaj gönderdim telefonuma.
    Ancak diğer prosedürler konusundada bizleri aydınlatırsanız memnun oluruz. Mesela programı açıp çıksam bile badge’da hala mesaj numarası kalıyor. vs.. vs… gibi konulardada aydınlatırmısınız bizi. Teşekkürler

    • badge’da beliren sayıyla ne yapılacağını uygulama içerisinde kendiniz halletmeniz gerekiyor, beliren sayı kendiliğinden kaybolmaz. Bunun için “[UIApplication sharedApplication].applicationIconBadgeNumber” ile mevcut badge’da bulunan sayının ne olduğunu kontrol edebilir ve düzenleyebilirsiniz. Eğer badge’da beliren sayının uygulama açıldıktan sonra silinmesini istiyorsanız, örnek vermek gerekirse appDelegate içerisinde “applicationDidBecomeActive” metodu içerisinde badge’i sıfırlayabilirsiniz. Veya beliren badge’ın örnek veriyorum whatsapp gibi bir uygulama da gelen okunmamış mesajların sayısını temsil ettiğini düşünün, bu durumda mevcut badge’ı uygulamayı her açtığınızda direkt sıfırlamak yerine okunmayan mesajların sayısına göre eksiltmek gerekebilir. Kısacası bu sayıların nasıl kullanılacağı tamamıyla sizin uygulamanızın kullanım amacına göre değişebilir. Bu nedenle badge sayılarının nasıl kullanılacağı sizin insiyatifinize bırakılmıştır.

  8. – (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
    [userInfo objectForKey:@”label”]
    ile verilere ulaşıyoruz ama bu prosedür sadece bildirime tıklanmışsa çalışıyor sanırım.
    Bildirim geldiğinde yorumlanacak bir sınıf varmı ya da
    Açılış sınıfından bu verlere ulaşmak mümkünmüdür?

    • öncelikle uygulama stateleri hakkında kısa bir bilgi şuradan
      “didReceiveRemoteNotification” metodu sadece uygulama çalışırken (“active state”) gelen bildirimlerle veya uygulamaya gelen bildirimlere tıklanılması veya daha önce gelen bildirimin notification center’den tıklanmasıyla tetiklenir.
      Eğer uygulamanız “not runing state”‘deyken bir bildirim alındıysa ve daha sonra uygulama normal bir şekilde uygulama ikonuna tıklanarak açıldıysa didReceiveRemoteNotification metodu tetiklenmez.
      peki kullanıcı uygulamayı bildirime tıklamadan açtıysa gelen bildirim içeriğinde bulunan, örnek veriyorum tekst mesajını nasıl alacağız diye bir soru oluşacaktır kafanızda.
      bu durumda “appDelegate” metodlarından olan “didFinishLaunchingWithOptions” metodunda yer alan “launchOptions”
      “UIApplicationLaunchOptionsRemoteNotificationKey” key’i ile aşağıdaki gibi parse edilmelidir. Bu sayede notification payload’ına ulaşabilirsiniz.

      “NSDictionary *remoteNotification = [launchOptions objectForKey: UIApplicationLaunchOptionsRemoteNotificationKey];”

      ama unutmayınki “didFinishLaunchingWithOptions” metodu uygulama “not running state”‘den açlıdığında çağrılacaktır, uygulama “suspended state”‘den foreground’a çağrıldığında bu metod tetiklenmez.
      suspended’den foreground’a bildirime tıklanmadan uygulama açıldığında gelen bildirim payload’ını elde etmeniz mümkün değil.

      bir öneri olarak böylesi bir durumu bypass etmek için uygulamanıza ait bir sunucu tarafı hazırlamalı ve her uygulamanın sunucunuza unique bir identifier göndermesini sağlamalısınız,
      daha sonra ilgili kullanıcıya gönderdiğiniz notification payload’ının bir kopyasını veritabanınızda gönderdiğiniz kullanıcının uniqe Id’si ile kaydetmeli ve kullanıcı bildirimlere tıklamadan uygulamayı açtığında uygulama ikonu üzerinde beliren badge number’a göre bir http request’i ile uygulamanın sunucuya bağlanıp en son notification payload’ını almasını sağlayabilirsiniz.

  9. deviceToken almak için uygulamayı çalıştırdığımda didFailToRegisterForRemoteNotificationsWithError methoduna giriyor. neden olabilir acaba?

    • didFailToRegisterForRemoteNotificationsWithError metodu sadece uygulamada kullanıcısı tarafından bildirimler tamamıyla devre dışı bırakılmış veya internet bağlantısının bulunamadığı durumlarda veya son olarak uygulama app-Id’si üzerinde APNS etkinleştirilmemişse çağrılır. bahsettiğim bu üç nedenden biri veya bir kaçı bu problemle karşı karşıya kalmanıza neden olmaktadır. kontrol edin.

  10. Yasin bey rica ediyorum bana ulaşın mail atmanızı bekliyorum 2 aydır apple geliştirici hesabı satın aldım ama yapamıyorum neyi yanlış yapıyorum yada yapamıyorum anlamadım lütfen mail atın mesajınızı bekliyorum.

    • neyi yapamadığınızın belirtirseniz yardımcı olmaya çalışayım. Bu aralar inanılmaz derecede yoğunum gecikmeler için şimdiden özür dilerim.

  11. Yasin Bey Merhaba,
    Böyle bir kaynağı bizimle paylaştığınız için çok teşekkür ederim. Anlattıklarınızı yaptım fakat şöyle bir sorun çıktı. Uygulamayı açınca bildirim izini çıkmıyor. Herhangi aksiyon olmuyor. Beyaz ekranda duruyor. Terminal kısmında şöyle bir hata almıştım;
    ‘openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert combined.pem’ bu koddan sonra
    ‘unable to load client certificate private key file
    628:error:0906D06C:PEM routines:PEM_read_bio:no start line:/SourceCache/OpenSSL098/OpenSSL098-50/src/crypto/pem/pem_lib.c:648:Expecting: ANY PRIVATE KEY’
    geçerli konumu desktop a da aldım.
    Sizce sorun nedir. Şimdiden teşekkürler

    • uygulamayı açınca bildirimlerle ilgili bir izin mesajı görmemeniz sertifikalarınızla alakalı olamaz. uygulamanıza ait AppDelegate dosyası içerisinden APNS’in aşağıdaki gibi doğru bir şekilde register edilmiş olması gerekli.

      – (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
      {
      // Override point for customization after application launch.

      [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];

      return YES;
      }

  12. Merhabalar, anlatımınız için teşekkür ediyorum. Ben şu satırdan sonra sorun yaşıyorum : openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert combined.pem

    Hatayı nerde yapıyorum bir fikrim yok. Yardımcı olabilir misiniz?

    unable to load client certificate private key file
    12911:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:/SourceCache/OpenSSL098/OpenSSL098-50/src/crypto/evp/evp_enc.c:330:
    12911:error:0906A065:PEM routines:PEM_do_header:bad decrypt:/SourceCache/OpenSSL098/OpenSSL098-50/src/crypto/pem/pem_lib.c:428:

    • Muhtemelen dosyalarınızı oluştururken kullandığınız passwordler de yaptığınız bir yanlışlık bu duruma neden oluyor.
      anlattığım adımları tekrarlayın ve yeni dosyalar oluşturun ve verdiğiniz password’lere dikkat edin.

  13. Hocam merhaba .
    geliştirme amaçlı push notification gönderdim herhangi bir sorun çıkmadı.
    Ancak dağıtım için aynı işlemleri yaptım sertifikaları oluşturdum. terminalden gateway.push.apple.com:2195 adresine mesaj gönderdim herhangi bir sorun çıkmadı. Siteden gönderdiğimde yine APNS sunucusuna baglanildi, Bildirim, basarili bir sekilde APNS sunucusuna gonderildi. mesajları alıyorum. Ancak push mesajı cihazıma gelmiyor. gelişirme aşamasında geliyordu. Bildirim izinleri açık.

    Dağıtım için hazırlarken veya mesaj gönderirken farklı bir durum falan mı var acaba.

    • muhtemelen apps development sertifikasıyla app store’da yayınlanmakta olan uygulamanıza bildirim göndermeye çalışıyorsunuz. oldukça sık yapılan bir hatadır.
      uygulamanız dağıtımdayken yani app Store’da yayınlanırken apns production sertifikasını kullanarak apns sunucusuna bağlanmalı ve bildirimlerinizi göndermelisiniz.
      apps development sertifikasıyla apns sunucusuna bağlanabilir ve bildirimlerinizi gönderebilirsiniz, ama o bildirimler app store üzerinden indirilmiş uygulamanıza ulaşmaz.
      uygulama app store’dan indirildiğinde uygulama production ortamına özel deviceToken’lar üretir ve cihazlardan topladığınız bu deviceToken’larla ancak apns production sertifikasını kullanılarak bildirim gönderebilirsiniz.

      • Muhtemelen bir yerde hata yapıyorum ancak onu bulamadım.
        production sertifikasını kullanarak sertifika hazırladım.
        uygulamayayı app storeden indirdim. device token değerlerini sunucumda tutturuyorum dağıtım esnasındaki token değeri farklı.
        herşeyi sizin cevabınızda yazdığınız gibi yaptım ancak neyi yanlış yaptığımı bulamadım.
        Birde ekstra bilgi olarak cihazların device token değerleri her uygulama için faklı mı oluyor.

        • devicetoken’lar bir cihazda tüm uygulamalar için aynıdır. devicetoken sadece cihaz sıfırlanırsa değişir.
          Ayrıca development ve production devicetoken’ları da bir birlerinden farklı olur.

  14. Merhaba yasin bey;
    Development sertifikası ile push notification gönderebiliyorum, uygulamayı silkdikten sonra push notification gönderdiğim zaman feedback’a herhangi bir cihaz düşmüyor.
    ilk gün denediğimde oluyordu fakat ertesi gün olmamaya başladı , nedeni ne olabilir?

    teşekkürler.

    • eğer uygulamanız, cihaz üzerinde development apns sertifikasıyla konfigure edilmiş son uygulamaysa,
      uygulamayı sildiğinizde feedback sunucusuna bir kayıt düşmez,
      çünkü sildiğiniz uygulama cihazınızın apns sunucusuyla olan son bağlantısıdır.
      Sildiğiniz uygulama kendini sandbox apns sunucusunun feedback listesine bildiremez ve sizde bir feedback alamazsınız haliyle.
      Çözüm: apps development sertifikasıyla konfigure edilmiş basit bir uygulama hazırlayın. Uygulamada çok detaylı bir yapı kullanmanıza gerek yok sadece bildirimler için register edin yeter ve uygulamayı silmeyin bu sayede sandbox apns sunucusuyla bir bağlantı sağlanacak ve asıl test etmek istediğiniz uygulamayı sildiğinizde sandbox feedback listesine devicetoken düşecektir.

  15. Merhabalar Hocam. Anlatımınız için çok teşekkürler. Gayet anlaşılır bir haldeydi. Dediklerinizi adım adım yaptım fakat şu hatayı alıyorum :

    Warning: stream_socket_client(): SSL operation failed with code 1. OpenSSL Error messages: error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure in /Library/WebServer/Documents/bildirim/push.php on line 15

    Warning: stream_socket_client(): Failed to enable crypto in /Library/WebServer/Documents/bildirim/push.php on line 15

    Warning: stream_socket_client(): unable to connect to ssl://gateway.sandbox.push.apple.com:2195 (Unknown error) in /Library/WebServer/Documents/bildirim/push.php on line 15
    APNS baglati hatasi:(0) =>

    • Merhaba Hocam. Sorunu yine kendim çözdüm.

      pem dosyasını masaüstünden göstermek yerine direk httpdocs klasör içine atınca çözüldü. 🙂

      Diğer sorum bunu kendi sunucumuza nasıl taşıyacağız ?

  16. Merhabalar,

    Ben asagidaki gibi serverima tokenlari gonderiyorum, fakat soyle bir sikintim var, bir kere push gonderiyime hayir dedikten sonra tekrar bu kodu calistiramiyorum. Aslinda tekrar uyg. nasil push gonderme izin popup ini cikartabilir. Uygulamayi silip kaldiriyorum tekrar yukluyorum fakat benden izin istemiyor. Tekrar nasil izin istetebilirim.

    -(void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
    {
    NSString* _str = [NSString stringWithFormat:@”%@”,deviceToken];
    _str = [_str stringByReplacingOccurrencesOfString:@”” withString:@””];

    [[Server sharedServer]registerPushToken:_str];
    }

    • neyazıkki push notification izinlerinin sorulduğu alert penceresi uygulama ilgili cihazda sadece ilk defa çalıştırıldığında görüntülenir. Uygulamayı cihazdan silip tekrar yüklemeniz bile alert penceresinin görüntülenmesini sağlamaz. Uygulamada kullanıcının notification’lara izin verip vermediğini manuel olarak denetleyip uygulamanıza özel bir alert penceresi yaratmalı ve kullanıcıdan bildirimlere izin vermesini talep etmelisiniz.

  17. $tokenarray yaklasik 1000 deviceToken id giriyorum fakat, kodu calistirdigimda ilk 50 si basariyla gitti diyor geri kalan hata gonderilemedi mesaji veriyor. Nette arastirdigim da Google daki gibi her hangi bir limitation olmadigi gozukuyor.

    • uygulamanızdan bildirimler almayı kabule etmiş fakat sonradan bildirim almayı red etmiş veya uygulamayı cihazından silmiş kullanıcılara bildirim göndermeye çalıştığınızda ilgili kullanıcının deviceToken’ine sıra geldiğinde socket bağlantınız apns server tarafından sonlandırılır. Bu nedenle belli aralıklarla veya bildirimlerinizi göndermeden önce feedback sunucusuna bağlanın ve uygun olmayan cihazlara ait deviceToken’ları gönderim listenizden çıkarın.

      • Yukardaki feedback php kodunu denedim, sandbox yazisini kaldirdim, feedback arrayine kayitli cihazlarin tokenlarini ekledim. Sonuc; tum cihazlarima gonderemiyorum sanirim, tum hepsini listeledi. 10000 kullanicimin hepside sanirim hayir dememistir diye dusunuyorum, zaten icindeki 50 kullaniciya gonderebilmistim.

        Nette buldugum birisi daha boyle bir sorunla karsilasmis, acaba yeni bir sinirlamami getirdiler.

        http://www.kubilayerdogan.net/sample-apple-push-notification-php-script/

      • Pardon sadece sandbox i sildim ve kendi cert pathimi ve sifremi yazdim ve sonuc;

        APNS feedback sunucusuna baglanildi
        uygulamanin kaldirildiÄŸi herhangi cihaz bulunamadi

        burdada bir terslik var aslinda, soyleki 10000 kisinin hepsi mi kabul etmis?

        • bir feedback alabilmeniz için öncelikle kullanıcılarınıza bir bildirimde bulunmanız gerek. Uygulamanızı silmiş olan kullanıcılara ait feedback’i ancak bir kere bildirim göndererek alabilirsiniz ve aldığınız bu feedback daha sonra silinir, ikinci defa ulaşılamaz.

  18. Merhaba, ben bir uygulama için veri tabanından gelen bilgilere göre ilgili kullanıcılara bildirim gönderen bir php scripti yazdım.
    Bu scriptin sürekli çalışması gerekiyor. Bunun için de dakikada bir tetiklenen bir cron job oluşturmayı düşünüyorum.
    Yani bu durumda APNS suncusuna dakikada bir soket bağlantısı açılacak.
    Sormak istediğim bu durumda kara listeye girer miyim?

    • her dakika socket bağlantısı açmaya çalışmayın. Bir kez socket bağlantınızı açın ve sürekli açık kalsın. sadece bağlantının düşüp düşmediğini kontrol edin, eğer bağlantı düşmüşse yeniden açın ve açık kalsın. Her dakika socket bağlantısı açıp kapamaya çalışmayın.

  19. Yasin Bey merhaba

    Öncelikle anladımınız harika ve açıklayıcı teşekkürler

    Benim bir projem var sisteme girilen verilerin işleme alınma süreleri aştığında eğer zaman aşımına uğramış işlem varsa yöneticilere her 5 dakikada bir bekleyen işlemler var diye eposya ve sms yolluyorum push notification sistemi her 5 dakikada toplamda 30 kullanıcıya mesaj gönderse yoğunluk olarak görüp engellenmeme neden olurmu sms yerine aplikasyonlara bu şekilde uyarı göndermem sizde mantıklımıdır.

    Teşekkürler

    • öncelikle SMS yerine push notification kullanmanızı tavsiye ederim. APNS server sadece çok seri bir şekilde DDOS ataklarında olduğu gibi yapılan bağlantıları engeller. 5 dakika aralıklarla socket bağlantısı açmanız bir soruna neden olmaz.

  20. Merhaba yasin bey,

    Aspn sertifikası oluşturma kısmında bir sorum olacaktı. Sertifikamın süresi dolmuş developer.apple.com üzerinden development ve production sertifikalarımı edit diyerek yeniledim.

    Mac üzerinde Tüm anahtar ve sertifikalarımı sildim. developer.apple.com üzerinden sertifikaları ve provisionig profile dosyalarını indirdim. Buraya kadar sorun yok. Sorun şu, anahtar zinciri erişiminde Sertifikalar bölümüne gelip sizin 8. adımda gösterdiğiniz gibi Apple Development IOS Push service dosyasının altında anahtar simgesi çıkmıyor, yanında ok ta yok. Dolayısıyla p12 dosyasını dışa aktaramıyorum.

    Sertifikaları silmeden önce p12 dosyası yaratmıştım ama

    System.Security.Authentication.AuthenticationException: A call to SSPI failed, see inner exception. —> System.ComponentModel.Win32Exception: Sertifikanın işlenmesi sırasında bilinmeyen bira hata oluştu — End of inner exception stack trace

    mesajı çıktı bende hepsini silip baştan oluşturayım diyince busefer p12 dosyasını dışarı aktaracağım anahtar simgesi yok oldu. Ne yapabilirim?

    • süresi dolan sertifikalarınızı provisionin portalda yenilemek için kullandığınız “Certificate Signing Request” dosyası ya kendi mac’inizde oluşturmadığınız bir istek dosyası ya da eski bir sürüm.
      şu an kullanmakta olduğunuz mac’inizde “apple developer / distribution provisioning profilleri” yazımda 7. adımda anlattığım şekilde yeni bir “Certificate Signing Request” dosyası oluşturun ve bu dosyayı kullanarak provisioning portalda yeni sertifikalar yaratın.
      sadece sahibi olduğunuz sertifikalarınızın private key’lerini anahtar zincir erişiminden elde edebilirsiniz.

  21. Merhaba Yasin Bey,

    Certificate sekmesinden Development ve Production sertifikalarını edit diyerek yenilemiştim, hep aynı mac ile çalışıyorum. Yenilerken certificate signing request dosyasını yeni oluşturmuştum. Provising Profiles sekmesindeki Development ve Distiribution sertifikalarını sildim tekrar oluşturdum, burada zaten certificate signing request dosyası istenmiyor. Dün bahsettiğim gibi sertifika üzerinde anahtar çıkmıyor.

    Peki o zaman şöyle bir soru daha yönelteyim;

    Certificate Sekmesindeki Development sertifikalarımı (2 adet biri IOS Development diğeri APNs Development IOS)

    ve Production sertifikalarımı (3 adet biri IOS Distiributioni diğeri APNs Production IOS, sonuncusu da hala geçerliliği olan APNs Production IOS)

    yenilemek üzere tamamını silsem yayındaki uygulamamı nasıl etkiler? ne gibi sorunla karşılaşırım. Sonuçta edit diyerek gönderdiğim certificate signing request dosyası yeni oluşturduğum dosyalar, sadece birden çok oluşturdum sonuçta aynı şeyi üretiyor. Şuan Tüm sertifikalar yeşil ama sorun p12 dosyasını aktaracağım anahtarın çıkmaması.

    • Sertifikaları silmeniz hiç bir şekilde yayında olan uygulamanızı etkilemez. Zaten sertifikaların belirli geçerlilik süreleri vardır ve süresi dolduğunda kendiliğinden geçersiz kalırlar ve yeni sertifikalar oluşturmanız gerekir. Uygulamalar için bağlayıcı olan appId’lerdir. Bu nedenle appId’ler bir kez oluşturulduktan sonra silinemezler.

  22. Merhaba,

    Benzer bir sorun da bende oluştu Yasin bey. Bende bunun için Apple Id sekmesinden edit diyerek Apple Push Notification service SSL Certificates altındaki Development ve Production sertifikalarını silip tekrar oluşturdum anahtar geldi. Yalnız şöyle bir durum oluştu. Developer sertifikasından p12 dosyasıyla lokal cihaz id mi kullanarak mesaj gönderdim. Aynı şeyi Production sertifikasından yarattığım p12 dosyası ve hali hazırda yayında olan uygulamamdan elde ettiğim cihaz id mi kullanarak mesaj göndermeye çalıştığımda mesaj gitmedi. Daha önce gidiyordu. Kafamdaki soru şu, mevcut sertifikayı silmedim yeni birtane yarattım, şimdi yayındaki uygulamam eski production sertifikasından yarattığım p12 dosyasıyla gönderdiğim mesajlarımı doğru şekilde iletir yoksa yeni sertifikadan elde ettiğim p12 dosyasıyla gönderdiğim mesajları mı iletir? Gerçi ikisinde de göndermedi acaba yayındaki uygulamam için üretilen cihaz id falan mı değişti yoksa sertifika sorunu mu, sizce neden gitmiyor olabilir?

    • gerek arkadaşınızın sorusuna verdiğim cevap gerek daha önce defalarca benzer sorunla gelen kişilere verdiğim cevaplarda olduğu gibi, sertifikalar bağlayıcı değildir. yayında olan uygulamalarınıza ait tüm sertifikaları dilediğiniz kadar revoke edip yeniden oluşturun hiç bir şey değişmez. yayında olan uygulama production ortamında yeni sertifikalarınızla kullanabileceğiniz devicetoken’lar üretmeye devam eder. sertifikalar sizin kullanımınız için üretilir, uygulamanın değil. yani kısacası yeni sertifikalarınızla mevcut production devicetokan’larına notification gönderebilirsiniz. genelde yapılan küçük hatalar (sertifika private’key’ini oluştururken verdiğiniz password’u hatalı girme, development sertifikasıyla production ortamındaki cihazlara notification göndermeye çalışmak, eski veya başka bir mac’de oluşturulmuş signing request dosyalarıyla elde ettiği sertifikalardan private’keyleri çıkartamama gibi ) bu türde problemlerin muhtemel nedenidir. Hatta appStore production sertifikasıyla apns sunucusuna bağlanmaya çalışan ama yaptığı hatayı ısrarla görmezden gelen ve problemin sistemden kaynaklandığını iddia eden kişilere bile rastladım. herşeyi, tüm sertifikaları, signing request dosyalarınızı silin ve yeniden oluşturun size önerebileceğim tek tavsiyem şu an için budur.

  23. Merhaba Yasin Bey,

    Dediklerinizi harfiyen yaptım tüm sertifikaları sildim baştan yaptım oldu. Çok teşekkür ederim. Son olarak sertifikaların sürelerinin dolması yayında olan uygulamayı etkilemez demiştiniz, sertifikaların süresinin dolduğu son 1 haftadır Iphone 6 larda uygulamam açılırken splash ekranından sonra kapanıyormuş öyle geri bildirimler aldım birkaç kişiden. Bu süreçte herhangi bir değişiklik yapmadım. Sertifika ile ilgili bir durum değilse sizce neden olabilir. Simulatorde sorun yok iphone 6 da.

    • sertifikalarla ilgili sorunlar uygulamanın çökmesine neden olmaz. Muhtemelen başka bir nedeni vardır. Itunes connect’üzerinden çökme raporlarını inceleyin.

  24. Yasin Bey dediklerinizi yaptım, sertifika ile ilgili değilmiş 64bit cihazlarda daha önce çalışan kod çalışmamaya başladı. Çözümünü buldum Projenin targets bölümündeki valid Architectures satırından arm64 kodunu sildim çalıştı. Kafam biraz karıştı emin olmak adına size sormak istediğim şey şudur;

    1 Şubat itibariyle Apple 64 bit desteği olmayan uygulamaların güncellenmeyeceğini açıkladı bu sebeple 64 bit desteği ile ilgili çalışma yapmıştım.

    Mevcut kodumda

    Projects bölümünde Architectures satırında : Standard architectures(armv7, arm64) – $(ARCHS_STANDARD) yazıyor. Valid Architectures satırında : arm64 armv7 armv7s yazıyor.

    Targets bölümünde Architectures satırında : Standars architectures Standard architectures(armv7, arm64) – $(ARCHS_STANDARD) yazıyor. Diğeri ile aynı, ancak Valid Architectures satırında armv7, armv7s yazıyor. Yani arm64 ü sildim hata çözüldü. 64 bit desteği için yukarıdaki verdiğim proje ayarları doğru mudur yoksa Targets bölümü valid architectures satırına da arm64 eklemeli miyim. Bu soruya vereceğiniz cevap beni ciddi anlamda rahatlatacak. Çünkü projemin appstore a göndermeye çekiniyorum şuan.

    • öncelkle targets, project üzerinde baskındır. Yani targets alanında yaptığınız değişiklikler geçerlidir.
      architectures satırı uygulamanın çalıştırılabileği platformu,
      valid architectures satırıysa uygulamanızın gerçekte çalışabileceği platformu belirtir.
      örneklemek gerekirse
      architectures’da arm64 yazıyorsa a7 ve a8 işlemcisi olan cihazlar (iphone5s, iphone6 serileri, iPadAir, ipadMini2 ve ipadMini3) tarafından uygulamanızın 64 bit binary’si çalıştırılacaktır.
      (Not:armv7 iphone3gs’den bu yana, armv7s iphone5, iphone5c ve ilk retina ipad’den bu yana olan cihazlar için. detaylar: http://iossupportmatrix.com)
      ama architectures satırının aksine valid architectures’da arm64 belirtmediyseniz, bu cihazlarda uygulamanızın 32 bit binary’si çalıştırılacaktır.
      yani 64 bit veya 32 bit binary’lerin oluşturulması valid architectures satırında tanımlanmış olmalarına bağlıdır.
      siz 64 bit versiyonunu hata verdiği için valid architectures’dan kaldırarak 64bit cihazlarda 32bit binary’nin çalışmasını istediğinizi belirtiyorsunuz,
      yani uygulamanız 64bit cihazlarda çalışacak ama 64bit’in sunduğu avantajları kullanamayacaktır.
      ayrıca appStore’a uygulama yüklemek için ios8 SDK’sını kullanmak zorunlu hale getirildi.

  25. Çok teşekkürler yasin bey, forumunuz açılmış hayırlı olsun. Oraya mutlaka kayıt olacağım. Konu bütünlüğünü bozmamak adına burdan yazmayı uygun gördüm ancak siz dilerseniz forumunuza taşıyabilirsiniz oradan devam ederin bundan sonraki sorularımıza. En aktif forum kullanıcılarından biri olacağım. Bizlere böyle bir forum hizmeti sunduğunuz için çok teşekkürler.

    Yasin Bey uygulamamda kullandığım hazır menü 64 bit cihazlarda arm64 te (simulatorde değil gerçek cihazlarda) hata verdiği için target valid architecture satırından kaldırdım, peki bu haliyle 1 şubattan sonra yayınlayabilir miyim, apple ın kabul etmeme yada benim sorun yaşama ihtimalim var mı, performans ihtiyacım yok o sebeple 64 bit ihtiyacı duymayacağımı düşünüyorum, xcode 6.1.1 son sürümü kullanıyorum onunla derledim.

    • malesef 1 şubat’dan sonra yayınlayamazsınız, sizin de bildiğiniz gibi apple 64bit uyumluluğunu zorunlu kılıyor yani, yeni bir uygulama yükleseniz veya mevcut uygulamanızı güncelleseniz bile valid architecture’s va architectures satırlarında armv64 ibaresini eklemelisiniz. uygulamanız destekleyen cihazlarda 64bit çalışabilmeli.

  26. Yasin bey merhaba , paylaşım için teşekkür ederim güzel bir çalışma olmuş , ben bildirim yapmayı başardım fakat aklıma takılan soru diğer kişiler indirdiğinde bunların tokenlerini nasıl otomatik push php sayfasına çektireceğim ? Bu konuda bilgi verebilirmisiniz?

    • kullanıcılar uygulamanızı indirdiğinde uygulamanızda kullanıcının devicetoken’ini sizin serverlarınıza bildirecek bir HTTP request’i oluşturmalı ve aldığınız devicetoken’ları bir database’inize kaydetmelisiniz.

  27. öncelikle ellerinize sağlık, ios ‘da çok çok yeniyim. anlatımınızı phonegap üzerinde uygulayabilir miyim? teşekkürler

    • bu blog’da verdiğim bilgiler apple’ın native SDK ve programlama dilleri için geçerlidir. 3. parti SDK ve programlama dilleri için ilgili platformun dokümantasyonunu incelemelisiniz.


Yorumunuzu bırakın

Geri izleme yok.