アプリ内でツイート、ダイレクトメッセージの送信、タイムラインの取得を
行うOSアプリケーションを開発しています。その際、ユーザをSwifterでOAuthを介してauthorizeする際に、SFSafatiViewController内でtwitter認証したのち、画面が閉じた途端にエラーが出てしまい認証ができません。エラーメッセージと該当箇所のコードおよびライブラリなどのバージョンは以下の通りです。LogInTwitterViewController.swift内の**LogInTwitter()中のauthorize()を除いてtwitter developerから取得したアクセストークンを用いたところ、テストツイートは作動したため(ただし認証画面は表示されずデベロッパ登録したアカウントからツイートされる)、おそらくauthorize( )**の使い方に何かしら問題があるのではないかと思っています。iOS開発は初心者なので破茶滅茶な質問をしているかもしれませんが、ご寛恕願います。
エラーメッセージ("Failed In Logging In"はエラー箇所の特定のため表示させています)
Failed In Logging In SwifterError(message: "Bad OAuth response received from server", kind: badOAuthResponse)
Swifter関連箇所のソースコード
LoggingInTwitter.swift
swift
1import Foundation 2import SwifteriOS 3 4public var isLoggedInTwitter = false 5 6public let swifter = Swifter(consumerKey: "コンシューマキー", consumerSecret: "コンシューマシークレット")
LogInTwitterViewController.swift
swift
1import UIKit 2import SafariServices 3import SwifteriOS 4 5 6 7class LoggingInTwitterViewController: UIViewController, SFSafariViewControllerDelegate { 8 9 override func viewDidLoad() { 10 super.viewDidLoad() 11 } 12 13 14 override func viewDidAppear(_ animated: Bool) { 15 super.viewDidAppear(animated) 16 // Do any additional setup after loading the view. 17 if(isLoggedInTwitter){ 18 self.performSegue(withIdentifier: "SegueFromStartingViewToHomeView", sender: nil) 19 } 20 else{ 21 self.LogInTwitter() 22 } 23 } 24 25func LogInTwitter(){ 26 swifter.authorize( 27 withCallback: URL(string:"app-アプリ名://")!, 28 presentingFrom: self, 29 success: { accessToken, response in 30 guard let accessToken = accessToken else { 31 return 32 } 33 let oAuthToken = accessToken.key 34 let secret = accessToken.secret 35 UserDefaults.standard.set(oAuthToken, forKey: "oAuthToken") 36 UserDefaults.standard.set(secret, forKey: "secret") 37 isLoggedInTwitter = true 38 }, failure: { error in 39 print("Failed In Logging In") 40 print(error) 41 }) 42 guard let oAuthToken = UserDefaults.standard.string(forKey: "oAuthToken") else { return } 43 guard let secret = UserDefaults.standard.string(forKey: "secret") else { return } 44 45 //認証情報の格納 46 let Sw_Token = Credential.OAuthAccessToken(key: oAuthToken, secret: secret) 47 let Sw_credential = Credential(accessToken: Sw_Token) 48 swifter.client.credential = Sw_credential 49 //テストツイート 50 swifter.postTweet(status: "This is test tweet") 51 52 // 53 self.performSegue(withIdentifier: "SegueFromStartingViewToHomeView", sender: nil) 54 } 55
AppDelegate.swift
import UIKit import CoreData import SwifteriOS import Firebase @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. FirebaseApp.configure() return true } func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool { Swifter.handleOpenURL(URL(string:"app-アプリ名://")!) return true } func applicationWillResignActive(_ application: UIApplication) { } func applicationDidEnterBackground(_ application: UIApplication) { } func applicationWillEnterForeground(_ application: UIApplication) { } func applicationDidBecomeActive(_ application: UIApplication) { } func applicationWillTerminate(_ application: UIApplication) { self.saveContext() } lazy var persistentContainer: NSPersistentContainer = { let container = NSPersistentContainer(name: "アプリ名") container.loadPersistentStores(completionHandler: { (storeDescription, error) in if let error = error as NSError? { fatalError("Unresolved error (error), (error.userInfo)") } }) return container }() func saveContext () { let context = persistentContainer.viewContext if context.hasChanges { do { try context.save() } catch { let nserror = error as NSError fatalError("Unresolved error (nserror), (nserror.userInfo)") } } } }
バージョン情報
Xcode 10.3 Swift 5 Swifter-2.2.2 CocoaPod 1.7.5

回答1件
あなたの回答
tips
プレビュー