You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:48:03