İOS 7'de Sessiz Push Bildirimi çalışmıyor


87

WWDC 2013'ün "Çoklu Görev ile İlgili Yenilikler" sunumunda, Sessiz Push Bildirimleri ile ilgili bir bölüm var. Basit görünüyor. Sunuma göre, APS yükünü yalnızca mevcut içerik 1 olarak ayarlanmış şekilde gönderirseniz, kullanıcılara bildirim bildirilmeyecektir.

// A. This doesn't work
{ 
  aps: { 
          content-available: 1 
       }
}

Testlerim, herhangi bir push alınmadığı için bunun işe yaramadığını gösteriyor. Ancak ses özniteliğini dahil edip uyarı özniteliğini hariç tutarsam, çalışır (artık sessiz olmasa da).

// B. This works
{ 
  aps: {
          content-available: 1,
          sound: "default"
       }
}

Ancak, sessiz bir ses çalmak için ses özelliğini değiştirirsem, sessiz bir basmayı taklit edebilirim.

// C. This works too.
{ 
  aps: {
          content-available: 1,
          sound: "silence.wav"
       }
}

Kimse biliyor mu:

  1. Bu bir hata ise?
  2. Ve B veya C'nin bir Uzaktan Bildirim olarak ele alındığını varsaymak doğruysa (ve bir ses özelliğine ihtiyaç duyduğunuzda Sessiz Push'ta bir hata değil)? Eğer öyleyse, bu, Apple'ın muhtemelen düzelteceği Silent Pushes gibi hız sınırlı olmadığı anlamına gelir. Bu yüzden muhtemelen ona güvenmemeliyim.
  3. Hız sınırı nedir (N, her X saniyede bir iter vb.)?

Şimdiden teşekkürler.

Daha fazla bilgi ile düzenleyin

A için başvurunun durumu önemli değil. Bildirim asla alınmaz.

Görünüşe göre B ve C, aşağıdaki gibi, nitelikleri ve değerleri tırnak içine alırsanız çalışır.

{"aps":{"content-available": 1, "sound":"silent.wav"}}

Ve bildirim uygulamaya gelir : didReceiveRemoteNotification: fetchCompletionHandler: durumdan bağımsız olarak.


Herhangi bir uygulama durumunda çalışmıyor mu? Benim için " A ", uygulama ön planda çalıştığı sürece çalışır (didReceiveRemoteNotification çağrılır). Ancak uygulama çalışmadığında, uygulama bildirim almıyor (" B " yi denediğimde sadece sesi duyuyorum ). " B " veya " C " kullandığınızda uygulamanız arka planda uyanıyor mu (didReceiveRemoteNotification) ?
DerBernie

Benzer davranışlar görüyorum, bunun bir süredir bunu denediğim ve uygulamayı ilk başta doğru şekilde ayarlamamış olduğum için olabileceğini düşünüyorum, bu yüzden Apple, kurulumu doğru yapmadan önce beni yavaşlatmış olabilir.
nickthedude

4
Dostum ... keşke sana 10 oy
verebilseydim

Bakın > onay Background fetchkutusunu işaretlerseniz, çünkü ilk seçenek çalışmalıdır. Sessiz itme bir ses özniteliğine ihtiyaç duymaz ve uygulama arka planda / ön planda çalışıyor veya çalışmıyor olsa bile her zaman gelir . Project CapabilitiesBackground Modesapplication:didReceiveRemoteNotification:fetchCompletionHandler:
IgniteCoders

Yanıtlar:


73

Bu aynı zamanda çalışır ve geldiğinde bir ses çalmaz:

{
    aps = {
        "content-available" : 1,
        sound : ""
    };
}

DÜZENLE

Bu sorunu yaşayan kişiler bu bağlantıya göz atmak isteyebilir . Apple'ın Geliştirici forumunda, tüm uygulama durumlarını ele alan ve sessiz itmeler alındığında ve alınmadığında geçen bir ileti dizisine katılıyorum.


Bağlantı için teşekkürler. ADC'nin Forumlarında bunu tartışan birden fazla konu var. Alt satır: Cihaz yeniden başlatıldıktan sonra bir Apple temsilcisinin bir güncellemede düzeltilmesi gerektiğini kabul ettiği bir hata var (sonunda).
SG1

3
İOS7'de ses / uyarı tuşları olmadan bile harika çalışıyor. İçerik avalable yeterli anahtardır! Ancak iOS8'de, "içerik kullanılabilir" e ek olarak boş olmayan dizeye sahip uyarı anahtarı ayarladığımızda bile gerçekten garip bir davranış sergiliyoruz: 1 yalnızca "uyarı" dizesi olan banner'ı alıyoruz, ancak "içerik kullanılabilir" bazı nedenlerden dolayı yok sayılıyor
malex

Eklenen sesle veya ses olmadan bildirimden uygulamayı başlatmayı başardım. Belki bir ses, uyarı veya rozet (boş olsun veya olmasın) ayarlamak, varsayılan bildirim önceliğini 10'a yükseltir ve böylece güvenilirliğini artırır. Apple'ın pans-öncelik hakkında söylediklerine bakın: developer.apple.com/library/ios/documentation/… Varsayılan öncelik 10'dur (yüksek), ancak bunu yalnızca içerik mevcut anahtarla push bildirimi için kullanmak bir hatadır. Dolayısıyla, yalnızca içerik kullanılabilir anahtar ayarlanmışsa varsayılan değer 5 olarak ayarlanmıştır.
emem

1
iOS10'da çalışmıyor. Bir şeyi "ses" için zorlamalıyım.
Stony

Benim için iOS10 üzerinde çalıştı. Ancak şu anda iOS11'de çalışmıyor
Slav

30

Bu yüzden dün bu sorunla karşılaştım ve boş bir dizeye bir ses seti ile bir yük göndermeyi denedikten sonra, hala cihazda titreşime / sese neden oluyordu. Sonunda, Urban Airship'ten şunu göndermem gerektiğini öneren bir blog gönderisine rastladım:

{ priority: 5 }

hiç görmediğim push bildiriminde. Apple'ın anlık bildirimler için belgelerini inceledikten sonra, bu sayfada tökezledim:

https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CommunicatingwithAPNs.html

Bu, önceliğin "5" veya "10" olarak ayarlanması gerektiğini gösterir ve açıklar:

Bildirim önceliği. Aşağıdaki değerlerden birini sağlayın:

10 Push mesajı hemen gönderilir.

Anlık bildirim cihazda bir uyarı, ses veya rozet tetiklemelidir. Bu önceliğin, yalnızca içerik kullanılabilir anahtarı içeren bir gönderim için kullanılması bir hatadır.

5 Push mesajı, kendisini alan cihazda güç tasarrufu sağlayan bir zamanda gönderilir.

Nihayetinde, bir rozet sayımıyla çalışan sessiz push bildirimleri alabildik (ve aynısını bir uyarı ile bile yapabileceğinizi sanıyorum) aşağıdaki formatta:

    aps =     {
        badge = 7;
        "content-available" = 1;
        priority = 5;
    };

Harika cevap Dave! 5 önceliğine izin verilirken, "bu önceliğin [10] yalnızca içerik kullanılabilir anahtarı içeren bir aktarım için kullanılması bir hatadır." developer.apple.com/library/ios/documentation/…
rjobidon

4
Öncelik, yüke dahil edilmeli mi? IMO gönderdiğiniz itmede bir bayttan ayrıdır.
Foriger

6
Yükte öncelik belirlenmez. Bu, ikili bildirimde belirlenir.
Sandy D.

10

Uyarı özelliği olarak boş bir dize ayarlamayı denedim ve aynı zamanda çalıştı:

{
    aps =     {
        "content-available" = 1;
        "alert" = "";
    };
}

APNS, itme yükünü doğrulamak amacıyla bu özniteliklerin varlığını kontrol ediyor gibi görünüyor. İlginç bir şekilde, gerçek içeriği kontrol etmiyorlar. Yine de biraz huysuz görünüyor ...


alert=""Payload'daki bu çözüm benim için de çalıştı iOS 9.0. Bunun sound=""yerine işe yaramadı.
loretoparisi

5

Aracı kullanıyorum - Knuff push bildirimimi cihazıma gönderiyor.

Şöyle görünüyor: görüntü açıklamasını buraya girin

Sonra bu örneği denedim.

Hepsi işe yarıyor! Ama önceliği 10 ayarlamalısınız!

Yani aracı kullanmıyorsanız, onu da not edersiniz.


örnekler:

  • uyarı yok, ses yok

{
    "aps":{
        "content-available":1,
    }
}

  • sadece uyarı

{
    "aps":{
        "content-available":1,
        "alert":""
    }
}

  • sadece ses

{
    "aps":{
        "content-available":1,
        "sound":""
    }
}


4

Bu benim için çalışıyor:

{ 
  aps: { 
          content-available: 1 
       }
}

Kontrol Background fetchkutusunu işaretlerseniz bakın Project Capabilities>Background Modes


2

Ben de aynı sorunu görüyorum. "Content-available" ile bir push gönderirsem: 1 ve başka bir öznitelik ayarlanmadıysa, bildirim asla alınmaz. Başka nitelikler eklediğimde mükemmel çalışıyor.

Geçici bir çözüm olarak, rozet özelliğini simgeye eklemek dışında kullanıcıyı hiçbir şekilde uyarmadığından rozet özelliğini ekliyorum.

Daha iyi bir çözüm bulursanız bana bildirin.


1

Öncelik, ikili akışta bir öğe olarak ayarlanmalı, ancak yük json dizesinde olmamalıdır. Görünüşe göre sadece en son tip 2 formatı aşağıdaki gibi öncelik ayarlamada kullanılabilir:

$token      = chr(1) . pack('n', 32)     . pack('H*', $deviceToken);
$payload    = chr(2) . pack('n', strlen($json)) . $json;
$identifier = chr(3) . pack('n', 4)      . pack('N', $notification);
$expiration = chr(4) . pack('n', 4)      . pack('N', time()+86400);
$priority   = chr(5) . pack('n', 1)      . chr($priority);

$frame_data = $token.$payload.$identifier.$expiration.$priority;
$frame_length = strlen(bin2hex($frame_data))/2;

$msg = chr(2) . pack('N', $frame_length) . $frame_data;

Uzaktan bildirim ikili mesajı için format türleri (ilk bayt):

0 - basit (eski) 1 - geliştirilmiş (eski) 2 - daha fazla parametre ile en son (yeni)


0

Argh! Ayrıca saçımı çekmek - bu, işe yaramayan bir yükün başka bir örneği olarak bir cevap değildir. DidReceiveRemoteNotification yöntemi hiçbir zaman çağrılmaz, ancak cihaz uyuyorsa uyarı metni görüntülenir.

 {"aps":
    {  "alert":"alert!",
       "sound":"default",
       "content-available" : 1},
    "content-id":21482,
    "apt":"1"
}

"apt", bildirim türünü belirtmek için kullandığımız özel bir alandır.


2
Uygulama arka plandaysa ve "uyarı" özniteliğini kaldırırsanız, geri aramayı uygulamada almalısınız: didReceiveRemoteNotification: fetchCompletionHandler:
mkwon

@mkwon ve BG + uygulamasındayken uyarıyı (normal itme) görmek istersem: didReceiveRemoteNotification: fetchCompletionHand‌ ler:? Tnx
DaNLtR

0

'Ses'i 0 olarak ayarlamak benim için çalıştı ... :)


0

Önceliği 5 olarak ayarlamak benim için işe yaramadı, ancak ses veya uyarıyı boş bir dizeye ayarlamak, bildirimin yüksek öncelikli bir bildirim olarak ele alınmasına neden oldu


0

Hiçbir Bildirim teslim edilmeden aynı sorunu yaşadık. Bizim durumumuzda, rozet numarasını güncellemek için sessiz bir itme kullanıyorduk. Uyarı (gövde ve başlık) ve ses için boş dizeler belirlediğimizde işe yarardı, ancak anahtarlardan herhangi biri yoksa başarısız oldu. İşte işe yarayan şey, rozeti ses veya uyarı olmadan güncellemek (didReceiveRemoteNotification'da ortaya çıkan userInfo sözlüğünün günlüğü)

{
    aps =     {
        alert =         {
            body = "";
            title = "";
        };
        badge = 103;
        "content-available" = 1;
        sound = "";
    };
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.