今回は、facebookやtwitter、LineのSDKを使わない && UIActivity(共有ボタン)を使わないで、Twitter・Facebook・Line・Mailでシェアできるような場面を想定します。
ライブラリのインストールがないのでコピペでできます。
しかしながら、普段はUIActivityを使っているかと思いますが...笑
完成形
-
line
- urlスキームでLINEアプリの遷移しますが、複数ユーザーにノートとメッセージに投稿することができます。
- シェアしたいURLとOGP画像がmessageにpostされます(みにくいですが...)
-
twitter
- actionsheetがアプリ上で開きそのまま投稿できます
-
facebook
- twitterと同様にactionsheetがアプリ上で開きそのまま投稿できます
-
mail
- URLスキームでメールアプリに遷移し特定のユーザーにメールを送信することができます。
UIActivityはこれ
- 今回はこれは使いません。
Socialをインポートする
.swift
import UIKit
import Social
SNSを列挙しておく
.swift
enum SNS: Int {
case line = 1
case twitter = 2
case facebook = 3
case mail = 4
}
シェアさせる
- lineとmailは、URLスキームです
- twitterとfacebookはSocialの
SLComposeViewController
を使用しています。
.swift
private func openURL(url: URL?) {
guard let url = url else { return }
if UIApplication.shared.canOpenURL(url) {
if #available(iOS 10.0, *) {
UIApplication.shared.open(url, options: [:], completionHandler: nil)
} else {
UIApplication.shared.openURL(url)
}
}
}
private func shareSNS(sns: SNS) {
let shareURL = "https://hogehogehogeho.com"
switch sns {
case .facebook:
guard let composeViewController: SLComposeViewController = SLComposeViewController(forServiceType: SLServiceTypeFacebook) else { return }
composeViewController.setInitialText(shareURL)
self.present(composeViewController, animated: true, completion: nil)
case .line:
guard let scheme: String = "line://msg/text/\(shareURL)".addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else { return }
self.openURL(url: URL(string: scheme))
case .mail:
guard let string = "mailto:test@test.com?body=\(shareURL)".addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed) else { return }
self.openURL(url: URL(string: string))
case .twitter:
guard let vc = SLComposeViewController(forServiceType:SLServiceTypeTwitter) else { return }
vc.setInitialText(shareURL)
self.present(vc, animated: true, completion: nil)
}
}
まとめ
- 少し強引な方法かもしれませんが、目的とした
UIActivityViewController
を使わずにシェアをすることができました