iOS
SNS
Swift

UIActivityViewControllerでSNSアプリを判別する

開発しているアプリからテキストや画像をSNSにシェアをする時に使うUIActivityViewControllerについて書きます。

UIActivityViewControllerの使い方

// StringとUIImageを配列で設定
let activityItems: [Any] = ["シェア", image]

let activityVc = UIActivityViewController(activityItems: activityItems, applicationActivities: nil)
present(activityVc, animated: true, completion: {

})

のようになります。こういうのです。

しかしFacebookはテキストのみやテキスト+画像を受け付けません。

UIActivityItemSourceを使う

例えば、、
Facebookの場合は画像のみシェア、Twitterの場合テキストのみシェアしたい。
そういう時はUIActivityItemSourceを使います。

class ActivityItemSorce:NSObject, UIActivityItemSource {
    var messsage: String!
    var image: UIImage!

    init(messsage: String, image: UIImage) {
        self.messsage = messsage
        self.image = image
    }

    // デフォルトのアイテム
    func activityViewControllerPlaceholderItem(_ activityViewController: UIActivityViewController) -> Any {
        return messsage
    }

    // アプリ選択時に呼ばれる
    func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivityType) -> Any? {

        switch activityType {
        case .postToFacebook:
            return image
        case .postToTwitter:
            return "Twitter"
        default:
            return messsage
        }
    }
}

UIActivityViewControllerのactivityItemsの設定は以下にようになります。

let activityItems: [Any] = [ActivityItemSorce(messsage: "シェア", image: image!)]

let activityVc = UIActivityViewController(activityItems: activityItems, applicationActivities: nil)
present(activityVc, animated: true, completion: {

})

InstagramやLINEの場合はどうする?

activityType.rawValueを使います。

func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivityType) -> Any? {
    switch activityType.rawValue {
    case "com.burbn.instagram.shareextension":
        return "Instagram"
    case "jp.naver.line.Share":
        return "LINE"
    default:
        return messsage
    }
}

Instagramは画像のみをactivityItemに設定しないとアプリの選択もできないので注意。