Facebook 登录在 iOS 11 上显示额外的确认弹出窗口
Facebook login shows an additional confirmation popup on iOS 11
我已经使用 facebook SDK for swift 通过 facebook 实现了登录。它在 iOS 10.3 上按预期工作,但在 iOS 11 上显示和额外的弹出窗口,要求用户允许通过 facebook.com.
登录
这会在登录过程中增加一个步骤,从而减慢登录过程。有没有办法将应用配置为默认允许此操作,从而消除烦人的弹出窗口?
我正在使用通过 cocoa pods.
添加的 facebook-sdk-swift 0.2.0(FBSDK 版本为 4.26.0)
info.plist
中的配置:
<key>FacebookAppID</key>
<string>xxxxxxxxxxxxxxx</string>
<key>FacebookDisplayName</key>
<string>XXXXX</string>
<key>LSApplicationQueriesSchemes</key>
<array>
<string>fbapi</string>
<string>fb-messenger-api</string>
<string>fbauth2</string>
<string>fbshareextension</string>
</array>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
<key>NSExceptionDomains</key>
<dict>
<key>akamaihd.net</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
<false/>
</dict>
<key>facebook.com</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
<false/>
</dict>
<key>fbcdn.net</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
<false/>
</dict>
</dict>
</dict>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLName</key>
<string>facebook</string>
<key>CFBundleURLSchemes</key>
<array>
<string>fbxxxxxxxxxxxxxxx</string>
</array>
</dict>
</array>
AppDelegate
中的代码:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
return SDKApplicationDelegate.shared.application(application, didFinishLaunchingWithOptions: launchOptions)
}
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
return SDKApplicationDelegate.shared.application(app, open: url, options: options)
}
LoginController
在处理程序中有一个自定义登录按钮:
let loginManager = LoginManager()
loginManager.loginBehavior = .native
loginManager.logIn([ .publicProfile, .userFriends, .email, .custom("user_location"), .custom("user_education_history"), .custom("user_work_history") ], viewController: self) { loginResult in
}
我从头开始创建了一个应用程序来测试它,在 GitHub 上分享。还是一样。
好的,经过几次无用的实验后,我找到了一种方法来实现我的客户想要的。上述行为是更新版本的 FBSDK 的结果。一旦我从 FBSDK 4.26.0 降级到 4.24.0(Swift SDK 版本无关紧要),弹出窗口停止显示。因此,如果您遇到同样的问题,并且您的客户(或您)不想要此弹出窗口,这可能也是适合您的解决方案。
我不认为 facebook 的人这样做是偶然的,这个弹出窗口可以允许一些新的 iOS 11 功能。但是,我无法区分任何真正的新功能——我只注意到较新的版本没有让您选择是使用本机应用程序还是 safari 登录,而是直接进入 safari 登录。但因为这也是我的客户的要求,所以对我来说,选择是很自然的。
该消息是 SFAuthenticationSession
用来询问用户访问 safari 的权限的标准消息(摘自 docs):
If an application uses SFAuthenticationSession, users are prompted by a dialog to give explicit consent, allowing the application to access the website's data in Safari.
更新:
显然,Safari 使用 "CFBundleName" 属性 作为此对话框的显示名称。这通常设置为 ${PRODUCT_NAME} ,它等于应用程序包标识符的最后一部分,但您可以将其更改为您喜欢的任何内容。当然,建议将其设置为您的应用程序的实际显示名称。
这与 iOS 11.x 更新有关,Facebook SDK 0.3.0 正在使用 SFAuthenticationSession
这会导致发出明确同意的警报,允许应用程序在 Safari 中访问网站的数据。
在 iOS 10.x 上试过这个,没有警报!
如果你想摆脱弹出窗口,你应该将 Facebook SDK 降级到 0.2.0 ,并且由于 Facebook swift SDK 仍然依赖于 Objective C SDK 你应该强制将这些也降级到版本 4.22.1
降级前:
pod 'FacebookCore', '~> 0.3.0'
pod 'FacebookLogin', '~> 0.3.0'
pod 'FacebookShare', '~> 0.3.0'
降级后:
pod 'FacebookCore', '~> 0.2.0'
pod 'FacebookLogin', '~> 0.2.0'
pod 'FacebookShare', '~> 0.2.0'
pod 'FBSDKCoreKit', '~> 4.22.1'
pod 'FBSDKLoginKit', '~> 4.22.1'
pod 'FBSDKShareKit', '~> 4.22.1'
我正在使用 FacebookLogin 0.5.0
将目标构建设置下的 Product Name
更改为所需的文本有效。
此外,在我的 plist Bundle display name
和 Bundle name
上有 $(PRODUCT_NAME)
我已经使用 facebook SDK for swift 通过 facebook 实现了登录。它在 iOS 10.3 上按预期工作,但在 iOS 11 上显示和额外的弹出窗口,要求用户允许通过 facebook.com.
登录这会在登录过程中增加一个步骤,从而减慢登录过程。有没有办法将应用配置为默认允许此操作,从而消除烦人的弹出窗口?
我正在使用通过 cocoa pods.
添加的 facebook-sdk-swift 0.2.0(FBSDK 版本为 4.26.0)info.plist
中的配置:
<key>FacebookAppID</key>
<string>xxxxxxxxxxxxxxx</string>
<key>FacebookDisplayName</key>
<string>XXXXX</string>
<key>LSApplicationQueriesSchemes</key>
<array>
<string>fbapi</string>
<string>fb-messenger-api</string>
<string>fbauth2</string>
<string>fbshareextension</string>
</array>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
<key>NSExceptionDomains</key>
<dict>
<key>akamaihd.net</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
<false/>
</dict>
<key>facebook.com</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
<false/>
</dict>
<key>fbcdn.net</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
<false/>
</dict>
</dict>
</dict>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLName</key>
<string>facebook</string>
<key>CFBundleURLSchemes</key>
<array>
<string>fbxxxxxxxxxxxxxxx</string>
</array>
</dict>
</array>
AppDelegate
中的代码:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
return SDKApplicationDelegate.shared.application(application, didFinishLaunchingWithOptions: launchOptions)
}
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
return SDKApplicationDelegate.shared.application(app, open: url, options: options)
}
LoginController
在处理程序中有一个自定义登录按钮:
let loginManager = LoginManager()
loginManager.loginBehavior = .native
loginManager.logIn([ .publicProfile, .userFriends, .email, .custom("user_location"), .custom("user_education_history"), .custom("user_work_history") ], viewController: self) { loginResult in
}
我从头开始创建了一个应用程序来测试它,在 GitHub 上分享。还是一样。
好的,经过几次无用的实验后,我找到了一种方法来实现我的客户想要的。上述行为是更新版本的 FBSDK 的结果。一旦我从 FBSDK 4.26.0 降级到 4.24.0(Swift SDK 版本无关紧要),弹出窗口停止显示。因此,如果您遇到同样的问题,并且您的客户(或您)不想要此弹出窗口,这可能也是适合您的解决方案。
我不认为 facebook 的人这样做是偶然的,这个弹出窗口可以允许一些新的 iOS 11 功能。但是,我无法区分任何真正的新功能——我只注意到较新的版本没有让您选择是使用本机应用程序还是 safari 登录,而是直接进入 safari 登录。但因为这也是我的客户的要求,所以对我来说,选择是很自然的。
该消息是 SFAuthenticationSession
用来询问用户访问 safari 的权限的标准消息(摘自 docs):
If an application uses SFAuthenticationSession, users are prompted by a dialog to give explicit consent, allowing the application to access the website's data in Safari.
更新:
显然,Safari 使用 "CFBundleName" 属性 作为此对话框的显示名称。这通常设置为 ${PRODUCT_NAME} ,它等于应用程序包标识符的最后一部分,但您可以将其更改为您喜欢的任何内容。当然,建议将其设置为您的应用程序的实际显示名称。
这与 iOS 11.x 更新有关,Facebook SDK 0.3.0 正在使用 SFAuthenticationSession
这会导致发出明确同意的警报,允许应用程序在 Safari 中访问网站的数据。
在 iOS 10.x 上试过这个,没有警报!
如果你想摆脱弹出窗口,你应该将 Facebook SDK 降级到 0.2.0 ,并且由于 Facebook swift SDK 仍然依赖于 Objective C SDK 你应该强制将这些也降级到版本 4.22.1
降级前:
pod 'FacebookCore', '~> 0.3.0'
pod 'FacebookLogin', '~> 0.3.0'
pod 'FacebookShare', '~> 0.3.0'
降级后:
pod 'FacebookCore', '~> 0.2.0'
pod 'FacebookLogin', '~> 0.2.0'
pod 'FacebookShare', '~> 0.2.0'
pod 'FBSDKCoreKit', '~> 4.22.1'
pod 'FBSDKLoginKit', '~> 4.22.1'
pod 'FBSDKShareKit', '~> 4.22.1'
我正在使用 FacebookLogin 0.5.0
将目标构建设置下的 Product Name
更改为所需的文本有效。
此外,在我的 plist Bundle display name
和 Bundle name
上有 $(PRODUCT_NAME)