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

Android中Facebook SDK集成:AccessToken刷新错误类型区分问题

区分Facebook Login刷新AccessToken时的认证异常与网络异常

我完全懂你现在的困扰——集成了Facebook Login后,刷新AccessToken时OnTokenRefreshFailed只返回带字符串描述的Exception,没有明确的错误码,根本没法直接区分是认证失效这类业务问题,还是网络波动这类环境问题,导致没法针对性做不同的处理逻辑。下面给你几个实用的解决方案:

方案1:解析Exception的消息字符串(临时兜底方案)

虽然官方没提供标准化错误码,但Facebook抛出的异常消息通常有固定的关键词特征,你可以通过匹配这些关键词来区分异常类型:

  • 网络相关异常:消息里往往包含「network」「connect」「timeout」「unreachable」这类关键词
  • 认证相关异常:消息里会出现「invalid」「expired」「permission」「unauthorized」「invalid token」这类关键词

举个C#的实现例子(你可以根据自己的开发平台调整语言):

private void HandleTokenRefreshFailure(Exception ex)
{
    var errorContent = ex.Message.ToLower();
    if (errorContent.Contains("network") || errorContent.Contains("timeout") || errorContent.Contains("connect"))
    {
        // 网络异常逻辑:提示用户检查网络,稍后重试
        ShowNetworkErrorTip();
    }
    else if (errorContent.Contains("invalid") || errorContent.Contains("expired") || errorContent.Contains("permission"))
    {
        // 认证异常逻辑:引导用户重新登录或授权
        NavigateToReLoginPage();
    }
    else
    {
        // 未知异常:统一提示或上报日志
        ShowGenericError();
    }
}

⚠️ 注意:这种方法依赖Facebook的错误消息格式,如果后续官方调整了消息文案,可能会失效,所以只能作为兜底方案。

方案2:捕获底层特定类型的异常(更可靠)

大多数平台的Facebook SDK在底层发起HTTP请求时,会抛出对应平台的网络类异常(比如Java的ConnectException/SocketTimeoutException,iOS的NSURLErrorDomain相关错误),你可以在调用刷新方法时,优先捕获这类特定异常,剩下的再归为认证相关异常:

以Android Java为例:

try {
    // 调用Facebook的刷新AccessToken方法
    AccessToken.refreshCurrentAccessTokenAsync(new AccessToken.AccessTokenRefreshCallback() {
        @Override
        public void OnTokenRefreshed(AccessToken newAccessToken) {
            // 刷新成功逻辑
        }

        @Override
        public void OnTokenRefreshFailed(Exception ex) {
            // 这里捕获的是认证相关的FacebookException
            handleAuthException(ex);
        }
    });
} catch (ConnectException | SocketTimeoutException e) {
    // 直接捕获底层网络连接/超时异常
    handleNetworkException(e);
}

这种方法的可靠性更高,因为它依赖的是异常类型而非字符串,你可以查看所用平台的Facebook SDK文档,确认哪些是专属的网络异常类。

方案3:提前检查网络状态(前置过滤)

在调用刷新AccessToken的方法前,先主动检查设备的网络连接状态,如果当前无网络,直接走网络异常处理逻辑,不用等到SDK抛出错误:

以Android Kotlin为例:

// 工具方法:检查网络是否可用
fun isNetworkAvailable(context: Context): Boolean {
    val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
    val activeNetwork = connectivityManager.activeNetwork ?: return false
    val networkCapabilities = connectivityManager.getNetworkCapabilities(activeNetwork) ?: return false
    return networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
}

// 调用刷新前先检查
if (!isNetworkAvailable(context)) {
    ShowNetworkErrorTip()
} else {
    AccessToken.refreshCurrentAccessTokenAsync(object : AccessToken.AccessTokenRefreshCallback {
        override fun OnTokenRefreshed(accessToken: AccessToken) {
            // 刷新成功处理
        }

        override fun OnTokenRefreshFailed(ex: Exception) {
            // 此时的异常大概率是认证相关
            NavigateToReLoginPage()
        }
    })
}

这个方法能过滤掉大部分因无网络导致的异常,减少后续异常处理的复杂度,但要注意:即使检查时网络可用,刷新过程中也可能出现网络中断,所以还是要结合方案2的异常捕获。

推荐你优先组合方案2+方案3,方案1作为最后的兜底,这样就能比较清晰地区分两种异常类型,实现不同的处理逻辑了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:35:12