Exemple #1
0
        public async Task <IFacebookAccount> AuthenticateAsync(IFacebookAuthOptions options)
        {
            await LogoutAsync();

            var currentAccessToken = global::Facebook.CoreKit.AccessToken.CurrentAccessToken;

            if (currentAccessToken != null &&
                (currentAccessToken.ExpirationDate == null || ((DateTime)currentAccessToken.ExpirationDate).ToUniversalTime() > DateTime.UtcNow))
            {
                var currentProfile = global::Facebook.CoreKit.Profile.CurrentProfile;

                if (currentProfile != null)
                {
                    populateAccount(currentAccessToken, currentProfile, options.RequestedPhotoSize);
                }
            }

            var loginManager = new global::Facebook.LoginKit.LoginManager();

            var vc = global::Plugin.SocialAuth.iOS.SocialAuth.PresentingViewController;

            global::Facebook.LoginKit.LoginManagerLoginResult resp = null;

            var scopes = options?.Scopes ?? new string[] { };

            if (options?.WritePermissions ?? false)
            {
                resp = await loginManager.LogInWithPublishPermissionsAsync(scopes, vc);
            }
            else
            {
                resp = await loginManager.LogInWithReadPermissionsAsync(scopes, vc);
            }

            if (resp.IsCancelled)
            {
                return(null);
            }

            if (resp == null || resp.Token == null)
            {
                return(null);
            }

            return(populateAccount(resp.Token, global::Facebook.CoreKit.Profile.CurrentProfile, options.RequestedPhotoSize));
        }
        static async void RequestTokenHandler(SDK.LoginKit.LoginManagerLoginResult result, NSError error)
        {
            if (error != null)
            {
                Log.For(typeof(Facebook)).Error("An error occurred in Facebook :[" + error + "]");
                await OnError.Raise(error.ToString());
            }
            else if (result?.IsCancelled ?? true)
            {
                await OnCancel.Raise();
            }
            else
            {
                try
                {
                    var er          = result.ToString();
                    var accessToken = result.Token;
                    if (accessToken.IsExpired)
                    {
                        accessToken = await RefreshAccessToken();
                    }

                    CurrentAccessToken = new AccessToken
                    {
                        TokenString = accessToken.TokenString,
                        AppId       = accessToken.AppId,
                        UserId      = accessToken.UserId
                    };

                    var param   = NSDictionary.FromObjectAndKey(CurrentParameters.ToString(",").ToNs(), "fields".ToNs());
                    var request = new SDK.CoreKit.GraphRequest("me", param, accessToken.TokenString, null, "GET");
                    request.Start(new SDK.CoreKit.GraphRequestBlockHandler(GraphCallback));
                }
                catch (Exception e)
                {
                    Log.For(typeof(Facebook)).Error(e);
                    throw;
                }
            }
        }