Swifter를 내 앱에 통합하는 방법
사용한 버전
1. 내 앱에 CocoaPod에서 Swifter를 설치합니다.
$ pod init
실행 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을 설정합니다.
Swifter는 OAuth에서 API를 인증하기 때문에 일시적으로 브라우저를 엽니다.
열린 곳에서 앱으로 돌아올 수 있도록 Custome URL Scheme을 설정합니다.
<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를 입력합니다
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.swiftimport 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가 설정되지 않았기 때문입니다.
다음과 같이 설정합니다.
Reference
이 문제에 관하여(Swifter를 내 앱에 통합하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/noby111/items/532f3d806b19ab46433a
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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()
}
}
}
dyld: Library not loaded: ... Reason: image not found로 나오는 경우
Embedded Binaries에 SwifteriOS가 설정되지 않았기 때문입니다.
다음과 같이 설정합니다.
Reference
이 문제에 관하여(Swifter를 내 앱에 통합하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/noby111/items/532f3d806b19ab46433a텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)