Share Extensionで自分のアプリが表示されない問題を解決した件


App Extensionの中のShare Extensionという今開いてるページの記事やデータを共有できる便利な機能がありますね。
Qiita、ブログなどを参考しながら機能を実装しましたが、なぜか特定のアプリで自分のアプリが表示されない現象でハマってしまいました。

StackOverFlowでも優しい回答が見当たらなかったので自分で調べたことを共有します。同じ悩みでハマっている方にお役に立てれば良いかと思います。


## 0. 一般的な方法はこちら

最初参考にした記事はこちらです。
 Share Extensionでデータを共有する　方法については@KosukeQiita さんの[記事](https://qiita.com/KosukeQiita/items/994693da551a7101cc9c)を参考にしました。ありがとうございます。

これですぐ終わるかとおもったら。。。

## 1. できなかったこと

上記のリンクでやってみたらできるアプリとできないアプリがあることがあることに気づきました。
シェアアイコンを押したらシェア可能なアプリが表示されますが、**なぜか！**自分のアプリが表示されません。（私の場合はGoogle Driveアプリでした！）

<img width="310" alt="スクリーンショット 2018-06-18 11.32.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/32323/6151bfbb-797a-97ac-e380-71574348ca0d.png">


原因を調べると**StackOverFlowでも同じ悩みの方がいました！**
[StackOverFlowの質問](https://stackoverflow.com/questions/48339024/ios-google-drive-send-a-copy-not-showing-app-extension)


## 2. 表示されない原因は？

経験ベースでの話ですが、（もっと詳しい方はご指摘ください。）　0.のリンクのあり方は**.plistにシェアできる条件を定義する方式**で細かくシェア条件などを定義する場合はカスタム定義(SUBQUERY)が必要だそうです。

下記のアップルの公式ドキュネントでも説明が書いてあります。

https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/AppExtensionKeys.html#//apple_ref/doc/uid/TP40014212-SW36

下記のドキュメントの説明の通りカスタムSUBQUERYを作成すればできるみたいですね。

https://developer.apple.com/jp/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html


## 3. SUBQUERYでやってみる

一旦作成するのは面倒なのでなんでもできる「TRUEPREDICATE」でやってみると、表示されない自分のアプリが表示されました。これで**SUBQUERY**の方法に変えれば表示されるはず！
（この設定はリリースの時には使えないみたいなのでSUBQUERY作成できたら変更が必要ですね。）


検索キーワードをSUBQUERYに変えるとやはりStackOverFlowにありました。

[SUBQUREYで作成した先輩の質問]
https://stackoverflow.com/questions/35935804/ios-share-extension-with-custom-subquery-for-nsextensionactivationrule

SUBQUERYを作成するにはにはPredicate文法の知識が必要だそうです。
下記のリンクを参考してみましょう。

[Predicate文法について](https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/Predicates/Articles/pSyntax.html#//apple_ref/doc/uid/TP40001795)

ちなみに、フィイルタイプ一覧はこちらを参考してください。

[SUBQUERYで必要なフィイルタイプ一覧](https://developer.apple.com/library/archive/documentation/Miscellaneous/Reference/UTIRef/Articles/System-DeclaredUniformTypeIdentifiers.html)


私が作成したSUBQUERYです。これで解決しました。

**NSExtensionActivationRule**キーに作成したSUBQUERYを追加します。
![スクリーンショット 2018-06-18 12.03.53.png](https://qiita-image-store.s3.amazonaws.com/0/32323/ec595554-f646-8c73-e56b-1ef5d94ef3fb.png)

---
これじゃ、みづらいですね。ソースでみるとこんな感じです。
![スクリーンショット 2018-06-18 12.04.17.png](https://qiita-image-store.s3.amazonaws.com/0/32323/8a2f49a3-b35a-6607-50c5-22f95f7b8e69.png)


**NSExtensionActivationRule**に挿入したコード

```

SUBQUERY (
    extensionItems,
    $extensionItem,
    SUBQUERY (
        $extensionItem.attachments,
        $attachment,
        (
            ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.text"
            || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "com.adobe.pdf"
            || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.image"
            || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.presentation"
            || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.composite-content"
            || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.audio"
            || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.movie"
            || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.url"
            || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.data"
        )
        
    ).@count == $extensionItem.attachments.@count
).@count == 1

```

## 4. 終わり

記事を書くとリンクだれけになりました。何か間違いなどがあればぜひご指摘ください。