Sociální rozhraní v Xamarin.iOS

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

Použití sociální architektury umožňuje aplikacím komunikovat se sociálními sítěmi z jednoho rozhraní API bez nutnosti spravovat ověřování. Zahrnuje systémový kontroler zobrazení pro vytváření příspěvků a také abstrakci, která umožňuje využívání rozhraní API každé sociální sítě přes HTTP.

Připojení k Twitteru

Twitter Account Nastavení

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

Twitter Account Nastavení

Po zadání a ověření účtu pomocí Twitteru bude tento účet používat libovolná aplikace v zařízení, které pro přístup k Twitteru používá třídy sociální architektury.

Odesílání tweetů

Social Framework obsahuje kontroler s názvem SLComposeViewController , který prezentuje zobrazení poskytnuté systémem pro úpravy a odesílání tweetu. Následující snímek obrazovky ukazuje příklad tohoto zobrazení:

Tento snímek obrazovky ukazuje příklad řadiče SLComposeViewController.

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

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

Po vrácení instance ji můžete použít k prezentace uživatelského rozhraní pro SLComposeViewController příspěvek na Twitteru. První věc, kterou je ale 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ílat tweet přímo bez zásahu uživatele. Je však možné ji inicializovat následujícími metodami:

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

Po inicializaci volání PresentVIewController zobrazí zobrazení vytvořené objektem SLComposeViewController . Uživatel pak může volitelně upravit a odeslat tweet nebo zrušit jeho odeslání. V obou případech by měl být kontroler zamítnutý v , kde je možné zkontrolovat také výsledek a zjistit, jestli se tweet odeslal nebo zrušil, jak je znázorněno CompletionHandler níže:

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

Příklad tweetu

Následující kód ukazuje použití k SLComposeViewController 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

Social Framework také zahrnuje podporu pro vytváření požadavků HTTP na sociální sítě. Zapouzdřuje požadavek ve třídě, která se používá k cílení na rozhraní SLRequest API konkrétní sociální sítě.

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

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

Podívejme se na tento kód podrobněji. Nejprve získá přístup k obchodu s účty a získá typ účtu Twitter:

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

Dále se uživatele zeptá, jestli má vaše aplikace přístup ke svému účtu na Twitteru, 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ž si uživatel vyžádá data časové osy (klepnutím na tlačítko v uživatelském rozhraní), aplikace nejprve formuje žá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, aby načetl data:

// 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):

Příklad zobrazení nezpracovaných dat JSON

Ve skutečné aplikaci by se pak výsledky JSON mohly parsovat jako obvykle a výsledky předkládané uživateli. Informace o tom, jak parsovat JSON, najdete v tématu Úvod k webovým službám.

Připojení k Facebooku

Facebook Account Nastavení

Připojení k Facebooku pomocí sociální architektury je téměř stejné jako u výše uvedeného postupu pro Twitter. V nastavení zařízení musí být nakonfigurovaný uživatelský účet Facebooku, jak je znázorněno níže:

Facebook Account Nastavení

Po nakonfigurování se k Facebooku připojí jakákoli aplikace na zařízení, které používá sociální rozhraní.

Publikování na Facebooku

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

Můžete například použít přesně jako v předchozím příkladu Twitteru, jediným rozdílem je přepnutí na nastavení a možnosti specifické pro SLComposeViewController Facebook. Napří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 se zobrazí zobrazení, které vypadá téměř stejně jako příklad na Twitteru a v tomto případě jako název SLComposeViewController zobrazuje SLComposeViewController

Zobrazení ŘADIČE SLComposeViewController

Volání rozhraní API Graph Facebooku

Podobně jako v příkladu na Twitteru je možné objekt rozhraní Social Framework použít s SLRequest rozhraním Graph API Facebooku. Například následující kód 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 aplikaci (které můžete vygenerovat z portálu pro vývojáře Facebooku), které se musí 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 nastavíte (nebo nepou ít neplatný klíč), vrátí se chyba nebo se nebudou vrácena žádná data.

Souhrn

Tento článek vám ukázal, jak používat sociální rozhraní k interakci s Twitterem a Facebookem. V nastavení zařízení se ukázalo, kde nakonfigurovat účty pro každou sociální síť. Probrali jsme také, jak pomocí prezentovat jednotné zobrazení pro SLComposeViewController publikování v sociálních sítích. Kromě toho prozkoumali SLRequest třídu , která se používá k volání rozhraní API každé sociální sítě.