Sociální architektura v Xamarin.iOS

Rozhraní Social Framework poskytuje jednotné rozhraní API pro interakci se sociálními sítěmi, včetně Twitteru a Facebooku, stejně jako SinaWeibo pro uživatele v Číně.

Použití rozhraní Social Framework umožňuje aplikacím pracovat se sociálními sítěmi z jednoho rozhraní API bez nutnosti spravovat ověřování. Zahrnuje systém poskytovaný kontroler zobrazení pro psaní příspěvků a abstrakci, která umožňuje využívání rozhraní API jednotlivých sociálních sítí přes HTTP.

Připojení na Twitter

Nastavení účtu Twitteru

Pokud se chcete připojit k Twitteru pomocí sociální architektury, musí být účet nakonfigurovaný v nastavení zařízení, jak je znázorněno níže:

Twitter Account Settings

Po zadání a ověření účtu pomocí Twitteru bude tento účet používat jakákoli aplikace na zařízení, která používá třídy Social Framework pro přístup k Twitteru.

Odesílání tweetů

Social Framework obsahuje kontroler, kterému se říká SLComposeViewController , že představuje systém poskytovaný zobrazení pro úpravy a odesílání tweetu. Následující snímek obrazovky ukazuje příklad tohoto zobrazení:

This screenshot shows an example of the SLComposeViewController

Pokud chcete použít SLComposeViewController s Twitterem, musí být instance kontroleru vytvořena voláním FromService metody, jak SLServiceType.Twitter je znázorněno níže:

var slComposer = SLComposeViewController.FromService (SLServiceType.Twitter);

SLComposeViewController Po vrácení instance ji můžete použít k prezentaci uživatelského rozhraní pro publikování na Twitteru. První věcí, kterou je však třeba udělat, je zkontrolovat dostupnost sociální sítě, Twitter v tomto případě voláním IsAvailable:

if (SLComposeViewController.IsAvailable (SLServiceKind.Twitter)) {
  ...
}

SLComposeViewController nikdy neodesílá tweet přímo bez zásahu uživatele. Dá se ale inicializovat následujícími metodami:

  • SetInitialText – Přidá počáteční text, který se zobrazí v tweetu.
  • AddUrl – Přidá do tweetu adresu URL.
  • AddImage – Přidá do tweetu obrázek.

Po inicializaci volání PresentVIewController zobrazí zobrazení vytvořené pomocí SLComposeViewController. Uživatel pak může volitelně upravit a odeslat tweet nebo ho zrušit. V obou případech by měl být kontroler zavřen v CompletionHandlerumístění , kde je možné také zkontrolovat, jestli byl tweet odeslán nebo zrušen, jak je znázorněno níže:

slComposer.CompletionHandler += (result) => {
  InvokeOnMainThread (() => {
    DismissViewController (true, null);
    resultsTextView.Text = result.ToString ();
  });
};

Příklad tweetu

Následující kód ukazuje použití SLComposeViewController k prezentaci zobrazení použitého k odeslání tweetu:

using System;
using Social;
using UIKit;

namespace SocialFrameworkDemo
{
    public partial class ViewController : UIViewController
    {
        #region Private Variables
        private SLComposeViewController _twitterComposer = SLComposeViewController.FromService (SLServiceType.Twitter);
        #endregion

        #region Computed Properties
        public bool isTwitterAvailable {
            get { return SLComposeViewController.IsAvailable (SLServiceKind.Twitter); }
        }

        public SLComposeViewController TwitterComposer {
            get { return _twitterComposer; }
        }
        #endregion

        #region Constructors
        protected ViewController (IntPtr handle) : base (handle)
        {

        }
        #endregion

        #region Override Methods
        public override void ViewWillAppear (bool animated)
        {
            base.ViewWillAppear (animated);

            // Update UI based on state
            SendTweet.Enabled = isTwitterAvailable;
        }
        #endregion

        #region Actions
        partial void SendTweet_TouchUpInside (UIButton sender)
        {
            // Set initial message
            TwitterComposer.SetInitialText ("Hello Twitter!");
            TwitterComposer.AddImage (UIImage.FromFile ("Icon.png"));
            TwitterComposer.CompletionHandler += (result) => {
                InvokeOnMainThread (() => {
                    DismissViewController (true, null);
                    Console.WriteLine ("Results: {0}", result);
                });
            };

            // Display controller
            PresentViewController (TwitterComposer, true, null);
        }
        #endregion
    }
}

Volání rozhraní Twitter API

Součástí sociální architektury je také podpora pro vytváření požadavků HTTP na sociální sítě. Zapouzdřuje požadavek do SLRequest třídy, která se používá k cílení na rozhraní API konkrétní sociální sítě.

Například následující kód odešle na Twitter žádost o získání veřejné časové osy (rozšířením kódu uvedeného výše):

using Accounts;
...

#region Private Variables
private ACAccount _twitterAccount;
#endregion

#region Computed Properties
public ACAccount TwitterAccount {
    get { return _twitterAccount; }
}
#endregion

#region Override Methods
public override void ViewWillAppear (bool animated)
{
    base.ViewWillAppear (animated);

    // Update UI based on state
    SendTweet.Enabled = isTwitterAvailable;
    RequestTwitterTimeline.Enabled = false;

    // Initialize Twitter Account access
    var accountStore = new ACAccountStore ();
    var accountType = accountStore.FindAccountType (ACAccountType.Twitter);

    // Request access to Twitter account
    accountStore.RequestAccess (accountType, (granted, error) => {
        // Allowed by user?
        if (granted) {
            // Get account
            _twitterAccount = accountStore.Accounts [accountStore.Accounts.Length - 1];
            InvokeOnMainThread (() => {
                // Update UI
                RequestTwitterTimeline.Enabled = true;
            });
        }
    });
}
#endregion

#region Actions
partial void RequestTwitterTimeline_TouchUpInside (UIButton sender)
{
    // Initialize request
    var parameters = new NSDictionary ();
    var url = new NSUrl("https://api.twitter.com/1.1/statuses/user_timeline.json?count=10");
    var request = SLRequest.Create (SLServiceKind.Twitter, SLRequestMethod.Get, url, parameters);

    // Request data
    request.Account = TwitterAccount;
    request.PerformRequest ((data, response, error) => {
        // Was there an error?
        if (error == null) {
            // Was the request successful?
            if (response.StatusCode == 200) {
                // Yes, display it
                InvokeOnMainThread (() => {
                    Results.Text = data.ToString ();
                });
            } else {
                // No, display error
                InvokeOnMainThread (() => {
                    Results.Text = string.Format ("Error: {0}", response.StatusCode);
                });
            }
        } else {
            // No, display error
            InvokeOnMainThread (() => {
                Results.Text = string.Format ("Error: {0}", error);
            });
        }
    });
}
#endregion

Pojďme se na tento kód podívat podrobněji. Za prvé získá přístup k úložišti účtů a získá typ účtu Twitter:

var accountStore = new ACAccountStore ();
var accountType = accountStore.FindAccountType (ACAccountType.Twitter);

Dále se zeptá uživatele, jestli má vaše aplikace přístup ke svému účtu Twitter a pokud je udělen přístup, účet se načte do paměti a uživatelské rozhraní se aktualizuje:

// Request access to Twitter account
accountStore.RequestAccess (accountType, (granted, error) => {
    // Allowed by user?
    if (granted) {
        // Get account
        _twitterAccount = accountStore.Accounts [accountStore.Accounts.Length - 1];
        InvokeOnMainThread (() => {
            // Update UI
            RequestTwitterTimeline.Enabled = true;
        });
    }
});

Když uživatel požádá o data časové osy (klepnutím na tlačítko v uživatelském rozhraní), aplikace nejprve vytvoří žádost o přístup k datům z Twitteru:

// Initialize request
var parameters = new NSDictionary ();
var url = new NSUrl("https://api.twitter.com/1.1/statuses/user_timeline.json?count=10");
var request = SLRequest.Create (SLServiceKind.Twitter, SLRequestMethod.Get, url, parameters);

Tento příklad omezuje vrácené výsledky na posledních deset položek zahrnutím ?count=10 do adresy URL. Nakonec připojí požadavek k účtu Twitteru (který byl načten výše) a provede volání Twitteru pro načtení dat:

// Request data
request.Account = TwitterAccount;
request.PerformRequest ((data, response, error) => {
    // Was there an error?
    if (error == null) {
        // Was the request successful?
        if (response.StatusCode == 200) {
            // Yes, display it
            InvokeOnMainThread (() => {
                Results.Text = data.ToString ();
            });
        } else {
            // No, display error
            InvokeOnMainThread (() => {
                Results.Text = string.Format ("Error: {0}", response.StatusCode);
            });
        }
    } else {
        // No, display error
        InvokeOnMainThread (() => {
            Results.Text = string.Format ("Error: {0}", error);
        });
    }
});

Pokud se data úspěšně načetla, zobrazí se nezpracovaná data JSON (jako v následujícím příkladu výstupu):

An example of the raw JSON data display

Ve skutečné aplikaci by se výsledky JSON pak mohly analyzovat jako normální a výsledky zobrazené uživateli. Informace o parsování JSON najdete v úvodní webové službě .

Připojení ing na Facebook

Nastavení facebookových účtů

Připojení na Facebook s social Framework je téměř identický s procesem používaným pro Twitter, jak je znázorněno výše. Uživatelský účet Facebooku musí být nakonfigurovaný v nastavení zařízení, jak je znázorněno níže:

Facebook Account Settings

Po nakonfigurování budou všechny aplikace na zařízení, které používají rozhraní Social Framework, používat tento účet pro připojení k Facebooku.

Publikování na Facebook

Vzhledem k tomu, že rozhraní Social Framework je sjednocené rozhraní API navržené pro přístup k více sociálním sítím, zůstává kód téměř stejný bez ohledu na použitou sociální síť.

Dá se například SLComposeViewController použít přesně stejně jako v předchozím příkladu Twitteru, jediným rozdílem je přepnutí na nastavení a možnosti specifické pro Facebook. Příklad:

using System;
using Foundation;
using Social;
using UIKit;

namespace SocialFrameworkDemo
{
    public partial class ViewController : UIViewController
    {
        #region Private Variables
        private SLComposeViewController _facebookComposer = SLComposeViewController.FromService (SLServiceType.Facebook);
        #endregion

        #region Computed Properties
        public bool isFacebookAvailable {
            get { return SLComposeViewController.IsAvailable (SLServiceKind.Facebook); }
        }

        public SLComposeViewController FacebookComposer {
            get { return _facebookComposer; }
        }
        #endregion

        #region Constructors
        protected ViewController (IntPtr handle) : base (handle)
        {

        }
        #endregion

        #region Override Methods
        public override void ViewWillAppear (bool animated)
        {
            base.ViewWillAppear (animated);

            // Update UI based on state
            PostToFacebook.Enabled = isFacebookAvailable;
        }
        #endregion

        #region Actions
        partial void PostToFacebook_TouchUpInside (UIButton sender)
        {
            // Set initial message
            FacebookComposer.SetInitialText ("Hello Facebook!");
            FacebookComposer.AddImage (UIImage.FromFile ("Icon.png"));
            FacebookComposer.CompletionHandler += (result) => {
                InvokeOnMainThread (() => {
                    DismissViewController (true, null);
                    Console.WriteLine ("Results: {0}", result);
                });
            };

            // Display controller
            PresentViewController (FacebookComposer, true, null);
        }
        #endregion
    }
}

Při použití s Facebookem SLComposeViewController se zobrazí zobrazení, které vypadá téměř stejně jako v příkladu Twitteru a zobrazuje Facebook jako název v tomto případě:

The SLComposeViewController display

Volání rozhraní Graph API pro Facebook

Podobně jako v příkladu Twitteru je možné objekt rozhraní Social Framework SLRequest použít s rozhraním API pro grafy Facebooku. Následující kód například vrátí informace z rozhraní Graph API o účtu Xamarin (rozšířením výše uvedeného kódu):

using Accounts;
...

#region Private Variables
private ACAccount _facebookAccount;
#endregion

#region Computed Properties
public ACAccount FacebookAccount {
    get { return _facebookAccount; }
}
#endregion

#region Override Methods
public override void ViewWillAppear (bool animated)
{
    base.ViewWillAppear (animated);

    // Update UI based on state
    PostToFacebook.Enabled = isFacebookAvailable;
    RequestFacebookTimeline.Enabled = false;

    // Initialize Facebook Account access
    var accountStore = new ACAccountStore ();
    var options = new AccountStoreOptions ();
    var options.FacebookAppId = ""; // Enter your specific Facebook App ID here
    accountType = accountStore.FindAccountType (ACAccountType.Facebook);

    // Request access to Facebook account
    accountStore.RequestAccess (accountType, options, (granted, error) => {
        // Allowed by user?
        if (granted) {
            // Get account
            _facebookAccount = accountStore.Accounts [accountStore.Accounts.Length - 1];
            InvokeOnMainThread (() => {
                // Update UI
                RequestFacebookTimeline.Enabled = true;
            });
        }
    });

}
#endregion

#region Actions
partial void RequestFacebookTimeline_TouchUpInside (UIButton sender)
{
    // Initialize request
    var parameters = new NSDictionary ();
    var url = new NSUrl ("https://graph.facebook.com/283148898401104");
    var request = SLRequest.Create (SLServiceKind.Facebook, SLRequestMethod.Get, url, parameters);

    // Request data
    request.Account = FacebookAccount;
    request.PerformRequest ((data, response, error) => {
        // Was there an error?
        if (error == null) {
            // Was the request successful?
            if (response.StatusCode == 200) {
                // Yes, display it
                InvokeOnMainThread (() => {
                    Results.Text = data.ToString ();
                });
            } else {
                // No, display error
                InvokeOnMainThread (() => {
                    Results.Text = string.Format ("Error: {0}", response.StatusCode);
                });
            }
        } else {
            // No, display error
            InvokeOnMainThread (() => {
                Results.Text = string.Format ("Error: {0}", error);
            });
        }
    });
}
#endregion

Jediným skutečným rozdílem mezi tímto kódem a výše uvedenou verzí Twitteru je požadavek Facebooku na získání ID specifického pro vývojáře nebo aplikace (které můžete vygenerovat z Portálu pro vývojáře Facebooku), které je potřeba nastavit jako možnost při vytváření požadavku:

var options = new AccountStoreOptions ();
var options.FacebookAppId = ""; // Enter your specific Facebook App ID here
...

// Request access to Facebook account
accountStore.RequestAccess (accountType, options, (granted, error) => {
    ...
});

Pokud tuto možnost nenastavíte (nebo použijete neplatný klíč), vrátí se chyba nebo nevrácená žádná data.

Shrnutí

Tento článek ukázal, jak používat rozhraní Social Framework k interakci s Twitterem a Facebookem. Ukázalo se, kde nakonfigurovat účty pro každou sociální síť v nastavení zařízení. Také se zabývala tím, jak použít SLComposeViewController k prezentaci jednotného zobrazení pro publikování do sociálních sítí. Kromě toho prozkoumal SLRequest třídu, která se používá k volání rozhraní API jednotlivých sociálních sítí.