12

I have implemented login through facebook using facebook SDK for swift. It works as expected on iOS 10.3, but on iOS 11 it shows and additional popup that asks the user to allow sign in through facebook.com.

security confirmation

This adds one more step in the login process that slows down the login process. Is there a way how to to configure the app to allow this by default, thus remove the annoying popup?

I am using facebook-sdk-swift 0.2.0 (FBSDK version is 4.26.0) added through cocoa pods.

Configuration in 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>

Code in 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 has a custom login button with this in handler:

    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
    }

I created an app from scratch to test it, shared on GitHub. Still does the same.

Milan Nosáľ
  • 19,169
  • 4
  • 55
  • 90

3 Answers3

24

OK, so after several useless experiments I have been able to find a way to achieve what my client wanted. Aforementioned behavior is the result of a newer version of FBSDK. Once I downgraded from FBSDK 4.26.0 to 4.24.0 (Swift SDK version does not matter), the popup stopped showing. So if you are facing the same problem, and your clients (or you) don't want this popup, this might be a solution for you too.

I don't think facebook guys did this by accident, and this popup can allow some new iOS 11 feature. However, I was not able to distinguish any real new functionality - I only noticed that the newer version does not give you a choice if you want to login using native app or safari, but goes directly for the safari login. But since that was a requirement by my client as well, for me the choice was quite natural.

The message is a standard message used by SFAuthenticationSession to ask the user for permissions to access safari (excerpt from 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.

UPDATE:

Apparently, Safari uses the "CFBundleName" property as the display name for this dialog. This is usually set to ${PRODUCT_NAME} which equals the last portion of your app's bundle identifier, but you can change it to whatever you like. Of course it is advisable to set it to the actual display name of your app.

Anders Emil
  • 457
  • 3
  • 13
Milan Nosáľ
  • 19,169
  • 4
  • 55
  • 90
  • Hey, do you think we can change the message in this alert somehow? – rv7284 Mar 01 '18 at 06:29
  • @rv7284 that message is a standard message used by `SFAuthenticationSession` to ask the user for permissions to access safari (excerpt from 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.`). So no, I do not think that there would be way to configure this very important security consent dialog – Milan Nosáľ Mar 01 '18 at 07:48
  • As you mentioned, since the alert is shown deliberately, I would discourage trying to hide it (skip it)... – Ahmad F Mar 07 '18 at 07:25
  • 1
    its okay to show this popup but I want to know that how to edit app name? it seems that app name is not a nickname of app but a bundle name so its confusing – Jigar Mar 07 '18 at 07:28
  • 1
    @Jigar you'll need to change the `Product Name` in your App Build Settings under the packaging section. – Vignesh May 08 '18 at 04:21
  • 3
    @vignesh that is not accurate, my product name is different from what appears there, it still shows the bundle id – Gustavo Parrado May 17 '18 at 18:59
  • @GustavoParrado hmm that was the change that worked for me. How did you get it to change then? – Vignesh May 19 '18 at 08:20
  • @GustavoParrado did you find a solution to this problem? We have an app with an internal id which is very different from the product name, so it's very confusing to our users when Facebook SDK shows internal id in this popup – Anders Emil Mar 11 '19 at 08:39
  • @AndersEmil no, another dev updated something but I never got to know what exactly – Gustavo Parrado Mar 13 '19 at 02:35
  • 1
    @GustavoParrado I found a solution in the meantime. Apparently Safari uses the "CFBundleName" property as the display name for this dialog. This is usually set to ${PRODUCT_NAME}, which is the internal identifier. I fixed my problem by changing it to the display name of my app and it works perfectly. FFR: https://github.com/facebook/facebook-swift-sdk/issues/221#issuecomment-405529681 – Anders Emil Mar 13 '19 at 06:04
  • @AndersEmil that's a very valuable info. Thanks a lot. – Gustavo Parrado Mar 13 '19 at 20:17
  • @AndersEmil feel free to update my answer with your insights – Milan Nosáľ Mar 13 '19 at 20:50
  • In my case CFBundleName was missing in Info.plist (app was in production and with correct name so CFBundleName is not required). I set CFBundleName to $(PRODUCT_BUNDLE_DISPLAY_NAME) and now dialog works OK - as app name in dialog is not used target name but real app name. – mikep May 03 '23 at 11:39
0

This is related to the iOS 11.x update, Facebook SDK 0.3.0 is using SFAuthenticationSession which result in an Alert to give explicit consent, allowing the application to access the website's data in Safari.

Tried this on iOS 10.x, no Alert!

If you want to get rid of the popup, you should downgrade the Facebook SDK to 0.2.0 , and since the Facebook swift SDK still depends on the Objective C SDK you should force downgrading these ones as well to the version 4.22.1

Before Downgrade:

pod 'FacebookCore', '~> 0.3.0'
pod 'FacebookLogin', '~> 0.3.0'
pod 'FacebookShare', '~> 0.3.0'

After Downgrade:

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'
raed
  • 4,887
  • 4
  • 30
  • 49
0

I'm using FacebookLogin 0.5.0

Changing the Product Name under the target's Build Settings to the desired text worked.

Also, on my plist Bundle display name and Bundle name have $(PRODUCT_NAME)

Tharak
  • 128
  • 4