2015-02-04 14 views
8

Tôi có mã sau để đọc trong URL được truyền. Tôi đang thử nghiệm này với ứng dụng Pocket và mặc dù hasItemConformingToTypeIdentifier đang trở lại YES cho kUTTypeURL, cố gắng để tải nó trong lợi nhuận một lỗi thay vì nêuChia sẻ Tải tiện ích mở rộngItemForTypeIdentifier trả về lỗi cho NSURL

"class giá trị bất ngờ."

. Nếu tôi cố tải nó dưới dạng một mục id<NSSecureCoding> và gỡ lỗi, tôi thấy rằng đối tượng được truyền vào thực sự chỉ là tiêu đề của trang chứ không phải là URL. Làm cách nào để đọc URL?

NSURL *pageURL = nil; 
    for (NSExtensionItem *item in self.extensionContext.inputItems) { 
    for (NSItemProvider *itemProvider in item.attachments) { 
    if ([itemProvider hasItemConformingToTypeIdentifier: (NSString*) kUTTypeURL]) { 
     [itemProvider loadItemForTypeIdentifier:(NSString*) kUTTypeURL options:nil completionHandler:^(id <NSSecureCoding> urlItem, NSError *error) { 
      if ([((NSObject*)urlItem) isKindOfClass: [NSURL class]]) { 
       pageURL = [((NSURL*)urlItem) absoluteString]; 
      } 
     }]; 
     } 
    } 
    } 
+1

Tính năng này có hoạt động đúng không nếu bạn thử nghiệm bằng Safari thay vì Pocket? –

+1

Có, thực tế nó hoạt động với tất cả các ứng dụng khác chia sẻ liên kết/URL, v.v. Bằng cách nào đó có vấn đề với Pocket. Điều thực sự kỳ lạ là làm thế nào nó vượt qua điều kiện 'if' đầu tiên nhưng sau đó trong điều kiện thứ hai nó không lấy được một URL hợp lệ, thay vì trả lại tiêu đề của trang dưới dạng văn bản thuần túy. Tôi thậm chí đã thử nhiều loại dữ liệu khác như NSData v.v., nhưng tất cả đều trả về nil hoặc tiêu đề của trang. Tôi không thấy các ứng dụng khác, như Wunderlist, có thể đọc URL từ Pocket đúng cách như thế nào. – strangetimes

+0

@strangetimes - Bạn đã bao giờ tìm thấy giải pháp cho điều này chưa? Tôi đã chỉ chạy vào vấn đề này chính xác cùng và đã đập đầu của tôi chống lại bàn phím của tôi cố gắng tìm ra cách các ứng dụng khác đang nhận được URL ra khỏi Pocket. – jrtilson

Trả lời

0

Hãy thử điều này

__block NSURL *pageURL = nil; 
    for (NSExtensionItem *item in self.extensionContext.inputItems) { 
    for (NSItemProvider *itemProvider in item.attachments) { 
    if ([itemProvider hasItemConformingToTypeIdentifier: (NSString*) kUTTypeURL]) { 
     [itemProvider loadItemForTypeIdentifier:(NSString*) kUTTypeURL options:nil completionHandler:^(NSURL *urlItem, NSError *error) { 
      if (urlItem) { 
       pageURL = urlItem; 
      } 
     }]; 
     } 
    } 
    } 

Và bây giờ nếu bạn muốn lấy URL của trang web hiện tại của bạn sử dụng
NSString *output = [pageURL absolutestring];

Output - sẽ là URL của bạn.

+0

Không may mắn với Pocket.app – strangetimes

+0

Sau đó, hãy thử thay đổi '(NSString *) kUTTypeURL' thành' @ "public.url" ' –

0

Tôi đã tình cờ gặp vấn đề này ngay bây giờ. Ứng dụng Pocket dường như là Ứng dụng duy nhất hiển thị vấn đề này. Điều kỳ lạ là có những ứng dụng có thể lấy mẫu URL Pocket. Ví dụ như Firefox cho iOS. Firefox là mã nguồn mở vì vậy tôi đã xem mã của nó (tại Github) và thấy rằng nó đang làm chính xác như vậy để có được URL được hiển thị ở đây. Điểm khác biệt duy nhất là Firefox được viết bằng Swift, và mã của tôi (và cái được đăng ở đây) là Objective C. Vì vậy, tôi tự hỏi liệu Pocket App có làm điều gì đó kỳ lạ đang kích hoạt một lỗi trong API mục tiêu C của iOS , vì vậy Swift Apps không bị ảnh hưởng? Tôi chưa có bất kỳ trải nghiệm Swift nào, vì vậy tôi chưa kiểm tra xem chuyển sang Swift có giải quyết được vấn đề này không.

Thực tế là phương thức "hasItemConformingToTypeIdentifier:" cho biết có sẵn URL nhưng „loadItemForTypeIdentifier:" không thể phân phối, là dấu hiệu rõ ràng rằng bản thân iOS có lỗi ở đây (ít nhất là trong API mục tiêu C .) Nhưng vẫn phải có cái gì đặc biệt Pocket App đang làm để kích hoạt lỗi này, bởi vì nếu không điều này sẽ không làm việc trong tất cả các ứng dụng khác

1

Nếu bạn đọc các tài liệu hướng dẫn cho:.

loadItemForTypeIdentifier(_:options:completionHandler:) 

bạn' sẽ thấy rằng:

Thông tin loại cho tham số đầu tiên của quá trình hoàn thành của bạnHandler khối phải được đặt thành loại của loại mong đợi. Ví dụ: khi yêu cầu dữ liệu văn bản, bạn có thể đặt loại tham số đầu tiên thành NSString hoặc NSAttributedString. Nhà cung cấp mục có thể thực hiện chuyển đổi loại đơn giản của dữ liệu cho lớp bạn chỉ định, chẳng hạn như từ NSURL sang NSData hoặc NSFileWrapper hoặc từ NSData đến UIImage (trong iOS) hoặc NSImage (trong OS X). Nếu dữ liệu không thể được truy xuất hoặc bị ép buộc đến lớp được chỉ định, lỗi được chuyển đến khối hoàn thành .

Có thể bạn có thể thử nghiệm bằng cách ép buộc với các loại khác nhau?

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