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:
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í:
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 CompletionHandler
umí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):
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:
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ě:
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í.