環境
- Xcode9.1
- Swift 4.0.2
- TwitterKit 3.2.1
問題
上記環境でTwitterに投稿をするコードを書いた。雑にコードの様子を書くと、Twitter.sharedInstance().logIn
をしてログインが成功した後で、
guard let session = Twitter.sharedInstance().sessionStore.session() else { return } let apiClient = TWTRAPIClient(userID: session.userID) let request = apiClient.urlRequest( withMethod: "POST", url: "https://api.twitter.com/1.1/statuses/update.json", parameters: [ "status": status ], error: nil ) apiClient.sendTwitterRequest(request) { response, _, error in if let error = error { print(error) } }
とする感じ。特に難しいことはしていないのでシミュレータでは難なく動いたが、なぜか実機だと "Request failed: unauthorized (401)" と error
が返されて投稿できない。なんでやねん。
解決方法
Twitterのアプリ管理画面( Twitter Application Management ) で対象のアプリを開いて、
- Access Levelを "Read and write" から "Read only" に変えて "Update Settings"ボタンを押す
- Access Levelを "Read only" から "Read and write" に変えて "Update Settings"ボタンを押す
とすると直る。
どうやらアプリを登録してすぐ表示されている"Read and write"というAccess Levelは正しくないらしい。実際にこの解決方法を試す前に、自分のアカウントで連携したアプリ一覧を見てみると、
となっていて、『読取専用』と書いてある。つらい。
感想
どうやらこの挙動はTwitterアプリや連携を開発したことがある人の間では、よく知られているらしい。知らんがな。
iOS11からSocialKitが使えなくなり、TwitterKitを使うことになったアプリが多くあると思うが、この罠に引っかからないことを切に願う。つらい。