BLOG

ブログ

2022/04/25 プログラミング

【Swift】UIActivityViewControllerでリマインダー除外でつまった話

この記事を書いた人 K.Y

個人的な開発でアプリの共有方法を調べた時に、タイトルの状況が起こりました。

アプリでのテキストの共有方法や、共有先アプリの表示の除外方法は多くの人が
記事にまとめてくれているのですが、少し詰まってしまったのでメモとしてここに残しておきます。

環境

  • Macbook Pro(13インチ)
  • macOS バージョン12.1(Monterey)
  • Xcode 13.1
  • Swift 5.5.1
  • iPad(第7世代) 14.3

UIActivityViewController

ダイアログの表示の部分では詰まっていないので使い方については簡単に書いておきます。

共有したいアイテム(テキストやURL、画像など)をSNSやメールで共有したい時に使用することができ、使い方は以下の通りです。

 /// インスタンス化
 let sampleVc = UIActivityViewController(activityItems: items, applicationActivities: nil)
        
 /// 表示
 self.present(sampleVc, animated: true, completion: nil)

itemsには共有したいものを配列で用意する必要があり、表示を行うと、
見たことあるようなダイアログが表示されました。

※今回はテキストを共有しようとしています。

参考:UIActivitiyViewController

共有Activityの欄で項目を除外したい時

AirDropやメッセージを表示したくない!という時は、以下のような記述を追加します。

// 先ほどインスタンス化したコントローラーのexcludedActivityTypesを指定する。
sampleVc.excludedActivityTypes = [
   .addToReadingList,
   .airDrop,
   .assignToContact,
   .copyToPasteboard,
   .mail,
  .......(省略)
]

この記述で、AirDropやメールなどの項目を除外して表示しないようにできます。

上記は一部のみですが、ここで指定できるアクティビティタイプの一覧は
ドキュメントにまとめてあるので、必要に応じて選択することができます。

参考: UIActivity.ActivityType

ドキュメントにはメモとリマインダーのアクティビティタイプがない

UIActivity.ActivityTypeの、アクティビティの定数一覧を見るとわかるのですが、
ドキュメントだとメモとリマインダーが存在せず、ドキュメントに載っている一覧全てを記述しても以下のような表示になってしまいます。

こちらだと困るので、どうしたものかと思っていたら、既に対応済みの方が多くいましたので、そちらを参考に以下の記述を追加します。

sampleVc.excludedActivityTypes = [
   .addToReadingList,
   .airDrop,
   .assignToContact,
   .copyToPasteboard,
   .mail,
  ......., // 途中省略
   UIActivity.ActivityType(rawValue: "com.apple.reminders.RemindersEditorExtension"), // この部分
   UIActivity.ActivityType(rawValue: "com.apple.mobilenotes.SharingExtension")  // この部分
]

rawValueで指定した値で新しいアクティビティタイプのインスタンスを作成できます。

UIActivityViewControllerでリマインダーやメモを非表示にする方法

UIActivityViewControllerからNotesアプリとRemindersアプリを除外する方法は?

iOSおよびiPadOSのネイティブAppのバンドルID

この状態で見てみる

上記を記述した段階で、現在の状態を見てみます。

あれれ?

メモはきちんと非表示になりましたが、リマインダーが残ってしまいました。

リマインダーも非表示にするには

参考にさせてもらった記事だとこの記述で間違いなさそうなのですが、
「何かOSのバージョンで書き方に違いがあるのかな?」とか考えつつ色々試してたら、
以下の記述で消すことができました。

// 元の記述
// UIActivity.ActivityType(rawValue: "com.apple.reminders.RemindersEditorExtension")

// RemindersEditorExtension を sharingextension に変更。
UIActivity.ActivityType(rawValue: "com.apple.reminders.sharingextension")  

注意するのは、メモと同じようにバンドルIDの後ろにSharingExtensionをつけても非表示にならないこと。

リマインダーの場合はsharingextensionのように、各単語の頭文字を小文字にしないと動きませんでした。

消えた!

終わりに

今回はたまたま色々試していたら非表示にできたので解決できましたが、
rawValue値に指定するべき文字列とか、調べてもあまりその辺について出てこなかったので、ドキュメントに書いてあると親切だなぁと思いました。



株式会社ウイングドアは福岡のシステム開発会社です。
現在、私達と一緒に"楽しく仕事が出来る仲間"として、新卒・中途採用を絶賛募集しています!
ウイングドアの仲間達となら楽しく仕事できるかも?と興味をもった方、
お気軽にお問い合わせ下さい!

アーカイブ