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

AppDelegate中Facebook/Google登录与Braintree支付的冲突解决求助

解决Google/Facebook登录与Braintree支付的URL回调冲突问题

我来帮你搞定这个冲突!你遇到的问题核心原因是:iOS 9及以后,系统会优先调用带options参数的application(_:open:options:)方法,而忽略旧版的不带options的application(_:open:sourceApplication:annotation:)方法。所以当你同时实现两个方法时,登录相关的回调逻辑根本没机会执行,自然就失效了。

正确的做法是把所有URL处理逻辑整合到同一个(新版的)回调方法里,同时兼容三个服务的需求。修改后的代码如下:

func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any]) -> Bool {
    // 先处理Braintree的支付回调
    if url.scheme?.localizedCaseInsensitiveCompare("com.release.braintreepayments") == .orderedSame {
        let braintreeHandled = BTAppSwitch.handleOpen(url, options: options)
        if braintreeHandled {
            return true
        }
    }
    
    // 再处理Google和Facebook的登录回调
    let facebookHandled = FBSDKApplicationDelegate.sharedInstance().application(
        app,
        open: url,
        sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication] as? String,
        annotation: options[UIApplicationOpenURLOptionsKey.annotation]
    )
    
    let googleHandled = GIDSignIn.sharedInstance().handle(
        url,
        sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication] as? String,
        annotation: options[UIApplicationOpenURLOptionsKey.annotation]
    )
    
    // 只要其中一个服务处理了URL,就返回true
    return facebookHandled || googleHandled
}

代码说明:

  • 优先级处理:先判断是否是Braintree的URL,处理成功就直接返回true,避免后续逻辑干扰
  • 参数适配:从options字典中提取sourceApplication和annotation参数,传给Google和Facebook的SDK(这两个参数在新版方法里不再直接作为方法参数,而是从options里获取)
  • 逻辑合并:把三个服务的处理结果做逻辑或,确保只要有一个服务处理了当前URL,就返回正确的结果

额外注意事项:

  • 确认你在Info.plist里已经正确配置了Google、Facebook和Braintree对应的URL Schemes
  • 检查三个SDK的版本是否为最新,避免因版本兼容问题导致的异常
  • 如果后续还有其他第三方服务需要处理URL回调,直接按照这个模式添加到方法里即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:37:46