Push bildirimlerini kullanma

Push bildirimleri, uzak bildirim sağlayıcılarının bir mobil aygıt üzerinde çalışan uygulamalara bildirim göndermesine olanak tanır. AIR 3.4, Apple Push Notification hizmetini (APNs) kullanan iOS aygıtları için push bildirimlerini destekler.

Not: Bir AIR for Android uygulaması için push bildirimlerini etkinleştirmek üzere, Adobe evangelisti Piotr Walczyszyn tarafından geliştirilen as3c2dm gibi bir yerel uzantı kullanın.

Bu bölümün geri kalanında, AIR uygulamasında iOS uygulamaları için push bildirimlerinin nasıl etkinleştirildiği açıklanmaktadır.

Not: Bu konuda, Apple geliştirici kimliğine ve iOS geliştirme iş akışı konusunda bilgiye sahip olduğunuz ve bir iOS aygıtı üzerinde en az bir uygulama dağıtmış olduğunuz varsayılır.

Push bildirimlerine genel bakış

Apple Push Notification hizmeti (APNs), uzak bildirim sağlayıcılarının, iOS aygıtları üzerinde çalışan uygulamalara bildirim göndermesine olanak tanır. APNs şu bildirim türlerini destekler:

  • Uyarılar

  • Rozetler

  • Sesler

APNs hakkında tüm bilgiler için bkz. developer.apple.com.

Uygulamanızda push bildirimlerini kullanmak, birkaç özelliği beraberinde getirir:

  • İstemci uygulama - Push bildirimlerine kaydolur, uzak bildirim sağlayıcılarıyla iletişim kurar ve push bildirimlerini alır.

  • iOS - İstemci uygulama ve APNs arasındaki etkileşimi yönetir.

  • APNs - İstemci kaydı sırasında bir tokenID sağlar ve uzak bildirim sağlayıcılarından gelen bildirimleri iOS'a iletir.

  • Uzak bildirim sağlayıcısı - tokenId-istemci uygulama bilgilerini saklar ve bildirimleri APNs'ye iletir.

Kayıt iş akışı

Push bildirimlerinin sunucu tarafı bir hizmete kaydedilmesine yönelik iş akışı şu şekildedir:

  1. İstemci uygulama, iOS'un push iletme bildirimlerini etkinleştirmesini ister.

  2. iOS isteği APNs'ye iletir.

  3. APNs sunucusu, tokenId öğesini iOS'a döndürür.

  4. iOS, tokenId öğesini istemci uygulamaya döndürür.

  5. İstemci uygulama (uygulamaya özgü bir mekanizma kullanarak), tokenId öğesini uzak bildirim sağlayıcısına sağlar ve bu da tokenId öğesini push bildirimleri için saklar.

Bildirim iş akışı

Bildirim iş akışı şu şekildedir:

  1. Uzak bildirim sağlayıcısı bir bildirim oluşturur ve bildirim yükünü, tokenId öğesiyle birlikte APNs'ye iletir.

  2. APNs, bildirimi aygıt üzerindeki iOS'a iletir.

  3. iOS bildirim yükünü uygulamaya iletir.

Push bildirim API'si

AIR 3.4, iOS push bildirimlerini destekleyen bir API kümesini kullanıma sunmuştur. Bu API'ler flash.notifications paketindedir ve şu sınıfları içerir:

  • NotificationStyle - Bildirim türlerine yönelik sabit değerleri tanımlar: ALERT, BADGE ve SOUND.C

  • RemoteNotifier - Push bildirimlerine abone olmanıza ve bunlara yönelik aboneliğinizi iptal etmenize olanak sağlar.

  • RemoteNotifierSubscribeOptions - Hangi bildirim türlerinin alınacağını seçmenize olanak sağlar. Çoklu bildirim türlerine kaydolan bir dize vektörü tanımlamak üzere notificationStyles özelliğini kullanın.

AIR 3.4 ayrıca RemoteNotifier tarafından gönderilen flash.events.RemoteNotificationEvent öğesini de şu şekilde içerir:

  • Bir uygulamanın aboneliği başarıyla oluşturulduğunda ve APNs'den yeni bir tokenId alındığında.

  • Yeni bir uzak bildirim alındığında.

Ayrıca, RemoteNotifier, abone olma işlemi sırasında bir hatayla karşılaşırsa flash.events.StatusEvent öğesini gönderir.

Bir uygulamada push bildirimlerini yönetme

Uygulamanızı push bildirimlerine kaydetmek için şu adımları gerçekleştirmelisiniz:

  • Uygulamanızda push bildirimlerine abone olan bir kod oluşturun.

  • Uygulama XML dosyasında push bildirimlerini etkinleştirin.

  • iOS Push Hizmetleri'ni etkinleştiren bir temel hazırlık profili ve sertifikası oluşturun.

Aşağıdaki vurgulanmış örnek kod, push bildirimlerine abone olur ve push bildirimi olaylarını işler:

package 
                        { 
                        import flash.display.Sprite; 
                        import flash.display.StageAlign; 
                        import flash.display.StageScaleMode; 
                        import flash.events.*; 
                        import flash.events.Event; 
                        import flash.events.IOErrorEvent; 
                        import flash.events.MouseEvent; 
                        import flash.net.*; 
                        import flash.text.TextField; 
                        import flash.text.TextFormat; 
                        import flash.ui.Multitouch; 
                        import flash.ui.MultitouchInputMode; 
                        // Required packages for push notifications 
                        import flash.notifications.NotificationStyle; 
                        import flash.notifications.RemoteNotifier; 
                        import flash.notifications.RemoteNotifierSubscribeOptions; 
                        import flash.events.RemoteNotificationEvent; 
                        import flash.events.StatusEvent; 
                        [SWF(width="1280", height="752", frameRate="60")] 

                        public class TestPushNotifications extends Sprite 
                        { 
                        private var notiStyles:Vector.<String> = new Vector.<String>;; 
                        private var tt:TextField = new TextField(); 
                        private var tf:TextFormat = new TextFormat(); 
                        // Contains the notification styles that your app wants to receive 
                        private var preferredStyles:Vector.<String> = new Vector.<String>(); 
                        private var subscribeOptions:RemoteNotifierSubscribeOptions = new RemoteNotifierSubscribeOptions(); 
                        private var remoteNot:RemoteNotifier = new RemoteNotifier(); 

                        private var subsButton:CustomButton = new CustomButton("Subscribe"); 
                        private var unSubsButton:CustomButton = new CustomButton("UnSubscribe"); 
                        private var clearButton:CustomButton = new CustomButton("clearText"); 

                        private var urlreq:URLRequest; 
                        private var urlLoad:URLLoader = new URLLoader(); 
                        private var urlString:String; 

                        public function TestPushNotifications() 
                        { 
                        super(); 

                        Multitouch.inputMode = MultitouchInputMode.TOUCH_POINT; 
                        stage.align = StageAlign.TOP_LEFT; 
                        stage.scaleMode = StageScaleMode.NO_SCALE; 

                        tf.size = 20; 
                        tf.bold = true; 


                        tt.x=0; 
                        tt.y =150; 
                        tt.height = stage.stageHeight; 
                        tt.width = stage.stageWidth; 
                        tt.border = true; 
                        tt.defaultTextFormat = tf; 

                        addChild(tt); 

                        subsButton.x = 150; 
                        subsButton.y=10; 
                        subsButton.addEventListener(MouseEvent.CLICK,subsButtonHandler); 
                        stage.addChild(subsButton); 

                        unSubsButton.x = 300; 
                        unSubsButton.y=10; 
                        unSubsButton.addEventListener(MouseEvent.CLICK,unSubsButtonHandler); 
                        stage.addChild(unSubsButton); 

                        clearButton.x = 450; 
                        clearButton.y=10; 
                        clearButton.addEventListener(MouseEvent.CLICK,clearButtonHandler); 
                        stage.addChild(clearButton); 

                        // 
                        tt.text += "\n SupportedNotification Styles: " + RemoteNotifier.supportedNotificationStyles.toString() + "\n"; 

                        tt.text += "\n Before Preferred notificationStyles: " + subscribeOptions.notificationStyles.toString() + "\n"; 

                        // Subscribe to all three styles of push notifications: 
                        // ALERT, BADGE, and SOUND. 
                        preferredStyles.push(NotificationStyle.ALERT ,NotificationStyle.BADGE,NotificationStyle.SOUND ); 

                        subscribeOptions.notificationStyles= preferredStyles; 

                        tt.text += "\n After Preferred notificationStyles:" + subscribeOptions.notificationStyles.toString() + "\n"; 


                        remoteNot.addEventListener(RemoteNotificationEvent.TOKEN,tokenHandler); 
                        remoteNot.addEventListener(RemoteNotificationEvent.NOTIFICATION,notificationHandler); 
                        remoteNot.addEventListener(StatusEvent.STATUS,statusHandler); 

                        this.stage.addEventListener(Event.ACTIVATE,activateHandler); 


                        } 
                        // Apple recommends that each time an app activates, it subscribe for 
                        // push notifications. 
                        public function activateHandler(e:Event):void{ 
                        // Before subscribing to push notifications, ensure the device supports it. 
                        // supportedNotificationStyles returns the types of notifications 
                        // that the OS platform supports 
                        if(RemoteNotifier.supportedNotificationStyles.toString() != "") 
                        {     
                        remoteNot.subscribe(subscribeOptions); 
                        } 
                        else{ 
                        tt.appendText("\n Remote Notifications not supported on this Platform !"); 
                        } 
                        } 
                        public function subsButtonHandler(e:MouseEvent):void{ 
                        remoteNot.subscribe(subscribeOptions); 
                        } 
                        // Optionally unsubscribe from push notfications at runtime. 
                        public function unSubsButtonHandler(e:MouseEvent):void{ 
                        remoteNot.unsubscribe(); 
                        tt.text +="\n UNSUBSCRIBED"; 
                        } 

                        public function clearButtonHandler(e:MouseEvent):void{ 
                        tt.text = " "; 
                        } 
                        // Receive notification payload data and use it in your app 
                        public function notificationHandler(e:RemoteNotificationEvent):void{ 
                        tt.appendText("\nRemoteNotificationEvent type: " + e.type + 
                        "\nbubbles: "+ e.bubbles + "\ncancelable " +e.cancelable); 

                        for (var x:String in e.data) { 
                        tt.text += "\n"+ x + ":  " + e.data[x]; 
                        } 
                        } 
                        // If the subscribe() request succeeds, a RemoteNotificationEvent of 
                        // type TOKEN is received, from which you retrieve e.tokenId, 
                        // which you use to register with the server provider (urbanairship, in 
                        // this example. 
                        public function tokenHandler(e:RemoteNotificationEvent):void 
                        { 
                        tt.appendText("\nRemoteNotificationEvent type: "+e.type +"\nBubbles: "+ e.bubbles + "\ncancelable " +e.cancelable +"\ntokenID:\n"+ e.tokenId +"\n"); 

                        urlString = new String("https://go.urbanairship.com/api/device_tokens/" + 
                        e.tokenId); 
                        urlreq = new URLRequest(urlString); 

                        urlreq.authenticate = true; 
                        urlreq.method = URLRequestMethod.PUT; 

                        URLRequestDefaults.setLoginCredentialsForHost 
                        ("go.urbanairship.com", 
                        "1ssB2iV_RL6_UBLiYMQVfg","t-kZlzXGQ6-yU8T3iHiSyQ"); 

                        urlLoad.load(urlreq); 
                        urlLoad.addEventListener(IOErrorEvent.IO_ERROR,iohandler); 
                        urlLoad.addEventListener(Event.COMPLETE,compHandler); 
                        urlLoad.addEventListener(HTTPStatusEvent.HTTP_STATUS,httpHandler); 

                        } 

                        private function iohandler(e:IOErrorEvent):void 
                        { 
                        tt.appendText("\n In IOError handler" + e.errorID +" " +e.type); 

                        } 
                        private function compHandler(e:Event):void{ 
                        tt.appendText("\n In Complete handler,"+"status: " +e.type + "\n"); 
                        } 

                        private function httpHandler(e:HTTPStatusEvent):void{ 
                        tt.appendText("\n in httpstatus handler,"+ "Status: " + e.status); 
                        } 

                        // If the subscription request fails, StatusEvent is dispatched with 
                        // error level and code. 
                        public function statusHandler(e:StatusEvent):void{ 
                        tt.appendText("\n statusHandler"); 
                        tt.appendText("event Level" + e.level +"\nevent code " + 
                        e.code + "\ne.currentTarget: " + e.currentTarget.toString()); 
                        } 
                        } 
                        }

Uygulama XML dosyasında push bildirimlerini etkinleştirme

Uygulamanızda push bildirimleri kullanmak için, Entitlements etiketi içinde aşağıdakileri sağlayın (iphone etiketi altında):

<iphone> 
                            ... 
                               <Entitlements> 
                                  <![CDATA[ 
                                     <key>aps-environment</key> 
                                     <string>development</string> 
                                  ]]> 
                               </Entitlements> 
                            </iphone>

Uygulamayı App Store'a iletmeye hazır olduğunuzda, üretim için geliştirmeye yönelik bir <string> öğesi:

      <string>production</string>

Uygulamanız yerelleştirilmiş dizeleri destekliyorsa, aşağıdaki örnekte gösterildiği şekilde intialWindow etiketi altında supportedLanguages etiketinde dilleri belirtin:

<supportedLanguages>en de cs es fr it ja ko nl pl pt</supportedLanguages>

iOS Push Hizmetleri'ni etkinleştiren bir temel hazırlık profili ve sertifikası oluşturma

Uygulama-APNs iletişimini etkinleştirmek için, uygulamayı aşağıdaki gibi iOS Push Hizmetleri'ni etkinleştiren bir temel hazırlık profili ve sertifikası ile paketlemeniz gerekir:

  1. Apple geliştirici hesabınızda oturum açın.

  2. Provisioning Portal'a gidin.

  3. App IDs (Uygulama Kimlikleri) sekmesini tıklatın.

  4. New App ID (Yeni Uygulama Kimliği) düğmesini tıklatın.

  5. Bir açıklama ve paket kimliği belirtin (paket kimliğinde * kullanmamalısınız).

  6. Submit (Gönder) öğesini tıklatın. Provisioning Portal, Uygulama Kimliğinizi oluşturur ve App IDs (Uygulama Kimlikleri) sayfasını yeniden görüntüler.

  7. Configure (Yapılandır) öğesini tıklatın (Uygulama Kimliğinizin sağında). Configure App ID (Uygulama Kimliğini Yapılandır) sayfası görüntülenir.

  8. Enable for Apple Push Notification (Apple Push Notification hizmeti için etkinleştir) onay kutusunu işaretleyin. Biri geliştirme/test için, diğeri ise üretim için olmak üzere iki tür push SSL sertifikası olduğuna dikkat edin.

  9. Development Push SSL Certificate (Geliştirme Push SSL Sertifikası) öğesinin sağındaki Configure (Yapılandır) düğmesini tıklatın. Generate Certificate Signing Request (CSR) (Sertifika İmzalama İsteği Oluştur) sayfası görüntülenir.

  10. Sayfanın talimatları doğrultusunda, Keychain Access yardımcı programını kullanarak bir CSR oluşturun.

  11. SSL sertifikasını oluşturun.

  12. SSL sertifikasını indirip yükleyin.

  13. (İsteğe Bağlı) Üretim Push SSL sertifikası için 9 -12 arası adımları tekrarlayın.

  14. Bitti'yi tıklatın. Configure App ID (Uygulama Kimliğini Yapılandır) sayfası görüntülenir.

  15. Bitti'yi tıklatın. App IDs (Uygulama Kimlikleri) sayfası görüntülenir. Uygulama Kimliğinize yönelik Push Bildiriminin yanındaki yeşil daireye dikkat edin.

  16. SSL sertifikalarınız daha sonra uygulama ve sağlayıcı iletişimi için kullanılacağından, bunları kaydettiğinizden emin olun.

  17. Provisioning Profiles (Temel Hazırlık Profilleri) sayfasını görüntülemek için Provisioning (Temel Hazırlık) sekmesini tıklatın.

  18. Yeni Uygulama Kimliğiniz için bir temel hazırlık profili oluşturun ve indirin.

  19. Certificates (Sertifikalar) sekmesini tıklatın ve yeni temel hazırlık profili için yeni bir sertifika indirin.

Push bildirimleri için ses kullanma

Uygulamanız için sesli bildirimleri etkinleştirmek üzere, ses dosyalarını tüm diğer varlıkları paketlediğiniz şekilde paketleyin, ancak bunların SWF ve app-xml dosyalarıyla aynı dizinde bulunduğundan emin olun. Örneğin:

Build/adt -package -target ipa-app-store -provisioning-profile _-_.mobileprovision -storetype pkcs12 -keystore _-_.p12 test.ipa test-app.xml test.swf sound.caf sound1.caf

Apple, aşağıdaki ses veri formatlarını destekler (aiff, wav veya caf dosyaları içinde):

  • Doğrusal PCM

  • MA4 (IMA/ADPCM)

  • uLaw

  • aLaw

Yerelleştirilmiş uyarı bildirimleri kullanma

Uygulamanızda yerelleştirilmiş uyarı bildirimleri kullanmak için, yerelleştirilmiş dizeleri lproj klasörleri biçiminde paketleyin. Örneğin, İspanyolca dilinde uyarıları şu şekilde destekleyebilirsiniz:

  1. Proje içinde app-xml dosyasıyla aynı düzeyde bir es.lproj klasörü oluşturun.

  2. es.lproj klasörünün içinde, - Localizable.Strings adında bir metin dosyası oluşturun.

  3. Localizable.Strings dosyasını bir metin düzenleyicide açın ve mesaj anahtarlarını ve ilgili yerelleştirilmiş dizeleri ekleyin. Örneğin:

    "PokeMessageFormat" = "La notificación de alertas en español."
  4. Dosyayı kaydedin.

  5. Uygulama bu anahtar değerine sahip bir uyarı bildirimi alırsa ve aygıt dili İspanyolca ise, çevrilmiş uyarı metni görüntülenir.

Uzak bildirim sağlayıcısını yapılandırma

Uygulamanıza push bildirimleri göndermek için bir uzak bildirim sağlayıcısına gereksinim duyarsınız. Bu sunucu uygulaması, sağlayıcı gibi davranarak push girdinizi kabul edip bildirimi ve bildirim verilerini APNs'ye iletir ve APNs de push bildirimini bir istemci uygulamaya gönderir.

Bir uzak bildirim sağlayıcısından gelen bildirimleri iletme hakkında ayrıntılı bilgi için, Apple Geliştirici Kütüphanesi'ndeki Provider Communication with Apple Push Notification Service (Apple Push Notification Service ile Sağlayıcı İletişimi) konusuna bakın.

Uzak bildirim sağlayıcısı seçenekleri

Uzak bildirim sağlayıcısına yönelik seçenekler arasında şunlar bulunur:

  • APNS-php açık kaynak sunucusunu temel alarak kendi sağlayıcınızı oluşturun. http://code.google.com/p/apns-php/ adresini kullanarak bir PHP sunucusu ayarlayabilirsiniz. Bu Google Code projesi, belirli gereksinimlerinizle örtüşen bir arabirim tasarlamanıza olanak tanır.

  • Bir hizmet sağlayıcı kullanın. Örneğin, http://urbanairship.com/, hazır bir APNs sağlayıcısı sunmaktadır. Bu hizmete kaydolduktan sonra, ilk adım olarak, şuna benzer bir kod yardımıyla aygıt belirtecinizi sağlamanız gerekir.

    private var urlreq:URLRequest; 
                                        private var urlLoad:URLLoader = new URLLoader(); 
                                        private var urlString:String; 
    
                                        //When subscription is successful then only call the following code 
                                        urlString = new String("https://go.urbanairship.com/api/device_tokens/" + e.tokenId); 
                                        urlreq = new URLRequest(urlString); 
    
                                        urlreq.authenticate = true; 
                                        urlreq.method = URLRequestMethod.PUT; 
                                        URLRequestDefaults.setLoginCredentialsForHost("go.urbanairship.com", 
                                           "Application Key","Application Secret"); 
                                        urlLoad.load(urlreq); 
                                        urlLoad.addEventListener(IOErrorEvent.IO_ERROR,iohandler); 
                                        urlLoad.addEventListener(Event.COMPLETE,compHandler); 
                                        urlLoad.addEventListener(HTTPStatusEvent.HTTP_STATUS,httpHandler); 
    
                                        private function iohandler(e:IOErrorEvent):void{ 
                                           trace("\n In IOError handler" + e.errorID +" " +e.type); 
                                        } 
    
                                        private function compHandler(e:Event):void{ 
                                           trace("\n In Complete handler,"+"status: " +e.type + "\n"); 
                                        } 
    
                                        private function httpHandler(e:HTTPStatusEvent):void{ 
                                           tt.appendText("\n in httpstatus handler,"+ "Status: " + e.status); 
                                        }

    Böylece Urban Airship araçlarını kullanarak test bildirimleri gönderebilirsiniz.

Uzak bildirim sağlayıcısına yönelik sertifikalar

SSL sertifikasını ve özel anahtarını (daha önce oluşturulan), uzak bildirim sağlayıcısının sunucusu üzerindeki uygun konuma kopyalamanız gerekir. Normalde bu iki dosyayı tek bir .pem dosyasında birleştirirsiniz. Bunu yapmak için şu adımları gerçekleştirin:

  1. Bir terminal penceresi açın.

  2. Şu komutu yazarak SSL sertifikasından bir .pem dosyası oluşturun:

    openssl x509 -in aps_developer_identity.cer -inform der -out TestPushDev.pem
  3. Şu komutu yazarak özel anahtardan (.p12) bir .pem dosyası oluşturun:

    openssl pkcs12 -nocerts -out TestPushPrivateKey.pem -in certificates.p12
  4. Şu komutu yazarak iki .pem dosyasını tek bir dosyada birleştirin:

    cat TestPushDev.pem TestPushPrivateKey.pem > FinalTestPush.pem
  5. Birleştirilen .pem dosyasını, sunucu tarafı push uygulamanızı oluştururken sunucu sağlayıcısına iletin.

Daha fazla bilgi için Apple Local and Push Notification Programming Guide (Apple Yerel ve Push Bildirim Programlama Kılavuzu) içindeki Installing the SSL Certificate and Key on the Server (SSL Sertifikasını ve Anahtarını Sunucuya Yükleme) konusuna bakın.

Bir uygulamada push bildirimlerini işleme

Bir uygulamada push bildirimlerinin işlenmesi, şunları gerektirir:

  • Push bildirimlerine yönelik global kullanıcı yapılandırması ve kabulü

  • Ayrı push bildirimlerinin kullanıcı tarafından kabulü

  • Push bildirimlerini ve bildirim yük verilerini işleme

Push bildirimlerine yönelik yapılandırma ve kabul

Bir kullanıcı push bildirimi etkin bir uygulamayı ilk kez başlattığında iOS, İzin Verme ve Tamam düğmelerini içeren appname Size Push Bildirimleri Göndermek İstiyor iletişim kutusunu görüntüler. Kullanıcı Tamam'ı seçerse, uygulama, abone olduğu tüm bildirim stillerini alabilir. Kullanıcı İzin Verme'yi seçerse, herhangi bir bildirim almaz.

Not: Kullanıcılar, her push bildirimleri etkin uygulama için alabileceği belirli bildirim türlerini denetlemek için Ayarlar > Bildirimler öğesine de gidebilir.

Apple, bir uygulama her etkinleştirildiğinde push bildirimlerine abone olmasını önerir. Uygulamanız RemoteNotifier.subscribe() öğesini çağırdığında, bu aygıttaki bir uygulamayı benzersiz şekilde tanımlayan 32 baytlık benzersiz bir sayısal tokenId'ye sahip token türünde bir RemoteNotificationEvent öğesi alır.

Aygıt bir push bildirimi aldığında, Kapat ve Başlat düğmelerini içeren bir açılır pencere görüntüler. Kullanıcı Kapat öğesine dokunursa hiçbir şey olmaz; ancak Başlat öğesine dokunursa iOS uygulamayı çağırır ve uygulama, aşağıda açıklandığı şekilde, notification türünde bir flash.events.RemoteNotificationEvent öğesi alır.

Push bildirimlerini ve yük verilerini işleme

Uzak bildirim sağlayıcısı bir aygıta bildirim gönderdiğinde (tokenID öğesini kullanarak), uygulamanızın çalışır durumda olup olmamasından bağımsız olarak notification türünde bir flash.events.RemoteNotificationEvent alır. Bu noktada, uygulamanız uygulamaya özgü bildirim işleme gerçekleştirir. Uygulamanız bildirim verilerini işliyorsa, buna JSON formatlı RemoteNotificationEvent.data özelliği üzerinden erişirsiniz.