2014-06-16 6 views
17

मैं Xamarin.Forms.ContentPage वर्ग संरचना निम्नलिखित हैलिखें उपकरण प्लेटफ़ॉर्म Xamarin.Forms में विशिष्ट कोड

public class MyPage : ContentPage 
{ 
    public MyPage() 
    { 
     //do work to initialize MyPage 
    } 

    public void LogIn(object sender, EventArgs eventArgs) 
    { 
     bool isAuthenticated = false; 
     string accessToken = string.Empty; 

     //do work to use authentication API to validate users 

     if(isAuthenticated) 
     { 
      //I would to write device specific code to write to the access token to the device 
      //Example of saving the access token to iOS device 
      NSUserDefaults.StandardUserDefaults.SetString(accessToken, "AccessToken"); 

      //Example of saving the access token to Android device 
      var prefs = Application.Context.GetSharedPreferences("MySharedPrefs", FileCreationMode.Private); 
      var prefsEditor = prefs.Edit(); 

      prefEditor.PutString("AccessToken", accessToken); 
      prefEditor.Commit(); 
     } 
    } 
} 

मैं MyPageLogIn विधि में मंच विशिष्ट कोड लिखने के लिए करने वाले डिवाइस के ओएस आधारित पहुँच टोकन को बचाने के लिए चाहते हैं वे मेरे आवेदन का उपयोग कर रहे हैं।

जब उपयोगकर्ता अपने डिवाइस पर अपने एप्लिकेशन का उपयोग करता है तो मैं केवल डिवाइस विशिष्ट कोड कैसे चला सकता हूं?

उत्तर

37

यह एक परिदृश्य है जो आसानी से निर्भरता इंजेक्शन के साथ हल हो गई है है।

पर वांछित तरीकों के साथ एक इंटरफेस है अपने साझा या PCL कोड, जैसे:

public interface IUserPreferences 
{ 
    void SetString(string key, string value); 
    string GetString(string key); 
} 

कि इंटरफ़ेस के आपके App वर्ग पर एक संपत्ति है:

public class App 
{ 
    public static IUserPreferences UserPreferences { get; private set; } 

    public static void Init(IUserPreferences userPreferencesImpl) 
    { 
     App.UserPreferences = userPreferencesImpl; 
    } 

    (...) 
} 

मंच-विशिष्ट कार्यान्वयन बनाएं आपकी लक्षित परियोजनाओं पर:

आईओएस:

public class iOSUserPreferences : IUserPreferences 
{ 
    public void SetString(string key, string value) 
    { 
     NSUserDefaults.StandardUserDefaults.SetString(key, value); 
    } 

    public string GetString(string key) 
    { 
     (...) 
    } 
} 

एंड्रॉयड:

public class AndroidUserPreferences : IUserPreferences 
{ 
    public void SetString(string key, string value) 
    { 
     var prefs = Application.Context.GetSharedPreferences("MySharedPrefs", FileCreationMode.Private); 
     var prefsEditor = prefs.Edit(); 

     prefEditor.PutString(key, value); 
     prefEditor.Commit(); 
    } 

    public string GetString(string key) 
    { 
     (...) 
    } 
} 

फिर प्रत्येक प्लेटफ़ॉर्म-विशिष्ट परियोजना पर IUserPreferences के एक कार्यान्वयन बना सकते हैं और या तो App.Init(new iOSUserPrefernces()) और App.Init(new AndroidUserPrefernces()) तरीकों का उपयोग कर यह निर्धारित किया है।

अंत में, आप करने के लिए अपने कोड को बदल सकता है:

public class MyPage : ContentPage 
{ 
    public MyPage() 
    { 
     //do work to initialize MyPage 
    } 

    public void LogIn(object sender, EventArgs eventArgs) 
    { 
     bool isAuthenticated = false; 
     string accessToken = string.Empty; 

     //do work to use authentication API to validate users 

     if(isAuthenticated) 
     { 
      App.UserPreferences.SetString("AccessToken", accessToken); 
     } 
    } 
} 
+0

'ऐप 'क्लास कोड स्निपेट पर, मुझे कोड की कोशिश करते समय" विधि का रिटर्न टाइप होना चाहिए "प्राप्त हो रहा है। क्या इसका रिटर्न प्रकार 'शून्य' होना चाहिए? –

+0

इनिट विधि में शायद 'शून्य' रिटर्न प्रकार होना चाहिए। – valdetero

+0

धन्यवाद, मैंने 'ऐप' कोड नमूना संपादित किया है। –

2

यह Xamarin.Forms और पीसीएल में डिफ़ॉल्ट का उपयोग करने के बारे में अधिक लगता है। क्रॉस-प्लेटफ़ॉर्म डिफ़ॉल्ट करने के लिए James Montemagno's github repo देखें।

फिर बस सेटिंग/पुनर्प्राप्ति के लिए अपनी स्थिर विधियों को कॉल करें। Nuget पैकेज Xam.Plugins.Settings है।

यह इस तरह इस्तेमाल किया जा सकता:

using Refractored.Xam.Settings; 

...

CrossSettings.Current.AddOrUpdateValue("AccessToken", accessToken); 
var value = CrossSettings.Current.GetValueOrDefault<string>("AccessToken"); 
8

एकाधिक जवाब है, तो आप क्या हासिल करना चाहते हैं पर निर्भर करता है, और इस परियोजना की तरह तुम हो:

निष्पादित विभिन्न Xamarin.Forms कोड विभिन्न प्लेटफार्मों पर।
इसका उपयोग करें उदा। यदि आप विभिन्न प्लेटफार्मों पर विभिन्न फ़ॉन्ट आकार हैं:

label.Font = Device.OnPlatform<int> (12, 14, 14); 

एक साझा (PCL) परियोजना आम पैटर्न इस के लिए डि (निर्भरता इंजेक्शन) का उपयोग करने के लिए है में मंच विशिष्ट कोड का निष्पादन करें। Xamarin.Forms इसके लिए एक सरल DependencyService प्रदान करता है, लेकिन जो भी आप चाहते हैं उसका उपयोग करें।

के रूप में कोड प्रति प्लेटफ़ॉर्म संकलित किया गया है साझा (साझा एसेट परियोजना) परियोजना में मंच विशिष्ट कोड का निष्पादन करें, आप #if __PLATFORM__#endif में अपने मंच विशिष्ट कोड लपेट और एक फ़ाइल में सभी कोड हो सकता है। प्लेटफ़ॉर्म प्रोजेक्ट को __IOS__, __ANDROID__ और __WINDOWS_PHONE__ परिभाषित करना चाहिए। ध्यान दें कि Xaml और कोड युक्त एक साझा संपत्ति प्रोजेक्ट Xamarin.Studio पर आईओएस के लिए अच्छा काम नहीं करेगा, और संकलक निर्देश होने से आपके कोड को पढ़ने और परीक्षण करने में कठिनाई होती है।

+0

मैं वर्तमान में विकल्प 3 का उपयोग कर रहा हूं "' __IOS__' और '__ANDROID__' वाक्यविन्यास के साथ शेड (साझा संपत्ति परियोजना) प्रोजेक्ट में प्लेटफॉर्म विशिष्ट कोड निष्पादित करें, लेकिन एंड्रॉइड विशिष्ट कोड इंटेलिसेंस में दिखाई नहीं दे रहा है। आईओएस विशिष्ट कोड Intellisense –

+1

@MichaelKniskern में दिखाया जा रहा है: इसके लिए इंटेलिजेंस रखने के लिए एंड्रॉइड पर अपना निर्माण लक्ष्य बदलें। और सुनिश्चित करें (आपकी परियोजना वरीयताओं में) कि प्रतीक निर्यात किया जाता है। बीटीडब्ल्यू, मुझे यह मजाकिया लगता है कि आप इस जवाब का उपयोग कर रहे हैं, और एक और स्वीकार कर रहे हैं :) –

+0

मैंने उस जवाब के साथ जाने का फैसला किया जो ज़ैमरिन कार्यक्षमता पर निर्भर नहीं था क्योंकि मुझे खाली ऐप (Xamarin.Forms) के साथ अन्य समस्याएं हैं साझा) परियोजना प्रकार। साथ ही, यदि आप मंच विशिष्ट कोड का उपयोग करना चाहते हैं तो प्रत्येक बार स्टार्ट अप प्रोजेक्ट को स्विच करना आदर्श नहीं है। –

1

Xamarin.Forms एक अंतर्निहित निर्भरता इंजेक्टर है यदि आप अपनी वेबसाइट के डेवलपर क्षेत्र में अपने गाइड पर एक नज़र डालें (http://developer.xamarin.com/guides/cross-platform/xamarin-forms/dependency-service/)

वहाँ भी एक अद्भुत पुस्तकालय आप NuGet/Github से खींच सकते हैं (https://github.com/aritchie/acr-xamarin-forms है) जो आपके द्वारा देखे जा रहे संग्रहण आवश्यकता को संभालेगा ... वहां सेटिंग सेटिंग्स पर एक नज़र डालें, यह अधिक जटिल वस्तुओं के क्रमबद्धीकरण को भी संभालेगा।

संबंधित मुद्दे