質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
OAuth

OAuth(Open Authorization)は、APIを通して保護されたリソース(サードパーティのアプリケーション)へアクセスする為のオープンプロトコルです。

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

893閲覧

SwifterでユーザをAuthorizeできない

chizu-daisuki

総合スコア10

OAuth

OAuth(Open Authorization)は、APIを通して保護されたリソース(サードパーティのアプリケーション)へアクセスする為のオープンプロトコルです。

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2019/08/06 00:08

アプリ内でツイート、ダイレクトメッセージの送信、タイムラインの取得を
行う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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MasakiHori

2019/08/08 12:44

Twitter Developers で Callback URL(app-アプリ名://) を登録していますか?
chizu-daisuki

2019/08/08 14:03

ご指摘ありがとうございます。Twitter Developer には"app-アプリ名"で登録してあります。ほかのスキーム(twitterkit-<consumer key>)などで試したりもしましたが、結果は変わりませんでした。
chizu-daisuki

2019/08/08 14:06

現在は代替にFirebaseAuthからアクセストークン・シークレットを取ってきてからSwifter.clientに紐づける形で認証を行えるようにはしたのですが、FirebaseAuthで一つのデバイスから複数のツイッターアカウントにログインすることが難しそうなので、Swifterが使えればと思っている状態です。
MasakiHori

2019/08/08 14:57

SwifterにDemoアプリがあるようですがそれは動きますか?
chizu-daisuki

2019/08/08 21:27

ありがとうございます。実の所Web上からSwifterのDemoアプリについての情報を見つけられず、よってまだ試した事はありません。(お恥ずかしい事ですが、アプリ開発やAPIの使用は生まれて初めてなのでDemoアプリがどういうものか分かりません。)お忙しい中恐縮ですが、Demoアプリに関する情報の書いてあるページのURLなど教えていただけると幸いです。
MasakiHori

2019/08/08 23:49

Swifterのプロジェクトに含まれています carthage使用ならあなたのプロジェクトのフォルダの下に Charthage/Checkout というフォルダが出来ててその中にSwifterがチェックアウトされてます
chizu-daisuki

2019/08/09 02:25

ありがとうございます。試してみて追って報告いたします。
chizu-daisuki

2019/08/09 04:04

度々すみません。今CarthageからSwifterをインストールし直してみたのですが、Demo iOS内にxcodeプロジェクトがなく、どこからデモプロジェクトを動かせるのでしょうか?Xcodeに慣れていないので質問ばかりになってしまい申し訳ありません。
MasakiHori

2019/08/09 08:26

Swifter.xcodeprojを開けいてウインドウ左上のスキームにSwifterDemoiOS があるはずですのでそれを選択
chizu-daisuki

2019/08/09 08:35

度々本当にありがとうございます!やってみます!
chizu-daisuki

2019/08/10 04:26

Demoを試してみたところ正常に動作しました。Demoプロジェクトのコードに倣ってコード内のコールバックURLを`app-アプリ名://success`にしたところ正常にログインできました。度々質問に答えて頂きありがとうございました。
guest

回答1

0

自己解決

MasakiHoriさんから頂いた指摘およびStackOverFlowで頂いた回答に依り、以下のコードにしたところ動作しました。
LoginTwitterViewController

Swift

1import UIKit 2import SafariServices 3import SwifteriOS 4import Firebase 5import FirebaseAuth 6 7 8class LoggingInTwitterViewController: UIViewController, SFSafariViewControllerDelegate { 9 10 override func viewDidLoad() { 11 super.viewDidLoad() 12 } 13 14 15 override func viewDidAppear(_ animated: Bool) { 16 super.viewDidAppear(animated) 17 if(isLoggedInTwitter){ 18 self.performSegue(withIdentifier: "SegueFromStartingViewToHomeView", sender: nil) 19 } else{ self.LogInTwitter()} 20 } 21 22 func LogInTwitter(){ 23 swifter.authorize( 24 withCallback: URL(string:"app-アプリ名://success")!, 25 presentingFrom: self, 26 success: { accessToken, response in 27 guard let accessToken = accessToken else { 28 return 29 } 30 let oAuthToken = accessToken.key 31 let secret = accessToken.secret 32 UserDefaults.standard.set(oAuthToken, forKey: "oAuthToken") 33 UserDefaults.standard.set(secret, forKey: "secret") 34 }, failure: { error in 35 print(error) 36 }) 37 38 guard let oAuthToken = UserDefaults.standard.string(forKey: "oAuthToken") else { return } 39 guard let secret = UserDefaults.standard.string(forKey: "secret") else { return } 40 let Sw_Token = Credential.OAuthAccessToken(key: oAuthToken, secret: secret) 41 let Sw_credential = Credential(accessToken: Sw_Token) 42 swifter.client.credential = Sw_credential 43 44 swifter.postTweet(status: "This is test tweet") 45 46 self.performSegue(withIdentifier: "SegueFromStartingViewToHomeView", sender: nil) 47 } 48 49}

投稿2019/08/10 04:41

編集2019/08/10 04:44
chizu-daisuki

総合スコア10

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chizu-daisuki

2019/08/10 05:09

上記のコードで問題を発見しました。解決次第訂正します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問