2015-02-04 17 views
8

Mam następujący kod do odczytu w przekazanych adresach URL. Jestem testowania to z app Pocket i chociaż hasItemConformingToTypeIdentifier wraca TAK dla kUTTypeURL, próbuje załadować go zwraca błąd zamiast stwierdzającUdostępnij rozszerzenie loadItemForTypeIdentifier zwraca błąd dla NSURL

„klasy wartość nieoczekiwane.”

. Jeśli spróbuję załadować go jako element i debugować, stwierdzam, że przekazany obiekt jest w rzeczywistości tylko tytułem strony, a nie adresem URL. Jak czytać adres 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

Czy to działa poprawnie, jeśli przetestujesz go za pomocą Safari zamiast Pocket? –

+1

Tak, działa tak samo w przypadku wszystkich innych aplikacji, które udostępniają łącza/adresy URL itp. W jakiś sposób mają problemy z Pocket. Naprawdę dziwne jest to, jak przechodzi pierwszy warunek "if", ale w drugim nie jest w stanie pobrać prawidłowego adresu URL, a zamiast tego zwraca tytuł strony jako zwykły tekst. Próbowałem nawet różnych innych typów danych, takich jak NSData itp., Ale wszystkie zwracają zero lub tytuł strony. Nie widzę, jak inne aplikacje, takie jak Wunderlist, są w stanie prawidłowo odczytać adres URL z Pocket. – strangetimes

+0

@strangetimes - Czy kiedykolwiek znalazłeś rozwiązanie tego problemu? Właśnie wpadłem na ten sam problem i waliłem głową w klawisze, próbując dowiedzieć się, w jaki sposób inne aplikacje pobierają adres URL z Pocket. – jrtilson

Odpowiedz

0

Spróbuj

__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; 
      } 
     }]; 
     } 
    } 
    } 

A teraz, jeśli chcesz wziąć URL bieżącej strony używać
NSString *output = [pageURL absolutestring];

wyjścia - będzie adres URL.

+0

Nie ma szczęścia z Pocket.app – strangetimes

+0

Spójrz, a następnie spróbuj zmienić '(NSString *) kUTTypeURL' na' @ "public.url" ' –

0

Natknąłem się teraz na ten problem. Aplikacja Pocket wydaje się być jedyną aplikacją, która pokazuje ten problem. Dziwne jest to, że istnieją aplikacje, które mogą uzyskać adres URL z postaci Pocket. Jak na przykład Firefox na iOS. Firefox jest Open Source, więc sprawdziłem jego kod (na Github) i odkryłem, że robi to dokładnie tak samo, aby uzyskać adres URL, który jest tutaj pokazany. Jedyna różnica polega na tym, że Firefox jest napisany w języku Swift, a mój kod (i ten tutaj zamieszczony) to Cel C. Zastanawiam się, czy aplikacja Pocket robi coś dziwnego, co uruchamia błąd w interfejsie API Objective C tylko w systemie iOS , więc nie ma to wpływu na aplikacje Swift? Nie mam jeszcze doświadczenia Swift, więc nie sprawdziłem, czy przejście na Swifta "rozwiąże" to.

Fakt, że metoda "hasItemConformingToTypeIdentifier:" określa, że ​​istnieje adres URL, ale "loadItemForTypeIdentifier:" nie może go dostarczyć, jest wyraźnym wskazaniem, że sam iOS ma tutaj błąd (przynajmniej w interfejsie API Objective C). Ale wciąż musi być coś specjalnego App kieszonkowy robi wywołać ten błąd, ponieważ w przeciwnym razie nie będzie działać we wszystkich innych Apps

1

Jeśli czytasz dokumentacji.

loadItemForTypeIdentifier(_:options:completionHandler:) 

ty” Zobacz:

Informacje o typie pierwszego parametru bloku zakończeniaHandler blok należy ustawić na klasę oczekiwanego typu:. Na przykład podczas żądania danych tekstowych można ustawić typ pierwszego parametru na NSString lub NSAttributedString. Dostawca pozycji może przeprowadzić konwersję danych w prostym typie do określonej klasy, np. Z NSURL na NSData lub NSFileWrapper, lub z NSData na UIImage (w iOS) lub NSImage (w OS X). Jeśli dane nie mogły być odtworzone lub zostały zmodulowane do określonej klasy, błąd jest przekazywany do bloków zakończenia .

Może możesz eksperymentować przez przymuszanie do różnych typów?