2017-11-09 2 views
0

Ich habe Code in MainActivity.cs-Datei zum Generieren von Geräte-ID hinzugefügt. Jetzt möchte ich dieses Geräte-Token an meine PCL-Projekt-Hauptseite übergeben. Wie ist das möglich? Ich möchte auch wissen, wie man Gerät Token in IOS App generieren? und wie dieses Token an die Portable Class Library übergeben wird?Wie Gerät Token von Android MainActivity an PCL übergeben?

Codebeispiel:

public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity 
{ 
    protected override void OnCreate(Bundle bundle) 
    { 
     TabLayoutResource = Resource.Layout.Tabbar; 
     ToolbarResource = Resource.Layout.Toolbar; 

     base.OnCreate(bundle); 

     global::Xamarin.Forms.Forms.Init(this, bundle); 
     LoadApplication(new App()); 
     if (Intent.Extras != null) 
     { 
      foreach (var key in Intent.Extras.KeySet()) 
      { 
       var value = Intent.Extras.GetString(key); 
       Log.Debug("Key: {0} Value: {1}", key, value); 
      } 
     } 
     FirebaseApp.InitializeApp(this); 
     var instanceId = FirebaseInstanceId.Instance; 
     if (FirebaseInstanceId.Instance.Token != null) 
      Log.Debug("MyToken", FirebaseInstanceId.Instance.Token.ToString());    
    } 
} 

Ich brauche diese "My Token" Daten auf Login-Seite Schaltfläche Click-Ereignis. Hows das möglich?

Mein Login-Seite-Code ist

public partial class LoginPage : ContentPage 
{ 
    private readonly DataService _dataService = new DataService(); 
    public LoginPage() 
    { 
     InitializeComponent(); 

    } 

    private async Task BtnLogin_ClickedAsync(object sender, EventArgs e) 
    { 
     var result = await _dataService.Authentication(TxtUserName.Text, TxtPassword.Text,"MyToken"); 
     if (result.AccessToken != null) 
     { 
      await Navigation.PushModalAsync(new MainMasterPage()); 
      GlobalClass.userToken = result; 
     } 
     else 
      await DisplayAlert("", Resource.InvalidMessage, Resource.OkText); 

    } 
} 
+0

Try this http://codeworks.it/blog/?p=260 –

Antwort

1

Willkommen im Reich der Dependency Injection :)

documentation can be found here

Sie brauchen eine Schnittstelle auf PCL erstellen dann die Referenz auf Natives Projekt

Beispiel: Create cla ss DeviceToke.cs im PCL

public interface ITextToSpeech 
{ 
    void Speak(string text); 
} 

Dann in Ihrer Mutter Projekt können Sie wie folgt vorgehen:

Beispielcode:

[assembly: Dependency(typeof(TextToSpeechAndroidImpl))] 
namespace IocAndDiXamarinForms.Droid 
{ 
    public class TextToSpeechAndroidImpl : Java.Lang.Object, ITextToSpeech, TextToSpeech.IOnInitListener 
    { 
     TextToSpeech speaker; 
     string toSpeak; 

     public void Speak(string text) 
     { 
      var ctx = Forms.Context; // useful for many Android SDK features 
      toSpeak = text; 
      if (speaker == null) 
      { 
       speaker = new TextToSpeech(ctx, this); 
      } 
      else 
      { 
       var p = new Dictionary<string, string>(); 
       speaker.Speak(toSpeak, QueueMode.Flush, p); 
      } 
     } 

     #region IOnInitListener implementation 
     public void OnInit(OperationResult status) 
     { 
      if (status.Equals(OperationResult.Success)) 
      { 
       var p = new Dictionary<string, string>(); 
       speaker.Speak(toSpeak, QueueMode.Flush, p); 
      } 
     } 
     #endregion 
    } 
} 
0

Sie können the Xamarin messaging center verwenden, um eine Nachricht zu übergeben zurück aus Ihre plattformspezifischen Klassen zu Ihrem PCL ViewModel. Sie müssen die Nachricht in Ihrer VM abonnieren und die Nachricht von Ihrer Android- oder iOS-Klasse senden. Anschließend können Sie den Wert in Ihrer VM speichern und verwenden, wenn der Benutzer auf "Anmelden" klickt.

Senden der Nachricht:

Xamarin.Forms.MessagingCenter.Send(FirebaseInstanceId.Instance.Token.ToString(), "InstanceId"); 

in Ihrer VM Anmeldung:

MessagingCenter.Subscribe<string> (this, "InstanceId", (InstanceId) => { 
      // use the InstanceId as required 
     }); 
    }); 
1

Eine praktische Lösung ist eine öffentlich zugängliche statische StrToken Eigenschaft in einem öffentlichen Klasse zu definieren, z.B. App:

public static Size Token; 

und OnCreate auf Android:

App.StrToken = FirebaseInstanceId.Instance; 
Verwandte Themen