Xcode9中requestAccessToAccounts异常,Twitter权限申请无弹窗求助
问题分析与解决方案
你遇到的核心问题确实是**requestAccessToAccounts(with:options:)针对Twitter账号的功能在iOS 11及以上系统中已经被完全弃用**,这就是为什么你在iOS 11.2.1设备和Xcode9模拟器上看不到权限弹窗,直接返回"Access to Twitter was not granted."的原因。
具体原因
在iOS 10及更早版本中,Apple允许通过ACAccountStore集成系统级的Twitter账号管理,但从iOS 11开始,Apple移除了对Twitter(以及Vimeo等第三方服务)的系统账号集成支持:
- 系统设置里不再有Twitter账号的添加入口
ACAccountStore调用requestAccessToAccounts(with:)请求Twitter权限时,不会弹出任何授权弹窗,直接回调granted = false- 调用
accounts(with:)也永远返回空数组
这就导致你的代码在iOS 11+环境下,进入else分支后,请求权限直接失败,触发对应的错误回调。
解决方案
你需要替换掉基于ACAccountStore的Twitter账号认证逻辑,改用Twitter官方提供的认证方案,推荐两种方式:
1. 使用Twitter官方SDK(Twitter Developer Kit)
Twitter提供了官方SDK来处理登录、权限申请和API请求,步骤大致如下:
- 移除代码中所有
ACAccountStore和SLRequest相关的逻辑 - 在项目中集成Twitter SDK(可通过CocoaPods或Swift Package Manager)
- 使用SDK的登录组件发起授权请求,获取用户的认证凭证
- 通过SDK提供的API客户端来发送推文获取请求
示例代码片段(简化版):
import TwitterKit func requestTwitterTweets(handler: @escaping (Any?) -> Void) { TWTRTwitter.sharedInstance().logIn { session, error in guard let session = session else { self.log("登录失败: \(error?.localizedDescription ?? "未知错误")") handler("Access to Twitter was not granted.") return } // 使用session中的凭证发起API请求 let client = TWTRAPIClient(with: session) let request = client.urlRequest( withMethod: "GET", url: "https://api.twitter.com/1.1/statuses/user_timeline.json", parameters: ["count": "20"], error: nil ) client.sendTwitterRequest(request) { response, data, connectionError in guard let data = data, connectionError == nil else { self.log("请求失败: \(connectionError?.localizedDescription ?? "无响应")") handler("No response from Twitter.") return } // 解析JSON响应 do { let tweets = try JSONSerialization.jsonObject(with: data, options: []) handler(tweets) } catch { self.log("解析失败: \(error.localizedDescription)") handler("Couldn't parse JSON response.") } } } }
2. 手动实现OAuth 1.0a认证
如果不想依赖第三方SDK,可以直接实现Twitter的OAuth 1.0a认证流程:
- 向Twitter的认证服务器请求临时凭证(request token)
- 引导用户打开Safari进行授权
- 获取授权后的凭证(access token)
- 使用access token签名API请求
这种方式需要处理更多细节(比如签名生成、跳转回调),适合对认证流程有定制需求的场景。
额外注意事项
- 确保你在Twitter开发者平台上创建的应用已经正确配置了回调URL(尤其是使用SDK或OAuth流程时)
- iOS 14及以上版本需要在
Info.plist中添加LSApplicationQueriesSchemes,包含twitter和twitterauth,以支持跳转至Twitter App或网页进行授权
内容的提问来源于stack exchange,提问作者Sente
相关产品推荐
相关产品推荐

