SwiftでアプリからTwitterにGif投稿

アプリで撮影した動画をgifに変換し、twitterに投稿してみた。

TwitterGifをサポートしてるけど、既存のSLComposeViewControllerや、UIActivityViewControllergifをサポートしていないので少し面倒でした。

動画をgifに変換

Regiftというライブラリを使ったら簡単にできた

github.com

twitterに投稿

まずはActionSheetで全アカウントを表示し、選択されたaccountを返します

import Accounts

func selectAccount() -> AnyObject {
            let account = ACAccountStore()
            let accountType = account.accountTypeWithAccountTypeIdentifier(ACAccountTypeIdentifierTwitter)
            account.requestAccessToAccountsWithType(accountType, options: nil, completion: { (success: Bool, error: NSError!) -> Void in
                if success {
                    guard let accounts = account.accountsWithAccountType(accountType) else { return }
                    if !accounts.isEmpty {
                        let actionSheet = UIAlertController(title: "Choose Account", message: "", preferredStyle: .ActionSheet)
                        for account in accounts {
                            guard let name = account.username else { return }
                            let action = UIAlertAction(title: name, style: .Default, handler: { (action: UIAlertAction) in
                                return account
                            })
                            actionSheet.addAction(action)
                        }
                        self.presentViewController(actionSheet, animated: true, completion: nil)
                    }
                }
            })
        }
    }

選択されたアカウント、メッセージ、gifのNSDataでポスト。 メッセージはDictionaryで["status", ツイート内容]

func post(account: ACAccount, message: [String: String!], data: NSData) {
        let url = NSURL(string: "https://api.twitter.com/1.1/statuses/update_with_media.json")
        let postRequest = SLRequest(forServiceType: SLServiceTypeTwitter, requestMethod: .POST, URL: url, parameters: message)
        postRequest.account = account
        postRequest.addMultipartData(data, withName: "media", type: "image/gif", filename: "image.gif")
        postRequest.performRequestWithHandler({ (responseData: NSData!, urlResponse: NSHTTPURLResponse!, error: NSError!) -> Void in
            print(urlResponse)
        })
    }