Swifter를 내 앱에 통합하는 방법

@ k-boy 님의 기사 을 참고로 Swifter를 자신의 앱에 짜넣어 보았습니다만, 여러가지 집착했으므로 비잊을 위해 순서를 남겨 둡니다.

사용한 버전


  • Xcode : 10.3
  • Swifter : 1.7.0

  • 1. 내 앱에 CocoaPod에서 Swifter를 설치합니다.


  • 내 앱 디렉터리로 이동하여 $ pod init 실행
  • Podfile이 만들어지므로 pod 'Swifter', :git => 'https://github.com/mattdonnelly/Swifter.git'를 추가하십시오
  • $ pod install 실행
  • # Uncomment the next line to define a global platform for your project
    # platform :ios, '9.0'
    
    target 'MyTweetTool' do
      # Comment the next line if you don't want to use dynamic frameworks
      use_frameworks!
    
      # Pods for MyTweetTool
      pod 'Swifter', :git => 'https://github.com/mattdonnelly/Swifter.git'
      pod 'SwiftGifOrigin', '~> 1.7.0'
    end
    

    2. Twitter Developers에서 자신의 앱 등록



    Twitter Developers에 자신의 앱을 등록합니다.
    세세한 절차는 생략하지만 @ tdkn 님의 기사 가 참고가 됩니다.

    등록이 완료되고 최종적으로 아래와 같이 자신의 Consumer API keys를 확인할 수 있으면 OK입니다.



    3. Custom URL Scheme 설정



    Swifter는 OAuth에서 API를 인증하기 때문에 일시적으로 브라우저를 엽니다.
    열린 곳에서 앱으로 돌아올 수 있도록 Custome URL Scheme을 설정합니다.
  • Info.plist에 자신의 CFBundleURLTypes 정의 추가
  •     <key>CFBundleURLTypes</key>
        <array>
            <dict>
                <key>CFBundleURLName</key>
                <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
                <key>CFBundleURLSchemes</key>
                <array>
                    <string>swifter-{Consumer API key}</string>
                </array>
            </dict>
        </array>
    

    ※CFBundleURLSchemes에 swifter-{Consumer API key}라고 있습니다만, {Consumer API key}에는 이전의 Twitter Developers의 API key를 입력합니다
  • AppDelegate.swift에서 application:openURL:options:을 재정의
  • func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
            return Swifter.handleOpenURL(url, callbackURL: URL(string: "swifter-{Consumer API key}://")!)
    }
    

    ※Swifter의 코드를 호출하므로 import SwifteriOS 가 필요합니다

    4. Swifter를 사용하여 트윗을 게시



    자신이 만든 것은 텍스트 입력과 게시 버튼만의 간단한 UI 앱으로 화면 구성은 아래와 같습니다.



    설명보다 실제 코드를 소개합니다.

    ViewController.swift
    import UIKit
    import SwifteriOS
    import SafariServices
    
    class ViewController: UIViewController, SFSafariViewControllerDelegate {
    
        @IBOutlet weak var tweetMsgArea: UITextView!
        private let appStatus = AppStatus()
    
        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view.
        }
    
        @IBAction func tweetPushed(_ sender: Any) {
            tweet()
        }
    
        func tweet() {
            let TWITTER_CONSUMER_KEY = "{Consumer API key}"
            let TWITTER_CONSUMER_SECRET = "{Consumer API secret key}"
    
            // load from UserDefaults
            let tokenKey = self.appStatus.twitterTokenKey
            let tokenSecret = self.appStatus.twitterTokenSecret
    
            if tokenKey == nil || tokenSecret == nil {
                let swifter = Swifter(consumerKey: TWITTER_CONSUMER_KEY, consumerSecret: TWITTER_CONSUMER_SECRET)
    
                swifter.authorize(
                    withCallback: URL(string: "swifter-{Consumer API key}://")!,
                    presentingFrom: self,
                    success: { accessToken, response in
                        print(response)
                        guard let accessToken = accessToken else { return }
                        self.appStatus.twitterTokenKey = accessToken.key
                        self.appStatus.twitterTokenSecret = accessToken.secret
                        self.tweet()
                }, failure: { error in
                    print(error)
                })
    
            } else {
                let swifter = Swifter(consumerKey: TWITTER_CONSUMER_KEY, consumerSecret: TWITTER_CONSUMER_SECRET, oauthToken: tokenKey!, oauthTokenSecret: tokenSecret!)
    
                swifter.postTweet(status: tweetMsgArea.text, success: { response in
                    print(response)
                }, failure: { error in
                    print(error)
                })
            }
        }
    }
    
    class AppStatus {
        var userdefault = UserDefaults.init(suiteName: "app_status")!
    
        var twitterTokenKey : String? {
            get {
                if let token : String = userdefault["token_key"] {
                    return token
                } else {
                    return nil
                }
            }
    
            set {
                userdefault["token_key"] = newValue
            }
        }
    
        var twitterTokenSecret : String? {
            get {
                if let secret : String = userdefault["token_secret"] {
                    return secret
                } else {
                    return nil
                }
            }
    
            set {
                userdefault["token_secret"] = newValue
            }
        }
    }
    
    extension UserDefaults {
        subscript<T: Any>(key: String) -> T? {
            get {
                if let value = object(forKey: key) {
                    return value as? T
                } else {
                    return nil
                }
            }
            set(_newValue) {
                if let newValue = _newValue {
                    set(newValue, forKey: key)
                } else {
                    removeObject(forKey: key)
                }
                synchronize()
            }
        }
    }
    

    포인트로서는 UserDefaults로부터 액세스 토큰을 취득해, 취득할 수 없었던 경우는 Swifter.authorize() 를 호출해 액세스 토큰을 취득합니다.
    이미 획득한 경우 그대로 Swifter.postTweet() 로 입력한 내용을 Twitter 합니다.

    5. 트러블 슛



    dyld: Library not loaded: ... Reason: image not found로 나오는 경우



    Embedded Binaries에 SwifteriOS가 설정되지 않았기 때문입니다.
    다음과 같이 설정합니다.

    좋은 웹페이지 즐겨찾기