2017-05-02 8 views
10

Mam problem z rozszerzeniem udziału w iOS mojej aplikacji. Mam następujący kod w rozszerzeniu udziału Info.plist.Rozszerzenie udziału w iOS nie wyświetla się/nie może odbierać adresu URL

<key>NSExtension</key> 
<dict> 
    <key>NSExtensionAttributes</key> 
    <dict> 
     <key>NSExtensionActivationRule</key> 
     <dict> 
      <key>NSExtensionActivationSupportsWebPageWithMaxCount</key> 
      <integer>1</integer> 
      <key>NSExtensionActivationSupportsWebURLWithMaxCount</key> 
      <integer>1</integer> 
     </dict> 
    </dict> 
    <key>NSExtensionMainStoryboard</key> 
    <string>MainInterface</string> 
    <key>NSExtensionPointIdentifier</key> 
    <string>com.apple.share-services</string> 
</dict> 

Głównym problemem jest to, że rozszerzenie nie pojawia się w Google Chrome, NYTimes, WSJ i wielu innych aplikacjach. Wszystkie powinny zawierać stronę internetową lub adres internetowy.

Czytałem gdzieś, że muszę dodać następujące do dyktando NSExtensionActivationRule.

<key>NSExtensionActivationSupportsText</key> 
<true/> 

Jeśli dodam, rozszerzenie udziału pojawi się w wymienionych powyżej aplikacjach, ale po prostu zwraca ciąg do mojego rozszerzenia. Na przykład, jeśli przejdę do wersji apple.com w przeglądarce Google Chrome i używam mojego rozszerzenia, udostępniam tylko Apple jako ciąg do mojego rozszerzenia, którego moja aplikacja tak naprawdę nie obsługuje. Powinien zawierać pewien typ adresu URL lub coś podobnego. A w aplikacji NYTimes wystarczy wysłać nagłówek artykułu na rozszerzenie.

Rozszerzenie działa idealnie w Safari. Po prostu nie niektóre aplikacje innych firm.

Poniżej znajduje się główny kod do otrzymywania adresu URL w pliku SWIFT mojego rozszerzenia.

if let item = extensionContext?.inputItems.first as? NSExtensionItem { 
    if let itemProvider = item.attachments?.first as? NSItemProvider { 
     if itemProvider.hasItemConformingToTypeIdentifier("public.url") { 
      itemProvider.loadItem(forTypeIdentifier: "public.url", options: nil, completionHandler: { (url, error) -> Void in 
       if let shareURL = url as? NSURL { 
        print (shareURL.absoluteString!) 

Stamtąd obsługuję adres URL, jak moja aplikacja powinna.

Kiedy dodałem opcję NSExtensionActivationSupportsText Zmieniłem kod powyżej nieznacznie od public.url do public.text wraz z kilkoma innymi przetestować go i to właśnie powrocie Super nieprzydatnych sznurki.

Wiem, że można uzyskać adres URL z tych aplikacji, ponieważ nawet w NYTimes ma opcję Google Chrome, który wyzywająco potrzebuje URL, a nie tylko nagłówek artykułu. Wszelkie pomysły, jak zdobyć ten adres URL?

Odpowiedz

6

Proponuję użyć to:

<key>NSExtension</key> 
<dict> 
    <key>NSExtensionAttributes</key> 
    <dict> 
     <key>NSExtensionActivationRule</key> 
     <string> 
    SUBQUERY (
     extensionItems, 
     $extensionItem, 
     SUBQUERY (
      $extensionItem.attachments, 
      $attachment, 
      ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.url" 
    )[email protected] == 1 
)[email protected] == 1 
     </string> 
    </dict> 
    <key>NSExtensionMainStoryboard</key> 
    <string>MainInterface</string> 
    <key>NSExtensionPointIdentifier</key> 
    <string>com.apple.share-services</string> 
</dict> 

Biorąc pod uwagę kod, aby uzyskać załączników, która jest sprawdzana tylko pierwsze inputItems i pierwszy załącznik, trzeba mieć pętlę foreach w obu przypadkach i sprawdzić wszystkie im.

+0

Otrzymanie następującego komunikatu o błędzie z przykładem kodu: '(null): nie można przeanalizować zawartości 'Share Extension/Info.plist': Nie można odczytać danych, ponieważ nie ma poprawnego formatu. '. Byłoby również pomocne, gdybyś mógł podać więcej szczegółów i wyjaśnić, dlaczego ten kod może zadziałać. Nie jestem pewien, czy to działa, ponieważ daje ten komunikat o błędzie. –

+0

@CharlieFish to jest kopiowane z mojego projektu z Xamarin na Windows. Możliwe, że problemy z wierszami w systemie Windows powodują ten problem, więc spróbuj skopiować wiersz po wierszu, ale powinno działać, ponieważ ostateczna wersja poprawnie kompiluje się na Macu z Xcode. Prawdopodobnie zrobiłeś coś nie tak z kopiowaniem i wklejaniem. –

+0

@CharlieFish biorąc pod uwagę wyjaśnienie - Chrome po prostu nie ustawia danych w tym formacie. W przypadku Chrome musisz dodać jeszcze jeden format danych (według mnie jest to zwykły tekst). Ale nawet to nie zadziała dla wszystkich aplikacji, np. Apple News. To oznacza, że ​​aplikacja działa tak długo, jak długo istnieje tylko jeden załącznik z adresem URL. –

Powiązane problemy