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:

Twitter-Kontoeinstellungen

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:

Dieser Screenshot zeigt ein Beispiel für den SLComposeViewController.

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

Beispiel für die Anzeige von JSON-Rohdaten

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:

Facebook-Kontoeinstellungen

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:

SlComposeViewController-Anzeige

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.