Статьи

Основы социальной основы

Узнайте о том, как использовать возможности Social Framework в этом посте, взятом из главы 11 книги Mobiletuts + Decoding для iOS 6 SDK !


Введение платформы Twitter в iOS 5 стало первым шагом к интеграции iOS с популярными социальными сетями. В iOS 6 Apple представила Социальную платформу. Социальная платформа не только эффективно заменяет платформу Twitter, но и расширяет ее функциональность, добавляя поддержку Facebook и Sina Weibo.

Несмотря на то, что платформа iOS устарела с iOS 6, к счастью, тривиальная задача — перенести существующий код из платформы Twitter в среду Social. В API социальной среды не упоминаются конкретные социальные сети. Компонент сети был удален, что делает добавление поддержки новых социальных сетей в будущем безболезненной задачей. Итог: хорошая новость для разработчиков заключается в том, что легко начать работу с социальной средой, особенно если вы уже знакомы с платформой Twitter.

В этой главе я дам вам обзор социальной структуры и того, что она может предложить, и я покажу вам, какие у вас есть варианты, когда вы хотите добавить социальный компонент в свои приложения. Хотя в этой главе будут рассмотрены только основы социальной среды, в следующей главе будет рассказано о более тщательной интеграции вашего приложения с социальной средой. В качестве дополнительного бонуса я также расскажу о классе UIActivityViewController. Это еще одно дополнение к UIKit, которое делает обмен контентом на одном дыхании!


До iOS 6 делиться контентом было не так просто. Если вы когда-либо интегрировали Facebook с приложением для iOS, то вы почти наверняка столкнулись с рядом препятствий. В iOS 6, однако, был внесен ряд существенных улучшений. Начиная с iOS 6, интеграция с социальными сетями теперь встроена в операционную систему, что значительно упрощает социальный обмен для разработчиков SDK.

На момент написания, Социальная структура поддерживает интеграцию с Facebook, Sina Weibo и Twitter. Поддержка Twitter является очевидной причиной устаревания платформы Twitter. Сина Вейбо может быть странной уткой в ​​ряду для некоторых из вас. Sina Weibo является чрезвычайно популярной платформой микроблогов в Китае, одной из самых густонаселенных стран мира, поэтому не так уж странно видеть ее интеграцию в iOS.

Учитывая вышесказанное, какие варианты у вас есть, когда одно из ваших приложений должно быть интегрировано с Facebook, Twitter или Sina Weibo? Социальная структура предлагает две опции, используя (1) класс SLComposeViewController или (2) класс SLRequest . Если вы работали с платформой Twitter в iOS 5, то имена этих классов наверняка будут звонить в колокол.

В этой главе я SLComposeViewController класс SLComposeViewController . Это простое в использовании и элегантное решение, позволяющее пользователям делиться контентом с Twitter, Facebook и Sina Weibo. Давайте посмотрим на этого новичка.

Самый простой способ поделиться контентом с одной из поддерживаемых социальных сетей — использовать класс SLComposeViewController . Его префикс, SL, указывает, что он является частью социальной структуры. Класс SLComposeViewController является эквивалентом класса TWTweetComposeViewController платформы Twitter. Наиболее важным отличием является то, что SLComposeViewController не привязан к какой-либо одной социальной сети в частности.

Создать экземпляр SLComposeViewController так же просто, как вызвать composeViewControllerForServiceType: для класса и передать тип сервиса, то есть социальную сеть, на которую вы ориентируетесь. На момент написания этой статьи существует три варианта: SLServiceTypeTwitter , SLServiceTypeFacebook и SLServiceTypeSinaWeibo .

Вы можете настроить экземпляр SLComposeViewController , установив исходный текст или добавив изображение или ссылку. Настройка экземпляра SLComposeViewController является необязательным шагом, поскольку пользователь сможет изменять содержимое сообщения перед отправкой его целевой службе.

Перед представлением контроллера SLComposeViewControllerCompletionHandler представления пользователю рекомендуется установить его обработчик завершения ( SLComposeViewControllerCompletionHandler ). Последний является блоком, который выполняется, когда запрос к службе завершен, успешно или безуспешно. Блок принимает один параметр, результат запроса. Это может быть полезно, если вы хотите сообщить пользователю, был ли запрос успешным или нет.

Представление SLComposeViewController пользователю выполняется путем отправки ему сообщения presentViewController:animated: точно так же, как вы делаете это с любым другим (модальным) контроллером представления. Как я уже упоминал ранее, пользователь по-прежнему может редактировать сообщение, добавлять геотеги к сообщению или добавлять изображение или ссылку. Параметры, а также пользовательский интерфейс экземпляра SLComposeViewController зависят от целевого сервиса. Если пользователь отправляет сообщение в Facebook, например, модальное представление экземпляра SLComposeViewController украшается знакомой пурпурной цветовой схемой.

Класс SLComposeViewController имеет еще один метод класса, который стоит упомянуть, isAvailableForServiceType: TWTweetComposeViewController имеет похожее имя метода класса, canSendTweet . Этот метод позволяет вашему приложению спрашивать операционную систему, доступна ли служба, на которую вы хотите настроить таргетинг. Как и в случае с composeViewControllerForServiceType , метод класса будет принимать тип службы, который указывает, какая служба является целевой. Несмотря на то, что isAvailableForServiceType: возвращает YES или NO , операционная система выполняет ряд проверок за кулисами. Он проверит, доступна ли социальная сеть, и, что более важно, проверит, установил ли пользователь действительную учетную запись для целевой службы. Давайте подробнее рассмотрим учетные записи пользователей и то, как они управляются операционной системой.

Социальная структура принимает концепцию, известную как единый вход (SSO), и важно понимать последствия этого решения. Проще говоря, больше не нужно, чтобы каждое стороннее приложение аутентифицировало себя с помощью целевой службы, теперь операционная система позаботится об этом за вас и предоставит разработчикам ряд конечных точек через социальную среду. Как вы уже догадались, это означает, что необходимо централизованное хранилище учетных записей пользователей. Это центральное расположение, разумеется, является приложением «Настройки» для iOS, и благодаря тому, что пользователи могут управлять сведениями о своей социальной сети из «Настройки», значительно повышает эффективность обмена контентом из приложений.

Хотя приложение «Настройки iOS 6» предоставляет возможность управлять только одной учетной записью Facebook, пользователи могут управлять несколькими учетными записями Twitter. Храня учетные записи пользователей в одном центральном месте, сторонним разработчикам приложений больше не нужно самим управлять этими конфиденциальными данными.

Основы социальной структуры - Рисунок 1
фигура 1
Основы социальной структуры - Рисунок 2
фигура 2

UIActivityViewController является прекрасным дополнением к UIKit. Это делает обмен контентом на одном дыхании. Как следует из названия класса, UIActivityViewController является подклассом UIViewController . UIActivityViewController делает обмен контентом тривиальным, предоставляя пользователю множество вариантов на выбор. Пользователь может делиться контентом через электронную почту, Twitter или просто вставить URL в буфер обмена. Существует довольно много вариантов на выбор, и конечные точки не ограничиваются тремя социальными сетями, поддерживаемыми социальной средой. Как UIActivityViewController названия UIActivityViewController , класс является частью UIKit, а не социальной средой. Другими словами, нет необходимости связывать ваш проект с социальной UIActivityViewController если вы хотите использовать UIActivityViewController класс UIActivityViewController .

Несмотря на то, что UIActivityViewController не является частью социальной структуры, я решил включить ее в эту главу, поскольку она имеет некоторые общие черты с социальной структурой. Фактически, через несколько минут вы заметите, что UIActivityViewController имеет довольно много общего с SLComposeViewController. Чтобы лучше понять UIActivityViewController , вы можете сравнить его с почтовым отделением. Почтовое отделение примет ваше сообщение и убедится, что оно доставлено по указанному вами адресу (услуге или конечной точке).

Некоторые из вас могут заметить, что это имеет некоторое сходство с хорошо известной библиотекой с открытым исходным кодом ShareKit . UIActivityViewController гораздо более мощный, потому что он легко интегрируется с операционной системой и ее сервисами. Однако, как и в случае с ShareKit, разработчики могут добавлять пользовательские конечные точки в массив конечных точек, которые UIActivityViewController интегрирует и отображает для пользователя.

Использование UIActivityViewController же просто, как использование SLComposeViewController. Назначенный инициализатор UIActivityViewController принимает два параметра: (1) элементы действий и (2) действия приложений. Оба аргумента должны быть экземплярами NSArray. Первый параметр — это массив объектов данных, которыми вы хотите поделиться. Массив может содержать один или несколько фрагментов текста или только одно изображение. Тип контента, которым вы можете поделиться, зависит не только от того, какой тип данных может предоставить ваше приложение, но и от того, какой тип данных принимает конечная точка. Класс UIActivityViewController обеспечит правильную обработку объектов данных в зависимости от службы или конечной точки, которую выберет пользователь.

Второй параметр, действия приложения, представляет собой массив служб или конечных точек, которые UIActivityViewController будет представлять пользователю. Услуги включают в себя электронную почту, Twitter, Facebook, печать или копирование чего-либо в буфер обмена. Как я упоминал ранее, разработчики также могут добавлять сервисы. Если для действий приложения установлено значение nil, операционная система будет использовать набор действий приложений по умолчанию.

После представления экземпляра UIActivityViewController пользователю UIActivityViewController позаботится обо всем остальном. Например, если вы добавили Twitter в качестве действия приложения, UIActivityViewController сначала проверит, доступен ли Twitter, и установил ли пользователь учетную запись Twitter на своем устройстве, прежде чем представить его в качестве опции конечному пользователю. UIActivityViewController избавляет вас от многих проблем, и для интеграции с приложением требуется всего несколько строк кода.


Чтобы проиллюстрировать, насколько легко использовать UIActivityViewController и SLComposeViewController , мы собираемся создать простое приложение для «обувной коробки» для обмена фотографиями. Приложение позволяет пользователям делать снимки, добавлять подписи и делиться ими с друзьями и семьей. Пример приложения покажет вам, как легко обмениваться контентом в iOS 6.

Начните с создания нового проекта в Xcode. Выберите шаблон приложения Single View из списка шаблонов (рисунок 3) . Назовите свое приложение Sharetastic, введите название и идентификатор компании, установите iPhone для семейства устройств и установите флажок Использовать автоматический подсчет ссылок . Снимите остальные флажки для этого проекта (рисунок 4) . Укажите, где вы хотите сохранить проект, и нажмите кнопку « Создать» .

Основы социальной структуры - Рисунок 3
Рисунок 3
Основы социальной структуры - Рисунок 4
Рисунок 4

Поскольку наше приложение будет использовать преимущества социальной среды, мы должны добавить его в наш проект. Выберите проект в Project Navigator и выберите цель справа (рисунок 5) . Выберите вкладку Build Phases вверху, откройте блок Link Binary With Libraries , нажмите кнопку «плюс» и выберите Social.framework из списка (рисунок 5) . Наш проект теперь успешно связан с социальной структурой.

Основы социальной структуры - Рисунок 5
Рисунок 5

Не забудьте добавить оператор импорта в верхней части заголовочного файла нашего контроллера представления, чтобы импортировать заголовки социальной платформы в ваш проект.

1
2
#import <UIKit/UIKit.h>
#import <Social/Social.h>

Перед созданием пользовательского интерфейса нашего приложения нам нужно добавить необходимые выходы и действия в заголовочный файл нашего контроллера представления. Всего нужно добавить четыре выхода: UITextField для ввода заголовка изображения, UIImageView отображающий привязанное изображение, и два экземпляра UIButton . Нажатие на первую кнопку отправит изображение и подпись в учетную запись пользователя Facebook. Нажатие второй кнопки вызывает экземпляр UIActivityViewController , предоставляя пользователю ряд опций для обмена изображением и подписью. Как вы уже догадались, каждая кнопка связана с IBAction . Фрагмент кода ниже показывает, как должен выглядеть заголовочный файл нашего контроллера представления:

01
02
03
04
05
06
07
08
09
10
#import <UIKit/UIKit.h>
#import <Social/Social.h>
@interface RPViewController : UIViewController
@property (weak, nonatomic) IBOutlet UITextField *captionTextField;
@property (weak, nonatomic) IBOutlet UIImageView *imageView;
@property (weak, nonatomic) IBOutlet UIButton *facebookButton;
@property (weak, nonatomic) IBOutlet UIButton *shareButton;
— (IBAction)facebook:(id)sender;
— (IBAction)share:(id)sender;
@end

Пришло время перейти к XIB-файлу нашего контроллера представления. Проще говоря, мы не будем использовать новые функции iOS 6 Autolayout в этой главе. С выбранным файлом XIB контроллера представления, откройте File Inspector справа и снимите флажок Use Autolayout .

Выбрав файл XIB контроллера представления, начните с перетаскивания текстового поля в представлении контроллера представления и расположите его в самой верхней части представления (рисунок 6) . Сконфигурируйте текстовое поле, открыв инспектор атрибутов, и измените его заполнитель на « Ввод заголовка» . Если текстовое поле все еще выделено, откройте инспектор подключений и подключите выход делегата текстового поля к объекту «Владелец файла» слева. Это означает, что контроллер представления будет действовать как делегат текстового поля. Причина этого станет ясна через несколько минут. Убедитесь, что вы также подключили выход captionTextField к объекту текстового поля на экране.

Основы социальной структуры - Рисунок 6
Рисунок 6

Перетащите экземпляр UIImageView из библиотеки в представление контроллера представления и UIImageView его ниже текстового поля (рисунок 6) . Измените его размеры до 280 пунктов на 280 пунктов. Откройте инспектор атрибутов еще раз и измените свойство режима просмотра изображения (режим content mode ) на Aspect Fit и убедитесь, что флажок « Взаимодействие с пользователем включен» . Последнее важно, так как мы скоро добавим распознаватель жестов касания к представлению изображения. Если мы не включим взаимодействие с пользователем для просмотра изображения, распознаватель жестов касания не будет работать. Не забудьте соединить выход контроллера просмотра с нашим представлением изображения. Самый простой способ сделать это — нажать Ctrl , перетащить из представления изображения к объекту «Владелец файла» и выбрать соответствующий выход.

Чтобы завершить пользовательский интерфейс нашего приложения, добавьте два экземпляра UIButton в представление нашего контроллера представления и расположите их под представлением изображения ( рисунок 6 ). Дайте верхней кнопке название Facebook, а нижней кнопке название « Поделиться» . Подключите остальные розетки, как я описал выше. Кроме того, соедините два действия нашего контроллера представления, нажав клавишу Ctrl, перетащив из объекта «Владелец файла» к каждой кнопке, а затем выбрав соответствующее действие. Пользовательский интерфейс готов. Теперь пришло время начать писать код, чтобы все это заработало!

Есть еще одна вещь, которую мы должны добавить в заголовочный файл нашего контроллера представления. Поскольку мы собираемся использовать UIImagePickerController для привязки изображений, наш контроллер представления должен соответствовать протоколам UINavigationControllerDelegate и UIImagePickerControllerDelegate . Кроме того, как я упоминал несколько минут назад, наш контроллер представления также будет выступать в качестве делегата текстового поля заголовка. Это означает, что контроллер представления также должен соответствовать протоколу UITextFieldDelegate . Взгляните на обновленный заголовочный файл нашего контроллера представления для уточнения.

01
02
03
04
05
06
07
08
09
10
#import <UIKit/UIKit.h>
#import <Social/Social.h>
@interface RPViewController : UIViewController <UINavigationControllerDelegate, UIImagePickerControllerDelegate, UITextFieldDelegate>
@property (weak, nonatomic) IBOutlet UITextField *captionTextField;
@property (weak, nonatomic) IBOutlet UIImageView *imageView;
@property (weak, nonatomic) IBOutlet UIButton *facebookButton;
@property (weak, nonatomic) IBOutlet UIButton *shareButton;
— (IBAction)facebook:(id)sender;
— (IBAction)share:(id)sender;
@end

В нашем файле реализации контроллера представления мы начинаем с расширения определения класса и добавления частного свойства. Рекомендуется не раскрывать все свойства класса, объявляя их в заголовочном файле, и один из способов сделать это — расширить определение класса в файле реализации. После первого оператора импорта и перед директивой @implementation добавьте приведенный ниже фрагмент кода, чтобы объявить новое частное свойство. Свойство будет содержать ссылку на изображение, которое пользователь снимает с камеры устройства.

1
2
3
@interface RPViewController ()
@property (strong, nonatomic) UIImage *image;
@end

Приятной особенностью Xcode 4.4+ является то, что вам больше не нужно синтезировать методы доступа к свойствам. Это сделано для вас за кулисами и соответствует соглашениям Apple об именах. В нашем примере будет создана переменная экземпляра с именем _image и _image доступа для нашего свойства изображения будут автоматически синтезированы для нас.

Мне всегда нравится начинать с реализации жизненного цикла представления контроллера представления. Кроме того, я также предпочитаю, чтобы метод viewDidLoad коротким, добавив несколько вспомогательных методов. Один из методов, которые я почти всегда создаю, это setupView , который заботится о настройке и настройке представления контроллера представления. Давайте взглянем на методы viewDidLoad и setupView чтобы понять, что я имею в виду.

01
02
03
04
05
06
07
08
09
10
11
12
13
— (void)viewDidLoad {
    [super viewDidLoad];
    // Setup View
    [self setupView];
}
 
— (void)setupView {
    // Add Gesture Recognizer
    UITapGestureRecognizer *tgr = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(takeImage:)];
    [self.imageView addGestureRecognizer:tgr];
    // Update View
    [self updateView];
}

Как видите, метод setupView не сложен. Мы добавляем распознаватель жестов касания к представлению изображения, чтобы пользователь мог привязать изображение, коснувшись представления изображения в нашем пользовательском интерфейсе. Сначала мы инициализируем распознаватель жестов касания, а затем добавляем его в наше изображение. snapImage: жестов касания отправляет сообщение snapImage: нашему контроллеру представления, когда пользователь нажимает на представление изображения. Мы рассмотрим метод snapImage: всего за секунду.

В конце метода setupView мы вызываем метод updateView. Опять же, это вспомогательный метод, который я использую очень часто, поскольку он позволяет мне группировать логику, связанную с обновлением представления. Давайте updateView метод updateView .

1
2
3
4
5
6
7
8
— (void)updateView {
    BOOL sharingEnabled = self.image ?
    float sharingAlpha = sharingEnabled ?
    self.facebookButton.enabled = sharingEnabled;
    self.facebookButton.alpha = sharingAlpha;
    self.shareButton.enabled = sharingEnabled;
    self.shareButton.alpha = sharingAlpha;
}

Как следует из названия метода, метод просто обновляет представление и его подпредставления. Мы начинаем с проверки доступности изображения, проверяя, установлено ли наше свойство изображения. Если у нас есть изображение для работы, мы активируем кнопки «Facebook» и «Поделиться» и устанавливаем их альфа-значения на 1,0. Если изображение недоступно, то есть пользователь еще не взял его, мы отключаем обе кнопки и делаем их слегка прозрачными, чтобы указать пользователю, что кнопки отключены.

Используя UIImagePickerController , привязка изображений является простым и UIImagePickerController процессом. Давайте начнем с изучения snapImage: метод, который вызывается распознавателем жестов касания, когда пользователь нажимает на изображение. Сначала инициализируется экземпляр UIImagePickerController и его делегату UIImagePickerController значение self, то есть наш контроллер представления. Затем мы спрашиваем операционную систему, доступна ли камера, вызывая isSourceTypeAvailable в классе UIImagePickerController и передавая ей UIImagePickerControllerSourceTypeCamera в качестве аргумента. На основе возвращаемого значения мы устанавливаем тип источника нашего экземпляра UIImagePickerController . В качестве отказоустойчивого типа источника устанавливается значение UIImagePickerControllerSourceTypePhotoLibrary если по какой-либо причине камера недоступна. Это означает, что пользователь может выбрать изображение из библиотеки фотографий устройства. Наконец, контроллер выбора изображения представляется пользователю.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
— (void)takeImage:(UITapGestureRecognizer *)tgr {
    // Initialize Image Picker Controller
    UIImagePickerController *ip = [[UIImagePickerController alloc] init];
    // Set Delegate
    [ip setDelegate:self];
    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
        // Set Source Type to Camera
        [ip setSourceType:UIImagePickerControllerSourceTypeCamera];
    } else {
        // Set Source Type to Photo Library
        [ip setSourceType:UIImagePickerControllerSourceTypePhotoLibrary];
    }
    // Present View Controller
    [self presentViewController:ip animated:YES completion:nil];
}

Можете ли вы угадать, каким будет следующий шаг? Нам нужно реализовать методы протокола UIImagePickerControllerDelegate . Протокол имеет два метода imagePickerController:didFinishPickingMediaWithInfo: и imagePickerControllerDidCancel: Позвольте мне рассказать вам о каждом методе.

В imagePickerController:didFinishPickingMediaWithInfo: мы начинаем с сохранения ссылки на исходное неотредактированное изображение. В следующих нескольких строках кода мы присваиваем исходное изображение нашему свойству изображения и обновляем его. Помните, что это позволит включить Facebook и делиться кнопками. Наконец, мы увольняем контроллер выбора изображений.

01
02
03
04
05
06
07
08
09
10
— (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
    UIImage *originalImage = [info objectForKey:UIImagePickerControllerOriginalImage];
    if (originalImage) {
        self.image = originalImage;
        // Update View
        [self updateView];
    }
    // Dismiss Image Picker Controller
    [self dismissViewControllerAnimated:YES completion:nil];
}

Второй метод делегата содержит только одну строку кода. Если пользователь нажимает кнопку отмены, контроллер выбора изображения отключается без лишних слов.

1
2
3
4
— (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
    // Dismiss Image Picker Controller
    [self dismissViewControllerAnimated:YES completion:nil];
}

Прежде чем приступить к реализации действий в facebook: и share: , я хочу сделать небольшой обход. Почему мы не присвоили вновь привязанное изображение свойству image изображения? Присвоение вновь привязанного изображения свойству image нашего представления изображений действительно является вполне приемлемым вариантом, но я выбрал другой подход. С момента введения директивы @synthesize люди часто забывают, насколько полезными могут быть сеттеры и геттеры. Позвольте мне объяснить, что я имею в виду на примере.

В нашем примере приложения я переопределил установщик свойства image нашего контроллера представления. Это позволяет мне (1) группировать связанный код в одном месте и (2) обновлять вид изображения только при изменении изображения. На данный момент это может показаться деталью, которая очень мало используется, но она показывает вам, как мы можем уже начать тонко оптимизировать наш код, что повлияет на читаемость кода и даже производительность. В этом конкретном примере это не повлияет на производительность нашего приложения, но будет полезно использовать лучшие практики, когда вы считаете нужным.

Добавьте следующее в файл реализации:

1
2
3
4
5
6
7
— (void)setImage:(UIImage *)image {
    if (_image != image) {
        _image = image;
        // Update Image View
        self.imageView.image = _image;
    }
}

Прежде чем мы сможем начать совместное использование изображений, нам нужно реализовать один метод UITextFieldDelegate протокола UITextFieldDelegate , то есть textFieldShouldReturn: В этом методе делегата мы оставляем текстовое поле в качестве первого респондента, если пользователь нажимает кнопку возврата на клавиатуре. Это отменит клавиатуру и покажет кнопки обмена под ней.

1
2
3
4
5
— (BOOL)textFieldShouldReturn:(UITextField *)textField {
    // Resign First Responder
    [textField resignFirstResponder];
    return YES;
}

Настало время испачкать руки с помощью социальной среды и UIActivityViewController . Давайте начнем с реализации метода facebook: Он проиллюстрирует, как использовать SLComposeViewController . Посмотрите на его реализацию ниже, и давайте разберем его шаг за шагом.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
— (IBAction)facebook:(id)sender {
    if ([SLComposeViewController isAvailableForServiceType:SLServiceTypeFacebook]) {
        // Initialize Compose View Controller
        SLComposeViewController *vc = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeFacebook];
        // Configure Compose View Controller
        [vc setInitialText:self.captionTextField.text];
        [vc addImage:self.image];
        // Present Compose View Controller
        [self presentViewController:vc animated:YES completion:nil];
    } else {
        NSString *message = @»It seems that we cannot talk to Facebook at the moment or you have not yet added your Facebook account to this device. Go to the Settings application to add your Facebook account to this device.»;
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@»Oops» message:message delegate:nil cancelButtonTitle:@»OK» otherButtonTitles:nil];
        [alertView show];
    }
}

Как я упоминал ранее, необходимо начать с того, чтобы спросить операционную систему, доступна ли услуга, на которую мы ориентируемся. Если isAvailableForServiceType: возвращает NO , мы выводим на экран предупреждение, сообщающее пользователю, в чем может быть проблема Однако, если служба доступна, мы инициализируем экземпляр SLComposeViewController , вызывая метод класса composeViewControllerForServiceType: Аргумент, который мы передаем методу класса, — это SLServiceTypeFacebook , который указывает, что мы нацелены на платформу Facebook.

Несмотря на то, что наш пользователь может изменить сообщение перед отправкой в ​​Facebook, мы заполняем сообщение содержимым текстового поля заголовка и прикрепляем прикрепленное изображение к сообщению. Наконец, мы представляем контроллер составного представления пользователю. Затем пользователь может отредактировать, отменить или опубликовать сообщение. Пользователь находится под контролем. Это важно помнить, особенно с учетом следующей главы, где пользователь не всегда будет знать, что делает наше приложение за кулисами. На данном этапе наше приложение готово к тестированию. Создайте и запустите приложение на тестовом устройстве и попробуйте сами!

Как я уже упоминал ранее, одной из сильных сторон социальной структуры является то, насколько легко заменить одну социальную сеть другой, изменив тип сервиса. Давайте попробуем это, заменив два экземпляра SLServiceTypeFacebook на SLServiceTypeTwitter . Благодаря этому простому изменению мы теперь можем делиться нашими изображениями с нашими подписчиками в Twitter

Наше приложение еще не закончено. Нам все еще нужно реализовать метод share: В этом методе мы используем класс UIActivityViewController для обмена привязанным изображением и соответствующим заголовком. Посмотрите на реализацию метода ниже.

01
02
03
04
05
06
07
08
09
10
— (IBAction)share:(id)sender {
    // Activity Items
    UIImage *image = self.image;
    NSString *caption = self.captionTextField.text;
    NSArray *activityItems = @[image, caption];
    // Initialize Activity View Controller
    UIActivityViewController *vc = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:nil];
    // Present Activity View Controller
    [self presentViewController:vc animated:YES completion:nil];
}

Сначала мы сохраняем изображение и подпись в массиве. Изображение и заголовок — это так называемые UIActivityViewController , которые передаются в качестве аргумента назначенному инициализатору UIActivityViewController . Важно сначала передать изображение, а затем подпись. Вы можете догадаться, почему?

UIActivityViewController класса UIActivityViewController том, что он знает, как обрабатывать объекты данных в массиве элементов действий. Это станет более понятным при тестировании функциональности общего ресурса. Второй параметр метода инициализации — это массив, содержащий сервисы, которые мы хотим сделать доступными для пользователя. Если вы передадите nil , операционная система покажет пользователю все сервисы, которые UIActivityViewController имеет в своем распоряжении. Часто лучше отображать только те услуги, которые подходят для конкретного случая использования.

Как я упоминал во введении, UIActivityViewController будет проверять доступность каждого сервиса за кулисами. Название Application Services может показаться немного странным или абстрактным, но оно охватывает широкий спектр конечных точек служб, таких как электронная почта, обмен текстовыми сообщениями, а также социальные сети и печать.

В конце нашего метода share: мы представляем пользователю экземпляр UIActivityViewController . Создайте и запустите свое приложение и опробуйте его сами.

UIActivityViewController имеет два свойства, UIActivityViewController и UIActivityViewController . Установив обработчик завершения, вы можете выполнить блокировку, если пользователь нажимает кнопку отмены или когда операция совместного использования завершена. Как вы могли догадаться, обработчик завершения является блоком ( UIActivityViewControllerCompletionHandler ) и принимает два параметра: (1) тип действия и (2) логическое значение, указывающее, была ли выполнена служба или нет. Логическое значение также будет установлено как NO если пользователь отменяет или UIActivityViewController экземпляр UIActivityViewController .

SLComposeViewController имеет обработчик завершения, который работает почти так же. Вместо двух параметров он принимает только результат операции.


Теперь у вас должно быть хорошее понимание того, что социальная структура может предложить вам. Мы внимательно SLComposeViewController а также UIActivityViewController . Оба класса невероятно полезны и в то же время просты в использовании. Раньше делиться контентом было громоздко и мучительно, но эти два класса значительно облегчают процесс. Я очень доволен введением социальной платформы в iOS 6, а также добавлением UIActivityViewController в UIKit.

Надеюсь, скоро я увижу социальные рамки, используемые в ваших приложениях!


Если вам понравился этот пост, обязательно ознакомьтесь с будущей книгой « Декодирование iOS 6 SDK» , антологией руководств по iOS 6, написанных лучшими участниками Mobiletuts +.