2017-05-12 14 views
8

में पुश अधिसूचना प्राप्त करने के बाद मेरा आईफोन ऐप क्रैश हो गया है। मैंने अभी पता लगाया है कि मेरे ऐप में पुश अधिसूचना को सही तरीके से कैसे भेजा जाए। हालांकि जब यह सही ढंग से काम करना शुरू कर दिया, तो एक नई प्रकार की त्रुटि आई है। पुश अधिसूचना प्राप्त करने के बाद मेरा ऐप लॉन्च पर क्रैश हो गया। मैंने 5 डिवाइसों पर परीक्षण किया और उनमें से 2 समस्या के कारण क्रैश हो गए (दोनों आईओएस_10.3.1 पर चल रहे हैं)। अजीब हिस्सा आईओएस 10.2 और 9.3.1 पर अन्य 3 डिवाइस चल रहे थे। मुझे सच में नहीं लगता कि यह ओएस से संबंधित कुछ है।कुछ आईफोन (विशेष रूप से ios_10.3.1)

एप्पल इस तरह एक दुर्घटना लॉग भेज है, लेकिन जब मैं इस परियोजना में खुला पर क्लिक करें यह सिर्फ मेरी लॉन्च स्क्रीन xib enter image description here

मेरे AppDelegate वर्ग APNS सेवा को फोन भाग>

func registerForPushNotifications(application: UIApplication) 
{ 

    if #available(iOS 10.0, *){ 
     UNUserNotificationCenter.currentNotificationCenter().delegate = self 
     UNUserNotificationCenter.currentNotificationCenter().requestAuthorizationWithOptions([.Badge, .Sound, .Alert], completionHandler: {(granted, error) in 
      if (granted) 
      { 
       UIApplication.sharedApplication().registerForRemoteNotifications() 
      } 
      else{ 
       CommonViewController.alertViewUI("Alert", message: "Push notification is enabled") 
      } 
     }) 
    } 

    else{ //If user is not on iOS 10 use the old methods we've been using 
     let notificationSettings = UIUserNotificationSettings(
      forTypes: [.Badge, .Sound, .Alert], categories: nil) 
     application.registerUserNotificationSettings(notificationSettings) 

    } 

} 

खोलता है मेरे ऐप फ़ंक्शनिंग-> लॉन्च पर -----------------------

उपयोगकर्ता संस्करण को जानने के लिए एक संस्करण चेक क्लास। वहां से इसे मुख्य पर रीडायरेक्ट किया गया (होम पेज)।

होम पेज पर -> 1. विचार लोड करें। 2. एक लिंक को असीमित रूप से कॉल करता है और अलर्ट प्रतीक के पास प्रदर्शित होने के लिए उपलब्ध अधिसूचना की गिनती प्राप्त करता है। (मुझे पूरा यकीन है कि इस लिंक को कॉल करते समय या अधिसूचना प्राप्त करने में कोई त्रुटि नहीं है) ----------- --------------

नोट: ** जब आईफ़ोन होम बटन मेनू को डबल टैप करते हैं तो ऐप को होम पेज के साथ खुली स्क्रीन के रूप में पृष्ठभूमि में दिखाया जाता है (इसके बाद क्रैश हो जाता है) ।

** एक 10.3.1 उपकरण ठीक से काम करता

एप्लिकेशन पुनर्स्थापित किया जाता है

** यदि सब कुछ सब में ठीक काम करता है।

+0

स्वचालित रूप से मैन्युअल से मैन्युअल प्रोजेक्ट की योजना बदलें और धक्का अधिसूचना और डीबग भेजें कि वास्तव में क्या हो रहा है –

+0

आपको पुश अधिसूचना के साथ-साथ didFinishLaunching विधि प्राप्त करने के लिए कोड पोस्ट करने की आवश्यकता है, क्योंकि आप कहां कहते हैं दुर्घटना हो रही है। पोस्ट कोड पुश अधिसूचनाओं के लिए पंजीकरण के लिए है। –

उत्तर

0

कृपया जांचें कि आपने इसमें क्या लिखा है क्योंकि इस फ़ंक्शन को पुश अधिसूचना प्राप्त करने के लिए कहा जाता है। कृपया इसे डीबग करें।

समारोह आवेदन (_ आवेदन: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: किसी भी]) आपकी समस्या { }

1
  • इस कोड को हल :: -

    func registerPushNotifications() { 
    
    if #available(iOS 10.0, *) { 
        let center = UNUserNotificationCenter.current() 
        center.delegate = self 
        center.requestAuthorization(options: [.sound, .alert, .badge]) { (granted, error) in 
         if error == nil{ 
          UIApplication.shared.registerForRemoteNotifications() 
         } 
        } 
    } 
    else { 
        UIApplication.shared.registerUserNotificationSettings(UIUserNotificationSettings(types: [.sound, .alert, .badge], categories: nil)) 
        UIApplication.shared.registerForRemoteNotifications() 
    } 
    } 
    
4

हैं मैं आपको सही समझता हूं, आपका ऐप पृष्ठभूमि में आगे बढ़ रहा है और अग्रभूमि पर वापस आने पर दुर्घटनाग्रस्त हो रहा है।

यह UNUserNotifications के साथ कोई समस्या नहीं दिखता है। अधिसूचना की तरह ही उस मामले में आपके ऐप में दुर्घटनाग्रस्त हो जाती है। ढेर से पता चलता है कि आपके ऐप में दुर्घटना होती है। इसका मतलब है कि आप अग्रभूमि पर लौटने पर कहीं नल पॉइंटर संदर्भ पर चल रहे हैं।
अंधेरा अनुमान:
क्या आप UIAplplicationDidBecomeActiveNotification या UIAplicationWillEnterForegroundNotification सुन रहे हैं?
यदि हां, तो प्रत्येक वर्ग जो उन अधिसूचनाओं को सुनती है उन्हें कचरा कलेक्टर से मिलने से पहले सदस्यता समाप्त करने की आवश्यकता होती है। इसके लिए अच्छी जगह dealloc/deinit है।

जब से तुम स्विफ्ट का उपयोग करें:

deinit { 
    NotificationCenter.default.removeObserver(self) 
} 

ऑब्जेक्टिव-सी एआरसी दिखाई देगा:

- (void)dealloc { 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
} 

को अपनी अधिसूचना को नहीं सुन, तो यह अभी भी एक संदर्भ कहीं कि deallocated मिलता है। कारण यह तुरंत दुर्घटनाग्रस्त नहीं होगा एक साधारण ज़ोंबी होगा। एक ऑब्जेक्ट इंस्टेंस जो डिलीओटेड होने वाला है, लेकिन अभी तक कुछ डिवाइसों पर रनटाइम के दौरान नहीं था।

संबंधित मुद्दे