2016-08-21 11 views
10

में दिखाई नहीं दे रही है, मैं समृद्ध अधिसूचना अनुभव पर काम कर रहा हूं जिसे आईओएस 10 में पेश किया गया है और UNNotificationContentExtension पर संलग्नक के रूप में गुजरने वाली छवियों के साथ अटक गया है।स्थानीय अधिसूचना से अनुलग्नक से छवि UNNotificationContentExtension

यहाँ मेरी ContentExtension है:

class NotificationViewController: UIViewController, UNNotificationContentExtension { 

    @IBOutlet weak var attachmentImage: UIImageView! 

    func didReceive(_ notification: UNNotification) { 

     if let attachment = notification.request.content.attachments.first { 
      if attachment.url.startAccessingSecurityScopedResource() { 
       attachmentImage.image = UIImage(contentsOfFile: attachment.url.path) 
       attachment.url.stopAccessingSecurityScopedResource() 
      } 
     } 
    } 
} 

एक ट्यूटोरियल के रूप में, मैं Advanced Notifications video from WWDC निम्नलिखित किया गया है। मैं देख लिया है - UIImage मैं UIImageView को बताए हूँ:

  • है नहींnil
  • उचित CGSize (191x191)
  • attachment.url.path /var/mobile/Library/SpringBoard/PushStore/Attachments/<bundle of app>/<...>.png

के बराबर होती है है यहां बताया गया है कि मैं ऐप से स्थानीय सूचना कैसे भेजता हूं:

let content = UNMutableNotificationContent() 
    content.title = "Sample title" 
    content.body = "Sample body" 
    content.categoryIdentifier = "myNotificationCategory" 

    let attachement = try! UNNotificationAttachment(identifier: "image", 
                   url: Bundle.main.url(forResource: "cat", withExtension: "png")!, 
                   options: nil) 

    content.attachments = [ attachement ] 

    let request = UNNotificationRequest(identifier:requestIdentifier, content: content, trigger: nil) 
    UNUserNotificationCenter.current().delegate = self 
    UNUserNotificationCenter.current().add(request){(error) in 
     if (error != nil){ 
     } 
    } 

"cat.png" सिर्फ एक डमी संसाधन है जिसे मैंने प्रोज में जोड़ा है। enter image description here

आप देख सकते हैं, अधिसूचना पिक दिखाता है, इसलिए मुझे लगता है कि मैं इसे सही ढंग से भेज रहा है, लेकिन विस्तृत स्थिति में (NotificationViewController में) मैं एक ही छवि दिखा पर कभी नहीं सफल हो गए हैं।

मैं क्या गलत कर रहा हूं? धन्यवाद!

+1

हाय मुझे अभी भी एक ही समस्या का सामना करना पड़ रहा है जो विस्तारित स्थिति में छवि प्रदर्शित करने में सक्षम नहीं है। क्या आप मेरी मदद कर सकते हैं। मेरा कोड उद्देश्य सी में है। –

उत्तर

21

जब आप contentsOfFile के साथ एक UIImage बनाने के लिए, UIImage वस्तु केवल छवि हैडर, जो इस प्रकार छवि आकार के रूप में बुनियादी जानकारी का संकेत, आदि

पढ़ा तो, [NotificationViewController dealloc] करने के लिए ले जाने के stopAccessingSecurityScopedResource प्रयास करें।

या इसका उपयोग करते निम्नलिखित:

  • उद्देश्य-सी कोड:

    NSData *imageData = [NSData dataWithContentsOfURL:imageURL]; 
    UIImage *image = [UIImage imageWithData:imageData]; 
    
  • तेज कोड:

    let imageData = NSData(contentsOf: attachment.url) 
    let image = UIImage(data: imageData! as Data) 
    

कोई दस्तावेज नहीं है कि contentsOfFile केवल छवि शीर्षलेख पढ़ता है। लेकिन जब मैं निम्नलिखित कोड चलाएँ:

NSString *docFolderPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject]; 
NSString *pngPath = [docFolderPath stringByAppendingPathComponent:@"test.png"];  
UIImage *image = [UIImage imageWithContentsOfFile:pngPath]; 
[[NSFileManager defaultManager] removeItemAtPath:pngPath error:nil]; 
imageView.image = image; 

कोई त्रुटि होती है:

ImageIO: createDataWithMappedFile:1322: 'open' failed '/Users/fanjie/Library/Developer/CoreSimulator/Devices/FFDFCA06-A75E-4B54-9FC2-8E2AAE3B1405/data/Containers/Data/Application/E2D26210-4A53-424E-9FE8-D522CFD4FD9E/Documents/test.png' 
    error = 2 (No such file or directory) 

तो मैं एक निष्कर्ष यह है कि UIImage contentsOfFile केवल छवि हैडर पढ़ता है बनाते हैं।

+0

जेफ़री, तुम मेरे नायक हो। महान पकड़ और स्पष्टीकरण! मैंने इस्तेमाल किए गए स्विफ्ट-संस्करण को जोड़ने के लिए उत्तर को थोड़ा सा संशोधित किया। अब आकर्षक के रूप में काम करता है! –

+1

@ जेफ़री आपने कहां पढ़ा था कि 'ContentOfFile' केवल छवि शीर्षलेख लोड करता है? यहां दस्तावेज़ों से चर्चा है: "यह विधि छवि डेटा को स्मृति में लोड करती है और इसे शुद्ध करने योग्य के रूप में चिह्नित करती है। यदि डेटा शुद्ध हो जाता है और उसे पुनः लोड करने की आवश्यकता होती है, तो छवि ऑब्जेक्ट उस डेटा को निर्दिष्ट पथ से फिर से लोड करता है।" मुझे लगता है कि समस्या यह हो सकती है कि आप 'StopAccessingSecurityScopedResource' को कॉल कर रहे हैं जो छवि स्मृति को शुद्ध करता है और यह छवि फ़ाइल तक पहुंच बंद कर देता है और इसे पुनः लोड नहीं किया जा सकता है। –

+0

@ कोस्टियनटाइन कोवल क्षमा करें। कोई दस्तावेज़ नहीं कह रहा है कि 'ContentOfFile' केवल छवि शीर्षलेख लोड करता है। मुझे लगता है कि 'stopAccessingSecurityScopedResource' को कॉल करना छवि स्मृति को शुद्ध नहीं करेगा। टिप्पणी में कोड पोस्ट करने के लिए यह विश्वास नहीं है, इसलिए मैं जवाब में कुछ स्पष्टीकरण जोड़ता हूं। – Jeffery

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