開発しているアプリからテキストや画像を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に設定しないとアプリの選択もできないので注意。