Повний процес побудови програми інтерактивної листування для iPhone

  1. Розробка архітектури додатку інтерактивної листування для iPhone
  2. Малюнок 1. Клієнт-серверна архітектура додатки для інтерактивної листування
  3. Побудова серверного компонента
  4. Лістинг 1. Скрипт chat.sql
  5. Лістинг 2. Скрипт add.php
  6. Лістинг 3. Сторінка test.html
  7. Малюнок 2. Тестова сторінка для відправки повідомлення
  8. Малюнок 3. Успішна відправка повідомлення
  9. Лістинг 4. Скрипт messages.php
  10. Малюнок 4. Список повідомлень інтерактивної листування
  11. Побудова клієнтського компонента
  12. Малюнок 5. Побудова заснованого на поданні програми для iPhone
  13. Створення призначеного для користувача інтерфейсу
  14. Малюнок 6. Макет інтерфейсу
  15. Створення контролера уявлення
  16. Лістинг 5. Визначення класу iOSChatClientViewController.h
  17. Побудова коду контролера уявлення
  18. Лістинг 6. Визначення класу iOSChatClientViewController.m - Початок
  19. Лістинг 7. Визначення класу iOSChatClientViewController.m - Отримання повідомлень
  20. Лістінг 8. Визначення класу iOSChatClientViewController.m - розбір Повідомлень
  21. Лістинг 9. Визначення класу iOSChatClientViewController.m - Відображення повідомлень
  22. Малюнок 7. Встановлення параметрів
  23. Лістинг 10. Визначення класу iOSChatClientViewController.m - Відсилання повідомлення
  24. Малюнок 8. Сторінка Settings
  25. Малюнок 9. Завдання імені користувача
  26. Малюнок 10. Введення нового повідомлення
  27. Малюнок 11. Додаток інтерактивної листування готове
  28. Висновок
  29. Ресурси для скачування

Створення вражаючого додатки для iPhone і відповідного серверного компонента для цього додатка

Розробка архітектури додатку інтерактивної листування для iPhone

Часто використовувані скорочення
  • DOM: Document Object Model
  • IDE: Integrated development environment (Інтегроване середовище розробки)
  • SAX: Simple API for XML
  • SQL: Structured Query Language
  • UI: User interface (Інтерфейс користувача)
  • W3C: World Wide Web Consortium
  • XIB: Xml Interface Builder
  • XML: Extensible Markup Language (Розширювана мова розмітки)

В умовах, коли на руках у користувачів знаходиться приблизно 40 мільйонів пристроїв iPhone, написання додатків для платформи iOS представляє величезний інтерес. З чого почати? Велика частина цих додатків буде підключена до мережі. Тому ми розглянемо проект, який охоплює і клієнтські, і серверні компоненти, - а саме додаток для інтерактивної листування. У цій статті я демонструю, як побудувати такий додаток, що містить серверний і клієнтський компоненти. Я гарантую, що після освоєння матеріалу цієї статті ви зможете самостійно створити свій власний додаток для iOS.

Побудова програми починається з розробки архітектури рішення. на малюнку 1 показана архітектура, що зв'язує iOS-пристрій (в даному випадку iPhone) з сервером за допомогою двох PHP-сторінок.

Малюнок 1. Клієнт-серверна архітектура додатки для інтерактивної листування
Створення вражаючого додатки для iPhone і відповідного серверного компонента для цього додатка   Розробка архітектури додатку інтерактивної листування для iPhone   Часто використовувані скорочення   DOM: Document Object Model   IDE: Integrated development environment (Інтегроване середовище розробки)   SAX: Simple API for XML   SQL: Structured Query Language   UI: User interface (Інтерфейс користувача)   W3C: World Wide Web Consortium   XIB: Xml Interface Builder   XML: Extensible Markup Language (Розширювана мова розмітки)   В умовах, коли на руках у користувачів знаходиться приблизно 40 мільйонів пристроїв iPhone, написання додатків для платформи iOS представляє величезний інтерес


Ці дві PHP-сторінки (add.php і messages.php) підключаються до бази даних з метою відправки і отримання повідомлень відповідно. У коді, який я надав для цієї статті, в якості бази даних використовується MySQL, однак ви можете використовувати DB2 або будь-яку іншу базу даних.

Я використовую протокол XML. Сторінка add.php повертає XML-повідомлення, яке говорить про те, чи була відправка повідомлення успішною. Сторінка messages.php повертає останні повідомлення, відправлені на сервер.

Перш ніж переходити до основного матеріалу статті, перерахую всі розглянуті в ній теми.

  • Доступ до бази даних. Я показую, як використовувати PHP для додавання рядків в базу даних і вилучення цих рядків з бази даних.
  • Кодування XML. Серверний код демонструє, як упаковувати повідомлення в формат XML.
  • Побудова інтерфейсу iOS. Я послідовно описую побудова користувальницького інтерфейсу для програми.
  • Запити до сервера. Код на мові Objective-C здійснює запити GET на сторінку messages.php з метою отримання нових повідомлень.
  • Розбір XML. За допомогою XML-парсера для iOS розробників ви зможете розбирати XML-повідомлення, які повертаються сторінкою messages.php.
  • Відображення повідомлень. Додаток використовує користувальницький елемент list для демонстрації повідомлень інтерактивної листування; цей підхід дозволить вам зрозуміти, як налаштувати вигляд свого iOS додатки.
  • Відправка повідомлення. Додаток відправляє (POST) дані на сервер через сторінку add.php.
  • Таймери. Таймер використовується для періодичного опитування сторінки messages.php на предмет надходження нових повідомлень інтерактивної листування.

Застосовуваний в розглянутому прикладі набір інструментів дозволить вам розробляти клієнт-серверні iOS-додатки будь-якого типу.

Побудова серверного компонента

Для початку створимо базу даних. Я дав своїй базі даних ім'я «chat», однак ви можете назвати свою базу даних будь-яким ім'ям. Для цього достатньо змінити зв'язують рядки в PHP відповідно до цим ім'ям бази даних. SQL-скрипт, який використовується при побудови єдиної таблиці для описуваного додатки, показаний в лістингу 1 .

Лістинг 1. Скрипт chat.sql

DROP TABLE IF EXISTS chatitems; CREATE TABLE chatitems (id BIGINT NOT NULL PRIMARY KEY auto_increment, added TIMESTAMP NOT NULL, user VARCHAR (64) NOT NULL, message VARCHAR (255) NOT NULL);

Ця проста база даних з єдиною таблицею має всього чотири поля:

  • Ідентифікатор рядка (id), що представляє собою ціле число з автоматичним збільшенням
  • Дата додавання даного повідомлення
  • Користувач, який додав дане повідомлення
  • Текст самого повідомлення

Ви можете змінювати розміри цих полів у відповідності зі своїм контентом.

Досить імовірно, що в системі виробничого рівня ви захочете мати таблицю користувачів з іменами / паролями, а також інтерфейс для входу користувачів в систему і т.д. У цьому прикладі я хотів зберегти простоту бази даних, тому в ній лише одна таблиця.

Отже, спочатку необхідно сконструювати скрипт add.php, показаний в лістингу 2

Лістинг 2. Скрипт add.php

<? Php header ( 'Content-type: text / xml'); mysql_connect ( 'localhost: /tmp/mysql.sock', 'root', ''); mysql_select_db ( 'chat'); mysql_query ( "INSERT INTO chatitems VALUES (null, null, '". mysql_real_escape_string ($ _REQUEST [' user ']). "', '". mysql_real_escape_string ($ _REQUEST [' message ']). "')"); ?> <Success />

Цей скрипт підключається до бази даних і зберігає повідомлення за допомогою полів user і message. Це простий оператор INSERT, в якому ці два значення забезпечуються escape-символами для правильної передачі спеціальних символів, таких як одинарні лапки, які могли б порушити синтаксис SQL.

Щоб протестувати скрипт add, створимо сторінку test.html, показану в лістингу 3 , Яка просто відправляє поля в скрипт add.php.

Лістинг 3. Сторінка test.html

<Html> <head> <title> Chat Message Test Form </ title> </ head> <body> <form action = "add.php" method = "POST"> User: <input name = "user" /> <br /> Message: <input name = "message" /> <br /> <input type = "submit" /> </ form> </ body> </ html>

Ця проста сторінка має лише одну форму, що вказує на add.php, з двома текстовими полями - User (користувач) і Message (повідомлення). Крім того, на цій сторінці є кнопка Submit, яка здійснює відправку.

Сторінка test.html дозволяє протестувати скрипт add.php. Відкрита в браузері тестова сторінка виглядає, як показано на малюнку 2 . В поле User відображається значення «jack», в поле Message відображається «This is a test». Крім того, присутній кнопка Submit Query.

Малюнок 2. Тестова сторінка для відправки повідомлення

На цій сторінці введіть будь-які значення, а потім натисніть на кнопку Submit Query. Якщо все працює добре, ви побачите наступну картину (див. малюнок 3 ).

Малюнок 3. Успішна відправка повідомлення

В іншому випадку ви, швидше за все, отримаєте вміст стека PHP, інформує про невдалий підключенні до бази даних або про що не спрацював операторі INSERT.

Тепер, коли у нас є працюючий скрипт для додавання повідомлень, створимо скрипт messages.php, який буде повертати список повідомлень. Цей скрипт показаний в лістингу 4 .

Лістинг 4. Скрипт messages.php

<? Php header ( 'Content-type: text / xml'); mysql_connect ( 'localhost: /tmp/mysql.sock', 'root', ''); mysql_select_db ( 'chat'); if ($ _REQUEST [ 'past']) {$ result = mysql_query ( 'SELECT * FROM chatitems WHERE id>'. mysql_real_escape_string ($ _REQUEST [ 'past']). 'ORDER BY added LIMIT 50'); } Else {$ result = mysql_query ( 'SELECT * FROM chatitems ORDER BY added LIMIT 50'); }?&gt; <Chat> <? Php while ($ row = mysql_fetch_assoc ($ result)) {?&gt; <Message added = "<? Php echo ($ row [ 'added'])?&gt;" Id = "<? Php echo ($ row [ 'id'])?&gt; "> <user> <? php echo (htmlentities ($ row [ 'user']))?> </ user> <text> <? php echo (htmlentities ($ row [ 'message']))?> </ text> </ message> <? php} mysql_free_result ($ result); ?> </ Chat>

Цей скрипт дещо складніше, ніж попередній. Спочатку він формує запит. В даному випадку є дві можливості:

  • Якщо параметр past був специфікований, то скрипт повертає тільки відіслані повідомлення із вказаним ідентифікатором ID.
  • Якщо параметр past ні специфікований, то скрипт повертає всі повідомлення.

Сенс застосування параметра past - підвищення «розумності» клієнта. Ми хочемо, щоб клієнт пам'ятав, які повідомлення він уже переглянув, і запитував тільки нові повідомлення. Логіка клієнта досить проста, вона зберігає тільки найбільше зі знайдених значень ідентифікатора ID і посилає його у вигляді параметра past. На початку роботи може бути повернеться значення «0», що рівнозначно відсутності значення.

У другій половині скрипта здійснюється витяг записів з результатів запиту і кодування цих записів в формат XML. Якщо ця частина скрипта спрацює успішно, то при відкритті цієї сторінки в своєму браузері ви побачите наступну картину (див. малюнок 4 ).

Малюнок 4. Список повідомлень інтерактивної листування

Це все, що необхідно для нашого серверного компонента. Звичайно, ви можете додати будь-яку логіку, яку тільки захочете, додаткові канали, перевірку користувача при вході в систему і т.д. Проте стосовно використовуваному в статті експериментальному додатком інтерактивної листування даний скрипт працює прекрасно. Тепер ми можемо побудувати додаток iOS, яка буде використовувати цей сервер.

Побудова клієнтського компонента

Інтегроване середовище розробки (IDE) для платформи iOS має назву XCode. Якщо у вас немає цієї IDE-середовища, необхідно завантажити її з сайту Apple Developer Site для розробників (див. Розділ ресурси ). Нова версія виробничого рівня має номер XCode 3. Саме вона використовувалася при створенні знімків екрана для даної статті. Є більш сучасна версія під номером XCode 4, в якій редактор User Interface інтегрований в середу IDE, однак на даний момент ця версія ще знаходиться на стадії попереднього ознайомлення.

При наявності встановленої середовища XCode можна приступити до побудови програми за допомогою майстра New Project (див. малюнок 5 ).

Малюнок 5. Побудова заснованого на поданні програми для iPhone

Найпростішим в освоєнні типом програми є т.зв. View-based Application (додаток на основі подання). Таке додаток дозволяє розробнику поміщати органи управління в будь-якому місці і залишає йому більшу частину дизайну користувальницького інтерфейсу. Після вибору органів управління виберіть тип продукту: iPhone або iPad. Цей вибір визначає пристрій, роботу з яким ви збираєтеся імітувати. Ви зможете написати програмний код, який буде працювати з iPhone або iPad або з будь-яким іншим пристроєм Apple серії i, якщо таке з'явиться в майбутньому.

Після того як ви натиснете на кнопку Choose, вам буде запропоновано дати ім'я додатком. Я назвав свій додаток «iOSChatClient», однак ви можете дати йому будь-яке ім'я. Після того як ви дасте ім'я додатком, інтегроване середовище розробки XCode створить для нього базові файли. Тепер скомпілюйте і запустіть додаток, щоб переконатися в тому, що все виглядає належним чином.

Створення призначеного для користувача інтерфейсу

Після створення програми можна приступати до розробки інтерфейсу. Спочатку нам потрібно XIB-файл контролера уявлення, який знаходиться в папці Resources. Натисніть два рази на цій папці. Відкриється інструмент Interface Builder, призначений для створення інтерфейсу користувача.

Малюнок 6. Макет інтерфейсу

на малюнку 6 показано, яким чином я розмістив три органи управління. Текстове віконце у верхній частині призначене для введення повідомлення, яке ви збираєтеся відіслати. Праворуч від цього тексту віконця знаходиться кнопка Send. І, нарешті, нижче цього віконця знаходиться об'єкт UITableView, який відображає всі елементи інтерактивної листування.

Я міг би докладно розповісти про налаштування вищезгаданих органів у інструменті Interface Builder, однак я рекомендую вам завантажити код проекту і попрацювати з ним самостійно. Ви можете використовувати даний проект як шаблон для свого власного додатка.

Створення контролера уявлення

Інтерфейс практично готовий. Тепер ми повернемося в IDE-середовище XCode і додамо в визначення класу контролера уявлення необхідні змінні, властивості і методи (див. лістинг 5 ).

Лістинг 5. Визначення класу iOSChatClientViewController.h

#import <UIKit / UIKit.h> @interface iOSChatClientViewController: UIViewController <UITableViewDataSource, UITableViewDelegate> {IBOutlet UITextField * messageText; IBOutlet UIButton * sendButton; IBOutlet UITableView * messageList; NSMutableData * receivedData; NSMutableArray * messages; int lastId; NSTimer * timer; NSXMLParser * chatParser; NSString * msgAdded; NSMutableString * msgUser; NSMutableString * msgText; int msgId; Boolean inText; Boolean inUser; } @Property (nonatomic, retain) UITextField * messageText; @property (nonatomic, retain) UIButton * sendButton; @property (nonatomic, retain) UITableView * messageList; - (IBAction) sendClicked: (id) sender; @end

У верхній частині я додав в визначення класу код UITableViewDataSource і UITableViewDelegate. Цей код використовується для відображення повідомлення. В даному класі знаходяться методи, які викликаються для доставки таблиці даних і інформації про розміщення в уявлення.

Змінні примірника діляться на п'ять груп. У верхній частині знаходяться об'єктні посилання на різні елементи призначеного для користувача інтерфейсу, текстове поле для посилається повідомлення, кнопка Send і список повідомлень.

Нижче знаходяться буфер для повернутого XML-контенту, список повідомлень і ідентифікатор останнього переглянутого повідомлення lastID. Спочатку значення ідентифікатора lastID дорівнює нулю, проте потім йому присвоюється максимальне значення ідентифікатора ID з переглянутих вами повідомлень. Потім це значення відсилається назад на сервер як значення параметра past.

Таймер кожні кілька секунд ініціює перегляд нових повідомлень від сервера. І, нарешті, в останньому розділі знаходяться робочі змінні, необхідні для розбору XML-контенту. Велике число цих змінних пояснюється тим, що XML-парсер базується на зворотних виклики (callback), тому йому необхідно безліч станів в класі.

Під робочими змінними знаходяться властивості і обробник натискань (click handler). Інструмент Interface Builder використовує їх для підключення елементів інтерфейсу до описуваного класу контролера. Тепер, коли ми маємо все необхідне для реалізації контролера уявлення, прийшов час повернутися в інструмент Interface Builder і використовувати його коннекторние механізми для зв'язування тексту повідомлення, кнопки Send і списку повідомлень з відповідним властивостями, а також для зв'язування події Touch Inside з методом sendClicked.

Побудова коду контролера уявлення

Тепер ми можемо перейти до суті нашого проекту і реалізувати контролер уявлення. Незважаючи на те, що реалізація є всього один файл, я розділив її на кілька лістингів - щоб спростити пояснення по кожному розділу.

Перший розділ, показаний в лістингу 6 , Охоплює запуск програми та ініціалізацію контролера уявлення.

Лістинг 6. Визначення класу iOSChatClientViewController.m - Початок

#import "iOSChatClientViewController.h" @implementation iOSChatClientViewController @synthesize messageText, sendButton, messageList; - (id) initWithNibName: (NSString *) nibNameOrNil bundle: (NSBundle *) nibBundleOrNil {if ((self = [super initWithNibName: nibNameOrNil bundle: nibBundleOrNil])) {lastId = 0; chatParser = NULL; } Return self; } - (BOOL) shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation) interfaceOrientation {return YES; } - (void) didReceiveMemoryWarning {[super didReceiveMemoryWarning]; } - (void) viewDidUnload {} - (void) dealloc {[super dealloc]; }

Це абсолютно стандартний код iOS. У ньому присутні кілька зворотних викликів для подій системних змінних, таких як попередження пам'яті і звільнення ресурсів. У додатку виробничого рівня з цими елементами можна було б звертатися акуратніше, проте я не хотів надмірно ускладнювати наш навчальний додаток.

Перша реальна задача - це подача запиту GET до скрипту messages.php. Відповідний код показаний в лістингу 7 .

Лістинг 7. Визначення класу iOSChatClientViewController.m - Отримання повідомлень

- (void) getNewMessages {NSString * url = [NSString stringWithFormat: @ "http: //localhost/chat/messages.php? Past =% ld & t =% ld", lastId, time (0)]; NSMutableURLRequest * request = [[[NSMutableURLRequest alloc] init] autorelease]; [Request setURL: [NSURL URLWithString: url]]; [Request setHTTPMethod: @ "GET"]; NSURLConnection * conn = [[NSURLConnection alloc] initWithRequest: request delegate: self]; if (conn) {receivedData = [[NSMutableData data] retain]; } Else {}} - (void) connection: (NSURLConnection *) connection didReceiveResponse: (NSURLResponse *) response {[receivedData setLength: 0]; } - (void) connection: (NSURLConnection *) connection didReceiveData: (NSData *) data {[receivedData appendData: data]; } - (void) connectionDidFinishLoading: (NSURLConnection *) connection {if (chatParser) [chatParser release]; if (messages == nil) messages = [[NSMutableArray alloc] init]; chatParser = [[NSXMLParser alloc] initWithData: receivedData]; [ChatParser setDelegate: self]; [ChatParser parse]; [ReceivedData release]; [MessageList reloadData]; NSInvocation * invocation = [NSInvocation invocationWithMethodSignature: [self methodSignatureForSelector: @selector (timerCallback)]]; [Invocation setTarget: self]; [Invocation setSelector: @selector (timerCallback)]; timer = [NSTimer scheduledTimerWithTimeInterval: 5.0 invocation: invocation repeats: NO]; } - (void) timerCallback {[timer release]; [Self getNewMessages]; }

Код починається з методу getNewMessages. Цей метод створює запит і запускає його за допомогою побудови NSURLConnection. Крім того, він створює буфер, в якому містяться відповідні дані. Різні фази завантаження даних обслуговуються відповідними обработчиками подій: didReceieveResponse, didReceiveData, і connectionDidFinishLoading.

Найважливішим є метод connectionDidFinishLoading - він запускає XML-парсер, який прочитує дані і вибирає повідомлення.

Заключний метод в цьому коді, timerCallback, використовується таймером для запуску запиту нового повідомлення. Після завершення цього таймера викликається метод getNewMessages, який знову запускає процес, що приводить до створення нового таймера, після завершення якого знову запускається процес вилучення повідомлення і т.д.

Наступний розділ, показаний в лістингу 8 , Здійснює розбір XML-контенту.

Лістінг 8. Визначення класу iOSChatClientViewController.m - розбір Повідомлень

- (void) parser: (NSXMLParser *) parser didStartElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI qualifiedName: (NSString *) qName attributes: (NSDictionary *) attributeDict {if ([elementName isEqualToString: @ "message" ]) {msgAdded = [[attributeDict objectForKey: @ "added"] retain]; msgId = [[attributeDict objectForKey: @ "id"] intValue]; msgUser = [[NSMutableString alloc] init]; msgText = [[NSMutableString alloc] init]; inUser = NO; inText = NO; } If ([elementName isEqualToString: @ "user"]) {inUser = YES; } If ([elementName isEqualToString: @ "text"]) {inText = YES; }} - (void) parser: (NSXMLParser *) parser foundCharacters: (NSString *) string {if (inUser) {[msgUser appendString: string]; } If (inText) {[msgText appendString: string]; }} - (void) parser: (NSXMLParser *) parser didEndElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI qualifiedName: (NSString *) qName {if ([elementName isEqualToString: @ "message"]) {[messages addObject: [NSDictionary dictionaryWithObjectsAndKeys: msgAdded, @ "added", msgUser, @ "user", msgText, @ "text", nil]]; lastId = msgId; [MsgAdded release]; [MsgUser release]; [MsgText release]; } If ([elementName isEqualToString: @ "user"]) {inUser = NO; } If ([elementName isEqualToString: @ "text"]) {inText = NO; }}

Цей XML-парсер винен буті зрозумілій кожному, хто Знайомий з технологією SAX. Ві відправляєте в цею парсер будь-якої XML-контент, а ВІН сообщает вам про что відкріваються и закріваються тегах, про знаходження тексту и т.д. Це керований подіями парсер, а не парсер на базі DOM. У парсеров на основі подій є суттєва перевага - вони займають мало місця в пам'яті. Однак у них є і недолік - такі парсери складніше у використанні, оскільки в процесі розбору необхідно зберігати всі стан в хост-об'єкті.

Процес починається з ініціалізації всіх робочих змінних (msgAdded, msgUser, inUser, і inText) за допомогою порожнього рядка або значення false. Потім, у міру запуску кожного тега в методі didStartElement, код дивиться на ім'я тега і встановлює відповідну логічну змінну inUser або inText. Після цього метод foundCharacters обробляє текстові дані, що додаються до відповідного рядка. І, нарешті, метод didEndElement здійснює закриття тега - при знаходженні кінця тега <message> цей метод додає розібране повідомлення до списку повідомлень.

Тепер нам необхідний програмний код для відображення повідомлень. Цей код показаний в лістингу 9

Лістинг 9. Визначення класу iOSChatClientViewController.m - Відображення повідомлень

- (NSInteger) numberOfSectionsInTableView: (UITableView *) tableView {return 1; } - (NSInteger) tableView: (UITableView *) myTableView numberOfRowsInSection: (NSInteger) section {return (messages == nil)? 0: [messages count]; } - (CGFloat) tableView: (UITableView *) tableView heightForRowAtIndexPath: (NSIndexPath *) indexPath {return 75; } - (UITableViewCell *) tableView: (UITableView *) myTableView cellForRowAtIndexPath: (NSIndexPath *) indexPath {UITableViewCell * cell = (UITableViewCell *) [self.messageList dequeueReusableCellWithIdentifier: @ "ChatListItem"]; if (cell == nil) {NSArray * nib = [[NSBundle mainBundle] loadNibNamed: @ "ChatListItem" owner: self options: nil]; cell = (UITableViewCell *) [nib objectAtIndex: 0]; } NSDictionary * itemAtIndex = (NSDictionary *) [messages objectAtIndex: indexPath.row]; UILabel * textLabel = (UILabel *) [cell viewWithTag: 1]; textLabel.text = [itemAtIndex objectForKey: @ "text"]; UILabel * userLabel = (UILabel *) [cell viewWithTag: 2]; userLabel.text = [itemAtIndex objectForKey: @ "user"]; return cell; }

У лістингу 9 представлені методи, задані інтерфейсами UITableViewDataSource і UITableViewDelegate. Найважливішим є метод cellForRowAtIndexPath, який створює спеціальний інтерфейс користувача для елемента list і заповнює його текстові поля відповідним текстом для поточного повідомлення.

Цей користувальницький елемент list задається в новому файлі ChatListItem.xib, який ми повинні створити в папці Resources. У цьому файлі ми створимо новий елемент UITableViewCell, що має дві мітки (1 і 2). Цей файл міститься в пропонованому для завантаження проекті разом з усім іншим програмним кодом (див. Розділ Завантаження ).

Код в методі cellForRowAtIndexPath призначає одну з комірок ChatListItem, а потім налаштовує текстове поле для міток даного тексту і для призначених для користувача значень, які ми знайшли для зазначеного повідомлення.

Отже, ми майже досягли фінішу. У нас вже є код для запуску уявлення, для отримання XML-повідомлення, для розбору цього повідомлення і для його відображення. Нам залишається лише написати код, який буде відсилати повідомлення.

Спочатку необхідно створити настройку для імені користувача. Додатки iOS дозволяють задавати призначені для користувача настройки, які відображаються на панелі управління Settings. За допомогою майстра New File створіть в папці Resources пакет налаштувань. Потім поверніть його до єдиного параметра настройки за допомогою редактора налаштувань, показаного на малюнку 7 .

Малюнок 7. Встановлення параметрів

Тепер дайте цим параметром настройки ім'я User і ключ user_preference. Після цього ви можете використовувати цю настройку при отриманні імені користувача для коду, що відсилає повідомлення (див. лістинг 10 ).

Лістинг 10. Визначення класу iOSChatClientViewController.m - Відсилання повідомлення

- (IBAction) sendClicked: (id) sender {[messageText resignFirstResponder]; if ([messageText.text length]> 0) {NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults]; NSString * url = [NSString stringWithFormat: @ "http: //localhost/chat/add.php"]; NSMutableURLRequest * request = [[[NSMutableURLRequest alloc] init] autorelease]; [Request setURL: [NSURL URLWithString: url]]; [Request setHTTPMethod: @ "POST"]; NSMutableData * body = [NSMutableData data]; [Body appendData: [[NSString stringWithFormat: @ "user =% @ & message =% @", [defaults stringForKey: @ "user_preference"], messageText.text] dataUsingEncoding: NSUTF8StringEncoding]]; [Request setHTTPBody: body]; NSHTTPURLResponse * response = nil; NSError * error = [[[NSError alloc] init] autorelease]; [NSURLConnection sendSynchronousRequest: request returningResponse: & response error: & error]; [Self getNewMessages]; } MessageText.text = @ ""; } - (void) viewDidLoad {[super viewDidLoad]; messageList.dataSource = self; messageList.delegate = self; [Self getNewMessages]; } @end

Це код обробника натискань для кнопки Send Message. Він створює запит NSMutableURLRequest, що має URL-адресу для скрипта add.php. Потім він представляє тіло повідомлення у вигляді рядка, в якій дані користувача і повідомлення закодовані в форматі POST. Після цього описуваний код використовує NSURLConnection для синхронної пересилання даних повідомлення на сервер і запускає витяг повідомлення за допомогою getNewMessages.

Виклик метод viewDidLoad, показаного у нижній частині лістингу 10, здійснюється при завантаженні уявлення. Він запускає процес вилучення повідомлення і пов'язує список повідомлень з цим об'єктом, завдяки чому список повідомлень «знає», звідки отримувати відповідні дані.

Отже, ми завершили створення програмного коду. Тепер прийшов час протестувати наш додаток. Почнемо з завдання імені користувача на сторінці Settings (див. рисунок 8 ).

Малюнок 8. Сторінка Settings

Натисніть на назву програми iOSChatClient, буде відображена сторінка його параметрів настройки (див. рисунок 9 ).

Малюнок 9. Завдання імені користувача

Тепер повернемося до додатка і введемо повідомлення за допомогою імітатора клавіатури телефону (див. рисунок 10 ).

Малюнок 10. Введення нового повідомлення

Після натискання на кнопку Send ми побачимо, що повідомлення пішло на сервер, потім було відправлено, і, нарешті, повернулося з messages.php (див. рисунок 11 ).

Малюнок 11. Додаток інтерактивної листування готове

При розгляді програмного коду можна помітити відсутність безпосереднього зв'язку між кнопкою Send і списком повідомлень. Таким чином, єдиний спосіб попадання повідомлення в список - це його проходження через сервер, який успішно вставить відповідні дані в базу даних. Потім код message.php успішно поверне це повідомлення з метою його відображення в списку повідомлень.

Висновок

Ви багато чому навчилися з цієї статті. Ви виконали певну роботу з XML-контентом бази даних на серверному компоненті. Ви створили iOS-додаток з індивідуалізованим призначеним для користувача інтерфейсом, який відсилає дані на сервер і отримує дані з сервера. Ви застосували XML-парсер для розбору XML-відповіді від сервера. І, нарешті, ви створили власний елемент list для призначеного для користувача інтерфейсу, щоб зробити вигляд повідомлень більш привабливим.

Тепер ви можете самостійно вибрати напрямок своєї подальшої діяльності. Компанія Apple надала вам інструменти для реалізації будь-яких ідей для iPhone або iPad. Крім того, ця стаття показала вам, як створювати власні мережеві додатки. Я настійно рекомендую вам скористатися отриманими знаннями на практиці. Якщо ви дійсно створите щось видатне, будь ласка, повідомте мені про це. Я обов'язково перевірю ваш продукт і розміщу його на ресурсі App Store.

Ресурси для скачування

Схожі тими

  • Оригінал статті: Building an iPhone chat app from the ground up . (EN)
  • Портал Apple для розробників. Отримайте інтегроване середовище розробки, Ініціалізуйте тестові пристрої і завантажте свої готові програми в сховище. (EN)
  • бібліотека iOS Reference Library . Цей прекрасний онлайновий ресурс містить вичерпну інформацію про наявні інструменти iOS. (EN)
  • Web-сайт PHP : Найкращий з наявних ресурсів по PHP. (EN)
  • Web-сайт W3C . Чудовий Web-сайт за стандартами, зокрема з стандарту XML , Має безпосереднє відношення до цієї статті. (EN)
  • Документація Apple за мовою Objective-C. Вдосконалить свої знання за унікальним синтаксису мови Objective-C. (EN)
  • Інші статті цього автора. (Jack Herrington, developerWorks, з березня 2005 р до теперішнього часу): статті з технологій Ajax, JSON, PHP, XML і т.д. (EN)
  • Сертифікація IBM по XML. Дізнайтеся, як отримати сертифікат IBM-Certified Developer in XML (сертифікований корпорацією IBM розробник по XML і пов'язаних технологій). (EN)
  • Ознайомчі версії продуктів IBM. Завантажте ознайомлювальні версії програмних продуктів IBM або скористайтеся їх онлайновими ознайомчими версіями на ресурсі IBM SOA Sandbox і придбайте досвід роботи з інструментами розробки додатків і продуктами сполучного рівня сімейств DB2®, Lotus®, Rational®, Tivoli®, and WebSphere®. (EN)
  • Подкасти ресурсу developerWorks. Слухайте інтерв'ю та дискусії для розробників ПЗ. (EN)

Підпишіть мене на повідомлення до коментарів

З чого почати?
ORDER BY added LIMIT 50'); } Else {$ result = mysql_query ( 'SELECT * FROM chatitems ORDER BY added LIMIT 50'); }?
Gt; <Chat> <?
Php while ($ row = mysql_fetch_assoc ($ result)) {?
Gt; <Message added = "<?
Php echo ($ row [ 'added'])?
Gt;" Id = "<?
Php echo ($ row [ 'id'])?
Gt; "> <user> <?
Php echo (htmlentities ($ row [ 'user']))?

Дополнительная информация

rss
Карта