文字っぽいの。

文字を書いています。写真も混ざります。

iOSのTwitterKitで投稿しようとすると、401が返ってきて投稿できない問題。

環境

  • 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は正しくないらしい。実際にこの解決方法を試す前に、自分のアカウントで連携したアプリ一覧を見てみると、

f:id:FromAtom:20171109125450p:plain

となっていて、『読取専用』と書いてある。つらい。

感想

どうやらこの挙動はTwitterアプリや連携を開発したことがある人の間では、よく知られているらしい。知らんがな。

iOS11からSocialKitが使えなくなり、TwitterKitを使うことになったアプリが多くあると思うが、この罠に引っかからないことを切に願う。つらい。