Расширение Share iOS не отображает/не может получать URL-адрес

У меня возникла проблема с расширением Share iOS для моего приложения. У меня есть следующий код в расширении Share Info.plist.

<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>

Основная проблема заключается в том, что расширение не отображается в Google Chrome, NYTimes, WSJ и многих других приложениях. Все из них должны содержать веб-страницу или URL-адрес веб-сайта.

Я где-то читал, что мне нужно добавить следующее к типу NSExtensionActivationRule.

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

Если я добавлю, расширение расширений появится в приложениях, перечисленных выше, но просто вернет строку для моего расширения. Например, если я перехожу к apple.com в Google Chrome и использую расширение своего общего доступа, оно просто предоставляет Apple в качестве строки моего расширения, которое мое приложение действительно не поддерживает. Он должен предоставлять некоторый тип URL-адреса или что-то в этом роде. И в приложении NYTimes он просто отправит заголовок статьи на расширение.

Расширение отлично работает в Safari. Просто не определенные сторонние приложения.

Ниже приведен основной код для получения URL-адреса в быстром файле моего расширения.

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!)

Оттуда я обрабатываю URL как мое приложение.

Когда я добавил параметр NSExtensionActivationSupportsText, я немного изменил код выше от public.url до public.text, а также несколько других вещей, чтобы проверить его, и он просто возвращал супер бесполезные строки.

Я знаю, что это возможно, чтобы получить URL-адрес из этих приложений, потому что даже в NYTimes у него есть опция для Google Chrome, на который явно нужен URL-адрес, а не только заголовок статьи. Любые идеи о том, как получить этот URL?

Ответ 1

Я предлагаю вам использовать это:

    <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>

Учитывая ваш код для получения вложений, вы проверяете только первые элементы ввода и первое вложение, вам нужно иметь цикл foreach в обоих случаях и проверять их все.