İOS, kullanıcı tarafından zorla kapatıldıysa uygulamamı arka planda başlatacak mı?


219

content-availableAnlık bildirimdeki bayrağı kullanarak arka plan getirmeyi tetikliyorum . Ben fetchve remote-notification UIBackgroundModesetkin.

İşte benim AppDelegate.m kullanıyorum uygulama:

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
    NSLog(@"Remote Notification Recieved");
    UILocalNotification *notification = [[UILocalNotification alloc] init];
    notification.alertBody =  @"Looks like i got a notification - fetch thingy";
    [application presentLocalNotificationNow:notification];
    completionHandler(UIBackgroundFetchResultNewData);

}

Uygulama arka planda çalışırken iyi çalışıyor. (Bildirim alınır ve yukarıdaki kodun yapması gerektiği gibi uygulama "bir bildirim var gibi görünüyor" yerel bildirim tetikledi).

Ancak, uygulama çalışmadığında ve content-availablebayrakla birlikte push bildirimi alındığında uygulama başlatılmaz ve didRecieveRemoteNotificationtemsilci yöntemi asla çağrılmaz.

WWDC Video Çoklu Görevde Yenilikler (WWDC 2013'ten # 204) şunu gösterir:resim açıklamasını buraya girin

content-availableBayrakla birlikte push bildirimi alındığında uygulamanın "arka plana başlatıldığını" söylüyor .

Uygulamam neden arka planda kullanıma sunulmuyor?

Asıl soru şu:

Kullanıcı uygulamadan zorla çıktıktan sonra iOS arka plan görevlerini yerine getirecek mi?


Uygulamanın arka planda başlatılıp başlatılmadığını nasıl kontrol ediyorsunuz?
runmad

1
@runmad Ben bir sürü bok giriş- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
Noel Baba

Nasıl giriş yapıyorsunuz, sadece NSLog? Uygulama düzeni ayarlarınızda Lansmanı manuel olarak ayarlamanız gerekir (cevaba bakın)
runmad

@runmad cevabın yorumuna bakın
Noel Baba

@HaimBenchimol Djd hata raporunuza bir yanıt aldınız mı? Kendi hata raporumu doldurmaya gelmedim.
Noel Baba

Yanıtlar:


215

Update2:

Sen olabilir VoIP için kullanılan iOS 8. rağmen PushKit tanıtılan yeni PushKit çerçevesini kullanarak bunu başarmak. Bu nedenle kullanımınız VoIP ile ilgili olmalıdır, aksi takdirde uygulamanın reddedilmesi riski vardır. ( Bu cevaba bakınız ).


UDPDATE1:

Belgeler iOS8 için netleştirildi . Dokümantasyon okunabilir burada . İşte ilgili bir alıntı:

Uygulamanız için gelen uzak bildirimleri işlemek üzere bu yöntemi kullanın. application:didReceiveRemoteNotification:Yalnızca uygulamanız ön planda çalışırken çağrılan yöntemin aksine sistem, uygulamanız ön planda veya arka planda çalışırken bu yöntemi çağırır. Ayrıca, uzak bildirimler arka plan modunu etkinleştirdiyseniz, sistem uygulamanızı başlatır (veya askıya alınmış durumdan uyandırır) ve bir push bildirimi geldiğinde arka plan durumuna getirir. Ancak, kullanıcı zorla bıraktığında sistem uygulamanızı otomatik olarak başlatmaz. Bu durumda, sistem uygulamanızı otomatik olarak yeniden başlatmaya çalışmadan önce kullanıcının uygulamanızı yeniden başlatması veya cihazı yeniden başlatması gerekir.


Bu WWDC videosu tarafından netleştirilmemiş olsa da, geliştirici forumlarında hızlı bir arama yapıldı:

https://devforums.apple.com/message/873265#873265 (giriş gerekli)

Ayrıca, uygulamanızı uygulama değiştiriciden (yani, uygulamayı öldürmek için hızlıca kaydırarak) öldürürseniz, işletim sisteminin push bildirimi veya arka plan getirmesine bakılmaksızın uygulamayı yeniden başlatmayacağını unutmayın. Bu durumda, kullanıcının uygulamayı bir kez manuel olarak yeniden başlatması gerekir ve daha sonra bu noktadan sonra arka plan etkinlikleri çağrılır. - pmarcos

Bu yazı bir Apple çalışanı tarafından yapıldı, bu yüzden bu bilgilerin doğru olduğuna güvenebileceğimi düşünüyorum.

Bu yüzden, uygulama uygulama değiştiriciden (yukarı kaydırarak) öldürüldüğünde, planlanmış arka plan getirileri için bile uygulama asla başlatılmayacak gibi görünüyor.


2
Benim için eylem ekleme yaparken "didFinishLaunchingWithOptions" eylem ekleme nil değil yaptı. Burada aynı yöntem var "didreceiveRemoteNotification"
harsh.prasad

@ harsh.prasad bu ilginç. Sorun, uygulama değiştiriciden öldürüldüğünde uygulamanın başlatılmamasıydı.
Noel Baba

3
Sessiz bir push alındığında uygulamanın uygulama değiştiricide gösterilmesine gerek yoktur. Uygulama değiştiricisine eklemeden arka planda başlatılabilir ve çalışmasına ve "işini yapmasına" ve ardından çıkmasına izin verilebilir. Çok uzun süre aktif kalan uygulamalar zaten oldukları gibi öldürülür.
MindJuice

1
@chrizstone Çözüm, bunun amaçlanan davranış olduğu ve bu konuda hiçbir şey yapamayacağınızdır.
Noel Baba

1
@JPK Ah, push bildirimlerinin kendileri etkilenmez. Sadece zorla bırakıldıktan sonra çalışmayacak arka plan görevleri yapıyor.
Noel Baba

70

Hedefinizin başlatma ayarlarını "Düzeni Yönet" bölümünden değiştirebilirsiniz Wait for <app>.app to be launched manually; bu, bir kesme noktası ayarlayarak application: didReceiveRemoteNotification: fetchCompletionHandler:ve arka plan başlatmasını tetiklemek için push bildirimi göndererek hata ayıklamanıza olanak tanır .

Sorunu çözeceğinden emin değilim, ancak şimdilik hata ayıklamada size yardımcı olabilir.

ekran görüntüsü


bu yardımcı oldu ama sorun hala var
Noel Baba

Garip. Tüm flaşın plistinizde vb. Ayarlandığını iki kez kontrol ettiğinizi varsayıyorum?
runmad

Ayrıca, uygulama arka planda olduğunda, her şey mükemmel çalışır çünkü her şeyi doğru ayarladığımı biliyorum. Onun sadece uygulama hiç çalışmadığı zaman.
Noel Baba

Bir push bildirimi başlatma-tetikleyicisinin sistem tarafından belirlenip belirlenmediğini merak ediyorum. Örneğin, iOS şu anda uygulamayı başlatmanın harika bir zaman olmadığını belirlerse, uygulamayı daha sonraya erteleyebilir. Belki de tüm çalışan / arka plan uygulamalarını kapatmayı deneyin ve ne olduğunu görün? Ben sadece bu noktada tahmin ediyorum: - /
runmad

Sadece denedim. Hiçbir şey olmadı, her zamanki gibi. Geliştirme forumları isteyebilirim.
Noel Baba

37

Cevap EVET, ancak 'Arka Plan Getirme' veya 'Uzaktan bildirim' kullanmamalı. PushKit, arzu ettiğiniz cevaptır.

Özetle, ios 8'deki yeni çerçeve olan PushKit, uygulamanızı uygulama değiştiriciden dışarı çekerek bile öldürülmüş olsa bile görsel uyarı istemi olmadan uygulamanızı sessiz bir şekilde arka plana başlatabilecek yeni push bildirim mekanizmasıdır. uygulama değiştiriciden.

Apple'dan PushKit referansı:

PushKit çerçevesi, iOS uygulamalarınızın uzak sunuculardan push almak için sınıflar sağlar. Pushlar iki türden biri olabilir: standart ve VoIP. Standart push'ler, tıpkı iOS'un önceki sürümlerinde olduğu gibi bildirim gönderebilir. VoIP push'ları, kullanıcıya bir bildirim göstermeden önce pushun isteğe bağlı olarak işlenmesi için VoIP uygulamalarına ihtiyaç duyulan standart pushun üzerine ek işlevsellik sağlar.

Bu yeni özelliği dağıtmak için lütfen şu eğiticiye bakın: https://zeropush.com/guide/guide-to-pushkit-and-voip - Cihazımda test ettim ve beklendiği gibi çalışıyor.


9
Bana öyle geliyor ki uygulamanızı VoIP kullanarak ayarlamanız gerekiyor. Uygulamanız aslında bir VoIP uygulaması değilse, inceleme sırasında reddedilmez mi?
duncanc4

6
Ne yazık ki, Apple tarafından doğrulama işlemini bilmek, başvurunun reddedilmesi mantıklı olacaktır.
Kepa Santos

3
VoIP için kullanılır. Kullanıcı için VoIP kullanılmazsa, inceleme reddi riskini büyük ölçüde artıracaktır.
Chris

Görünüşe göre büyük sağlayıcılar bu tesisi arka planda bir şeyler çalıştırmak için bir bahane olarak kullanıyor ve Apple kör bir gözle çalışıyor. Android bir anda olmak bir özellik.
TCB13

PushKit, VoIP, Dosya Sağlayıcıları ve İzleme Komplikasyonları için ayrılmıştır. Bu cevabın açıkladığı kullanım durumları için mevcut değildir.
quellish


4

Günlerce bunun farklı varyantlarını deniyorum ve bir gün boyunca, kullanıcı öldürmek için kaydırıldığında bile uygulamayı arka planda yeniden başlattığımı düşündüm, ancak hayır bu davranışı tekrarlayamıyorum.

Davranışın öncekinden oldukça farklı olması talihsiz bir durum. İOS 6'da, uygulamayı jiggling simgelerinden öldürdüyseniz, yine de SLC tetikleyicilerinde yeniden uyanır. Şimdi, kaydırarak öldürürseniz, bu olmaz.

Bu farklı bir davranış ve iOS 6'da öldürmüş olsaydı uygulamamızdan yararlı bilgiler almaya devam edecek olan kullanıcı artık kalmayacak.

Kullanıcılarımızı, uygulamayı öldürmek için hızlıca kaydırmışlarsa ve yine de onlara verdiğimiz bildirim davranışlarından bazılarını bekledikleri takdirde uygulamayı tekrar açmak için sürüklemeliyiz. Bir uygulamayı hızlıca kaydırdıklarında bunun kullanıcılar için açık olmayacağından endişe ediyorum. Sonuçta, en aza indirilen uygulamaları temizliyor veya yeniden düzenlemek istiyor olabilirler.


2
Tam olarak bunu yaptık (applicationWillTerminate), ancak en azından iOS 7'de değil, bellek temizliği sırasında bildirim verdiğine inanmıyorum, ancak OS yükseltmesi için yeniden başlatmadan hemen önce bildirimi gösterdiğini fark ettim, ancak çok kötü görünmüyordu.
snarshad

"İOS 6'da, uygulamayı jiggling simgelerinden öldürdüyseniz, yine de SLC tetikleyicilerinde yeniden uyandırılır. Şimdi, kaydırarak öldürürseniz, bu olmaz." Bu şimdi gerçekleşti, iOS 7'nin erken bir sürümünde geçici bir gerileme oldu
funkybro

3

Bu size yardımcı olabilir

Çoğu durumda, sistem uygulamaları kullanıcı tarafından zorla bırakıldıktan sonra yeniden başlatmaz. Bir istisna, iOS 8 ve sonraki sürümlerde kullanıcı tarafından zorla bırakıldıktan sonra yeniden başlatılan konum uygulamalarıdır. Diğer durumlarda, uygulamanın sistem tarafından arka plana otomatik olarak başlatılmasından önce kullanıcının uygulamayı açıkça başlatması veya cihazı yeniden başlatması gerekir. Cihazda şifre koruması etkinleştirildiğinde, kullanıcı cihazın kilidini ilk kez açmadan önce sistem arka planda bir uygulama başlatmaz.

Kaynak: https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html


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.