Platforma Social Framework na platformie Xamarin.iOS
Struktura społecznościowa udostępnia ujednolicony interfejs API do interakcji z sieciami społecznościowymi, w tym Twitter i Facebook, a także SinaWeibo dla użytkowników w Chinach.
Korzystanie z platformy Social Framework umożliwia aplikacjom interakcję z sieciami społecznościowymi z jednego interfejsu API bez konieczności zarządzania uwierzytelnianiem. Zawiera on system udostępniony kontroler widoku do tworzenia wpisów, a także abstrakcji, która umożliwia korzystanie z interfejsu API każdej sieci społecznościowej za pośrednictwem protokołu HTTP.
Połączenie do usługi Twitter
Ustawienia konta w usłudze Twitter
Aby nawiązać połączenie z usługą Twitter przy użyciu platformy Social Framework, należy skonfigurować konto w ustawieniach urządzenia, jak pokazano poniżej:
Po wprowadzeniu i zweryfikowaniu konta w usłudze Twitter każda aplikacja na urządzeniu używająca klas Programu Social Framework do uzyskiwania dostępu do usługi Twitter będzie używać tego konta.
Wysyłanie tweetów
Struktura społecznościowa zawiera kontroler o nazwie SLComposeViewController
, który przedstawia system udostępniony widok do edycji i wysyłania tweetu. Poniższy zrzut ekranu przedstawia przykład tego widoku:
Aby można było używać elementu SLComposeViewController
z usługą Twitter, należy utworzyć wystąpienie kontrolera, wywołując metodę FromService
przy SLServiceType.Twitter
użyciu metody , jak pokazano poniżej:
var slComposer = SLComposeViewController.FromService (SLServiceType.Twitter);
SLComposeViewController
Po powrocie wystąpienia można go użyć do prezentowania interfejsu użytkownika do publikowania w usłudze Twitter. Jednak pierwszą rzeczą do zrobienia jest sprawdzenie dostępności sieci społecznościowej, Twitter w tym przypadku, wywołując polecenie IsAvailable
:
if (SLComposeViewController.IsAvailable (SLServiceKind.Twitter)) {
...
}
SLComposeViewController
nigdy nie wysyła tweetu bezpośrednio bez interakcji użytkownika. Można go jednak zainicjować przy użyciu następujących metod:
SetInitialText
— dodaje początkowy tekst do pokazania w tweecie.AddUrl
— dodaje adres URL do tweetu.AddImage
— dodaje obraz do tweetu.
Po zainicjowaniu wywołanie PresentVIewController
powoduje wyświetlenie widoku utworzonego SLComposeViewController
przez element . Użytkownik może następnie opcjonalnie edytować i wysyłać tweet lub anulować jego wysyłanie. W obu przypadkach kontroler powinien zostać odrzucony w CompletionHandler
obiekcie , gdzie można również sprawdzić, czy tweet został wysłany lub anulowany, jak pokazano poniżej:
slComposer.CompletionHandler += (result) => {
InvokeOnMainThread (() => {
DismissViewController (true, null);
resultsTextView.Text = result.ToString ();
});
};
Przykład tweetu
Poniższy kod demonstruje użycie elementu , SLComposeViewController
aby przedstawić widok używany do wysyłania 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
}
}
Wywoływanie interfejsu API usługi Twitter
Struktura społecznościowa obejmuje również obsługę podejmowania żądań HTTP do sieci społecznościowych. Hermetyzuje żądanie w SLRequest
klasie, która jest używana do kierowania do interfejsu API określonej sieci społecznościowej.
Na przykład poniższy kod wysyła żądanie do usługi Twitter, aby uzyskać publiczną oś czasu (rozwijając kod podany powyżej):
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
Przyjrzyjmy się szczegółowo temu kodowi. Najpierw uzyskuje dostęp do Sklepu kont i pobiera typ konta w serwisie Twitter:
var accountStore = new ACAccountStore ();
var accountType = accountStore.FindAccountType (ACAccountType.Twitter);
Następnie zostanie wyświetlony monit o to, czy aplikacja może mieć dostęp do swojego konta w serwisie Twitter, a jeśli dostęp zostanie udzielony, konto zostanie załadowane do pamięci i zaktualizowany interfejs użytkownika:
// 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;
});
}
});
Gdy użytkownik żąda danych osi czasu (naciskając przycisk w interfejsie użytkownika), aplikacja najpierw tworzy żądanie dostępu do danych z serwisu Twitter:
// 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);
W tym przykładzie zwracane wyniki są ograniczane do ostatnich dziesięciu wpisów przez uwzględnienie ?count=10
ich w adresie URL. Na koniec dołącza żądanie do konta usługi Twitter (załadowane powyżej) i wykonuje wywołanie usługi Twitter w celu pobrania danych:
// 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);
});
}
});
Jeśli dane zostały pomyślnie załadowane, zostaną wyświetlone nieprzetworzone dane JSON (jak w przykładowych danych wyjściowych poniżej):
W rzeczywistej aplikacji wyniki JSON mogą być analizowane normalnie, a wyniki prezentowane użytkownikowi. Aby uzyskać informacje na temat analizowania kodu JSON, zobacz Wprowadzenie usług sieci Web.
Połączenie do Serwisu Facebook
Ustawienia konta w serwisie Facebook
Połączenie do Facebooka z Social Framework jest prawie identyczny z procesem używanym w serwisie Twitter pokazanym powyżej. Konto użytkownika serwisu Facebook musi być skonfigurowane w ustawieniach urządzenia, jak pokazano poniżej:
Po skonfigurowaniu każda aplikacja na urządzeniu korzystająca z programu Social Framework będzie używać tego konta do łączenia się z serwisem Facebook.
Publikowanie na Facebooku
Ponieważ platforma Social Framework to ujednolicony interfejs API przeznaczony do uzyskiwania dostępu do wielu sieci społecznościowych, kod pozostaje prawie identyczny niezależnie od używanej sieci społecznościowej.
Na przykład można go użyć dokładnie tak, jak w pokazanym wcześniej przykładzie SLComposeViewController
twittera, a jedyną inną opcją jest przełączenie do ustawień i opcji specyficznych dla serwisu Facebook. Na przykład:
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
}
}
W przypadku użycia z Serwisem Facebook SLComposeViewController
wyświetla widok, który wygląda prawie identycznie z przykładem twittera, pokazujący Facebook jako tytuł w tym przypadku:
Wywoływanie interfejsu API programu Facebook Graph
Podobnie jak w przykładzie usługi Twitter, obiekt programu Social Framework SLRequest
może być używany z interfejsem API grafu serwisu Facebook. Na przykład poniższy kod zwraca informacje z interfejsu API grafu o koncie platformy Xamarin (rozwijając kod podany powyżej):
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
Jedyną rzeczywistą różnicą między tym kodem a przedstawioną powyżej wersją usługi Twitter jest wymaganie, aby użytkownik Facebooka mógł uzyskać identyfikator specyficzny dla deweloperów/aplikacji (który można wygenerować z portalu deweloperów serwisu Facebook), który należy ustawić jako opcję podczas składania żądania:
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) => {
...
});
Nie można ustawić tej opcji (lub użycie nieprawidłowego klucza) spowoduje zwrócenie błędu lub braku danych.
Podsumowanie
W tym artykule pokazano, jak korzystać z platformy Social Framework do interakcji z usługami Twitter i Facebook. Pokazano, gdzie skonfigurować konta dla każdej sieci społecznościowej w ustawieniach urządzenia. Omówiono również sposób używania elementu SLComposeViewController
do prezentowania ujednoliconego widoku publikowania w sieciach społecznościowych. Ponadto przeanalizowała klasę SLRequest
używaną do wywoływania interfejsu API każdej sieci społecznościowej.