1

私は、ユーザが自分の資格情報を入力すると、ユーザーがfacebookを介してログインできるようにするアプリを持っています - 私のapiリクエストがユーザをデータベースに保存し、これは各ユーザーに固有のものです)。一度ユーザーがログインすると、ユーザー固有の詳細を表示するために、トークンを参照する必要があります。私はこのトークンをPCLプロジェクトに取得しようとしていますが、トークンに対してnullを返します。名前のような別の文字列を渡そうとすると、正しい値が渡されます。 - 私はちょうどラベルでトークンを渡していますDroidプロジェクトからPCLにXamarin.Formsフィールドを渡す

public class FacebookRender : PageRenderer 
    { 
     public FacebookRender() 
     { 
      CustomerService customerService = new CustomerService(); 
      String error; 
      var activity = this.Context as Activity; 

      var auth = new OAuth2Authenticator(
       clientId: "", 
       scope: "", 
       authorizeUrl: new Uri("https://www.facebook.com/dialog/oauth/"), 
       redirectUrl: new Uri("https://www.facebook.com/connect/login_success.html") 
       ); 

      auth.Completed += async (sender, eventArgs) => 
       { 
        try 
        { 
         if (eventArgs.IsAuthenticated) 
         { 
          await AccountStore.Create().SaveAsync(eventArgs.Account, "FacebookProviderKey"); 

          var accessToken = eventArgs.Account.Properties["access_token"].ToString(); 
          var expiresIn = Convert.ToDouble(eventArgs.Account.Properties["expires_in"]); 
          var expiryDate = DateTime.Now + TimeSpan.FromSeconds(expiresIn); 

          var request = new OAuth2Request("GET", new Uri("https://graph.facebook.com/me?fields=email,first_name,last_name,gender,picture"), null, eventArgs.Account); 
          var response = await request.GetResponseAsync(); 
          var obj = JObject.Parse(response.GetResponseText()); 

          var id = obj["id"].ToString().Replace("\"", ""); 
          var name = obj["first_name"].ToString().Replace("\"", ""); 
          var surname = obj["last_name"].ToString().Replace("\"", ""); 
          var gender = obj["gender"].ToString().Replace("\"", ""); 
          //var email = obj["email"].ToString().Replace("\"", ""); 

          Customer.Customers cust = new Customer.Customers(); 
          cust.Credentials = new Customer.Credentials(); 
          cust.Name = name; 
          cust.Surname = surname; 
          cust.Email = ""; 
          cust.MobilePhone = ""; 
          cust.DOB = DateTime.Now; 
          cust.Number = ""; 
          cust.City = ""; 
          cust.Region = ""; 
          cust.Country = ""; 
          cust.DeviceToken = "sample"; 
          cust.Credentials.SecretKey = ""; 

          await customerService.AddCustomer(cust); 

          App.SaveToken(cust.Credentials.Token); - **//This is where I am passing the token** 

          App.NavigateToProfile(string.Format(name + surname)); 


         } 
         else 
         { 
          App.NavigateToProfile("Invalid Login"); 
         } 
        } 
        catch(Exception ex) 
        { 
         error = ex.Message; 
        } 
       }; 
      activity.StartActivity(auth.GetUI(activity)); 
     } 

App.cs

public App() 

{ 
     InitializeComponent(); 


     MainPage = new NavigationPage(new MainPage()); 
    } 
    public static void NavigateToProfile(string message) 
    { 
     App.Current.MainPage = (new Profile(message)); 
    } 

    static string _Token; 
    public static string Token 
    { 
     get { return _Token; } 
    } 

    public static void SaveToken(string token) 
    { 
     _Token = token; 
    } 

AboutPage.cs:任意の助けもappreciated.Thanksドロイドで

FacebookRenderになりますそれが通過しているかどうかを確認する

public partial class About : ContentPage 
    { 
     private Label _lbltoken; 
     public About() 
     { 
      //InitializeComponent(); 
      Appearing += (object s, EventArgs a) => { 
       _lbltoken.Text = App.Token; 
      }; 

      string tk = App.Token; 

      _lbltoken = new Label() 
      { 
       FontSize = 20, 
       HorizontalOptions = LayoutOptions.CenterAndExpand, 
       Text = tk, 
      }; 
      var stack = new StackLayout 
      { 
       VerticalOptions = LayoutOptions.StartAndExpand, 
       Children = { _lbltoken }, 
      }; 
      Content = stack; 

     } 


    } 
+0

だけの提案とそれを使用しようと提案します。他の方法でやり遂げることはできませんか?私は、他のすべてのプロジェクトでトークンにアクセスできるように、PCLプロジェクトにサービスを書くことを意味します。 – Curiousity

答えて

0

MessagingCenterを使用できます。 ボタンクリック、システムイベントまたはその他のインシデントのようなメッセージが送信されることがあります。購読者は、ユーザーインターフェイスの外観を変更したり、データを保存したり、他の操作をトリガーするためにリッスンしている可能性があります。私は本当に今、その良いアイデアは、アプリケーションクラスの静的フィールドを使用しない場合

More Info

+0

ありがとう、これを試してみましょう –

0

。サービスロケータ、App.Current.[property]持つすべてのフィールドアクセスをXamarin私はあなたが公共の

string _Token; 
public string Token 
{ 
    get { return _Token; } 
} 

public void SaveToken(string token) 
{ 
    _Token = token; 
} 

にこれらのフィールドを変更し、App.Current.SaveToken(token)またはApp.Current.Token

関連する問題