2015-10-16 18 views
5

Tôi đang làm việc để chia sẻ mảng hình ảnh từ thư viện bằng tiện ích chia sẻ. tôi có thể lấy hình ảnh bên trong phần mở rộng chia sẻ bằng cách sử dụngCách nhận URL biểu mẫu hình ảnh được tiện ích mở rộng chia sẻ chuyển đến Ứng dụng

- (void)getImageFromExtension:(NSExtensionItem *)extensionItem 
{ 
    for(NSItemProvider *attachment in extensionItem.attachments) 
    { 
     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
      if([attachment hasItemConformingToTypeIdentifier:(NSString *)kUTTypeImage]) 
      { 
       [attachment loadItemForTypeIdentifier:(NSString *)kUTTypeImage options:nil completionHandler:^(id<NSSecureCoding> item, NSError *error) { 
        NSURL *image = (NSURL *)item; 
        if(error) 
        { 
         NSLog(@"Error retrieving image"); 
        } else { 
         dispatch_async(dispatch_get_main_queue(), ^{ 
          NSLog(@"*** ### %@",[UIImage imageWithData:[NSData dataWithContentsOfURL:image]]); 
         }); 
        } 
       }]; 
      } 
     }); 
    } 
} 

Điều tôi thực sự cần là, tôi cần chuyển url hình ảnh tới applciation container. Nhưng không thể tải hình ảnh từ URL đó. Định dạng url là file:///var/mobile/Media/DCIM/101APPLE/IMG_1705.JPG

Dữ liệu từ url này luôn rỗng. làm thế nào để có được hình ảnh từ URL này?

Trả lời

3

Bạn có thể gọi getImageFromExtension từ didSelectPost. Vào cuối didSelectPost, bạn được yêu cầu gọi completeRequestReturningItems:completionHandler: để yêu cầu ứng dụng máy chủ hoàn tất yêu cầu tiện ích ứng dụng với một loạt các mục kết quả. Khi phương thức đó được gọi là toàn bộ ShareViewController được loại bỏ và deallocated. Khi bạn gọi nó vào cuối didSelectPost, nó sẽ được thực hiện trước khi NSItemProvider có thể truy xuất URL hình ảnh. Bởi vì điều đó xảy ra không đồng bộ. Để khắc phục điều này, bạn phải gọi completeRequestReturningItems:completionHandler: sau NSItemProvider đã truy xuất imageURL.

Sau đây là cách nó nên làm việc:

- (void)didSelectPost { 
    NSString *typeIdentifier = (NSString *)kUTTypeImage 
    NSExtensionItem *item = self.extensionContext.inputItems.firstObject; 
    NSItemProvider *itemProvider = item.attachments.firstObject; 
    if ([itemProvider hasItemConformingToTypeIdentifier:typeIdentifier]) { 
     [itemProvider loadItemForTypeIdentifier:typeIdentifier 
             options:nil 
           completionHandler:^(NSURL *url, NSError *error) { 
            NSURL *imageURL = (NSURL *)item 
            self.saveImage(imageURL) 
            [self.extensionContext completeRequestReturningItems:@[]   
                    completionHandler:nil]; 
           }]; 
    } 
} 

Bằng cách này, không có nhu cầu sử dụng dispatch_async khi làm việc với NSItemProvider là nhà cung cấp đã được thực hiện công việc của mình không đồng bộ.

Tôi đã viết một số blog post về việc này, nếu bạn muốn đọc thêm một chút về điều này.

EDIT

Bây giờ bạn có thể tải hình ảnh với các đường dẫn tập tin mà bạn vừa lấy. Điều này chỉ hoạt động trong phần mở rộng! Nếu bạn muốn truy cập hình ảnh từ ứng dụng có chứa, bạn không thể sử dụng URL của tệp mà bạn vừa truy xuất. Phần mở rộng chia sẻ lưu hình ảnh đã chọn trong một thư mục mà ứng dụng có chứa không thể truy cập được.

Để hiển thị hình ảnh cho ứng dụng có chứa, bạn phải kích hoạt App Groups trong ứng dụng có chứa tiện ích mở rộng. Sau đó tiện ích mở rộng lưu hình ảnh vào vùng chứa được chia sẻ và ứng dụng chứa có thể truy xuất hình ảnh đó:

func saveImage(url: NSURL) { 
    guard let imageData = NSData(contentsOfURL: url) else { return } 
    let selectedImage = UIImage(data: imageData) 

    let fileManager = NSFileManager.defaultManager() 
    if let sharedContainer = fileManager.containerURLForSecurityApplicationGroupIdentifier("YOUR_GROUP_IDENTIFIER") { 
     if let dirPath = sharedContainer.path { 
      let sharedImageFilePath = dirPath + "/image.png" 
      let binaryImageData = UIImagePNGRepresentation(selectedImage!) 
      binaryImageData?.writeToFile(sharedImageFilePath, atomically: true) 
      // send the sharedImageFilePath to the containing app 
     } 
    } 
} 
+0

cảm ơn @joren, có câu hỏi, tại sao URL (được tạo trong tiện ích chia sẻ) 'tệp: /// var/mobile/Media/DCIM/101APPLE/IMG_1705.JPG' không thể đánh giá trong ứng dụng máy chủ? –

+0

Bạn có nhận được thông báo lỗi không? Nó nói gì? – joern

+0

tôi vừa cố gắng lấy NSData từ URL. Dữ liệu retuning để Null –

Các vấn đề liên quan