しめ鯖日記

swift, iPhoneアプリ開発, ruby on rails等のTipsや入門記事書いてます

【Swift】TwitterKitでアプリから投稿してみる

iOS11からはSocial.frameworkによるツイートができなくなり、代わりにTwitterKitが推奨されています。
今回はTwitterKitを使って投稿する方法を試してみます。

iOS11でSocial.frameworkを使った時の挙動

下のようにテキストをツイートする実装をしました。

import UIKit
import Social

class ViewController: UIViewController {
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        
        let c = SLComposeViewController(forServiceType: SLServiceTypeTwitter)!
        c.setInitialText("ついーと")
        present(c, animated: true, completion: nil)
    }
}

上のコードを動かしたところ、無事に投稿する事ができました。
もしかすると、iOS10以前でTwitter連携したセッションが残っていたのかもしれません。

iOS11のシミュレータで上を試したら、画面に何も表示されませんでした。

TwitterKitで投稿する

準備

最初にTwitterのDeveloperページでアプリを登録します。

https://dev.twitter.com/index

アプリを作ったら、ConsumerKeyとConsumerSecretを取得します。
それを使って以下のようにTwitterKitを初期化します。

Twitter.sharedInstance().start(withConsumerKey: "XXXXX", consumerSecret: "XXXXX")

次にCocoaPodsでTwitterKitをインストールします。

target 'MyApp' do
  use_frameworks!

  pod 'TwitterKit'
end

続けてAppDelegateに下のようなメソッドを追加します。

func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
    if Twitter.sharedInstance().application(app, open: url, options: options) {
        return true
    }
    return true
}

最後にInfo.plistを修正します。
LSApplicationQueriesSchemesにTwitterのスキーマを登録してください。

f:id:llcc:20170916151728p:plain

Info.plistのURL typesにも値をセットします。
XXXXXのところは、自分のConsumerKeyを入れます。

f:id:llcc:20170916151743p:plain

ログイン周り

ログインしているかどうかはhasLoggedInUsersメソッドで確認します。

if Twitter.sharedInstance().sessionStore.hasLoggedInUsers() {
}

ログインはlogInメソッドで行う事ができます。

Twitter.sharedInstance().logIn { success, error in
    print(success)
    print(error)
}

ユーザーがTwitterアプリをインストールしてない場合は下のようなエラーになります。

Desktop applications only support the oauth_callback value 'oob'

投稿する

投稿処理は以下の通りです。
Social.framework同様に画像やURLの添付もできます。

let composer = TWTRComposer()
composer.setText("てきすと")
composer.show(from: self) { result in
    if (result == .done) {
        print("OK")
    } else {
        print("NG")
    }
}