Help us understand the problem. What is going on with this article?

【Swift】コピペでできる!SDKを使わずにSNS(Twitter/Facebook/Line/Mail)でシェアさせる方法まとめ

More than 3 years have passed since last update.

今回は、facebookやtwitter、LineのSDKを使わない && UIActivity(共有ボタン)を使わないで、Twitter・Facebook・Line・Mailでシェアできるような場面を想定します。

ライブラリのインストールがないのでコピペでできます。
しかしながら、普段はUIActivityを使っているかと思いますが...笑

完成形

  • line
    • urlスキームでLINEアプリの遷移しますが、複数ユーザーにノートとメッセージに投稿することができます。
    • シェアしたいURLとOGP画像がmessageにpostされます(みにくいですが...)

IMG_9119.PNG

  • twitter
    • actionsheetがアプリ上で開きそのまま投稿できます

IMG_9116.PNG

  • facebook
    • twitterと同様にactionsheetがアプリ上で開きそのまま投稿できます

IMG_9117.PNG

  • mail
    • URLスキームでメールアプリに遷移し特定のユーザーにメールを送信することができます。

IMG_9118.PNG

UIActivityはこれ

  • 今回はこれは使いません。

68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f343930302f64326333623935662d373963632d643861662d376164642d3439623238633962656234632e706e67.png

Socialをインポートする

import UIKit
import Social

SNSを列挙しておく

enum SNS: Int {
    case line = 1
    case twitter = 2
    case facebook = 3
    case mail = 4
}

シェアさせる

  • lineとmailは、URLスキームです
  • twitterとfacebookはSocialのSLComposeViewControllerを使用しています。
    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を使わずにシェアをすることができました
okamu_
no plan inc. CEO 元フリーランスエンジニア/ iOS / サーバーサイド / 共同創業 / 福岡出身 https://qiita.com/organizations/noplan-inc
https://twitter.com/okamu_ro
noplan-inc
no plan株式会社は、Webサイト、iOSアプリ、AndroidアプリなどWebサービス全般の開発から運用をワンストップで行っています。
https://noplan-inc.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away