Hoşgeldin. Soru sormak veya cevaplamak için hemen üye ol.
0 oy
3.6k kez görüntülendi
ios development kategorisinde tarafından

Merhaba,

Linkteki adımları izleyip swift 3 e uyarladım şuan tamamen çalışır durumda.
- Uygulama tamamen kapalıyken AppDelegate - didFinishLaunchingWithOptions fonksiyonu ile launchOptions içinde gelen json verisini okuyarak,
gelen bildirime tıkladığında istediğim sayfaya yönlendire biliyorum.

  • Fakat uygulama açıkken yani uygulama iconuna tıklayıp açıldığında gelen bildirimi görüyorum. Ama bildirimin içeriğini hangi fonksiyon ile okuya bilirim ve Uygulama gelir gelmez kullanıcı bildirime tıklamadan nereye düşüyor bildirim hangi fonksiyona.

Cevabınız için şimdiden teşekkürler, herkese iyi çalışmalar

tarafından

Debug ile kontrol ettim
Uygulama açıkken

Bildirim geldiğinde ve genişletildiğinde
- applicationWillResignActive fonksiyonu çalışıyor

Bildirime tıklandığında
- applicationDidBecomeActive fonksiyonu çalışıyor

Ama hala bildirim gelir gelmez hangi fonksiyonun çalıştığını çözemedim.
Örnek olarak: Whatsapp ta uygulama açıkken mesaj gelirse, bildirim geliyor, bildirime tıklamadan sayfayı yeniliyor mesaj gelen kişiyi listenin başına alıp mesaj sayısını gösteriyor, bildirime tıklanırsa mesaja gidiyor.

tarafından
func application(_ application: UIApplication, 
didReceiveRemoteNotification 
userInfo: [AnyHashable : Any]) {

}

func application(_ application: UIApplication, 
didReceiveRemoteNotification 
userInfo: [AnyHashable : Any], 
fetchCompletionHandler 
completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {

}

bu iki fonksiyona da girmiyor

tarafından
func application(_ application: UIApplication, 
didFinishLaunchingWithOptions 
launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {


if let notification = launchOptions?[UIApplicationLaunchOptionsKey.remoteNotification] as? [String: AnyObject] {

Burada uygulama kapalıyken bildirime tıklayıp açıldığında Json u okuyorum

1 cevap

0 oy
tarafından

benzer bir soru ve verdiğim cevap için,
Uygulama açıkken bildirim geldiğini belli etmiyor

tarafından

O soruya baktım çözüme ulaşamadığım için yeni bir soru sordum,

  • Bildirimin geldiğini görüyorum uygulama açıkken çalışıyor yani. Ama o anda neresi tetikleniyor AppDelegate sınıfımın her yerine breakpoint koydum ama hiç birine yakalanmıyor
tarafından

https://gist.github.com/HalitGumus/6e7709088d013b0852b45c753b890085

AppDelegate sınıfım

Kontrol edebilir misiniz acaba

tarafından
func application(_ application: UIApplication, 
didReceiveRemoteNotification 
userInfo: [AnyHashable : Any], 
fetchCompletionHandler 
completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {

yani bu fonksiyona girmiyor

tarafından

öncelikle xcode'da targets/capabilities altında push notifications ve
background modes açık ve altındaki "Remote notifications" kutucuğu işaretli mi?
bir de paylaştığın appDelegate class'ın da, 54. satır'a bir break point atarmısın.
application.registerForRemoteNotifications() register ediliyor mu?
testlerini simulator'de filan da denemiyorsun ayrıca değil mi?

tarafından

push notifications ve
background modes açık ve altındaki "Remote notifications" kutucuğu işaretli

54 . satırada break point koydum girdi orayada.

Simulatorde denemiyorum.

Dediğim gibi uygulama tamamen çalışıyor. Uygulama açıkkende kapalıykende bildirim geliyor.

Uygulama kapalıyken bildirim gelirse üzerine tıklanırsa gerekli işlemleri yaptırıyorum

func application(_ application: UIApplication, 
didFinishLaunchingWithOptions 
launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.

if let notification = launchOptions?
[UIApplicationLaunchOptionsKey.remoteNotification] 
as? [String: AnyObject] {

burada

  • Ama işte şöyle bir şeye ihtiyaç duydum. Uygulama açık bildirim geldi gördük bildirimi ama üzerine tıklayınca bildirimin her hangi bir şey gerçekleşmiyor.

Uygulama açıksa ve bildirim geldiyse bu fonksiyona düşmesi gerekmiyor muydu

func application(_ application: UIApplication, 
didReceiveRemoteNotification 
userInfo: [AnyHashable : Any], 
fetchCompletionHandler 
completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
tarafından

evet doğru.
uygulama açıkken gelen bildirimlerde,
didReceiveRemoteNotification, fetchCompletionHandler metodu tetiklenir,
keza çalıştığını da söylüyorsun.
zaten didFinishLaunchingWithOptions metodu notification'dan bağımsız,
sadece uygulama tamamen kapalıyken (background'da değilken yani) çalıştırıldığında tetiklenir.

benim anlamadığım nokta şu,
uygulama açıkken gelen bildirimlerde mesaja tıkladığımda bir şey olmuyor diyorsun.

öncelikle uygulama açıktan kastın,
uygulama kullanıcı tarafından çalıştırılmış ama background'a gönderilmiş
ve o durumda gelen mesaja tıklayınca birşey olmuyor herhalde değil mi.
yanlış anlamadım umarım.
zaten uygulama tamamen açık yani foreground'dayken bir bildirim mesajı görünmez.

tarafından

Aynen hocam uygulama kullanıcı tarafından çalıştırılmış. Background a gönderilmiş veya gönderilmemiş hala açık iken. Bildirim alıyorum gelen mesajı görüyorum mesaja tıklayınca birşey olmuyor tetiklenmiyor.
Uygulama background da ise açlıyor, açıksa da hiç bir şey olmuyor

tarafından

Hocam uygulama arayüzü bu şekilde. Açıkken bildirim geliyor altta yer alan CollectionView i Reload etmek istiyorumda bildirime tıklayınca bir olay gerçekleştiremiyorum.

Ekran alıntısı

tarafından
tarafından düzenlendi

Mesela letgo da mesaj gelince uygulama açıksa bildirim gelir gelmez uygulamada görünüyor kırmızı noktalarla bunu appDelegate içerisindeki fonksiyonlarda yapmıyor muyuz

tarafından

aa şimdi jeton düştü ok.
UNUserNotificationCenter'i kullanıyorsun evet. ama delegate metodlarını set etmemişsin appDelegate içerisinde.
öncelikle appDelegate class'ına UNUserNotificationCenterDelegate'ekle.

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate,
UNUserNotificationCenterDelegate {

daha sonrada application: didFinishLaunchingWithOptions içerisine delegate'i

UNUserNotificationCenter.current().delegate = self

ve UNUserNotificationCenter delegate metodları olan

func userNotificationCenter(_ center: UNUserNotificationCenter, 
didReceive response: UNNotificationResponse, 
withCompletionHandler 
completionHandler: @escaping () -> Void) {
        completionHandler()
}

ve

func userNotificationCenter(_ center: UNUserNotificationCenter, 
willPresent notification: UNNotification, 
withCompletionHandler 
completionHandler: 
@escaping (UNNotificationPresentationOptions) -> Void) {
      completionHandler(UNNotificationPresentationOptions.alert)
}

şimdi uygulama açıkken yane foreground'dayken bir bildirim geldiğinde ve bu bildirime tıklandığında "didReceive response" response metodu tetiklenecek.
burada artık ne yapmak istiyorsan onu yaptırırsın.

tarafından

ayrıca şunu da hatırlatayım.
UNUserNotificationCenter sadece IOS 10 ve üzeri çalışır.
eğer IOS 10 altına yapıyorsan uygulamayı çökecektir. Bilgin olsun.

tarafından

Hocam sizinde vaktinizi aldım. Ama bir türlü çalışmadı, dediklerinizi ekledim

AppDelegate: https://gist.github.com/HalitGumus/6e7709088d013b0852b45c753b890085

Nerde hata yapıyorum bir şey mi eksik ya da fazla kontrol edebilir misiniz

tarafından

e ama olmamış ki,

UNUserNotificationCenter.current().delegate = self

didReceiveRemoteNotification metoduna eklemişsin.

func application(_ application: UIApplication, 
didFinishLaunchingWithOptions 
launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

metodu içerisinde en tepeye ekle.

tarafından

pardon yanlış yazmışım yukarıdaki mesajda düzelttim sonra
didFinishLaunchingWithOptions metodu içerisine ekle

tarafından

Bende düzelttim hocamda en yukarıya ekledim didFinishLaunchingWithOptions bir değişiklik olmadı

tarafından
UNUserNotificationCenter.current().requestAuthorization

iki kere çağrılıyor, ikincisini sil bakalım o mu etkiliyor acaba.

didReceive response delegate metodu içerisinde de bir print al bakalım,

print("response:\(response)")

log ları takip et, mesaja tıkladığında çağrılıyor mu

tarafından

UNUserNotificationCenter ın tüm fonksiyonlarına girmiyor hocam hiç bir şekilde

tarafından

aynı şeyleri ben de test ediyorum çalışıyor.
kim bilir neyi atlıyoruz.

tarafından

Uygulama açıkken bildirim gelirse direk didReceive response fonksiyonuna mı düşüyor sizde.
acaba APNs nin json apisinde bişiler eklemek gerekiyor mu

tarafından

Json = "{'aps' : {'alert' : { 'title' : '" + apn.MESSAGETITLE +
"','subtitle' : '" + apn.MESSAGE
SUB_TITLE +
"', 'body' : '" + apn.MESSAGE +
"' , 'IdT' : '" + apn.IdT +
"'},'badge':" + count +
",'sound':'" + apn.SOUND +
"', 'mutable-content' : 1 }, 'my-attachment' : '" + apn.LINK + "'} ";

tarafından
'{
  "aps" : {
          "alert" : { 
                     "title" : "asdasd",
                     "subtitle" : "rtyrty", 
                     "body" : "ghfdgh" , 
                     "IdT" : "12"
                     },
          "badge":3,
          "sound":"Notification.wav", 
          "mutable-content" : 1 
          }, 
  "my-attachment" : "weqw"
}'

evet, örnek verdiğin payload'la da denedim. Çalıştı.
önce willPresent notification metodu tetikleniyor ve bildirim görünüyor,
bildirime tıklandığında da
didReceive response metodu tetikleniyor.

tarafından

UNUserNotificationCenter ı kullanmadan önce bende yine görünüyordu bildirimler, büyük ihtimalle o taraf UNUserNotificationCenter ı engelliyor olabilir ben biraz daha araştırayım. Bilgilendirdiğiniz, yardımcı olduğunuz ve zaman ayırdığınız için çok teşekkürler hocam.
İyi çalışmalar sizede

tarafından

bildirimler hiç gözükmemeye başladı öyle mi?
o zaman o kullandığın payload'a ki tırnak işaretlerini bir düzenleyip denesene benim verdiğim payload'da olduğu gibi yani;
tüm payload'ı tek tırnak içerisine,
içindeki elemanları da çift tırnak içerisine alarak.
ayrıca line break olmadan.
kısacası şöyle;

'{"aps" : {"alert" : { "title" : "asdasd","subtitle" : "rtyrty", "body" : "ghfdgh" , "IdT" : "12"},"badge":3,"sound":"Notification.wav", "mutable-content" : 1 }, "my-attachment" : "weqw"}'

tarafından

Yok hocam onu kastetmedim yine çalışıyorda.
Şunu demek istedim. Ben UNUserNotificationCenter delegate i fonksiyonları falan eklemeden bile çalışıyordu yani bildirim geliyordu. Nasıl çalışıyordu acaba ona bir bakayım

tarafından

hee, ok.
tamam o zaman.
bir sonuca vardığında burada paylaşırsan sevinirim.

tarafından

Hocam ne yaptıysam bir şey değişmedi
En son sınıfı tamamen temizledim aşağıdaki hale getirdim. Payload a mutable-content, content-available falan ekledim yine olmadı

https://gist.github.com/HalitGumus/6e7709088d013b0852b45c753b890085
Payload ve bazı ekran görüntüleri linkte mevcuttur

  • Şöyle bir şey var hocam sizin bu yazınızdaki "Provisioning Profile" alanında "Debug" altından yüklediğimiz provizyon dosyasını seçme adımını gerçekleştirememiştim ondan olabilir mi acaba
tarafından

geç cevap için çok pardon. yeni farkettim.
şu daha önce söylediğim payload'da ki çift tırnak, tek tırnak olayını denedin mi?

tarafından

Malesef hocam bir değişiklik yok. Bildirim geliyor ama "willPresent" fonksiyonuna girmiyor nasıl veriyor bildirimi fonksiyona girmeden onuda anlamış değilim

tarafından

bir örnek hazırladım aşağıdaki link üzerinden indirerek inceleyebilirsin.
https://drive.google.com/open?id=0B_33To7xgYO7WExRRmxXSVFYT3c

bundleIdentifier'i ve provizyon dosyasını değiştirerek kendi bildirimlerini gönderip, test edebilirsin.

şu payload'ı göndererek test ettim. Çalışıyor.

'{"aps":{"alert":{"title":"Hello world!","body":"This is the test notification."},"sound":"default","badge":1}}'

uygulama açıkken önce,
userNotificationCenter:willPresent:withCompletionHandler
delegate metodu tetikleniyor ve bildirim görünüyor.

bildirime tıklandığında da
userNotificationCenter:didReceive response:withCompletionHandler

delegate metodu tetikleniyor.

tarafından

Hocam sizin yolladığınız bu örnekte çalıştı ama benim uygulamada çalışmıyor. AppDelegate sınıfını sizin sınıfla aynı yaptım yine çalışmadı. Benim projenin başka bir yerinde ya eksik ya da fazla bir yer var onu bulamadım

tarafından

yani, ben de anlayamadım.
muhtemelen senin proje içerisinde bir yerlerde mükerrer notification kodları filan var galiba.

tarafından

Olabilir hocam kontrol ediyorum, çözüme ulaştığımda yazarım buraya.
Yardımlarınız ve ilginiz için çok teşekkür ederim

...