Социальная платформа в Xamarin.iOS

Social Framework предоставляет единый API для взаимодействия с социальными сетями, включая Twitter и Facebook, а также SinaWeibo для пользователей в Китае.

Использование Social Framework позволяет приложениям взаимодействовать с социальными сетями из одного API без необходимости управлять проверкой подлинности. Он включает в себя системный контроллер представления для создания записей, а также абстракции, которая позволяет использовать API каждой социальной сети по протоколу HTTP.

Подключение в Twitter

Учетная запись Twitter Параметры

Чтобы подключиться к Twitter с помощью Социальной платформы, необходимо настроить учетную запись в параметрах устройства, как показано ниже:

Twitter Account Settings

После ввода и проверки учетной записи с помощью Twitter любое приложение на устройстве, использующее классы Social Framework для доступа к Twitter, будет использовать эту учетную запись.

Отправка твитов

Социальная платформа включает в себя контроллер, который SLComposeViewController представляет системное представление для редактирования и отправки твита. На следующем снимка экрана показан пример этого представления:

This screenshot shows an example of the SLComposeViewController

Чтобы использовать SLComposeViewController Twitter, необходимо создать экземпляр контроллера, вызвав FromService метод, SLServiceType.Twitter как показано ниже:

var slComposer = SLComposeViewController.FromService (SLServiceType.Twitter);

SLComposeViewController После возврата экземпляра его можно использовать для представления пользовательского интерфейса для публикации в Twitter. Однако первое, что нужно сделать, — проверка доступность социальной сети, Twitter в этом случае путем вызоваIsAvailable:

if (SLComposeViewController.IsAvailable (SLServiceKind.Twitter)) {
  ...
}

SLComposeViewController никогда не отправляет твит напрямую без взаимодействия с пользователем. Однако его можно инициализировать с помощью следующих методов:

  • SetInitialText — добавляет исходный текст для отображения в твите.
  • AddUrl — добавляет URL-адрес в твит.
  • AddImage — добавляет изображение в твит.

После инициализации вызов PresentVIewController отображает представление, созданное элементом SLComposeViewController. Затем пользователь может изменить и отправить твит или отменить отправку. В любом случае контроллер должен быть уволен в том CompletionHandlerместе, где результат также может быть проверка, чтобы узнать, был ли твит отправлен или отменен, как показано ниже:

slComposer.CompletionHandler += (result) => {
  InvokeOnMainThread (() => {
    DismissViewController (true, null);
    resultsTextView.Text = result.ToString ();
  });
};

Пример твита

Следующий код демонстрирует использование SLComposeViewController представления, используемого для отправки твита:

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
    }
}

Вызов API Twitter

Социальная платформа также включает поддержку отправки HTTP-запросов в социальные сети. Он инкапсулирует запрос в SLRequest классе, который используется для назначения API конкретной социальной сети.

Например, следующий код отправляет запрос на Twitter для получения общедоступного временная шкала (путем расширения кода, указанного выше):

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

Давайте подробно рассмотрим этот код. Во-первых, он получает доступ к Магазину учетных записей и получает тип учетной записи Twitter:

var accountStore = new ACAccountStore ();
var accountType = accountStore.FindAccountType (ACAccountType.Twitter);

Затем он спрашивает пользователя, может ли ваше приложение иметь доступ к учетной записи 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;
        });
    }
});

Когда пользователь запрашивает данные временная шкала (нажав кнопку в пользовательском интерфейсе), приложение сначала формирует запрос на доступ к данным из 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);

Этот пример ограничивает возвращенные результаты последними десятью записями, включив ?count=10 в URL-адрес. Наконец, он присоединяет запрос к учетной записи Twitter (которая была загружена выше) и выполняет вызов Twitter для получения данных:

// 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);
        });
    }
});

Если данные были успешно загружены, необработанные данные JSON будут отображаться (как в примере выходных данных ниже):

An example of the raw JSON data display

В реальном приложении результаты JSON можно проанализировать как обычные и результаты, представленные пользователю. Дополнительные сведения о синтаксическом анализе JSON см. в статье "Введение в веб-службы ".

Подключение в Facebook

Учетная запись Facebook Параметры

Подключение на Facebook с социальной платформой почти идентичен процессу, используемому для Twitter, показанному выше. Учетная запись пользователя Facebook должна быть настроена в параметрах устройства, как показано ниже:

Facebook Account Settings

После настройки любое приложение на устройстве, использующее Social Framework, будет использовать эту учетную запись для подключения к Facebook.

Публикация в Facebook

Поскольку Social Framework — это единый API, предназначенный для доступа к нескольким социальным сетям, код остается почти идентичным независимо от используемой социальной сети.

Например, можно использовать именно так, SLComposeViewController как в приведенном ранее примере Twitter, единственное другое — переход на параметры и параметры, относящиеся к Facebook. Например:

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
    }
}

При использовании с Facebook SLComposeViewController отображается представление, которое выглядит почти идентично примеру Twitter, показывающее Facebook в качестве названия в этом случае:

The SLComposeViewController display

Вызов API Graph Для Facebook

Как и в примере Twitter, объект Social Framework SLRequest можно использовать с API графа Facebook. Например, следующий код возвращает сведения из API графа об учетной записи Xamarin (путем расширения кода, указанного выше):

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

Единственное реальное различие между этим кодом и версией Twitter, представленной выше, — это требование Facebook для получения конкретного идентификатора разработчика или приложения (который можно создать на портале разработчика Facebook), который необходимо задать в качестве параметра при выполнении запроса:

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) => {
    ...
});

Сбой установки этого параметра (или использование недопустимого ключа) приведет к ошибке или без возврата данных.

Итоги

В этой статье показано, как использовать социальные платформы для взаимодействия с Twitter и Facebook. В нем показано, где настроить учетные записи для каждой социальной сети в параметрах устройства. Он также обсудил, как использовать SLComposeViewController единое представление для публикации в социальных сетях. Кроме того, он изучил SLRequest класс, используемый для вызова API каждой социальной сети.