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

Twitter登录成功后无法唤起TWTRComposer分享框问题排查

问题分析与解决方案

你遇到的这个问题,核心原因是异步登录过程中局部的TWTRComposer实例被ARC自动释放了。

咱们拆解下你的代码逻辑:你先创建了一个局部的TWTRComposer对象,接着调用logInWithCompletion——这是个异步方法,用户完成登录的这段时间里,当前方法已经执行完毕,局部变量composer会被ARC自动回收。等登录成功的回调触发时,你调用的composer已经是个无效的野指针了,自然弹不出分享框。

解决方法有两种,按需选择即可:

方法1:把TWTRComposer改成ViewController的实例变量

在你的ViewController的.m文件延展(或头文件)里声明一个实例变量,让ViewController持有它的引用:

@interface YourViewController ()
@property (nonatomic, strong) TWTRComposer *twitterComposer;
@end

然后修改你的分享方法:

self.twitterComposer = [[TWTRComposer alloc] init];
// 此处配置self.twitterComposer,比如设置分享文本、图片、链接等

if ([[Twitter sharedInstance].sessionStore hasLoggedInUsers]) {
    [self.twitterComposer showFromViewController:self completion:nil];
} else {
    [[Twitter sharedInstance] logInWithCompletion:^(TWTRSession *session, NSError *error) {
        if (session) {
            [self.twitterComposer showFromViewController:self completion:nil];
        } else {
            // 错误处理,比如提示用户登录失败
        }
    }];
}

这样composer被ViewController持有,直到登录回调执行时都不会被释放,就能正常唤起分享框了。

方法2:在登录成功的回调里重新创建并配置TWTRComposer

如果不想额外维护实例变量,也可以在登录成功后重新创建分享器:

if ([[Twitter sharedInstance].sessionStore hasLoggedInUsers]) {
    TWTRComposer *composer = [[TWTRComposer alloc] init];
    // 配置composer
    [composer showFromViewController:self completion:nil];
} else {
    [[Twitter sharedInstance] logInWithCompletion:^(TWTRSession *session, NSError *error) {
        if (session) {
            TWTRComposer *composer = [[TWTRComposer alloc] init];
            // 这里要重复执行一遍composer的配置逻辑(和上面一致)
            [composer showFromViewController:self completion:nil];
        } else {
            // 错误处理
        }
    }];
}

这种方式适合配置逻辑简单的场景,缺点是要重复写配置代码。

额外优化建议

如果你的composer配置逻辑比较复杂,建议把配置抽成一个单独的方法,避免代码重复:

- (TWTRComposer *)configuredTwitterComposer {
    TWTRComposer *composer = [[TWTRComposer alloc] init];
    // 统一配置分享内容
    [composer setText:@"我正在分享iOS应用里的内容!"];
    [composer setURL:[NSURL URLWithString:@"https://your-app-url.com"]];
    return composer;
}

之后两种方法里都可以调用这个方法,直接拿到配置好的分享器。

内容的提问来源于stack exchange,提问作者Sjakelien

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:36:33