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
相关产品推荐
相关产品推荐

