Разработка iPhone-приложения для социальных сетей на основе IBM Lotus Connections 2.5

Портал IBM® developerWorks® недавно представил в Apple Application Store свое первое настоящее iPhone-приложение - отличный инструмент для пользователей, позволяющий исследовать и изучать материалы и сообщество developerWorks, связываться с другими ИТ-специалистами и экспертами по конкретным вопросам, а также находить возможности для обмена опытом.

Николас Пур, программист-консультант, IBM

Ник Пур (Nick Poore), программист-консультант IBM developerWorks, является главным архитектором сообщества My developerWorks. Работал по запросу группы поставки продукта Lotus Connections 3.0. Соединив свой энтузиазм в отношении Apple iPhone со знанием Lotus Connections, он разработал одно из первых собственных iPhone-приложений IBM. Подробнее можно узнать в профиле Ника на My developerWorks: http://www.ibm.com/developerworks/mydeveloperworks/profiles/user/nickpoore.



Эми Дьюар, руководитель группы проектирования developerWorks, IBM

фото автораЭми Дьюар (Ami Dewar) руководит группой проектирования developerWorks. Группа проектирования – это сборная команда, состоящая из дизайнеров, разработчиков и архитекторов, которые работают над дальнейшим совершенствованием developerWorks. Эми, в прошлом ведущий дизайнер в области компьютерной графики, работает дизайнером в IBM в течение шести лет и создала свыше 1200 графических произведений и 8000 технических иллюстраций. За дополнительными сведениями обращайтесь к профилю Эми на "Моем developerWorks".



25.10.2011

Введение

Специалисты developerWorks понимают, что мобильные устройства сегодня являются самым перспективным способом связи и синдикации контента, а смартфон iPhone от Apple приобрел огромную популярность во всем мире. Кроме того, ПО IBM Lotus® Connections 2.5, на основе которого функционирует сообщество developerWorks, теперь обеспечивает оптимальное взаимодействие с пользователем, эмулируя многие наиболее популярные мобильные приложения для социальных сетей.

Приложение developerWorks для iPhone поддерживает многие из наиболее популярных функций Lotus Connections для социальных сетей:

  • Просмотр общедоступных новостей, что позволяет пользователям видеть все происходящее в сообществе и выполнять в My developerWorks поиск материалов и пользователей по тегам, ключевым словам или имени пользователя.
  • Способность отслеживать изменения профилей, вносить изменения статуса в профили и добавлять комментарии к профилям коллег.

Все эти функции были реализованы при помощи общедоступных интерфейсов прикладного программирования Lotus Connections 2.5.

В качестве введения в использование интерфейсов прикладного программирования Lotus Connections 2.5 мы продемонстрируем шаг за шагом процесс создания простого iPhone-приложения, которое отображает самые последние записи блогов из My developerWorks. В ходе этого процесса мы узнаем, как получить доступ к интерфейсу блогов, загрузить данные из фида, проанализировать эти данные и корректно отобразить их на iPhone.


Знакомство с интерфейсами Lotus Connections 2.5

Lotus Connections предоставляет большой набор общедоступных интерфейсов прикладного программирования (Application Programming Interfaces - API), которые имеют множество применений в разработке. Чтобы понять, как использовать эти интерфейсы прикладного программирования для решения ваших задач, будь то создание iPhone-приложения или что-либо еще, надо сначала научиться ориентироваться в документации интерфейсов.

Приложения Lotus Connections, такие как Activities (события), Blogs (блоги), Bookmarks (закладки), Communities (сообщества), Files (файлы), Profiles (профили) и Wikis (вики), а также домашняя страница Lotus Connections, предоставляют интерфейсы, которые позволяют интегрировать их с другими приложениями, такими как наше iPhone-приложение. Используя эти интерфейсы, можно программно обращаться к тем же данным, которые отображаются в Lotus Connections Community Suite, например, ко всей деятельности сообщества на My developerWorks. Интерфейсы Lotus Connections основаны на формате Atom Syndication Format, который предоставляет возможность двусторонней связи (чтение/запись). Чтобы использовать эти интерфейсы, достаточно, чтобы ваш язык программирования имел возможность отправлять и получать XML поверх HTTP.

Документация по интерфейсам Lotus Connections содержится в информационном центре Lotus Connections Information Center. При разработке нашего iPhone-приложения мы сосредоточили внимание на получении текущих пользовательских обновлений для нашего сообщества, поэтому мы выбрали документ под названием Получение фида всех общедоступных обновлений. Этот документ указал нам на интерфейсы Updates. Интерфейсы для Updates позволили нам получать сведения о последней (общедоступной) деятельности пользователей на My developerWorks. Эти же интерфейсы Updates мы используем для примера Blog. Чтобы найти эти интерфейсы, пройдите по ссылкам Developing - Lotus Connections APIs - Updates API - Getting updates feeds - Getting a feed of all public updates.

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

В таблице 1 приведен ресурс для получения контента из интерфейса. Ресурсом является URL в интерфейсе, который позволяет получить доступ к данным. Этот источник предоставляет корневой URL для доступа ко всем общедоступным обновлениям в Lotus Connections.

Таблица 1. Параметры запроса интерфейса Atom
РесурсОписание
/atom/stories/publicПолучает фид всех общедоступных обновлений

По этому URL находятся все общедоступные обновления; в нашем примере нас интересует фид только для одного приложения - Blogs.

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

Таблица 2. Параметры для фильтрации фида Lotus Connections
ПараметрОписание
beforeВозвращает только те элементы, которые последний раз были изменены до даты, указанной в этом параметре. Синтаксис формата даты: 2008-02-07T21:07:56Z.
containerУникальный идентификатор одного из следующих элементов:

  • Событие в приложении Activities
  • Блог в приложении Blogs
  • Персональная коллекция закладок в приложении Bookmarks
  • Сообщество в приложении Communities
  • Файл в приложении Files
  • Персональный профиль в приложении Profiles
  • Вики в приложении Wikis

Используйте этот параметр с параметром source. В параметре source укажите приложение, в котором действителен этот уникальный идентификатор элемента. Этот параметр игнорируется, если в параметре source не указано действительное имя приложения.

emailПерсональный адрес электронной почты. Используйте этот параметр для ограничения фида обновлениями, сгенерированными конкретным лицом. Не используйте этот параметр, если Lotus Connections настроен на скрытие адресов электронной почты; вместо этого используйте идентификатор (ID) пользователя.
lang Используйте этот параметр для запроса текстов на языке, отличном от указанного в HTTP-запросе. Чтобы указать язык, используйте один из следующих форматов:

  • Формат Java™ (например, en_IE, es_GT)
  • Формат Dojo (например, en-ie, es-gt)
pageНомер страницы. Задает страницу, которая требуется возвратить. По умолчанию - 1.
psРазмер страницы. Определяет число записей на страницу. Максимально допустимое значение 100.
sinceВозвращает только те элементы, которые последний раз были изменены после даты, указанной в этом параметре. Синтаксис формата даты: 2008-02-07T21:07:56Z.
sourceУкажите один источник, из которого хотите получать фид обновлений. Имеются следующие варианты:

  • Activities
  • Blogs
  • Bookmarks
  • Communities
  • Files
  • Profiles
  • Wikis
useridУникальный личный идентификатор. Используйте этот параметр для ограничения фида обновлениями, сгенерированными конкретным лицом. Значение этого параметра имеет приоритет, если кроме него задан также параметр электронной почты.

Нас интересуют 30 последних обновлений блогов, а не установленные по умолчанию 20 записей. Мы задаем это назначение с помощью параметра размера страницы (ps).

Фид для просмотра 30 последних обновлений блогов будет выглядеть следующим образом:

https://www.ibm.com/developerworks/mydeveloperworks/news/atom/stories/public?source=blogs&ps=30

Среди других часто используемых параметров - language, since и userid. Важно отметить, что возвращаемый параметр language не переводит контент, размещенный пользователем, однако переводит стандартные метки или пользовательский интерфейс, связанные с этим контентом. Параметры before и since позволяют применять отметки времени и ограничивать получаемые данные только теми обновлениями, которые имели место до или после определенной даты. Параметр userid позволяет ограничить обновления только теми, которые созданы конкретным пользователем.

Хотя в примере приложения мы демонстрируем только один фид, iPhone-приложение My developerWorks использует интерфейсы Lotus Connections для отображения всего размещенного пользователем контента, отфильтрованного приложением, а также результатов поиска, данных профиля и многого другого.


Получение данных для приложения и анализ их с помощью интерфейсов Lotus Connections

Теперь, когда мы понимаем, как получить доступ к данным Lotus Connections при помощи интерфейсов, начнем писать iPhone-приложение. С помощью генератора шаблонов Apple Xcode создадим проект View-Based Application под названием iPhone SampleApplication (см. рисунок 1).

Рисунок 1. Окно нового проекта в Xcode
New xCode Project window

При создании проекта автоматически создается ряд файлов, в том числе SampleApplicationViewController.h и SampleApplicationViewController.m. В файле SampleapplicationViewController.m обратите внимание на метод viewDidLoad. Этот метод вызывается, когда в приложении загружается представление. Когда представление загружено и пользователь запускает приложение, добавление запроса на подключение к фиду интерфейсов Lotus Connections в методе viewDidLoad инициирует запрос к интерфейсу. Чтобы начать работу с интерфейсом, необходимо определить NSURLRequest, добавив в него URL фида Atom, полученный в первом разделе.

Теперь, имея объект NSURLRequest, мы создаем NSURLConnection, передаем его NSURLRequest и предоставляем ему делегата. NSURLConnection - это простой интерфейс, используемый для связи между iPhone-приложением и Lotus Connections посредством интерфейсов Atom. Создать соединение при помощи NSURLConnection просто. Приложение должно предоставить объект делегата, в котором этот делегат реализует следующие методы:

  • connection:didReceiveResponse:
  • connection:didReceiveData:
  • connection:didFailWithError:
  • connectionDidFinishLoading:

Мы предоставляем ему делегата, потому что NSURLConnection загружает запрос асинхронно и должен знать, что делать с NSData, возвращенным из NSURLConnection.

Прежде чем двинуться дальше, определим объект делегата в соответствии с руководством для разработчиков Apple. Объект делегата или делегирование - это простая и мощная модель, в которой один объект в программе действует от имени или в координации с другим объектом. Объект делегирования содержит ссылку на другой объект, т.н. делегата, и в нужный момент посылает ему сообщение. Сообщение информирует делегата о событии, которое объект делегирования собирается обработать или уже обработал. В нашем случае, когда из NSURLConnection возвращаются данные, он вызывает объект делегата и сообщает ему, что данные готовы для анализа и могут быть показаны пользователю.

В листинге 1 приведен код, используемый в нашем примере приложения для инициализации соединения с NSURLRequest. Если соединение прошло успешно, networkActivityIndicatorVisible устанавливается в YES. Этот параметр отображает в интерфейсе iPhone визуальный индикатор, говорящий о наличии сетевой активности.

Листинг 1. Создание NSURLRequest
//API фида Atom блогов
  NSURL *url = [[[NSURL alloc]
    initWithString:@"https://www.ibm.com/developerworks/mydeveloperworks/news/
atom/stories/public?source=blogs&ps=30"]
	 autorelease];

  NSURLRequest* request = [[NSURLRequest alloc]
	   initWithURL:url];



  NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request 
delegate:self];		
  if (connection) {
	//соединение прошло успешно – включить индикатор сетевой активности
	[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
  } else {
	 //ошибка	
}

Следующим шагом необходимо определить метод, который вызывается, когда на соединение получен ответ. В этом методе мы получаем Content-Length из заголовка в объекте ответа. Это значение используется для определения размера объекта NSMutableData, в котором хранятся все данные, возвращенные из запроса (см. листинг 2).

Листинг 2. Обработка ответа NSURLConnection
////////////////////////////////////////////////////////////////////////////////////
- (void)connection:(NSURLConnection*)connection didReceiveResponse:
(NSHTTPURLResponse*)response {
	//ответ сохранен, так что статус Codes можно проверить позже
    _response = [response retain];
    NSDictionary* headers = [response allHeaderFields];
    int contentLength = [[headers objectForKey:@"Content-Length"] intValue];
    
    //добавить responseData, используемый в connectionDidFinishLoading:
    _responseData = [[NSMutableData alloc] initWithCapacity:contentLength];}

По мере получения данных из соединения мы добавляем их к объекту responseData. Вполне возможно, что этот метод будет вызываться более одного раза, поэтому используется добавление, а не присваивание данных (см. листинг 3).

Листинг 3. Добавление всех данных ответа
////////////////////////////////////////////////////////////////////////////////////
- (void)connection:(NSURLConnection*)connection didReceiveData:(NSData*)data {
	[_responseData appendData:data];
	}

После завершения загрузки из соединения вызывается метод объекта делегата connectionDidFinishLoading. Теперь все данные, возвращенные из запроса, отправляются в анализатор, чтобы можно было получить заголовки записей блога в фиде обновлений.

Поскольку на этой стадии данные с сервера получены, запрос завершен и можно отключить индикатор сетевой активности, как показано в листинге 4.

Листинг 4. Создание анализатора и передача в него данных для анализа
////////////////////////////////////////////////////////////////////////////////////
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {

	[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
		
		
		AtomParser *parser = [[AtomParser alloc] initWithData:_responseData];
		[parser parse];
				
		_items = parser.items;
		[_tableView reloadData];
}

Наконец, необходимо создать класс, который анализирует фид Atom. Во-первых, создайте класс Objective-C в вашем проекте XCode. Мы назвали наш анализатор Atom-фида AtomParser.m и AtomParser.h. Теперь измените его так, чтобы AtomParser.h являлся подклассом NSXMLParser и реализовывал протокол SXMLParserDelegate. Этот шаг выполняется в AtomParser.h и выглядит примерно так:

@interface AtomParser : NSXMLParser <NSXMLParserDelegate>

Теперь, когда класс AtomParser создан, нужно создать метод parse, вызываемый в листинге 5, который показывает, что содержится в методе parse в AtomParser.m.

Листинг 5. Вызов NSXMLParser
- (BOOL)parse {
	_items = [[NSMutableArray alloc] init];
	
	self.delegate = self;
	
	BOOL result = [super parse];
	
	
	return result;
}

Теперь необходимо инициализировать массив элементов для хранения всей информации, которая будет передаваться обратно в SampleApplicationViewController.m для отображения в tableView. Настройте делегата для себя, определив методы NSXMLParserDelegate:

  • elements: parser:didStartElement:namespaceURI:qualifiedName:attributes:
  • parser:foundCharacters:
  • parser:didEndElement:namespaceURI:qualifiedNames:

После этого вызовите унаследованный суперкласс класса AtomParser для выполнения анализа данных, возвращаемых интерфейсом Lotus Connections. После анализа данных вызываются методы делегата; на этом шаге вы решаете, какие данные следует игнорировать, а какие необходимо поместить в массив элементов. В нашем примере нас интересуют только элементы title в теге <entry>. Позже мы покажем вам, как вывести эту информацию в UITableView.

После запуска NSXMLParser метод parse сначала вызывает реализацию делегата метода: parser:didStartElement:namespaceURI:qualifiedName:attributes:. Этот метод просматривает имена элементов и ищет элемент <title>. Найдя его, он устанавливает BOOL _foundTitle в YES, указывая ему хранить строковое содержимое в элементе <title>. В этом примере используется элемент <title>, потому что tableView отображает все заголовки последних 30 записей блогов из извлеченных данных интерфейса. В листинге 6 показано, как определить, равно ли значение elementName "title"; если это так, foundEntry BOOL настраивается соответствующим образом. Он также проверяет elementName для строки "entry", чтобы убедиться, что все теги под названием "title" в фиде Atom являются потомками тегов <entry>. В нашем случае нам нужны только элементы <title>, являющиеся потомками элементов <entry>. Если вы посмотрите на фид Atom, возвращаемый интерфейсом, то увидите, что есть элемент <title>, который определяет заголовок фида. Этот элемент <title> не является потомком элемента <entry>, поэтому мы будем его игнорировать.

Листинг 6. Проверка elementNames
////////////////////////////////////////////////////////////////////////////////////
- (void)         parser: (NSXMLParser*) parser
    didStartElement: (NSString*) elementName
        namespaceURI: (NSString*) namespaceURI
    qualifiedName: (NSString*) qName
        attributes: (NSDictionary*)attributeDict {
        if ([elementName isEqualToString:@"entry"]) {
            _foundEntry = YES;
        }
        if ([elementName isEqualToString:@"title"]) {
            _foundTitle = YES;
            _title = [[NSMutableString alloc] init];
        }
	
}

Следующий метод, вызываемый в процессе анализа, - это parser:foundCharacters:, который предоставляет полностью или частично строковое содержимое текущего элемента. Поскольку нет никакой гарантии, что он вызовет весь строковое содержимое с первого раза, объект NSMutableString_title приписывает текущее строковое значение до тех пор, пока не будет вызван последний метод:

parser:didEndElement:namespaceURI:qualifiedNames:

Листинг 7. Сохранение текстового значения элемента title
////////////////////////////////////////////////////////////////////////////////////
- (void)         parser: (NSXMLParser*) parser
        foundCharacters: (NSString*) string {
        	if (_foundTitle '&& _foundEntry) {
        			[_title appendString:string];
        	}
}

Последний метод, вызываемый в качестве делегата, - это parser:didEndElement:namespaceURI: qualifiedName:. Этот метод проверяет, равен ли ElementName "title" и установлен ли _foundEntry BOOL в YES. Если elementName равен "title" и _foundEntry установлен в true, значит проанализирован весь тег title и можно сохранить строковое значение контента элемента <title> в массиве элементов. Это означает, что мы нашли конец элемента <title>, являющегося потомком элемента <entry>. Если это так, строковое значение контента элемента <title> сохраняется в массиве элементов. В листинге 7 показано добавление строкового значения к _title. После добавления строки title к элементам массива строковой объект title освобождается, так что следующий заголовок не добавляется к предыдущему. Если elementName равен "entry", то foundEntry устанавливается в NO. Другими словами, если анализатор находит элемент с именем "title", он знает, что этот элемент не является потомком элемента <entry>, и все остальные имена элементов в данном примере игнорируются.

Листинг 8. Сохранение текстового значения элемента title
////////////////////////////////////////////////////////////////////////////////////
- (void)         parser: (NSXMLParser*) parser
    didEndElement: (NSString*) elementName
      namespaceURI: (NSString*) namespaceURI
    qualifiedName: (NSString*) qName {
      if ([elementName isEqualToString:@"title"] && _foundEntry) {
            _foundTitle = NO;
            [_items addObject:_title];
            [_title release];
      }
      if ([elementName isEqualToString:@"entry"]) {
            _foundEntry = NO;	
      }
}

Отображение данных на iPhone

Наконец, пришло время подготовить данные для отображения на iPhone в предназначенном для пользователя виде.

После завершения анализа имеется массив элементов NSString, готовых для отображения в виде таблицы. Чтобы создать табличное представление для просмотра, загрузите данные таблицы в вызов массива элементов [_tableView reloadData], как показано в листинге 4. Этот код вызывает реализацию метода-делегата таблицы просмотра tableView:cellForRowAtIndexPath:. Поскольку SampleApplicationViewController.m является делегатом tableView, вызывается метод, определенный в этом классе. Делегат tableView и источник данных задаются ниже в методе viewDidLoad. Этот код вставляется непосредственно перед кодом NSURLRequest и NSURLConnection.

Листинг 9. Реализация viewDidLoad
// Реализуем viewDidLoad для дополнительной настройки
после загрузки представления, обычно из nib.

- (void)viewDidLoad {

    [super viewDidLoad];


_tableView = [[[UITableView alloc] initWithFrame:self.view.bounds] autorelease];

    [self.view addSubview:_tableView];


_tableView.delegate = self;

_tableView.dataSource = self;


//API фида Atom блогов

NSURL *url = [[[NSURL alloc] 

initWithString:@"https://www.ibm.com/developerworks/mydeveloperworks/news/atom/
stories/public?source=blogs&ps=30"]

  autorelease];


NSURLRequest* request = [[NSURLRequest alloc] 

initWithURL:url];

При загрузке объекта UITableView он вызывает tableView:cellForRowAtIndexPath: столько раз, сколько ячеек таблицы будет отображено на экране. Например, если высота экрана составляет 100 пикселов, а каждая ячейка таблицы имеет 10 пикселов в высоту, метод вызывается 10 раз. Данный метод возвращает экземпляр класса TableViewCell. Этот экземпляр является макетом данных, отображаемых в таблице. Когда пользователь прокручивает таблицу, всякий раз для отображения ячейки таблицы на экране вызывается tableView:cellForRowAtIndexPath:. Каждый раз, когда UITableView вызывает этот метод, он передает indexPath, значение которого соответствует требуемому UITableViewCell. В нашем примере приложения обратно передается UITableViewCell, в котором textLabel присвоен заголовок записи блога.

Листинг 10. Создание UITableViewCell
// Настраиваем вид ячеек представления таблицы
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:
(NSIndexPath *)
indexPath {
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:CellIdentifier] autorelease];
 		    NSString* title = [[NSString alloc] initWithString:[_items
objectAtIndex:indexPath.row]];
            cell.textLabel.font = [UIFont systemFontOfSize:12];
            cell.textLabel.text = title;
                     				 				
    }
    // Конфигурируем ячейку...
    return cell;
  }

UITableView должен знать количество отображаемых строк таблицы. Необходимо отображать только то количество строк таблицы, которые находятся в массиве элементов. Поскольку вызов интерфейса запрашивал 30 записей, размер массива элементов равен 30. Для надежности класс источника данных таблицы просмотра реализует метод tableView: numberOfRowsInSection:. Этот метод возвращает размер tableView, основанный на размере массива элементов, который в данном случае равен 30.

Листинг 11. Получение количества строк и секций в UITableView
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
	return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)
section {
	return [_items count];
	}

Наш пример приложения не включает подробного представления, которое вызывается, когда пользователь выбирает UITableViewCell, как это имеет место в приложении My developerWorks, однако эту задачу можно решить путем реализации tableView:didSelectRowAtIndexPath:. При инициализации в этом методе другого UIViewController приложение отобразит более детализированное представление UITableViewCell.

Поздравляем! После выполнения этих шагов ваш пример iPhone-приложения, отображающий 30 самых последних записей в блогах Lotus Connections, будет выглядеть так, как показано на рисунке 2.

Рисунок 2. Windows Picture и Fax Viewer
Рисунок 2. Windows Picture и Fax Viewer

Настройка производительности вашего приложения

При использовании Atom-интерфейсов Lotus Connections иногда полезно реализовать локальный кэш, чтобы оптимизировать производительность вашего iPhone-приложения в зависимости от того, что отображает приложение. Необходимо подумать о следующем:

  • Если ваше приложение обращается к данным, которые редко обновляются (например, профиль пользователя), следует реализовать кэширование.
  • Если вы получаете данные, которые обновляются часто (например, данные в примере приложения для блогов), кэширование не является идеальным вариантом, поскольку не отображает самые свежие данные пользователя.

Кэширование может быть реализовано на нескольких различных уровнях. Можно кэшировать результаты в NSMutableData, возвращаемом из запроса на соединение. Подобный подход избавит приложение от повторной загрузки фида. Тем не менее приложение должно анализировать данные в кэше, прежде чем отобразить их.

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

Для кэширования массива элементов необходимо, чтобы объекты, хранящиеся в массиве, соответствовали NSCoding. В нашем примере приложения массив элементов хранит заголовки в виде объектов NSString, поэтому его можно кэшировать на диск.

Листинг 12. Размещение и получение кэшируемых элементов NSArray
////////////////////////////////////////////////////////////////////////////////////
+(void)cacheItems:(NSArray*)items {
	NSString *kFile = @"cachedArrayFile";
	NSString *kArray = @"Array";
		
	NSMutableData *theData;
	NSKeyedArchiver *encoder;
	
	theData = [NSMutableData data];
	encoder = [[NSKeyedArchiver alloc]
initForWritingWithMutableData:theData];
	[encoder encodeObject:items forKey:kArray];
	[encoder finishEncoding];
	
	NSArray *paths = NSSearchPathForDirectoriesInDomains
(NSDocumentDirectory, NSUserDomainMask, YES);
	NSString *documentsDirectory = [paths objectAtIndex:0];
	NSString *path = [documentsDirectory
stringByAppendingPathComponent:kFile];

	[theData writeToFile:path atomically:YES];
	[encoder release];
}


////////////////////////////////////////////////////////////////////////////////////
+(NSMutableArray *)getCachedItems {
	NSString *kFile = @"cachedArrayFile";
	NSString *kArray = @"Array";
	NSMutableArray *tempArray = [NSMutableArray array];
	NSArray *paths = NSSearchPathForDirectoriesInDomains
(NSDocumentDirectory, NSUserDomainMask, YES);
	NSString *documentsDirectory = [paths objectAtIndex:0];
	NSString *path = [documentsDirectory
stringByAppendingPathComponent:kFile];

	NSFileManager *fileManager = [NSFileManager defaultManager];
	if([fileManager fileExistsAtPath:path]) {
		//open it and read it
		NSMutableData *decodeData;
		NSKeyedUnarchiver *decoder;
		
		decodeData = [NSData dataWithContentsOfFile:path];
		decoder = [[NSKeyedUnarchiver alloc]
		
initForReadingWithData:decodeData];
		tempArray = [decoder decodeObjectForKey:kArray];
		[decoder finishDecoding];
		[decoder release];
	}
	return tempArray;
}

Заключение

Использование интерфейсов Lotus Connections 2.5 для создания iPhone-приложений является очень простым. Достаточно иметь общее представление о том, как ориентироваться в интерфейсах Lotus Connections, и уметь выполнить несколько простых шагов, чтобы получить данные из Atom-фида Lotus Connections, проанализировать их, а затем отобразить в своем приложении. Чтобы исследовать все возможности интерфейсов Lotus Connections 2.5, обратитесь к iPhone-приложению My developerWorks, которое теперь доступно в Apple Application Store.


Загрузка

ОписаниеИмяРазмер
Образец кодаSampleApplication.zip39,5 КБ

Ресурсы

Научиться

Получить продукты и технологии

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Lotus
ArticleID=767768
ArticleTitle=Разработка iPhone-приложения для социальных сетей на основе IBM Lotus Connections 2.5
publish-date=10252011