2010-04-06 32 views
17

Soruları daha kavramsal olmasına rağmen PHP'ye özgü olması gerekmediğinden, bazı aygıtlara bazı bildirimleri göndermek için PHP'yi apn s'ye bağlamak için kullanıyorum.Apple Push Bildirimi: Yüksek miktarda mesaj gönderme

Aynı anda yaklaşık 7000 aygıta (ve büyümeye) göndereceğim. İşlemim günde ONCE çalışır ve tüm cihazlara yayın yapar, bu nedenle sürekli bir bağlantıyı yeniden açmayacağım.

Şu anda bir kerede 2 cihaza kolayca mesaj gönderebilir ve mesajlar başarıyla gönderilir. Ancak, tam 7000 cihaza göndermeye çalıştığımda, mesajlar iletilmiyor gibi görünüyor.

benim koduna sözde mantıktır:

open connection to apple 
loop over device-tokens 
    write to socket connection per device 
end loop 
close connection to apple. 

Ben sadece sözde kod gibi görünecektir başka bir deyişle, bir TEK yazma gerçekleştirmek ve bir büyük beden inşa gerektiğini bir yerlerde gördük:

loop over device tokens 
    create payload aggregating all devices 
end loop 
open connection to apple 
write to socket ONCE with whole payload for 7000 devices 
close connection 

Test iletileri ile 7000 üretim kullanıcımın spam'ını açık olarak belirleyemediğimden sınamak zor. Başkalarının benzer bir sorunu var mı?

Teşekkür

+0

Hiç bu işe yaramadı mı? Yakında aynı konuyla karşılaşacak bir uygulama yazacağım - binlerce müşteriye APNS üzerinden yayın yapacağım. –

+3

Merhaba Mike. Evet yaptım. Bu soruyu yayınladığım zamandaki uygulama oldukça erken aşamalardaydı. Sorun, üretim cihazları ile aynı tabloda bazı kum havuzu cihazlarının olmasıydı. Apple, üretim sertifikalarını kullanırken bir sandbox device_token ürününe gönderirseniz bazen bağlantıyı bırakır. Bu nedenle, basit çözüm, bağlantıya doğru sayıda bayt yazıldığını ve her yazma olayından sonra bağlantının düşmediğini doğrulamaktır. Düşerse bağlantıyı tekrar açmanız ve kaldığınız yerden devam etmeniz gerekir. iyi şanslar! – BoomShaka

+0

FYI, bağlantıyı açabilir ve istediğiniz kadar çok yazabilirsiniz. Her yazmadan sonra bağlantı durumunu kontrol ettiğinizden emin olun. – BoomShaka

cevap

5

Ben onların sunucularına yapmak elma bağlantı sayısı hakkında bakım yaptığı okudum ama herhangi yazma sınırları hakkında hiç duymadım. Ayrıca, burada ne tür bir cevap alacağınızdan emin değilim, ama ne olduğunu görmek için denemeye değer olabilir. Belki de sanal alan push bildirim sunucusu ile deneme yaparak, yalnızca üretim cihazlarının cihaz jetonlarını deneyebilirsiniz. Bu telefonlar sandbox sunucusuna gönderilen herhangi bir push bildirimi almamalı ve sanal alan "başarılı bir şekilde teslim edildi" raporunda, test etmek için endişesiz bir yol olacaktır.

+0

Cevabınız esas olarak doğruydu. teşekkürler :) – BoomShaka

+0

Sandbox geliştirme sertifikasına ve üretim ihtiyaçları üretim sertifikalarına ihtiyaç duyuyor. APNS belgesi, geliştirme (kum havuzu ortamı) oluşturmak için üretilen cihaz tokenlerinin, üretim yapısından tamamen farklı olduğunu söylüyor. Ayrıca, geliştirme oluşturma tarafından oluşturulan bir aygıt belirteci alırsa APNS üretim yapısı, aygıt belirtecini doğrudan geçersiz kılar ve bağlantıyı bırakır. Böylece durum başarılı olmayacak, ancak bağlantı bırakılacak. APNS servisinin alay edilmesi test etmek için daha iyi bir seçenektir. –

-1

Ne istediğini görüyorum, aynı problemle karşılaştım, benim için çalışılan şey tersine mühendislikti. Sadece kütüphaneye baktım ve deviceToken'i doğrulayan fonksiyon için kontrol ettim. Böylece, kukla cihaz belirteci oluştururken, oluşturulan simgenin kitaplığa göre geçerli olduğundan emin oldum.

Aşağıdaki kod, geçerli aygıt Jetonları üretmenize izin verecektir, şimdi size bu işlevi kullanarak milyonlarca jetonun üretileceği zamana bağlıdır.

def generateRandomDeviceTokenAndAppendItToJson(tokenLength: Int) { 
    val randomlyGeneratedDeviceToken = new StringBuilder() 
     randomlyGeneratedDeviceToken.append("   \"") 
     (1 to tokenLength) foreach { 
     times: Int => 
     if (tokenLength equals Device.Apple) 
     randomlyGeneratedDeviceToken.append(validCharacter().toString.charAt(0)) 
     else 
     randomlyGeneratedDeviceToken.append(Random.alphanumeric.head) 
     } 
     randomlyGeneratedDeviceToken.append("\",") 
     println(randomlyGeneratedDeviceToken) 
     writer.write(randomlyGeneratedDeviceToken.toString()) 
     } 

     private def validCharacter(): Int = { 
     val a = Random.alphanumeric.head 
     if ('0' <= a && a <= '9') 
     return (a - '0') 
     else if ('a' <= a && a <= 'f') 
     return ((a - 'a') + 10) 
     else if ('A' <= a && a <= 'F') 
     return ((a - 'A') + 10) 
     validCharacter() 
    } 

Apple deviceToken 64 karakterden oluşur, bu nedenle 64 kez yinelemeniz gerekir.

+0

Bunun işe yaradığından şüpheliyim. Bir dereceye kadar bir belirteç * 'in doğruluğunu kontrol eden bir düşük seviye validasyonu ters mühendislik yapmış olabilirsiniz *. Ama bu, herhangi bir istenmeyen posta engellemek için Apple'ın ilk savunma hattı. Milyonlarca dolara bahse girerim ki, vahşi cihazlarda rastgele deviceTokens'e mesaj gönderemezsiniz. Apple seni çok çabuk kapatacaktı. Sandbox sunucusuyla çalışsa bile, bu test benim görüşüme göre bir şey kanıtlamaz. –

+0

BTW, doğrulama yapılmadı mı? Çünkü kodunuzdan, * tamamen rastgele * altıgen karakterden oluşan 64 karakterlik bir uzunluğa sahip olması gibi görünüyor. Hiçbir kısıtlama yok. –

+0

Agreed Csaba Toth, bu rasgele 64 karakterlik uzunluk dizgisi üretir, ancak doğrulama (yukarıdaki geçerli karakter işlevine bakın) aynıdır (ağda bir yerde bulmak yerine belirteçleri analiz etmemi sağladı). ve sunucumu performans açısından test etmek için işe yaradı. Bir deneyin ve bunu aplara göndermeyi deneyin, geçerli olduğunu bildirir. Tabi ki, oluşturulan gerçek tokenler olabilir, sandbox ortamına göndermek için yeterince dikkat etmeliyiz, aksi takdirde bunun spam olduğunu söylediniz. –

İlgili konular