Social Framework in Xamarin.iOS
Das Social Framework bietet eine einheitliche API für die Interaktion mit sozialen Netzwerken wie Twitter und Facebook sowie SinaWeibo für Benutzer in China.
Mit dem Social Framework können Anwendungen über eine einzelne API mit sozialen Netzwerken interagieren, ohne die Authentifizierung verwalten zu müssen. Es enthält einen vom System bereitgestellten Ansichtscontroller zum Verfassen von Beiträgen sowie eine Abstraktion, die die Nutzung der API jedes sozialen Netzwerks über HTTP ermöglicht.
Herstellen einer Verbindung mit Twitter
Twitter-Kontoeinstellungen
Um eine Verbindung mit Twitter über das Social Framework herzustellen, muss ein Konto in den Geräteeinstellungen konfiguriert werden, wie unten gezeigt:
Sobald ein Konto eingegeben und bei Twitter überprüft wurde, verwendet jede Anwendung auf dem Gerät, die die Social Framework-Klassen für den Zugriff auf Twitter verwendet.
Senden von Tweets
Das Social Framework enthält einen Controller namens SLComposeViewController
, der eine systemseitig bereitgestellte Ansicht zum Bearbeiten und Senden eines Tweets darstellt. Der folgende Screenshot zeigt ein Beispiel für diese Ansicht:
Um eine SLComposeViewController
mit Twitter zu verwenden, muss ein instance des Controllers erstellt werden, indem die FromService
-Methode mit SLServiceType.Twitter
aufgerufen wird, wie unten gezeigt:
var slComposer = SLComposeViewController.FromService (SLServiceType.Twitter);
Nachdem die SLComposeViewController
instance zurückgegeben wurde, kann sie verwendet werden, um eine Benutzeroberfläche für die Veröffentlichung auf Twitter anzuzeigen. Zunächst müssen Sie jedoch die Verfügbarkeit des sozialen Netzwerks, in diesem Fall Twitter, überprüfen, indem Sie anrufen IsAvailable
:
if (SLComposeViewController.IsAvailable (SLServiceKind.Twitter)) {
...
}
SLComposeViewController
sendet niemals einen Tweet direkt ohne Benutzerinteraktion. Es kann jedoch mit den folgenden Methoden initialisiert werden:
SetInitialText
– Fügt den Anfangstext hinzu, der im Tweet angezeigt werden soll.AddUrl
– Fügt dem Tweet eine URL hinzu.AddImage
– Fügt dem Tweet ein Bild hinzu.
Nach der Initialisierung zeigt der Aufruf PresentVIewController
die von erstellte Ansicht an SLComposeViewController
. Der Benutzer kann den Tweet dann optional bearbeiten und senden oder das Senden abbrechen. In beiden Fällen sollte der Controller in CompletionHandler
geschlossen werden, wobei das Ergebnis auch überprüft werden kann, um festzustellen, ob der Tweet gesendet oder abgebrochen wurde, wie unten gezeigt:
slComposer.CompletionHandler += (result) => {
InvokeOnMainThread (() => {
DismissViewController (true, null);
resultsTextView.Text = result.ToString ();
});
};
Tweet-Beispiel
Der folgende Code veranschaulicht die Verwendung von SLComposeViewController
, um eine Ansicht anzuzeigen, die zum Senden eines Tweets verwendet wird:
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
}
}
Aufrufen der Twitter-API
Das Social Framework umfasst auch Unterstützung für das Senden von HTTP-Anforderungen an soziale Netzwerke. Sie kapselt die Anforderung in einer SLRequest
Klasse, die für die API des jeweiligen sozialen Netzwerks verwendet wird.
Der folgende Code stellt beispielsweise eine Anforderung an Twitter, um die öffentliche Zeitleiste abzurufen (indem der oben angegebene Code erweitert wird):
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
Sehen wir uns diesen Code im Detail an. Zunächst erhält es Zugriff auf den Kontospeicher und ruft den Typ eines Twitter-Kontos ab:
var accountStore = new ACAccountStore ();
var accountType = accountStore.FindAccountType (ACAccountType.Twitter);
Als Nächstes wird der Benutzer gefragt, ob Ihre App Zugriff auf sein Twitter-Konto haben kann, und wenn der Zugriff gewährt wird, wird das Konto in den Arbeitsspeicher geladen und die Benutzeroberfläche aktualisiert:
// 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;
});
}
});
Wenn der Benutzer die Zeitleiste Daten anfordert (durch Tippen auf eine Schaltfläche auf der Benutzeroberfläche), stellt die App zunächst eine Anforderung zum Zugriff auf die Daten von 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);
In diesem Beispiel werden die zurückgegebenen Ergebnisse auf die letzten zehn Einträge beschränkt, indem in die URL eingeschlossen ?count=10
wird. Schließlich fügt es die Anforderung an das Twitter-Konto an (das oben geladen wurde) und führt den Aufruf von Twitter aus, um die Daten abzurufen:
// 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);
});
}
});
Wenn die Daten erfolgreich geladen wurden, werden die JSON-Rohdaten angezeigt (wie in der folgenden Beispielausgabe):
In einer echten App könnten die JSON-Ergebnisse dann normal analysiert und die Ergebnisse dem Benutzer angezeigt werden. Informationen zum Analysieren von JSON finden Sie unter Einführungswebdienste .
Herstellen einer Verbindung mit Facebook
Facebook-Kontoeinstellungen
Die Verbindung mit Facebook mit dem Social Framework ist fast identisch mit dem oben gezeigten Prozess für Twitter. Ein Facebook-Benutzerkonto muss in den Geräteeinstellungen wie unten dargestellt konfiguriert werden:
Nach der Konfiguration verwendet jede Anwendung auf dem Gerät, die das Social Framework verwendet, dieses Konto, um eine Verbindung mit Facebook herzustellen.
Posten auf Facebook
Da das Social Framework eine einheitliche API für den Zugriff auf mehrere soziale Netzwerke ist, bleibt der Code unabhängig vom verwendeten sozialen Netzwerk nahezu identisch.
Beispielsweise kann die SLComposeViewController
genau wie im oben gezeigten Twitter-Beispiel verwendet werden, der einzige Unterschied ist der Wechsel zu den Facebook-spezifischen Einstellungen und Optionen. Beispiel:
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
}
}
Bei Verwendung mit Facebook wird eine Ansicht angezeigt, die SLComposeViewController
fast identisch mit dem Twitter-Beispiel aussieht und in diesem Fall Facebook als Titel anzeigt:
Aufrufen von Facebook-Graph-API
Ähnlich wie im Twitter-Beispiel kann das Objekt des SLRequest
Sozialen Frameworks mit der Graph-API von Facebook verwendet werden. Der folgende Code gibt beispielsweise Informationen aus der Graph-API zum Xamarin-Konto zurück (indem der oben angegebene Code erweitert wird):
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
Der einzige wirkliche Unterschied zwischen diesem Code und der oben dargestellten Twitter-Version ist die Anforderung von Facebook, eine Entwickler-/App-spezifische ID zu erhalten (die Sie im Entwicklerportal von Facebook generieren können), die als Option festgelegt werden muss, wenn die Anforderung gestellt wird:
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) => {
...
});
Wenn sie diese Option nicht festlegen (oder einen ungültigen Schlüssel verwenden), wird entweder ein Fehler oder keine Daten zurückgegeben.
Zusammenfassung
In diesem Artikel wurde gezeigt, wie Sie das Social Framework verwenden, um mit Twitter und Facebook zu interagieren. Es wurde gezeigt, wo Konten für jedes soziale Netzwerk in den Geräteeinstellungen konfiguriert werden. Darüber hinaus wurde erläutert, wie Sie mithilfe von SLComposeViewController
eine einheitliche Ansicht für die Veröffentlichung in sozialen Netzwerken präsentieren können. Darüber hinaus wurde die Klasse untersucht, die zum Aufrufen der SLRequest
API jedes sozialen Netzwerks verwendet wird.