ややめも

アプリ作りたい女子大学院生のめも💁‍♀️

技術メモ
日記
つくったもの
就活の話

iOS13のUIActivityのサムネイル画像をカスタマイズしたい

画像のシェア・標準写真アプリへの保存機能を実装したいと思い、UIActivityを実装しました。

実はこのUIActivityの表示がiOS13から変更されていて、上にヘッダーのようなものが表示されるようになりました。
f:id:yaya-w-1026:20191015233428p:plain

iPhoneの標準写真アプリで画像をシェアしようとすると、選択している画像がヘッダーに表示されています。

しかし、今までのようにUIActivityを実装すると、
写真のようにサムネイル部分にはアプリのアイコンのみが表示されるようになっていました。
f:id:yaya-w-1026:20191015234020p:plain:w320


そこで、この記事ではiPhoneの標準写真アプリのような共有画面の実装方法について書きます。

解決策

ViewControllerにUIActivityItemSourceプロトコルを適用し、activityViewControllerLinkMetadataメソッドを実装します。
activityViewControllerLinkMetadata: - UIActivityItemSource | Apple Developer Documentation
このactivityViewControllerLinkMetadataで共有画面のヘッダーに表示するデータを管理します。

実装

class SampleViewController: UIViewController {
     var imageURL: URL?

//    中略

// シェアボタンをタップして発火させる関数
    private func shareImage() {
        photoAuthSettingAlert() // 写真の書き込み・読み取り権限をチェック

        imageURL = 画像のurlを取得する処理
        
       // もともとUIImageを送っていた
        let activityItems = [self]
        let activityVC = UIActivityViewController(activityItems: activityItems, applicationActivities: nil)
            
        present(activityVC, animated: true, completion: nil)
    }
}

extension SampleViewController: UIActivityItemSource {
    func activityViewControllerPlaceholderItem(_ activityViewController: UIActivityViewController) -> Any {
        return UIImage()
    }
    
    func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivity.ActivityType?) -> Any? {
        return imageURL
    }
    
    @available(iOS 13.0, *)
    func activityViewControllerLinkMetadata(_ activityViewController: UIActivityViewController) -> LPLinkMetadata? {
        let metadata = LPLinkMetadata()
        metadata.title = "写真を共有"
        metadata.url = imageURL
        metadata.imageProvider = NSItemProvider(contentsOf: imageURL) // 渡す写真
        metadata.iconProvider = NSItemProvider(contentsOf: imageURL) // サムネイルに表示する写真
        return metadata
    }
}

photoAuthSettingAlert()は、写真の読み取り・書き込み権限がないとUIActivityの共有画面に「画像を保存」という項目が表示されなくなるため、処理を追加しています。
内容としてはPHPhotoLibrary.authorizationStatus()で権限を取得して、deniedとnotDeterminedのときはアラートを出して設定画面に飛ばすようにしています。

また、activityItemsにはUIActivityItemSourceを実装したオブジェクトをセットします。このプロトコルを実装しておくと、 そのオブジェクト自体がUIActivityに渡すためのデータとなります。
この場合はSampleViewControllerをいれるので、activityItems=[self]になります。


ヘッダー部分に画像とタイトルを表示させることができました🐶
f:id:yaya-w-1026:20191016002139p:plain:w320

アプリの紹介

この機能を実装したアプリはこちらの「フォトメモ」というアプリです。

写真メモ帳 フォトメモ

写真メモ帳 フォトメモ

  • Satoshi Kobayashi
  • 仕事効率化
  • 無料

タグで写真を保存できるのでこんな感じでレシピのスクショ管理や、レシートのメモなどに使えます。


この機能を追加してアップデートしたので、ぜひインストールしてください!