Uygulama için push bildirim ayarlarını sıfırla


173

Anlık bildirimler içeren bir uygulama geliştiriyorum. Kullanıcı etkileşiminin tüm olası yollarını kontrol etmek için, bir kullanıcı ilk başlatma sırasında uygulamam için push bildirimlerinin etkinleştirilmesini reddettiğinde uygulamamı test etmek istiyorum.

registerForRemoteNotificationTypesBununla birlikte (tarafından başlatılan ) iletişim kutusu uygulama başına yalnızca bir kez görünür. İPhone işletim sisteminin uygulamamın belleğini nasıl sıfırlarım. Uygulamayı silmek ve yeniden yüklemek yardımcı olmaz.

Yanıtlar:


300

Teknik Not TN2265: Anlık Bildirimlerde Sorun Giderme

Push özellikli bir uygulama push bildirimlerine ilk defa kaydolduğunda iOS kullanıcıya bu uygulama için bildirim almak isteyip istemediklerini sorar. Kullanıcı bu uyarıyı yanıtladıktan sonra, cihaz geri yüklenmedikçe veya uygulama en az bir gün boyunca kaldırılmadığı sürece bir daha gösterilmez.

Uygulamanızın ilk kez çalıştırılmasını simüle etmek istiyorsanız, uygulamayı bir gün boyunca kaldırılmış olarak bırakabilirsiniz. İkincisini, sistem saatini bir gün veya daha fazla ileri ayarlayarak, cihazı tamamen kapatarak ve ardından cihazı tekrar açarak bir gün beklemeden elde edebilirsiniz.

Güncelleme: Aşağıdaki yorumlarda belirtildiği gibi, bu çözüm iOS 5.1'den beri çalışmayı durdurdu. Belgelerini güncelleyebilmeleri için Apple'a bir hata göndermeyi teşvik ediyorum. Geçerli çözüm, cihazın içeriğini ve ayarlarını sıfırlıyor gibi görünüyor.

Güncelleme: Teknik not, iOS 7'den itibaren düzgün çalışan yeni adımlarla güncellendi.

  1. Uygulamanızı cihazdan silin.
  2. Cihazı tamamen kapatın ve tekrar açın.
  3. Ayarlar> Genel> Tarih ve Saat'e gidin ve tarihi bir veya daha fazla gün önceden ayarlayın.
  4. Cihazı tamamen kapatın ve tekrar açın.

İOS 9'dan itibaren GÜNCELLEME

Uygulamanın silinmesi ve yeniden yüklenmesi, bildirim durumunu 'e sıfırlar notDetermined(yani, bilgi istemleri görünür).

Aşağıdaki Gomfucius'un cevabı için teşekkürler: https://stackoverflow.com/a/33247900/704803


16
İOS 5.1 ile bunu deneyen var mı? Bu adımları tam olarak izledim ve cihazı sıfırlamaya devam edemiyorum ... Hatta Xcode ile yüklemeden önce Mac'imdeki saati ileriye doğru ayarlamayı denedim.
nrj

1
Aynen ... Bir şey almadım.
Rob

2
Apple, AppStore gönderme yönergelerine, istemi göstermesi için uygulamaya dayanan yeni bir gereksinim ekledi. Bu, otomatik istemin iOS 5.1'de kaldırıldığını gösterebilir. Ancak, bildirim merkezi ayarlarını sorgulayacak bir API yoktur, bu nedenle istemin amacının ne olacağından emin olun. Benzer bir soruna yanıtımı görün: stackoverflow.com/questions/10191006/…
Greg

10
Bu gülünç. Apple, geliştiricilerin ve hatta kullanıcıların bu şeyleri gerçekten kötü bir geçici çözüm kullanmadan sıfırlamak isteyebileceklerinin farkında değil mi?
sudo

2
Bunu simülatörde denediğimde Code = 3010 "simülatörde uzaktan bildirimler desteklenmiyor" hatasını alıyorum
Thomas Zimmer

48

Bunu test etmek için başka bir şey sadece paket kimliğinizi değiştirmektir. İşiniz bittiğinde tekrar değiştirmeyi unutmayın!


12
Ayrıca test etmek için yeni uygulama kimliği için bir sertifika oluşturmanız gerekmez mi?
Tony

1
Bu yalnızca joker karakter tabanlı sağlama profilleri kullanıyorsanız işe yarar - aksi takdirde yeni paket için bir profil oluşturmanız gerekir.
Zorayr

Yeni bir profil oluşturmanız gerekse bile, bu sadece "Düzelt" düğmesini tıklayıp birkaç saniye bekler - tüm bu yeniden başlatma döngülerinden daha hızlıdır.
Ilya

bu en hızlı çözüm! Benim için gayet iyi çalışıyor! Paket_kimliği'nizi değiştirdiğinizde, uygulamayı aynı "ön hazırlık profilleri" ile imzalayamazsınız. Ama endişelenmeyin, xCode'da (sürüm 7.1.1), "düzelt" e tıklayabilirsiniz ve bu işi yapar. Ayrıca, "düzeltmek" ("düzelt" düğmesine tıklayarak) için birkaç öğeye sahip olabileceğiniz "Yetenekler" onglet'ini de unutmayın ve çok iyi çalışır!
Baraj Fa

Bu cevap yasal bir seçenektir, ancak Apple'ın aptalca bir durumu için hala bir hack düzeltmesidir. Paket kimliğini değiştirmiyorum veya cihaz saatini değiştirmiyorum. Uygun şekilde, herhangi bir geliştirici "Push bildirimlerine izin verilsin mi?" .. Evet = kayıt yöntemini çağırın; No = didFailToRegisterForRemoteNotificationsWithError (vb.) Deyin. Bu benim kendi çözümüm, bu soru ve cevapları okuduktan sonra götürmem. Teknik olarak, kullanıcılara gizlilik bilgileri hakkında bilgi vermenin en iyi yolu ... NEDEN push etkinleştirilmeli veya isteğe bağlı olmalıdır.
Tom Pace

36

İOS 9.0.2'de, uygulamayı her sildiğimde ve yeniden yüklediğimde "kayıt push bildirimi uyarısı" alıyorum. Bu, hem AppStore üretim indirmeleri hem de adhoc modu için geçerlidir.

GÜNCELLEME: Bunun iOS 9.x için çalıştığı onaylandı


1
İOS 9.x için de aynı davranışı yaşıyorum. Bir GÜNCELLEME
Yevhen Dubinin

3
En sonunda! Artık uygulamayı silmeye, cihazı kapatmaya, saati ileri bir saate ayarlamaya ve bunun gibi saçma şeylere gerek yok.
mkeremkeskin

19

Daha önce de belirtildiği gibi, bir cihazdaki bir uygulamanın bildirim durumunu sıfırlama yaklaşımı daha yeni iOS5 için değiştirildi.

Bu benim için iOS6'da çalışıyor:

  • Uygulamayı cihazdan kaldırın
  • Cihazı iki gün veya daha uzun bir süre önce ayarlayın
  • Cihazı yeniden başlatın
  • Cihazı iki gün veya daha uzun bir süre önce ayarlayın
  • Cihazı yeniden başlatın
  • Uygulamayı tekrar yükleyin ve çalıştırın

Ancak bu, yalnızca ilk istemin tekrar görünmesini sağlar - push durumuyla ilgili başka herhangi bir şeyi kaldırmaz.


IOS7'de benim için de çalıştım, tarihi bir kez iki kez değiştirmek zorunda değilsiniz
Nath

1
Teşekkür ederim! Bu bile iOS 8'de çalışıyor (Twitter.app için push izinlerini sıfırlamak zorunda kaldım, çünkü Ayarlar'daki tercih bölmesinde "Uygulama simgesi rozetleri" ayarına sahip değildi).
gklka

9

Plist: /private/var/mobile/Library/RemoteNotification/Clients.plist

... anında iletme bildirimleri için kayıtlı istemcileri içerir. Uygulamanızın girişini kaldırmak istemin yeniden görünmesine neden olur


11
App Store için geliştirirseniz işe yaramaz cevap
samvermette

20
Bu jailbreak'lar için mümkünse, geliştiricilerin jailbreak yapılmamış bir telefonda yapmaları mümkün olmalı, değil mi? Ve işe yaramaz bir cevap DEĞİL, çünkü bu mağazaya sunulmak için bir uygulamaya koyacağınız bir şey değil. Geliştiriciler TEST EDERK yapmak için.
Oscar

1
Bu dosya iOS 5.x'in bir parçası değil.
gmogames

Bu sorunun bir parçası olarak güncellenmiş bir cevaba bakınız: stackoverflow.com/questions/13021066/…
AriX

7

Programlı yapmak her zaman benim için çalışıyor gibi görünüyor. Ben şu satır uncommented ile bir yapı var:

 [[UIApplication sharedApplication] unregisterForRemoteNotifications];

PN'den her kaydını silmek istediğimde çalıştırıyorum. Uygulamayı son kullanıcı listesinden açıkça sonlandırmanız ve doğru şekilde yapabilmek için Ayarlar uygulamasındaki Bildirim Merkezi ile oynamanız gerekebilir.

Ayrıca kullanıcıdan PN'ye kaydolmasını isteyen kullanıcı arabirimi istemi görünmeyebilir. Son iOS sürümlerinden herhangi birinde devre dışı bırakılıp bırakılmadığından emin değilim.


Benim için çalıştı iOS 10 / iPhone 6S. Kayıtsız kaldım, ardından yeniden yüklemeden önce uygulamayı sildim.
Gabriel Jensen

5

İanolito'nun dediği gibi, tarihin ayarlanması gerekir:

Sistem saatini bir gün veya daha fazla ileri ayarlayarak, cihazı tamamen kapatarak ve ardından cihazı tekrar açarak ikincisini gerçekten bir gün beklemeden elde edebilirsiniz.

Cihazımda (iPhone 4, iOS 6.1.2) sistem saatini bir gün ileriye ya da birkaç güne bile ayarlamamın işe yaramadığını fark ettim. Bu yüzden tarihi bir ay ileri götürdüm ve sonra işe yaradı ve uygulamam bildirimleri tekrar gösterdi.

Umarım bu herkese yardımcı olur, baş ağrıyan olabilir!


1
Lütfen "En son işletim sistemi" ile cevap vermeyin - her zaman değişir. Bu davranış 6.1.2'de hala bozuk görünüyor, ama belki 6.0.1'de çalıştı?
patr1ck

Cevabı düzenledi, hala 6.1.2 evet ve daha önce 6.0.1 de var. Yalnızca en az +1 ay tarihini belirlersem benim için çalışır.
Vincent Cohen

1
Ayrıca 24 saat şey duymuştu, bu yüzden denedim ve 2 gün içinde gelişmiş işe yaramadı. Şu andan itibaren 3 ay gibi ayarlayın ve izin açılır penceresi tekrar belirdi! Teşekkürler!
marcshilling

Eski yazı ama yine de yardımcı olduğunu görmek sevindim! İyi şanslar :)
Vincent Cohen

5

Kabul ediyorum micmdk .. Push Bildirimleri ile bir geliştirme ortamı kurulumu vardı ve ilk kurulum gibi görünmek için telefonumu sıfırlamak için bir yol gerekiyordu ... ve sadece bu kesin adımlar benim için çalıştı ... Cihazın İKİ yeniden başlatma gerektirir:

APPLE TECH DOC'tan:

İOS'ta Anında Bildirim İzinleri Uyarısını Sıfırlama Anında etkin bir uygulama anlık bildirimlere ilk kez kaydolduğunda iOS, kullanıcıya bu uygulama için bildirim almak isteyip istemediklerini sorar. Kullanıcı bu uyarıyı yanıtladıktan sonra, cihaz geri yüklenmedikçe veya uygulama en az bir gün boyunca kaldırılmadığı sürece bir daha gösterilmez.

Uygulamanızın ilk kez çalıştırılmasını simüle etmek istiyorsanız, uygulamayı bir gün boyunca kaldırılmış olarak bırakabilirsiniz. Bu adımları izleyerek bir gün beklemeden ikincisine ulaşabilirsiniz:

  1. Uygulamanızı cihazdan silin.

  2. Cihazı tamamen kapatın ve tekrar açın.

  3. Ayarlar> Genel> Tarih ve Saat'e gidin ve tarihi bir veya daha fazla gün önceden ayarlayın.

  4. Cihazı tamamen kapatın ve tekrar açın.


Bunun artık başka bir cevapta çalışmadığı belirtildi.
Beau Nouvelle

Sadece iyi çalışıyor. İOS 5.1'de çalışmayı durduran şey , uygulamanın silinmesi ile saati önceden ayarlama arasında yeniden başlatmayı bırakan diğer cevabın eski sürümüdür.
dgatwood

3

Geçmişte bunu merak ettim ve aslında benim kodum için geçerli bir test örneği olmadığı sonucuna vardım. Uygulama kodunuzun aslında bildirimleri ilk kez reddeden veya daha sonra iPhone bildirim ayarlarından devre dışı bırakan biri arasındaki farkı söyleyebileceğini sanmıyorum. Kullanıcı deneyiminin farklı olduğu, ancak registerForRemoteNotificationTypes çağrısının içinde gizli olduğu doğrudur.

UnregisterForRemoteNotifications çağrıldığında, uygulama bildirim ayarlarından tamamen kaldırılmaz - ancak bu uygulamanın ayarlarının içeriği kaldırılır. Bu hala iletişim kutusunun uygulama bir sonraki çalıştırıldığında kullanıcıya ikinci kez sunulmasına neden olmaz (en azından şu anda test ettiğim v3.1.3'te değil). Ama yukarıda söylediğim gibi, muhtemelen bu konuda endişelenmemelisiniz.


Daha iyi bir cevap bekliyordum, ama sanırım sadece bir cevap yok. Yine de teşekkürler!
hanno

3

Kabul edilen yanıtta ( TN2265 - Anlık Bildirimlerde Sorun Giderme) belirtilen aynı teknik not, o zamandan beri iOS 5 ve üstü için bir çözümle güncellendi.

Kısacası: bir yedekleme oluşturun ve her defasında geri yükleyin.

İOS 5 ve sonraki sürümlerinde, cihazı bir yedeklemeden geri yükleyerek push bildirimleri izin uyarısını sıfırlayın (r. 11450187). İşte bunu verimli bir şekilde yapmak için adımlar:

  1. Uygulamanızı cihaza yüklemek için Xcode Organizer'ı kullanın. Anahtar, uygulamayı çalıştırmadan ilk kez yüklemektir.
  2. Cihazı yedeklemek için iTunes'u kullanın.
  3. Uygulamayı çalıştırın. Anlık bildirim izinleri uyarısı sunulacaktır.
  4. Anlık bildirim izinleri uyarısını sıfırlamak istediğinizde, cihazı ilk adımda oluşturduğunuz yedekten geri yükleyin.

Bunu bir seferde tavsiye etmiş olabilir, ancak artık yapmıyor. Geçerli öneri, uygulamayı silmek, yeniden başlatmak, saati ileri ayarlamak, yeniden başlatmak, isteğe bağlı olarak saati doğru tarih ve saate ayarlamak ve uygulamayı çalıştırmaktır.
dgatwood

2

Apple Teknik Not ayrıca Push Bildirimi iletişim kutusunu sıfırlamak için cihazı geri yükleyebileceğinizi de açıkladı.

Cihazın kendisinde (iOS 5.x) "Genel -> Sıfırla -> Tüm İçeriği ve Ayarları Sil" seçeneğini de kullanabileceğinizi söylemez.


1
Değeri için: Sadece 'tüm ayarları sil' denedim ve bu işe yaramadı. Tüm içerik ve tüm ayarlar
deneniyor

8
Ve "tüm içerik ve ayarlar" gerçekten işe yarıyor, teşekkürler! Ama kutsal nükleer seçenek Batman! Bu kesinlikle delilik.
Groxx

94
Yeni bir cihaz satın almanın push bildirim uyarısını da temizlediğini duydum!
samvermette

Yeni bir cihaz satın almaya çalıştım, ama bu da işe yaramadı. Yeni cihazı deha çubuğuna götürdükten sonra, biraz sihir çalıştılar ve daha fazla para için sabitlediler ... Uzun yıllar sonra Apple hala itme izinlerini sıfırlamak için pratik ve basit bir yol sağlamadı. Çok saçma
Chris

1

İanolito cevabına ek olarak.

Bir yıl önce indirdiğim bir uygulama ile aynı sorunu vardı ve başlangıçta itme bildirimi reddetti. Şimdi push bildirimlerini geri almak isteyen bu adımlar benim için iOS 7 beta sürümünde çalıştı. Hangi nokta (lar) ın tam olarak tetiklediğinden emin değilim.

  • Uygulamayı kapatın ve silin.
  • İCloud ayarlarınıza gidin ve uygulamayı iCloud'dan silin. Bunu, uygulamalar için iCloud yedeklemesinin etkin olduğu diğer tüm cihazlarda yapın. Devre dışı bıraktıktan ve sildikten sonra yeni bir yedekleme yapın. Uygulama artık yedeklemeler altında listelenmemelidir. (Bu nedenle, ianolito tarafından açıklanan Apple'ın Teknik Notu, iCloud'un iOS 5'de tanıtıldığı ve uygulamaların çoğunda iCloud yedeklemesinin etkinleştirildiği için iOS 5'te çalışmayı bırakmasının nedeni budur.)
  • Zaman ayarlarınıza gidin ve zamanı 1 aydan daha uzun süre ayarlayın.
  • İPhone'u kapatın (sıfırlama yok).
  • Bir dakika bekleyin, tekrar açın ve uygulamayı tekrar indirin.
  • Uygulamayı başlatın ve ben tekrar iletişim sunuldu.
  • Hala devre dışı bırakıldığından uygulama yedeklemeyi tekrar etkinleştirin. Zamanı düzeltin.

Çok şükür ki "Tüm İçeriği ve Ayarları Sil" e gerek yoktu. Belki birine yardım eder.


1

Yakın zamanda, yerel tepki uygulamasıyla benzer bir sorunla karşılaştım. iPhone OS sürümü 13.1 idi. Uygulamayı kaldırdım ve uygulamayı yüklemeye çalıştım ve hem konum hem de bildirim izinlerinin istenmediğini fark ettim.

Ayarları kontrol ederken, uygulamamın konum için etkinleştirildiğini görebiliyordum (önceki kurulumdan), ancak bildirime karşılık gelen bir giriş yoktu. Saati ayarlamadan kaldırma ve yeniden başlatma denendi, işe yaramadı. Btw, Appstore uygulamasını indirmeye çalıştım, yine aynı davranış.

Sorun yalnızca cihaz saatini ayarladıktan sonra çözüldü.


0

Saatlerce arama yaptıktan ve yukarıdaki önerilerle şanssız kaldığınızda, bu 3.x +

override func viewDidLoad() {
        super.viewDidLoad()


            requestAuthorization()

}

func requestAuthorization() {

        if #available(iOS 10.0, *) {

            UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { (granted, error) in
                print("Access granted: \(granted.description)")
            }

        } else {
            // Fallback on earlier versions
        }

    }
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.