2017-12-08 2 views
0

Ich habe ein Projekt eingerichtet, damit ich für jeden unserer Kunden eine andere gestylte App verwenden kann und versuche, unser Design zu streamen. Derzeit ist es eingerichtet, so dass wir unsere PCL und dann ein Android- und ein iOS-Projekt für jeden Client haben. Dies bedeutet, dass wir, wenn wir Änderungen am App-Seitencode vornehmen, diese manuell über jedes Projekt ändern müssen.Xamarin Gemeinsame Nutzung eines Android- und iOS-Basisprojekts mit mehreren Android- und iOS-Apps

Ich habe versucht, es zu ändern, so haben wir unsere PCL und ein Basis-Android und iOS-Projekt, das die plattformspezifische Schnittstelle Code, den jedes der anderen Projekte mit ihren individuellen Farbenstyling, Bilder und Bundle-IDs dann erben kann.

z.B.

  • PCL Poject (Shared Code, Formulare, etc.)
  • Android.Shared (gemeinsam genutzter Ressourcen/Lokalisierungen für android apps/Plattform-spezifischen Code)
  • Android.Client1Theme (kundenspezifische Ressourcen (Logos, Farben, Android.Client2Theme usw.) für Client1)
  • (kundenspezifische Ressourcen (Logos, Farben, etc.) für Client2)

  • iOS.Shared (gemeinsam genutzter Ressourcen/Lokalisierungen für die android apps/Plattform-spezifischen Code)

  • iOS.Client1Theme (kundenspezifische Ressourcen (Logos, Farben, etc.) für Client1)
  • iOS.Client2Theme (kundenspezifische Ressourcen (Logos, Farben, etc.) für Client2)

Ich habe dies gelernt Arbeiten Sie für Android, indem Sie einfach ein neues Android-Projekt erstellen und einen Verweis auf das freigegebene Android-Projekt und PCL hinzufügen.

Ich habe Probleme, für iOS auf die gleiche Weise zu arbeiten. Es ist nah dran, die iOS-App kompiliert als eine neue App mit dem richtigen Styling, aber der DependencyService stürzt ab, wenn er versucht, auf eine Interface-Methode zuzugreifen.

DependencyService.Get<ISystemFunctions>().ToggleTorch();

exception thrown on iOS interface access

Unten ist der Code meiner Schnittstelle in meinem gemeinsamen Projekt, ich aber glaube nicht, dass dies das Problem ist, sondern die DependencyService kann es nicht finden.

[assembly: Dependency(typeof(SystemFunctions_iOS))] 
namespace SharedApp.iOS.iOS_Interfaces 
{ 
    public class SystemFunctions_iOS : ISystemFunctions 
    {   
     public SystemFunctions_iOS() 
     { } 

     public void ToggleTorch() 
     { 
      var device = AVCaptureDevice.GetDefaultDevice(AVMediaTypes.Video); 
      if (device == null) 
       return; 

      device.LockForConfiguration(out NSError error); 
      if (error != null) 
      { 
       device.UnlockForConfiguration(); 
       return; 
      } 
      else 
      { 
       device.TorchMode = device.TorchMode == AVCaptureTorchMode.On ? AVCaptureTorchMode.Off : AVCaptureTorchMode.On; 
       device.UnlockForConfiguration(); 
      } 
     } 
    } 
} 

Lassen Sie mich wissen, wenn es noch etwas gibt, das ich teilen kann, um damit zu helfen.

+0

Die gleiche 'DependencyService.Get () 'Methode hat in Ihrem Android-Projekt funktioniert? –

+0

Ja, es funktioniert gut auf iOS. Ich habe die Lösung für mein Problem gefunden, die ich unter – LPQ

+0

posten * Es funktioniert gut auf Android ich meine. – LPQ

Antwort

0

die Lösung für mein Problem für iOS.Shared entfernen Sie die Zeile [Register("AppDelegate")]

//[Register("AppDelegate")] NEEDED TO REMOVE THIS 
public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate 
{   
    public override bool FinishedLaunching(UIApplication app, NSDictionary options) 
    { 
     global::Xamarin.Forms.Forms.Init(); 
     LoadApplication(new App());    

     return base.FinishedLaunching(app, options); 
    } 
} 

für iOS.ClientThemeX die Linie var systemFunctions_iOS = new iOS.Shared.iOS_Interfaces.SystemFunctions_iOS();

[Register("AppDelegate")] 
public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate 
{ 
    public override bool FinishedLaunching(UIApplication app, NSDictionary options) 
    { 
     global::Xamarin.Forms.Forms.Init(); 
     LoadApplication(new App()); 

     // DO NOT REMOVE THIS. It breaks without it. Don't know why 
     // but a similar row will need to be added for each interface added to the project 
     var systemFunctions_iOS = new SharedApp.iOS.iOS_Interfaces.SystemFunctions_iOS(); 

     return base.FinishedLaunching(app, options); 
    } 
} 
hinzufügen Im AppDelegate Im AppDelegate

gefunden

Entfernen des AppDelegate-Registers aus dem freigegebenen Projekt macht se nse, aber ich bin nicht sicher, warum ich ein neues Objekt mit meiner Schnittstelle erklären musste, um zu arbeiten. Dieser Schnittstellenkonstruktor ist wie in der Frage leer.

Wenn irgendjemand noch etwas Licht darauf werfen könnte, würde es geschätzt werden, oder wenn es einen Rat für eine viel einfachere Weise gibt, dies zu tun.

Verwandte Themen