Социальная платформа в Xamarin.iOS
Social Framework предоставляет единый API для взаимодействия с социальными сетями, включая Twitter и Facebook, а также SinaWeibo для пользователей в Китае.
Использование Social Framework позволяет приложениям взаимодействовать с социальными сетями из одного API без необходимости управлять проверкой подлинности. Он включает в себя системный контроллер представления для создания записей, а также абстракции, которая позволяет использовать API каждой социальной сети по протоколу HTTP.
Подключение в Twitter
Учетная запись Twitter Параметры
Чтобы подключиться к Twitter с помощью Социальной платформы, необходимо настроить учетную запись в параметрах устройства, как показано ниже:
После ввода и проверки учетной записи с помощью Twitter любое приложение на устройстве, использующее классы Social Framework для доступа к Twitter, будет использовать эту учетную запись.
Отправка твитов
Социальная платформа включает в себя контроллер, который 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 будут отображаться (как в примере выходных данных ниже):
В реальном приложении результаты JSON можно проанализировать как обычные и результаты, представленные пользователю. Дополнительные сведения о синтаксическом анализе JSON см. в статье "Введение в веб-службы ".
Подключение в Facebook
Учетная запись Facebook Параметры
Подключение на Facebook с социальной платформой почти идентичен процессу, используемому для Twitter, показанному выше. Учетная запись пользователя Facebook должна быть настроена в параметрах устройства, как показано ниже:
После настройки любое приложение на устройстве, использующее 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 в качестве названия в этом случае:
Вызов 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 каждой социальной сети.