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

Merhaba arkadaşlar,
iOS uygulamasında development ortamında hiçbir hata vermeyen uygulama App Store'da yayınlandıktan sonra bir Crash'e sebep oluyor. Device Logs üzerinden inceledim. Detaylar kısaca şöyle:

Exception Type:  EXC_CRASH (SIGABRT)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Exception Note:  EXC_CORPSE_NOTIFY

Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0   libsystem_kernel.dylib          0x0000000184fbd014 __pthread_kill + 8
1   libsystem_pthread.dylib         0x0000000185087334 pthread_kill + 112
2   libsystem_c.dylib               0x0000000184f31a60 __abort + 144
3   libsystem_c.dylib               0x0000000184f319d0 __abort + 0
4   libswiftCore.dylib              0x00000001006bfd1c 0x1004c4000 + 2080028
5   libswiftCore.dylib              0x00000001006a1e04 0x1004c4000 + 1957380
6   libswiftCore.dylib              0x00000001006a1e7c 0x1004c4000 + 1957500
7   libswiftCore.dylib              0x00000001006cf31c 0x1004c4000 + 2143004
8   libswiftCore.dylib              0x00000001006a5c24 0x1004c4000 + 1973284
9   libswiftCore.dylib              0x00000001006a40bc 0x1004c4000 + 1966268
10  libswiftCore.dylib              0x00000001006a4350 0x1004c4000 + 1966928
13  libdispatch.dylib               0x0000000184e7a9e0 _dispatch_call_block_and_release + 24
14  libdispatch.dylib               0x0000000184e7a9a0 _dispatch_client_callout + 16
15  libdispatch.dylib               0x0000000184e7f5e8 _dispatch_main_queue_callback_4CF + 996
16  CoreFoundation                  0x0000000185f710c0 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 12
17  CoreFoundation                  0x0000000185f6ecdc __CFRunLoopRun + 1572
18  CoreFoundation                  0x0000000185e9ed94 CFRunLoopRunSpecific + 424
19  GraphicsServices                0x0000000187908074 GSEventRunModal + 100
20  UIKit                           0x000000018c157130 UIApplicationMain + 208
22  libdyld.dylib                   0x0000000184ead59c start + 4

Bildirimi alan kullanıcı, bildirime dokunup uygulamayı açıyor. Sonra uygulama açılıp crash alıp kapanıyor:

Bildirimi aldığımda gelen payload datasını işlerken DispatchQueue.main.async(execute: { () -> Void in içinde bazı işlemler yapıyorum.

Hata için, device logs'taki hata raporunda işaret edilen bir class ve satır yok. Yani şu satırda sorun oldu gibisine. Fabric kullanıyorum orada da yok bilgi. Sadece crash oluyor. Acaba gözden kaçırdığım bir şey mi var?

1- Development ortamında hatayı nasıl tekrar ettirebilirim?

2- Nasıl öğrenebilirim bu sorunun sebebini?

Teşekkürler.

1 cevap

+1 oy
tarafından
tarafından seçilmiş
 
En İyi Cevap

Yani bildirimin ele alındığı kod bloğunu bir incelemek lazım, görmeden bir yorumda bulunmak zor. notification payload'ını bir array'a dönüştürüyor ve bu array içerisindeki sabit bir index'e filan mı ulaşmaya çalışıyorsun acaba? Belki payload bir şekilde eksik geliyor ve ulaşmaya çalıştığın index nil dönüp çökmeye neden oluyordur.

tarafından

Şurada anlatıldığı gibi crash report 'u Re-Symbolicate Log menüsü ile yeniden kontrol ettim.

Şimdi nihayet daha okunabilir bir rapora kavuştum. Hatanın sebep olduğu kod bloğunu paylaşıyorum. Ben String olarak gelen bir payload datasındaki değeri cast ederek int'e çevirmiştim. İşte tam burada, newsID ismindeki değişkenimi tanımladığım ve cast ettiğim satırda uygulama patlıyor.

Ancak ilginç olan Development aşamasında hiçbir sorun olmuyor. Yayınladıktan sonra ne oluyorsa oluyor.

DispatchQueue.main.async(execute: { () -> Void in
            let newsID: Int = (payload["newsID"] as! NSString).integerValue
                print("newsID : %i", newsID)
})

Üstadım bu sorunu nasıl çözebilirim?

tarafından
+1
//gelen payload'ı optional closure ile NSString'e çevir'
        if let newsIDInString = payload["newsID"] as? NSString {
            let newsIDInInt = newsIDInString.integerValue
            print("newsID :\(newsIDInInt)")
        }

şu an bu uygulama appStore'da mı, yoksa reviewed filan mı?
neden soruyorum bunu?
Çünkü eğer uygulamada pushnotification varsa review esnasında bunu kendileri uygulamaya bildirim göndererek kontrol ediyorlar ve tabi gönderdikleri bildirim payload'ında senin özel keylerin bulunmuyor.
bu potansiyel hatalara karşı önlem almak bizim sorumluluğumuzda.
istikrarından emin olamadığın datalar için her zaman optional closure veya guard filan kullan.

tarafından

uygulama appStore'da şu anda. Üstadım senin dediğin şekilde kullandım development ortamında sorun yok şimdilik.

Peki gelelim asıl soruya:

Ben bunu yayınlamadan önce testflight felan mı yapacağım? Nasıl bu hatayı tekrar ettirebileceğim? Yani tabii eğer olursa.

Teşekkür ederim her zamanki gibi yardımların için minnettarım.

tarafından
+1

Hatanın Payload'ın bir şekilde eksik gelmesi sonucu oluştuğunu biliyoruz.
Bunun önlemini de yukarıdaki verdiğim örnekteki gibi aldık nitekim.
Buna benzer başka yerler de varsa kod bloğu içerisinde, onlarıda yine optional closure içerisine al.
Artık böylesi bir çökme problemi yaşamazsın.
Ama payload'ın eksik gelmesi uygulama kullanım ve işlevselliği açısından bir sıkıntı doğuracaksa onu oturup incellemek lazım tabi.

tarafından

Teşekkür ederim. Aynen öyle yapıyorum. Birkaç crash daha var onları da çözmeye çalışıyorum. Bu arada, Re-Symbolicate Log süper şeymiş. Neden Fabric bunu kullanıp bize daha okunabilir rapor göstermiyor acaba?

tarafından
+1

Daha önce de bu çökme raporlarının okunamamsıyla ilgili bir kaç kelam etmiştik seninle yine hatırlarsan.
Konuyla ilgili birkaç şeye daha ulaşmak isteyen olursa diye şuraya liniki bırakayım.
Fabric Crashlytics ile hiçbir sorunu çözemiyorum

tarafından

Zor oldu ama çözebiliyorum artık sorunları. Master yaptım o konuyu açtıktan sonra uzun süre :)

...