ios - 为什么 Xamarin.Auth 使用 OAuth1Authenticator 和 Twitter 引发身份验证错误

标签 ios xamarin.ios xamarin twitter-oauth xamarin.auth

我目前在 iOS 项目上使用 Xamarin.Auth 在我的应用程序中通过 Facebook 和 Twitter 处理一些用户身份验证。使用 OAuth2Authenticator 的 Facebook 身份验证效果很好,我的实现主要基于文档 (http://components.xamarin.com/gettingstarted/xamarin.auth)。然而,Twitter 似乎仍然使用 OAuth1,因此我的实现主要基于这个 StackOverflow 问题 (https://stackoverflow.com/a/21982205) 中的答案。一切正常,我能够检索用户、推文等,但在所有代码执行后,我在屏幕上收到“身份验证错误”弹出窗口,显示“对象引用未设置为对象的实例”。控制台上没有打印任何内容,但是到目前为止我看到的大多数正常错误都是如此。我可以关闭弹出窗口,一切都会继续正确执行。我相信我已将问题缩小到 OAuth1Authenticator 请求中的某些内容,因为当所有其他处理代码都被注释掉时,我仍然收到错误消息。请引用下面的代码,看看可能是什么原因造成的。

public override void ViewDidLoad ()
    {
        base.ViewDidLoad ();

        signupBtn.TouchUpInside += delegate {
            LoginToTwitter(true, this);
        };
    }
    void LoginToTwitter(bool allowCancel, UIViewController _vc)
    {

        var auth = new OAuth1Authenticator (
            consumerKey: "My Consumer Key", 
            consumerSecret: "My Consumer Secret", 
            requestTokenUrl: new Uri("https://api.twitter.com/oauth/request_token"), 
            authorizeUrl: new Uri("https://api.twitter.com/oauth/authorize"), 
            accessTokenUrl: new Uri("https://api.twitter.com/oauth/access_token"), 
            callbackUrl: new Uri("My callback url"),
            getUsernameAsync: (IDictionary<string, string> accountProperties) => {
                string screen_name = "";
                if (accountProperties.TryGetValue("screen_name", out screen_name)) {
                    Console.WriteLine("SN: {0}", screen_name);
                    Account a = new Account(screen_name, accountProperties);
                    AuthenticatorCompletedEventArgs e = new AuthenticatorCompletedEventArgs(a);
                    TwitterCompleted(e, _vc);
                }
                return null;}
        );
        auth.AllowCancel = allowCancel;

        UIViewController authView = auth.GetUI ();

        _vc.PresentViewController (authView, true, null);
    }
    void TwitterCompleted (AuthenticatorCompletedEventArgs e, UIViewController _vc)
    {
        var theAccount = e.Account;
        var theProperties = theAccount.Properties;
        foreach (var item in theProperties) {
            Console.WriteLine (item); //debugging
        }
        InvokeOnMainThread (delegate {
            _vc.DismissViewController (true, null);
        });

        AccountStore.Create ().Save (e.Account, "Twitter");

        if (!e.IsAuthenticated) {
            Console.WriteLine("Not authorized");
            return;
        }

        theScreenName = e.Account.Properties["screen_name"];
        theCount = "2";

        IDictionary<string, string> theDict = new Dictionary<string, string>();;
        theDict.Add("screen_name", theScreenName);
        theDict.Add("count", theCount);


        var request = new OAuth1Request("GET", new Uri("https://api.twitter.com/1.1/statuses/user_timeline.json"), theDict, e.Account, false); 
        request.GetResponseAsync().ContinueWith (t => {
            if (t.IsFaulted)
                Console.WriteLine("Error: {0}", t.Exception.InnerException.Message);
            else if (t.IsCanceled)
                Console.WriteLine("Canceled");
            else
            {
                var obj = JsonValue.Parse (t.Result.GetResponseText());
                Console.WriteLine("object: {0}", obj); // debugging
            }

        }, uiScheduler);
        return;
    }
    private readonly TaskScheduler uiScheduler = TaskScheduler.FromCurrentSynchronizationContext();

最佳答案

而不是在“getUsernameAsync”返回任务中返回 null

关于ios - 为什么 Xamarin.Auth 使用 OAuth1Authenticator 和 Twitter 引发身份验证错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22928256/

相关文章:

c# - 在 UIScrollView XAMARIN.IOS C# 中添加 UIWebView

xamarin - MvvmCross 6 RecyclerView 多个按钮项目绑定(bind)

ios - 将 xcode 分析器与葫芦测试框架集成

ios - 在 iTunesConnect 上用新的应用程序替换已经接受的应用程序构建

ios - 在 Knockout 下拉列表中覆盖默认的 Next/Previous iOS

ios - 将 UILabel.attributedText 设置为相同的值很昂贵吗?

ios - Xamarin.iOS - MSBUILD 不生成 IPA

xamarin.ios - 设置默认语言

android - "Activity has been destroyed"在设备旋转后使用带 fragment 的 map

jenkins - 无法恢复 nuget 包并出现 "WARNING: Invalid parameter"错误