1. 共有には2種類ある
自分で実装するまであまり考えたことがなかったのだが、共有には「Clipbox+」と「"Clipbox+"で開く」のように、「で開く」が付かない物と付く物の2種類がある。
そして動きが違う。
赤丸は編集モードのようなものが開くが、青丸はアプリ(ここではClipbox+)に遷移する。
2. Share Extensionを使った方法
赤丸はShare Extensionを実装すると出てくるようになる。
こちらのページが詳しい。
何をしないといけないかというと、Share Extension機能をもった別のBundle ID(例えばClipbox.shareとか)を持つ、新しいアプリを作らないといけない。
この新しく作ったアプリのinfo.plist内NSExtensionActivationRuleで、サポートしている機能を記述することにより、iOSに自分が持つ機能を宣言することになる。
結果、共有ボタンを押した時にiOSが、候補(Suggestions)に、新しく作ったアプリのCFBundleDisplayNameを表示できるようになる。
候補から新しく作ったアプリを押下すると、新しく作ったアプリがキックされ、標準で用意されているPostを押下すると、didSelectPost()でURL名、ファイル名、文字列等が獲得できる。
獲得したものを元のアプリに渡せば一件落着のはずなのだが、実は、新しく作ったアプリと、元のアプリは別のものなので、直接データのやりとりはできない。
この障壁を回避するために、App Groupsと言われる共有空間が用意されている。
新しく作ったアプリと、元のアプリで同じApp Groupsを定義して使う。
Xcode上で実施すればうまくいくはずなのだが、うまく自動生成できない場合は、Apple Developper Program「Certificates, Identifiers & Profiles」のページで手動登録するしかない。
作成した共有空間にデータを書き出す方法としては、ググると、plistでの方法が、
let userDefaults = UserDefaults(suiteName: "group.XXX.XXX")
userDefaults.set(item, forKey: "text")
userDefaults.synchronize()
紹介されているが、後々のことを考えると、ファイルやりとりの方が便利と思う。
let dst = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.XXX.XXX")?.appendingPathComponent("test.txt")
item.write(to: dst, atomically: true, encoding: .utf8)
3. Share Extension :アプリをキックできない
iOSの仕様変更で今はできない。昔はできていただけに情けない(こちらに詳しい)。
でもAdobeはできてるんだよね。何か方法はあるのだろう。
4. Document Content Type UTIを使った方法
表題の「〜で開く」「〜にコピー」の話だが、Windowsで言うところの拡張子の関連付けみたいなものだろうか、UTIで設定すればいいだけ。
Share Extensionに比べると相当楽。
ただ以下の点でつまづいた。
・public.textを指定しても、標準アプリの「メモ」からは呼び出せない。
・「〜にコピー」にしたいのに、「〜で開く」になってしまう。
それぞれの処方箋は以下のとおり。
【処方箋】標準アプリの「メモ」はそもそもUTIが謎。あきらめてShare Extensionの方法で対応した。
・「〜にコピー」にしたいのに、「〜で開く」になってしまう。
それぞれの処方箋は以下のとおり。
【処方箋】標準アプリの「メモ」はそもそもUTIが謎。あきらめてShare Extensionの方法で対応した。
【処方箋】「〜で開く」は、LSSupportsOpeningDocumentsInPlaceを削除すると「〜にコピー」にできる。(*1
iOSは、LSSupportsOpeningDocumentsInPlace=NOが必要。(*2
MacOSは、LSSupportsOpeningDocumentsInPlaceは削除。(*3
*1 以前は、ApplicationDelegateで受け取るために、LSSupportsOpeningDocumentsInPlaceが必要だったが、今は常にSceneDelegateが呼ばれる仕様に変わったようなので、削除することができる。
*2 iOSアプリをAppStoreにあげる時、LSSupportsOpeningDocumentsInPlaceがないと、Document Typeを指定してるくせにと怒られる。
*3 一方でMacOSアプリでは、LSSupportsOpeningDocumentsInPlace=NOは許されないので、削除するしかない。
5. ShareExtention:public.textだけどpublic-file-urlもサポートすべき例
public.text系のアプリから、青丸の「〜でコピー」を選択すればうまくいくのだが、試しに赤丸のShare Extensionも試してみると、UTTypeText(public-text)が空っぽだった。
しかし、kUTTypeFileURL(public-file-url)には、ファイルパスが入っていたので、どうやらこれを使えということらしい。
標準の「メッセージ」や「メール」は、当然のことながら、うまく実装できていた(下図)。
0 件のコメント:
コメントを投稿