Posted at

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に設定しないとアプリの選択もできないので注意。