MILLEN BOX

音楽好きの元組み込みソフトエンジニアによるプログラミング(主にiOSアプリ開発)の勉強の記録

Social.frameworkを使ってシェア機能付ける [swift2.0] [Social.framework] [SLComposeViewController]

こんにちは。
また改めて投稿しますが、今朝起きたら先日サブミットしたアプリがリリースされていました!
良かったら遊んでみて下さい!

今日はアプリにシェア機能を付けてみたいと思います。
以下は成果物の画面ですが、Tweet機能とFacebookのシェア機能を実装しています。 これ本当にびっくりするくらいに簡単です。
f:id:anthrgrnwrld:20151020073905g:plain

Githubはこちら。

github.com

参考にしたページのURLは以下です。

▶︎[Swift 1.1] なにはともあれTwitterとFacebookに何かしらシェアする機能を作る - Qiita

▶︎iOS プログラマー's メモ: SLComposeViewControllerを使用したTwitter, Facebook投稿

自分ポイント1

準備としてSocial.frameworkを入れておいて下さい。
f:id:anthrgrnwrld:20151020074920p:plain

ViewControllerの頭でのimportも忘れずに!

import UIKit
import Social

自分ポイント2

シェア機能のために、 SLComposeViewController というクラスを使用します。
TwitterFacebookのそれぞれ用にSLComposeViewControllerクラスをインスタンス化し、それにツイート内容を付加していく という流れになります。

今回はTwitterボタン、Facebookボタンそれぞれを押すと

  1. 文章
  2. URL
  3. 画像

の3つをシェアすることにします。
TwitterFacebookでやることは全然変わりません! 最初にインスタンス化した SLComposeViewController の指定するタイプが
SLServiceTypeTwitterSLServiceTypeFacebook
だけです!
画像についてはスクリーンショットをシェアします。
スクリーンショットについては以下を参照のこと。

▶︎スクリーンショットをUIImageに保存する方法 [swift2.0] [UIImage] [UIView] [スクリーンショット] - MILLEN BOX

コードは以下です。

//
//  ViewController.swift
//  socialTest
//
//  Created by Masaki Horimoto on 2015/10/19.
//  Copyright © 2015年 Masaki Horimoto. All rights reserved.
//

import UIKit
import Social

class ViewController: UIViewController {
    
    var capturedImage : UIImage?

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        
        capturedImage = GetImage() as UIImage     // キャプチャ画像を取得.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    /**
    スクリーンキャプチャ用関数
    
    :returns: UIImage
    */
    func GetImage() -> UIImage {
        
        // キャプチャする範囲を取得.
        let rect = self.view.bounds
        
        // ビットマップ画像のcontextを作成.
        UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0)
        let context: CGContextRef = UIGraphicsGetCurrentContext()!
        
        // 対象のview内の描画をcontextに複写する.
        self.view.layer.renderInContext(context)
        
        // 現在のcontextのビットマップをUIImageとして取得.
        let capturedImage : UIImage = UIGraphicsGetImageFromCurrentImageContext()
        
        // contextを閉じる.
        UIGraphicsEndImageContext()
        
        return capturedImage
    }

    @IBAction func pressTwitter(sender: AnyObject) {
        
        //Tweet用のViewを作成する
        let twitterPostView:SLComposeViewController = SLComposeViewController(forServiceType: SLServiceTypeTwitter)!
        
        let tweetDescription1:String = "hogehoge"
        let tweetDescription2:String = "Masaki Horimotoの開発したアプリを宜しくお願いします!!"
        let tweetURL:NSURL = NSURL(string: "https://itunes.apple.com/jp/developer/masaki-horimoto/id1018825942")!

        //Tweetする文章を設定する
        twitterPostView.setInitialText("\(tweetDescription1)\n\(tweetDescription2)")

        //Tweetに添付するURLを設定する
        twitterPostView.addURL(tweetURL)
        
        //起動時にキャプチャしたスクリーンショットを添付する
        twitterPostView.addImage(capturedImage)

        //上述の内容を反映したTweet画面を表示する
        self.presentViewController(twitterPostView, animated: true, completion: nil)
    }

    @IBAction func pressFacebook(sender: AnyObject) {

        //Facebookシェア用のViewを作成する
        let facebookPostView:SLComposeViewController = SLComposeViewController(forServiceType: SLServiceTypeFacebook)!
        
        let facebookDescription1:String = "hogehoge"
        let facebookDescription2:String = "Masaki Horimotoの開発したアプリを宜しくお願いします!!"
        let facebookURL:NSURL = NSURL(string: "https://itunes.apple.com/us/app/shootspeed-get-high-score!/id1029309778?l=ja&ls=1&mt=8")!
        
        //シェアする文章を設定する
        facebookPostView.setInitialText("\(facebookDescription1)\n\(facebookDescription2)")

        //シェアに添付するURLを設定する
        facebookPostView.addURL(facebookURL)
        
        //起動時にキャプチャしたスクリーンショットを添付する
        facebookPostView.addImage(capturedImage)

        //上述の内容を反映したfacebookシェア画面を表示する
        self.presentViewController(facebookPostView, animated: true, completion: nil)
        
    }

}

これで完成。
これだけ!

自分ポイント3

ここで注意点。
Facebookのシェアですが、端末にインストールされているFacebookのバージョンによって、シェアされる内容が削除されるみたいです。

参考リンク▶︎iOS - Social.frameworkを使用してFacebook投稿するときのFacebookアプリによる仕様変更まとめ - Qiita

シミュレーターの動きをみる限り、Facebookアプリをインストールしてなければ思った通り動くみたいですがどうなんでしょうか。(面倒くさくて実機では確認していません。すいません。)

上記のような問題はあるにせよ、SLComposeViewController はめちゃくちゃ簡単なんで是非試してほしいと思います。