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




