TÓM TẮT NỘI DUNG ĐỒ ÁN TỐT NGHIỆPNhận thức được nhu cầu tìm kiếm thông tin trên di động, hệ thống cổng thông tin di động Mobile Portal đã ra đời và bắt đầu đi vào hoạt động. Mobile Portal sử dụng công nghệ tìm kiếm của máy tìm kiếm Socbay (trang chủ www.socbay.com) được phát triển bởi Công ty Cổ phần dịch vụ công nghệ thông tin Naiscorp với khả năng đem lại cho người dùng những thông tin đã được sàng lọc, lựa chọn và chuẩn hóa riêng cho thiết bị di động.
Trọng tâm của đồ án xin trình bày thành phần client của hệ thống Mobile Portal - Ứng dụng Petto được phát triển trên nền tảng iPhone. Các phần chính của báo cáo:
Phần 1: Nền tảng công nghệ
Chương 1: Tìm hiểu về môi trường lập trình trên di động, tổng quan về lập trình iPhone. Giới thiệu ngôn ngữ, công cụ lập trình. Tìm hiểu lập trình mạng, mutithread, core audio.
Chương 2: Đưa ra mô hình tổng quan về cổng thông tin tìm kiếm trực tuyến. Từ đó đưa ra ứng dụng mà đồ án xây dựng là “xây dựng ứng dụng tìm kiếm đa phương tiện trên điện thoại iPhone” – thành phần đóng vai trò client trong mô hình.
Phần 2: Xây dựng chương trình
Chương 3: Giới thiệu các loại ứng dụng trên iPhone, phát biểu bài toán cần giải quyết.
Chương 4: Xây dựng các dịch vụ tìm kiếm đa phương tiện. Phân tích, thiết kế ứng dụng.
mỤC lỤC
PHIẾU GIAO NHIỆM VỤ ĐỒ ÁN TỐT NGHIỆP 1
TÓM TẮT NỘI DUNG ĐỒ ÁN TỐT NGHIỆP 3
DANH MỤC HÌNH 7
DANH MỤC BẢNG 8
LỜI NÓI ĐẦU 9
PHẦN I: NỀN TẢNG CÔNG NGHỆ 10
CHƯƠNG 1: TÌM HIỂU MÔI TRƯỜNG LẬP TRÌNH TRÊN IPHONE 10
1.1 Tổng quan về lập trình trên di động. 10
1.1.1 Thị trường lập trình trên di động. 10
1.1.2. Những khó khăn khi lập trình cho di động. 11
1.2 Tổng quan về lập trình iPhone. 12
1.2.1 Giới thiệu về iPhone. 12
1. Cuộc cách mạng về công nghệ trên điện thoại di động mang tên iPhone 12
2. Giới hạn của iPhone. 14
1.2.2 Các nền tảng phát triển di động hứa hẹn trong năm 2010. 14
1.2.3. Môi trường lập trình iPhone. 16
1.2.4. iPhone SDK: 16
1. Phân tích một ứng dụng: 16
2. Cài đặt iPhone SDK: 20
3. iPhone Simulator: 22
1.2.5 Xcode. 23
1.Mô hình MVC ( Model - View - Controller). 23
2. Các template thường dùng. 24
3. Sự bố trí của một project trong Xcode. 24
1.2.6 Interface Builder. 26
1. Mở Interface Builder: 26
2. Tạo file Interface Builder. 26
3. Cửa sổ tài liệu. 29
1.3 Công cụ lập trình. 32
1.3.1 Ngôn ngữ Objective-C 32
1. Lịch sử của ngôn ngữ Objective-C 32
2. Lớp, đối tượng và thông điệp. 33
3. Định nghĩa một lớp. 37
1.3.4 Lập trình mạng. 43
1. Tổng quan: 43
2. Lập trình mạng với CFNetwork. 44
1.3.5 MultiThreading. 54
1. Về lập trình thread. 54
2. Quản lý thread. 61
3. Run loop. 66
1.3.6. Core Audio. 70
1. Core Audio là gì?. 71
2. Cơ bản về Core Audio. 73
CHƯƠNG 2: TỔNG QUAN VỀ HỆ THỐNG TÌM KIẾM MOBILE PORTAL 79
2.1 Hệ thống Mobile Portal 79
2.2 Máy tìm kiếm Socbay (Socbay Search Engine). 80
2.3.1. Thu thập dữ liệu cho các dịch vụ. 81
2.3.2 Phân tích truy vấn ngắn dựa trên thói quen người dùng. 82
2.4 Tầng giao diện di động (Mobile Interface). 82
2.4.1 Quá trình chuẩn hóa dữ liệu cho thiết bị di động: 83
2.4.2 Thiết kế module kết nối tại client và server. 84
2.5 Ứng dụng Petto. 84
PHẦN II: XÂY DỰNG CHƯƠNG TRÌNH 85
CHƯƠNG 3: ỨNG DỤNG TRÊN IPHONE 85
3.1 Các loại ứng dụng trên iPhone. 85
3.2 Phát biểu bài toán. 85
CHƯƠNG 4: XÂY DỰNG CÁC DỊCH VỤ TÌM KIẾM ĐA PHƯƠNG TIỆN DỰA TRÊN MÁY TÌM KIẾM SOCBAY 87
4.1 Xác định yêu cầu hệ thống:. 87
4.2 Đặc tả user case:. 88
4.2.1. Tin tức. 88
4.2.2. Đọc truyện. 89
4.2.3. Địa điểm 90
4.2.4. Cẩm nang tư vấn. 91
4.2.5. Hình ảnh. 92
4.2.6. Nhạc MP3. 93
4.3 Các vấn đề kỹ thuật, thuật toán. 94
4.3.1. Việc kết nối, truyền nhận dữ liệu giữa client và server: 94
4.3.2. Hiển thị 95
4.3.3. MP3 streaming. 96
4.4 Thiết kế giao diện:. 98
4.4.1. Giao diện chính: 98
4.4.2. Dịch vụ Tin Tức: 99
4.4.3. Dịch vụ Truyện: 99
4.4.4. Dịch vụ Địa Điểm: 100
4.4.5. Dịch vụ Cẩm Nang Tư Vấn: 100
4.4.6. Dịch vụ Hình Ảnh: 101
4.4.7. Dịch vụ Nhạc MP3: 101
4.5 Thiết kế lớp:. 102
4.5.1. Tầng Cocoa Touch Application. 102
1. Lớp ứng dụng: 102
2. Dịch vụ Tin Tức: 104
3. Dịch vụ nhạc MP3. 106
4.5.2. Tầng Mobile Interface: 107
4.5.3. Quan hệ giữa tầng Mobile Interface và Cocoa Touch Application: 108
TỔNG KẾT ĐÁNH GIÁ 109
1. Một số kết quả đạt được. 109
2 Nhược điểm 109
3 Hướng phát triển:. 110
TÀI LIỆU THAM KHẢO 111
LỜI NÓI ĐẦUĐồ án tốt nghiệp này đã được hoàn thành sau một thời tìm hiểu, xây dựng tại Công ty Cổ phần dịch vụ công nghệ thông tin Naiscorp. Ngoài sự cố gắng và nỗ lực của bản thân, còn có sự giúp đỡ của nhiều người để em có thể hoàn thành được đồ án như ngày nay.
Trước hết, em xin được gửi lời cảm ơn sâu sắc đến ThS Lương Mạnh Bá - Bộ môn Công nghệ phần mềm, Viện Công nghệ Thông tin và Truyền thông, trường Đại học Bách Khoa Hà Nội đã hết lòng giúp đỡ, định hướng và chỉ dạy tận tình giúp em vượt qua những khó khăn trong quá trình em làm đồ án tốt nghiệp.
Em xin được gửi lời cảm ơn tới các thầy cô giáo trong trường Đại học Bách Khoa Hà Nội nói chung và các thầy cô trong viện Công nghệ Thông tin và Truyền thông, Bộ môn Công nghệ phần mềm nói riêng đã tận tình giảng dạy, truyền đạt cho em những kiến thức, những kinh nghiệm quý báu trong suốt 5 năm học tập và rèn luyện tại trường Đại học Bách Khoa Hà Nội.
Ngoài ra, em cũng xin gửi lời cảm ơn đến anh Nguyễn Xuân Tài, anh Mai Đình Thắng và các anh chị em công ty Naiscorp đã tạo điều kiện để em có thể hoàn thành sản phẩm và cũng là đồ án của mình.
111 trang |
Chia sẻ: lvcdongnoi | Lượt xem: 2849 | Lượt tải: 3
Bạn đang xem trước 20 trang tài liệu Xây dựng ứng dụng tìm kiếm đa phương tiện trên điện thoại iPhone, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Thread:
- Sử dụng hàm detachNewThreadSelector: toTarget: withObject
- Tạo một đối tượng NSThread và gọi hàm start
Cả hai kỹ thuật đều tạo ra một thread tách biệt trong ứng dụng. Một thread tách biệt nghĩa là tài nguyên của thread sẽ được tự động phát hiện và sử dụng bởi hệ thống khi thread đó còn tồn tại. Nó cũng có nghĩa là code của lập trình viên sẽ không tác động vào thread đó được nữa.
Vì phương thức detachNewThreadSelector: toTarget: withObject: được hỗ trợ trong tất cả các phiên bản của Mac OS X, nó được sử dụng rất phổ biến trong các ứng dụng Cocoa có sử dụng thread. Để detach một thread mới, chỉ cần cung cấp tên của phương thức (xác định bởi selector) muốn sử dụng như là điểm vào của thread, đối tượng định nghĩa phương thức đó, và các dữ liệu muốn truyền vào thread lúc khởi động.
Ví dụ như tạo một thread chạy hàm myThreadMainMethod của chính đối tượng hiện tại, không truyền dữ liệu cho thread hết
[NSThread detachNewThreadSelector:@selector(myThreadMainMethod:) toTarget:self withObject:nil];
Trước Mac OS X v10.5, lớp NSThread được sử dụng để tạo ra thread. Mặc dù có thể nhận được một đối tượng NSThread và truy cập một số thuộc tính của thread, nhưng điều đó chỉ có thể làm được trong bản thân thread khi nó đã chạy. Trong OS X v10.5 Mac bổ sung hỗ trợ đã làm cho nó có thể làm và thiết lập các thuộc tính khác nhau thread trước khi bắt đầu thread này. Nó cũng làm cho nó có thể sử dụng đối tượng thread để tham chiếu tới thread sau đó.Cách đơn giản để khởi tạo một đối tượng NSThread trong Mac OS X v10.5 và sau đó là sử dụng phương thức initWithTarget: selector: object. Phương thức này có những thông tin chính xác giống như phương thức detachNewThreadSelector: toTarget: withObject và sử dụng nó để khởi tạo một thể hiện NSThread mới. Nhưng hàm này không start một thread. Để start thread, phải gọi hàm start của đối tượng thread như trong ví dụ sau:
NSThread* myThread = [[NSThread alloc] initWithTarget:self
selector:@selector(myThreadMainMethod:)
object:nil];
[myThread start]; // Actually create the thread
Để gửi thông điệp tới một thread đang chạy có thể sử dụng phương thức performSelector: onThread: withObject: waitUntilDone. Phương thức này là phương thức trong hầu hết đối tượng của Cocoa. Phương thức này mới được giới thiệu từ Mac OS X v10.5 và là cách thuận tiện để liên lạc giữa các thread.
*Sử dụng POSIX Thread:
Trong Mac OS X và iPhone OS có thể tạo thread dựa trên ngôn ngữ C bằng cách sử dụng API thread POSIX. Công nghệ này thực sự có thể được sử dụng trong bất kỳ loại ứng dụng nào (bao gồm cả Cocoa và các ứng dụng Cocoa Touch) và sẽ thuận tiện hơn nếu dự định viết phần mềm cho nhiều nền tảng khác nhau. Khi POSIX rountine sử đụng để tạo thread: pthread_create.
* Sử dụng NSObject:
Trong hệ điều hành iPhone và kể từ Mac OS X v10.5, tất cả các đối tượng có khả năng tạo một thread mới và sử dụng nó để thực hiện một phương thức của mình. Phương thức performSelectorInBackground: withObject tạo ra một thread tách biệt mới.
Ví dụ, đối tượng myObj có phương thức doSomething mà muốn chạy ở thread ngầm, có thể sử dụng đoạn code sau:
[myObj performSelectorInBackground:@selector(doSomething) withObject:nil];
Phương thức này có tác dụng giống như phương thức detachNewThreadSelector: toTarget: withObject của lớp NSThread với đối tượng, selector, tham số hiện tại. Thread ngay lập tức được cấu hình mặc định và bắt đầu chạy.
d. Cấu hình các thuộc tính của thread
Sau khi tạo ra một thread, người lập trình có thể cấu hình lại môi trường thread.
* Kích thước stack của thread:
Đối với mỗi thread mới được tạo ra, hệ thống cấp phát một lượng bộ nhớ trong không gian tiến trình để hoạt động như là ngăn xếp của thread đó. Ngăn xếp quản lý stack frame và các biến địa phương của thread đã được khai báo.
Nếu muốn thay đổi kích thước ngăn xếp của một thread nhất định, phải làm như vậy trước khi tạo các thread. Tất cả các công nghệ lập trình thread đều cung cấp một số cách thiết lập kích thước stack mặc dù thiết lập kích thước stack sử dụng NSThread chỉ có sẵn trong hệ điều hành iPhone và Mac OS X kể từ vesion v10.5 trở về sau. Bảng sau liệt kê các tùy chọn khác nhau cho mỗi công nghệ.
Công nghệ
Tùy chọn
Cocoa
Tạo một đối tượng NSThread (không sử dụng hàm detachNewThreadSelector: toTarget: withObject). Trước khi gọi hàm start, sử dụng hàm setStackSize để thiết lập kích thước stack mới
POSIX
Tạo một cấu trúc pthread_attr_t và sử dụng hàm pthread_attr_setstacksize để đổi kích thước mặc định của stack. Truyền tham số vào hàm pthread_create khi tạo thread
Dịch vụ đa tiến trình
Truyền kích thước stack vào hàm MPCreateTask khi tạo thread.
Bảng 1.9 Cấu hình thread
* Bộ lưu trữ địa phương của thread
Mỗi thread duy trì một từ điển cặp khóa - giá trị có thể được truy cập từ bất cứ nơi nào trong thread này. Từ điển này cũng có thể được sử dụng để lưu trữ các thông tin tùy biến tồn tại suốt quá trình thực hiện thread.
Cocoa và POSIX lưu trữ từ điển của thread theo những cách khác nhau, nên không thể trộn và kết hợp các lời gọi đến hai công nghệ. Trong Cocoa, sử dụng phương thức threadDictionary của đối tượng NSThread để lấy nhận được đối tượng NSMutableDictionary. Từ đó có thể thêm bất kỳ khóa nào vào trong thread của mình. Trong POSIX, sử dụng chức năng pthread_setspecific và pthread_getspecific để thiết lập và nhận được chìa khóa và giá trị của thread.
* Thiết lập priority của thread:
Với đối tượng NSThread của Cocoa sử dụng hàm setThreadPriority.
Với POSIX thread, sử dụng hàm pthread_setschedparam.
e. Viết thread entry rountine
* Tạo Autorelease Pool:
Các ứng dụng xây dựng trên các framework của Objective-C thường phải tạo ít nhất một autorelease pool cho mỗi thread của mình. Nếu một ứng dụng sử dụng mô hình quản lý, nơi mà ứng dụng xử lý sự giữ lại và giải phóng các đối tượng - autorelease pool giữ tất cả các đối tượng được tự động giải phóng từ thread đó.
Nếu viết ứng dụng sử dụng mô hình quản lý bộ nhớ, tạo ra một autorelease pool là điều đầu tiên phải làm trong thread entry routine. Tương tự như vậy, hủy autorelease pool này là điều cuối cùng làm trong thread. Autorelease pool đảm bảo rằng các đối tượng đã tự giải phóng được bắt lại, mặc dù nó không giải phóng chúng cho đến khi thread tự thoát.
Bởi vì các autorelease ở cấp cao nhất không được giải phóng các đối tượng của nó cho đến khi thread thoát ra, các thread có thời gian tồn tại dài nên tạo thêm autorelease pool để giải phóng các đối tượng thường xuyên hơn. Giải phóng các đối tượng thường giúp cho bộ nhớ của ứng dụng không bị phình ra quá lớn.
*Thiết lập bộ quản lý ngoại lệ:
Nếu ứng dụng bắt và xử lý các trường hợp ngoại lệ, mã thread cần được chuẩn bị để đón bất kỳ trường hợp ngoại lệ có thể xảy ra. Mặc dù tốt nhất để xử lý các trường hợp ngoại lệ là ngay ở điểm nó có thể xảy ra, Không bắt được ngoại lệ trong thread có thể khiến ứng dụng bị thoát ra. Cài đặt một final try/catch trong thread entry routine cho phép nắm bắt bất kỳ trường hợp ngoại lệ nào và đưa ra một phản ứng thích hợp.
*Thiết lập một run loop
Có 2 lựa chọn để chạy các thread riêng biệt. Lựa chọn đầu tiên là viết mã cho một thread như là một tách vụ lâu dài sẽ được thực hiện với sự gián đoạn ít hoặc không có, và thread thoát ra khi tác vụ này hoàn thành. Lựa chọn thứ hai là đưa thread của bạn vào một vòng lặp và có yêu cầu quá trình tự động khi nhận được. Lựa chọn đầu tiên không yêu cầu cài đặt đặc biệt gì trong code. Với lựa chọn thứ hai, cần phải thiết lập một run loop cho thread.
Mac OS X và hệ điều hành iPhone cung cấp built-in support để thực thi run loop trong mỗi thread. Ca cao, Carbon, và UIKit bắt đầu run loop của main thread một cách tự động, nhưng nếu tạo ra bất kỳ một thread thứ cấp nào, người lập trình phải tự thiết lập run loop và tự mở nó.
f. Kết thúc một thread
3. Run loop
Run loop là một phần của cơ sở hạ tầng cơ bản liên quan đến thread. Một run loop là một vòng lặp xử lý sự kiện được sử dụng để lên lịch làm việc và phối hợp các sự kiện vào. Mục đích của run loop là giữ thread bận rộn khi có những việc cần làm và đưa thread vào trạng thái sleep khi không có gì để làm.
Run loop quản lý không hoàn toàn tự động. Lập trình viên vẫn phải thiết kế code cho thread để bắt đầu run loop vào các thời điểm thích hợp và đáp ứng với các sự kiện đến. Cả hai Cocoa và Core Foundation đều cung cấp đố các đối tượng run giúp cấu hình và quản lý các run loop. Một ứng dụng mới không cần phải tạo ra các đối tượng này một cách rõ ràng, mỗi thread, bao gồm thread chính của ứng dụng, đều có quan hệ với một run loop. Chỉ những thread thứ cấp mới cần chạy run loop một cách rõ ràng. Trong cả hai ứng dụng Carbon và Cocoa, các thread chính sẽ tự động thiết lập và chạy run loop của nó như là một phần của quá trình khởi động ứng dụng nói chung.
a. Anatomy of a Run Loop
Run loop là một vòng lặp thread đưa vào để chạy bộ xử lý sự kiện nhằm mục đích phản ứng lại các sự kiện đến. Phần code của lập trình viên chứa các câu lệnh điều khiển để thực thi phần vòng lặp thực sự của run loop - nói cách khác, phần code này cung cấp vòng lặp while hay for dùng để điều khiển run loop. Trong vòng lặp, sử dụng một đối tượng run loop để "chạy" phần code xử lý sự kiện và gọi bộ xử lí đã được cài đặt.Run loop nhận các sự kiện từ hai loại nguồn khác nhau. Nguồn input cung cấp các sự kiện không đồng bộ, thông thường là các thông điệp từ thread hoặc ứng dụng khác. Nguồn timer cung cấp các sự kiện đồng bộ, xảy ra tại một thời điểm theo lịch trình hoặc một khoảng thời gian lặp đi lặp lại. Cả hai loại nguồn sử dụng một application - specific handler routine để xử lý sự kiện khi nó đến.Hình sau cho thấy cấu trúc lý thuyết của một run loop và các nguồn của nó. Các nguồn input cung cấp các sự kiện không đồng bộ cho các bộ xử lý tương ứng và vọi phương thức runUntilDate: để thoát ra. Nguồn timer cung cấp các sự kiện để thói quen xử lý ọ, nhưng không làm run loop thoát ra.
Hình 1.14 Cấu trúc và nguồn của runloop
Ngoài việc xử lý nguồn đầu vào, run loop cũng tạo ra các thông báo về hành vi của mình. Bộ quan sát các run loop đã đăng ký có thể nhận được những thông báo này và dùng chúng để bổ sung các xử lý cho thread. Sử dụng Core Foundation để cài đặt bộ quan sát các run loop đã đăng ký cho thread.
b. Các kiểu run loop:
Kiểu run loop là tập hợp các nguồn input và timer được theo dõi và thu thập bởi bộ quan sát run loop. Mỗi lần chạy run loop, phải chỉ rõ kiểu run loop. Trong suốt quá trình chạy, chỉ các nguồn liên quan tới kiểu đó mới được theo dõi và cho phép nhận sự kiện. (Tương tự như vậy, bộ quan sát chỉ có liên quan tới kiểu được thông báo về tiến trình của run loop) Nguồn thuộc các kiểu khác giữ các sự kiện mới cho đến khi được truyền cho một vòng lạp ở kiểu tương ứng.
Cocoa và Core Foundation xác định một chế độ mặc định và một số chế độ thường dùng được biểu diễn bằng một chuỗi.
Các kiểu run loop
Kiểu
Tên
Mô tả
Mặc định
NSDefaultRunLoopMode (Cocoa)
kCFRunLoopDefaultMode (Core Foundation)
Kiểu mặc định là kiểu được sử dụng nhiều nhất.
Kết nối
NSConectionReplyMode (Cocoa)
Cocoa sử dụng chế độ này kết hợp với các đối tượng NSConnection để theo dõi các trả lời.
Modal
NSModalPanelRunLoopMode (Cocoa)
Cocoa sử dụng chế độ này để định nghĩa các sự kiện dành cho modal panel.
Theo dấu sự kiện
NSEventTrackingRunLoopMode (Cocoa)
Cocoa sử dụng chế độ này để giới hạn các sự kiện trong suốt quá trình kéo chuột .
Chế độ thông dụng
NSRunLoopCommonModes (Cocoa)
kCFRunLoopCommonModes (Core Foundation)
Chế độ thường dùng
Bảng 1.10 Các chế độ run loop
c. Khi nào thì sử dụng run loop
Chỉ khi tạo ra các thread thứ cấp trong ứng dụng thì mới cần chạy run loop một cách rõ ràng. Run loop cho thread chính của ứng dụng là một phần cơ sở hạ tầng quan trọng. Cả Cocoa và Carbon cung cấp mã chạy vòng lặp chính của ứng ụng và start vòng lặp đó tự động. Hàm run của UIApplication trong hệ điều hành iPhone (hoặc NSApplication trong Mac OS X) bắt đầu vòng lặp chính của ứng dụng như một phần của trình tự khởi động bình thường. Tương tự như vậy, hàm RunApplicationEventLoop bắt đầu vòng lặp chính cho các ứng dụng Carbon. Nếu bạn sử dụng các project template của Xcode để tạo ra các ứng dụng của bạn, bạn không bao giờ phải gọi các hàm này.
Đối với thread thứ cấp, lập trình viên cần phải quyết định khi nào run loop cần thiết và nếu cần thì phải tự cấu hình và start nó. Không cần phải start run loop của thread trong mọi trường hợp. Ví dụ: nếu bạn sử dụng một thread để thực hiện một số tác vụ dài hạn và đã định trước, bạn có thể tránh start run loop. Run loop được dành cho các tình huống khi muốn tương tác nhiều hơn với thread. Ví dụ, bạn cần phải start một run loop định làm bất cứ điều gì sau đây:
- Sử dụng cổng hay các nguồn đầu vào tùy biến để giao tiếp với các thread khác
- Sử dụng timer trên thread
- Sử dụng bất kì một phương thức performSelector … nào của Cocoa
- Giữ cho thread thực thi một tác vụ định kỳ nào đó.
d. Sử dụng đối tượng run loop
Một đối tượng run loop cung cấp giao diện chính cho việc thêm các nguồn input, timer và bộ quan sát run loop để chạy no. Mỗi thread có một đối tượng run loop duy nhất liên kết với nó. Trong Cocoa, đối tượng này là một thể hiện của lớp NSRunLoop. Trong ứng dụng Carbon hay BSD, nó là một con trỏ trỏ tới CFRunLoopRef.
* Lấy ra đối tượng run loop
Để nhận được đối tượng run loop từ thread hiện tại, có thể sử dụng một trong các cách sau:
- Trong ứng dụng Cocoa, sử dụng hàm currentRunLoop của lớp NSRunLoop để nhận về đối tượng NSRunLoop
- Sử dụng hàm CFRunLoopGetCurrent
Tuy nhiên, có thể nhận được đối tượng CFRunLoopRef từ đối tượng NSRunLoop khi cần thiết thông qua hàm getCFRunLoop của lớp NSRunLoop. Bởi cả 2 đối tượng đều chỉ đến 1 run loom nên có thể kết hợp cả 2 cách gọi tới đối tượng NSRunLoop và CFRunLoopRef khi cần thiết.
*Cấu hình một run loop
Trước khi chạy run loop trên thread thứ cấp, việc đầu tiên cần làm là phải thêm vào ít nhất một nguồn input hoặc timer cho nó. Nếu run loop không có bất cứ nguồn nào để theo dõi, nó sẽ ngay lập tức thoát ra khi lập trình viên cố gắng chạy nó.
Ngoài việc cài đặt nguồn cho run loop, lập trình viên cần phải cài đặt bộ giám sát run loop và dùng nó để phát hiện ra các trạng thái hoạt động khác nhau của run loop.Để cài đặt một bộ giám sát run loop, tạo một đối tượng CFRunLoopObserverRef và sử dụng hàm CFRunLoopAddObserver để add nó vào run loop của mình.
1.3.6. Core Audio
Core Audio cung cấp giao diện phần mềm để thực hiện các tính năng âm thanh trong các ứng dụng của hệ điều hành iPhone và Mac OS X. Core Audio xử lý tất cả các khía cạnh liên quan tới âm thanh trên mỗi nền tảng này. Trong hệ điều hành iPhone, khả năng của Core Audio bao gồm ghi âm, phát lại, hiệu ứng âm thanh, định vị, chuyển đổi định dạng, và phân tích file stream, cũng như là:
- Một equalizer và mixer tích hợp sẵn mà người dùng có thể sử dụng trong các ứng dụng của mình
- Truy cập tự động vào thiết bị vào / ra âm thanh
- Là một API quản lý các khía cạnh âm thanh của các ứng dụng trên thiết bị có thể nhận các cuộc gọi
- Tối ưu hóa để kéo dài tuổi thọ pin mà không ảnh hưởng tới chất lượng âm thanh
Core Audio kết hợp giao diện lập trình C và Objective-C với tích hợp hệ thống, kết quả trong một môi trường lập trình linh hoạt có thể duy trì độ trễ thấp thông qua các chuỗi tín hiệu. Trong hệ điều hành iPhone, bạn sử dụng Core Audio trong ứng dụng Cocoa Touch. Trong Mac OS X, bạn có thể sử dụng Core Audio trong ứng dụng C, Objective-C, hoặc C + +.
1. Core Audio là gì?
Core Audio là cơ sở hạ tầng âm thanh kỹ thuật số của iPhone OS và Mac OS X. Nó bao gồm một tập các framework được thiết kế để xử lý các nhu cầu âm thanh trong ứng dụng của bạn.
Core Audio được tích hợp chặt chẽ vào hệ điều hành iPhone và Mac OS X nhằm đạt hiệu năng cao và độ trễ thấp.
Trong Mac OS X, phần lớn các dịch vụ Core Audio được xếp là tầng trên của layer trừu tượng của phần cứng (Hardware Abstraction Layer - HAL) như trong hình dưới. Tín hiệu âm thanh vượt qua đến và đi từ phần cứng thông qua HAL. Có thể truy cập HAL sử dụng Các dịch vụ phần cứng âm thanh (Audio Hardware Services) của Core Audio framework khi yêu cầu âm thanh thời gian thực. Framework Core MIDI (Musical Instrument Digital Interface) cung cấp giao diện tương tự để làm việc với dữ liệu và thiết bị MIDI.
Hình 1.15 Kiến trúc Core Audio của Mac OS X
2 framework Audio Toolbox và Audio Unit chứa các dịch vụ ở mức ứng dụng của Core Audio:
- Audio Queue Service: để ghi âm, phát lại, tạm dừng, lặp, và đồng bộ hóa âm thanh.
- Sử dụng Audio File, Converter, Codec Services để đọc và ghi lên đĩa và để thực hiện biến đổi định dạng dữ liệu âm thanh.. Trong Mac OS X lập trình viên cũng có thể tự tạo ra các codec của riêng mình.
- Sử dụng Audio Unit Services và Audio Processing Graph Services (đại diện trong hình là "Audio Unit") để lưu trữ các đơn vị âm thanh (audio plug-in) trong ứng dụng. Trong Mac OS X, cũng có thể tạo ra các đơn vị âm thanh tùy chỉnh để sử dụng trong các ứng dụng hoặc cung cấp để sử dụng trong các ứng dụng khác.
- Sử dụng Music Sequencing Services để chơi dữ liệu âm nhạc dựa trên MIDI.
- Sử dụng Core Audio Clock Services cho sự động bộ hóa âm thanh và MIDI và quản lý định dạng thời gian.
- Sử dụng System Sound Services (đại diện trong hình là "System sounds") để phát âm thanh hệ thống và hiệu ứng âm thanh.
Core Audio trong hệ điều hành iPhone được tối ưu hóa cho các tài nguyên máy tính có sẵn trong một nền tảng di động chạy bằng pin. Không có API cho các dịch vụ đó phải được quản lý rất chặt chẽ bởi hệ điều hành, cụ thể là HAL và các I / O Kit. Tuy nhiên, có các dịch vụ bổ sung trong hệ điều hành iPhone không có trong Mac OS X. Ví dụ, Audio Session Service cho phép quản lý các hành vi âm thanh của các ứng dụng của bạn trong bối cảnh của một thiết bị có chức năng như một điện thoại di động và iPod. Hình sau cung cấp một cái nhìn cấp cao của kiến trúc âm thanh trong hệ điều hành iPhone.
Hình 1.16. Kiến trúc Core Audio của hệ điều hành iPhone
2. Cơ bản về Core Audio
Apple đã thiết kế các giao diện phần mềm cho Core Audio sử dụng phương pháp phân lớp, cooperative và hướng tác vụ.
a. Các tầng kiến trúc giao diện lập trình API
Giao diên lập trình cho Core Audio được chia thành 3 lớp : các dịch vụ ở lớp cao, các dịch vụ ở lớp trung và các dịch vụ ở lớp thấp.
Hình 1.17 Ba lớp API của Core Audio
Lớp thấp nhất bao gồm:
- Các bộ vào ra I/O tương tác với các driver
- Tầng trừu tượng hóa phần cứng âm thanh (audio HAL) cung cấp một giao diện độc lập về phần cứng và driver cho phần cứng
- Core MIDI cung cấp sự trừu tượng của phần mềm để làm việc với luồng và các thiết bị MIDI.
- Host Time Services cung cấp khả năng truy cập vào đồng hồ của máy tính
Các ứng dụng trong Mac OS X có thể sử dụng trực tiếp các công nghệ này khi cần thực thi trong thời gian thực đạt hiệu quả cao. Tuy nhiên, nhiều ứng dụng audio không truy cập lớp này. Thật vậy, Core Audio trong hệ điều hành iPhone cung cấp nhiều cách để đạt được âm thanh thời gian thực bằng cách sử dụng giao diện cấp cao hơn. OpenAL, sử dụng trực tiếp I / O cho âm thanh thời gian thực trong game. Kết quả nhỏ ơn đáng kể, điều chỉnh API thích hợp cho một nền tảng di động.
Các lớp trung trong Core Audio bao gồm các dịch vụ cho chuyển đổi định dạng dữ liệu, đọc và ghi vào đĩa, phân tích luồng, và làm việc với các plug-ins.
- Audio Converter Services giúp ứng dụng làm việc với bộ chuyển đổi định dạng dữ liệu
- Audio File Services hỗ trợ việc đọc và ghi dữ liệu âm thanh từ file
- Audio Unit Services và Audio Processing Graph Services giúp ứng dụng làm việc với digital signal processing (DSP) plug-ín như là equalizer hay mixer.
- Audio File Stream giúp phân tích luồng, như là play file được stream qua kết nối mạng.
- Core Audio Clock Services hỗ trợ đồng bộ hóa âm thanh và MIDI cũng như là chuyển đổi thời gian.
- Audio Format Services quản lý định dạng dữ liệu âm thanh
Core Audio trong hệ điều hành iPhone hỗ trợ hầu hết các dịch vụ này như trong hình:
Hình 1.18 Cấu trúc Core Audio của hệ điều hành iPhone
Lớp cao nhất trong Core Audio bao gồm các giao diện kết hợp các tính năng từ các lớp thấp hơn.
- Audio Queue Services cho phép ghi, chơi, tạm dừng, lặp, và đồng bộ hóa âm thanh.
- Lớp AVAudioPlayer cung cấp một giao diện Objective-C đơn giản để chơi và lặp âm thanh trong các ứng dụng iPhone OS. Lớp AVAudioPlayer xử lý tất cả các định dạng âm thanh hỗ trợ trong hệ điều hành iPhone, và giúp thực hiện các tính năng như tua lại và chuyển bài kế tiếp.
- Extended Audio File Services kết hợp các tính năng của Audio File Services và Audio Converter Services. Nó cung cấp cho bạn một giao diện thống nhất cho việc đọc và ghi các dữ liệu âm thanh không nén và có nén.
- OpenAL trong Core Audio thực hiện các chuẩn OpenAL mã nguồn mở cho việc định vị âm thanh.
b. Framework
- Audio Toolbox framework cung cấp giao diện giữa các dịch vụ thuộc tầng cao và tầng trung trong Core Audio. Trong hệ điều hành iPhone, framework này còn bao gồm cả Audio Session Services để quản lý hành vi của âm thanh trong ứng dụng chạy trên iPhone và iPod.
- Audio Unit framework: làm việc với audio plug-in
- AV Foundation framework: chứa lớp AVAudioPlayer, các giao diện stream cho audio playback.
- Core Audio framework cung cấp các kiểu dữ liệu của Core Audio cũng như là giao diện cho các dịch vụ thuộc tầng thấp.
- OpenAL framework: làm việc với OpenAL.
c. Proxy Object
Core Audio sử dụng khái niệm proxy object để đại diện cho các tập tin, luồng, audio player... Ví dụ, khi muốn làm việc với một file âm thanh có sẵn trong máy, bước đầu tiên là phải tạo thể hiện của đối tượng AudioFileID. Đối tượng này được khai báo trong AudioFile.h. Sau đó, tạo file âm thanh thực liên kết với đối tượng đó thông qua hàm AudioFileCreateWithURL. Hàm này sẽ trả về một ánh xạ tới đối tượng file âm thanh và người dùng có thể làm việc với file âm thanh thực thông qua việc giao tiếp với đối tượng proxy.
d. Hàm gọi lại
Nhiều giao diện Core Audio có thể giao tiếp với ứng dụng bằng cách sử dụng hàm gọi lại (callback). Core Audio sử dụng hàm gọi lại cho những việc như:
- Cung cấp một tập dữ liệu âm thanh mới cho ứng dụng (chẳng hạn như để ghi âm; hàm gọi lại sẽ ghi dữ liệu mới vào đĩa).
- Yêu cầu một tập dữ liệu âm thanh mới từ ứng dụng (chẳng hạn như để phát lại; hàm gọi lại của bạn đọc từ đĩa và cung cấp các dữ liệu).
- Thông báo với ứng dụng một đối tượng phần mềm đã thay đổi trạng thái
Một cách để hiểu là để hàm gọi lại là đảo ngược quan điểm vvề việc ai gọi ai. Trong một lời gọi hàm bình thường, chẳng hạn như AudioQueueNewOutput, ứng dụng sẽ gọi hành vi được định nghĩa bởi Apple trong việc thực hiện của hệ điều hành.
Lập trình viên không biết, và không cần biết, những gì diễn ra bên dưới. Ứng dụng yêu cầu một đối tượng hàng đợi âm thanh chơi lại (playback audio queue) và nhận được một đối tượng trả về. Nó hoạt động bởi vì, trong khi thực hiện lời gọi, lập trình viên đã tuân theo các giao diện hàm quy định trong file header của hàm đó.
Trong trường hợp hàm gọi lại, hệ điều hành sẽ gọi hành vi mà lập trình viên thực thi trong ứng dụng của mình. Bằng việc định nghĩa một hàm gọi lại trong ứng dụng theo một mẫu, hệ điều hành có thể gọi nó thành công. Ví dụ, Audio Queue Service quy định cụ thể một mẫu cho một hàm gọi lại, mà lập trình viên có thể thực hiện, phản ứng với các tin nhắn âm thanh, khi một đối tượng hàng đợi thay đổi thuộc tính. Template của hàm gọi lại này được định nghĩa trong AudioQueue.h:
typedef void (*AudioQueuePropertyListenerProc) (
void * inUserData,
AudioQueueRef inAQ,
AudioQueuePropertyID inID
);
Để thực thi và sử dụng một hàm gọi lại trong ứng dụng cần phải làm hai việc:
- Thực thi hàm gọi lại.
- Đăng ký hàm gọi lại với đối tượng muốn tương tác với.
CHƯƠNG 2: TỔNG QUAN VỀ HỆ THỐNG TÌM KIẾM MOBILE PORTAL
2.1 Hệ thống Mobile Portal
Hệ thống Mobile Portal là hệ thông cổng tìm kiếm thông tin trực tuyến được phát triển trên phục vụ cho nhu cầu tìm kiếm thông tin trên các thiết bị di động. Hệ thống được chia ra làm 3 tầng với những chức năng và nhiệm vụ cụ thể:
Tầng ứng dụng (Cocoa Touch Application): đây cũng chính là thành phần chính được tập trung trình bày trong đồ án này.
Tầng giao diện di động (Mobile Interface)
Tầng dưới cùng là tầng máy tìm kiếm socbay (Socbay Search Engine): được nghiên cứu và phát triển bởi công ty Naiscorp và đã đi vào hoạt động được hơn 3 năm.
Mô hình tổng quan hệ thống được biểu diễn như hình dưới:
Hình 2.1 Mô hình hệ thống Mobile Portal
Trong đó:
Socbay Search Engine: máy tìm kiếm của socbay chịu trách nhiệm thu thập dữ liệu từ các nguồn khác nhau trên internet. Dữ liệu được đánh chỉ mục và lưu trữ trong cơ sở dữ liệu của socbay. Tầng này được nghiên cứu và phát triển tương đối hoàn thiện bởi công ty Naiscorp
Mobile Interface: tầng Mobile Interface hỗ trợ cho việc chuẩn hóa dữ liệu phục vụ cho điện thoại di đông. Ngoài ra Mobile Interface còn quản lý module giao tiếp cho phép lấy và trả dữ liệu từ máy chủ lưu trữ về cho ứng dụng Java khi nhận được yêu cầu từ ứng dụng.
Cocoa Touch Application: Tầng Cocoa Touch Application được phát triển thành một ứng dụng chạy trên điện thoại di động cho phép giao tiếp với người dùng thông qua giao diện đồ họa ứng dụng
2.2 Máy tìm kiếm Socbay (Socbay Search Engine)
Socbay là một máy tìm kiếm với đầy đủ quy mô và thuần Việt được phát triển hoàn thiện bởi công ty Naiscorp. Mô hình máy tìm kiếm của socbay hiện nay đã có nhiều thay đổi và cải tiến tuy nhiên các thành phần chính của mô hình máy tìm kiếm vấn là: crawler, indexer.
Hình 2.2 Mô hình đơn giản của Socbay Search Engine
Crawler: Thành phần này của hệ thống làm nhiệm vụ thu thập các nguồn dữ liệu dạng thô từ trên Internet, xử lí và lưu trữ vào Store server. Dữ liệu có thể được lấy từ nhiều nguồn khác nhau.
Indexer: Thành phần indexer làm công việc đánh chỉ mục dữ liệu, xử lí dữ liệu phục vụ cho thành phần searcher.
Searcher: Tìm kiếm kết quả cho câu truy vấn của người dùng dựa trên dữ liệu đã được xử lí, và trong đó Ranking là vấn đề rất quan trọng phải được giải quyết.
Tuy nhiên để dữ liệu có thể phục vụ cho các thiết bị di động, dữ liệu cần phải được tổ chức lại cho phù hợp. Vai trò chính của máy tìm kiếm socbay trong hệ thống Mobile Portal:
Thu thập dữ liệu cho các dịch vụ trong hệ thống
Phân tích truy vấn ngắn dựa trên thói quen người dùng
2.3.1. Thu thập dữ liệu cho các dịch vụ
Các dịch vụ đang được cung cấp tới người sử dụng của Mobile Portal bao gồm: MP3, hình ảnh, thông tin rao vặt, tin tức, thông tin địa điểm, và từ điển. Các dữ liệu này được lấy từ nhiều nguồn khác nhau trên internet.
Dịch vụ
Mô tả
MP3
Nguồn dữ liệu là từ các trang nghe nhạc, hosting phổ biến hiện nay. Số lượng lên tới hàng triệu bài và liên tục được cập nhật.
Hình ảnh
Hỗ trợ nhiều định dạng khác nhau phổ biến hiện nay như JPEG, TIFF, BMP, PNG, GIF, … và đã được resize phù hợp với kích thước màn hình điện thoại.
Dữ liệu được lấy từ nhiều nguồn khác nhau và được lọc kĩ.
Cẩm nang tư vấn
Hệ thống hiện nay mới dừng lại ở mức cung cấp thông tin có sẵn cho người dùng. Trong tương lai gần sẽ được tích hợp thêm khả năng đăng thông tin cho người dùng
Tin tức
Được tổng hợp từ các báo điện tử phổ biến hiện nay như vnexpress, vietnamnet, dantri, … . Vấn đề cập nhật thông tin liên tục và chống trùng lặp dữ liệu được xử lí rất tốt.
Thông tin địa điểm
Cung cấp thông tin về các địa điểm phổ biến như karaoke, shop, café, … . Nguồn dữ liệu từ các trang chứa dữ liệu địa điểm và các trang đăng thông tin địa điểm.
Trong tương lai dịch vụ này sẽ có thêm mục chỉ đường, tìm đường, hỗ trợ GPS tại các thành phố lớn cho người dùng.
Truyện
Một kho các truyện đọc được phân chia theo chủ đề.
Bảng 2.1 Các dịch vụ
2.3.2 Phân tích truy vấn ngắn dựa trên thói quen người dùng
Search engine cho Mobile Portal là kết quả của việc nghiên cứu thói quen của người dùng trên thiết bị di động. Việc bị hạn chế về số lượng phím bấm và khả năng trình diễn thông tin dẫn tới việc phải có một cơ chế cho phép hiểu thông tin người dùng nhập vào một cách tốt nhất với query có độ dài ngắn nhất. Đây không phải chỉ là việc chuyển cách sử dụng search engine từ máy tính để bàn sang thiết bị di động, đó là cả vấn đề khác yêu cầu phải có nghiên cứu nghiêm túc.
Hệ thống đã ứng dụng thành công kết quả của việc nghiên cứu này, người dùng sẽ được hỗ trợ trong việc tìm kiếm thông tin với những câu truy vấn ngắn nhất như: iphone hn, hay atm hcm, … .
2.4 Tầng giao diện di động (Mobile Interface)
Mobile Interface là thành phần giao diện trung gian giữa máy tìm kiếm Socbay và ứng dụng di động. Vai trò của Mobile Interface trong hệ thống tìm kiếm Mobile Portal là:
- Chuẩn hóa dữ liệu cho thiết bị di động
- Quản lý các module kết nối
2.4.1 Quá trình chuẩn hóa dữ liệu cho thiết bị di động:
Với những hạn chế về mặt hiển thị (kích thước màn hình hiển thị bé), và những hạn chế về mặt đường truyền kết nối (tốc độ kết nối chậm). Dữ liệu trên thiết bị di động phải thật sự ngắn gọn, súc tích nhưng vẫn bao gồm đầy đủ các thông tin cần thiết. Việc chuẩn hóa dữ liệu cho mỗi dịch vụ trong hệ thống được mô tả như sau:
Dịch vụ
Mô tả
Cẩm nang tư vấn
Thông tin hết sức ngắn gọn, và nhanh chóng phù hợp với thói quen người dùng, giảm thời gian tải dữ liệu.
Hình ảnh
Được xử lí đa luồng nên việc load kết quả search bao gồm các hình thumbnails là rất nhanh chóng, lượng dữ liệu truyền tải cũng giảm đáng kể.
Kích cỡ hình ảnh có nhiều dạng phù hợp với các mục đích khác nhau. Với mỗi hành động của người dùng: search, preview, download thì hệ thống sẽ đưa ra hình ảnh với kích thước tương ứng, tiết kiệm tối đa cho người dùng.
MP3
Kích thước của tập tin cũng được thay đổi phù hợp với nhu cầu của người dùng.
Có hai chế độ được hỗ trợ là tải nhạc chất lượng cao và tải nhạc chất lượng thấp. Phiên bản nhạc chất lượng thấp dành cho mục đích làm nhạc chuông, gửi MMS. Phiên bản nhạc chất lượng cao dành cho người muốn sở hữu một bản nhạc chân thực hơn.
Ngoài ra để phục vụ nhu cầu nghe trước khi tải về, hệ thống hỗ trợ giao thức cho nghe thử.
Tin tức, Địa điểm, Truyện
Nhu cầu theo dõi thông tin với thiết bị di động dẫn đến việc phải giải quyết bài toán trích chọn thông tin. Đây chính là vấn đề quan trọng nhất đối với việc chuẩn hóa dữ liệu cho thiết bị di động, và nhóm đã thành công trong việc xây dựng hệ thống này.
2.4.2 Thiết kế module kết nối tại client và server
Mobile Interface được chia làm 2 module tại client và server.
Module trên server là một Interface sẽ tạo một socket, lắng nghe những packet từ client gửi lên, xử lý, lưu log, sau đó dựa vào mã gửi lên để gọi các service được cung cấp bởi Search Engine của trang Socbay.com sau khi đã được chuẩn hóa dữ liệu để phù hợp với các thiết bị di động.
Module trên client có nhiệm vụ quản lý các packet gửi đi, nhận và phân phối các gói tin gửi về từ server và phân phối cho các form phía client.
Hai module trên phía client và server sẽ tạo kết nối giựa trên giao thức kết nối socket TCP và luôn được giữ ổn định trong suốt quá trình client được bật. Điểm đặc biệt trong kết nối này là tạo được Mobile streaming cho dịch vụ mp3, cho phép client có thể chơi nhạc trực tuyến với chất lượng ổn định.
2.5 Ứng dụng Petto
Petto là ứng dụng phía client chạy trên môi trường điện thoại. Ứng dụng được tích hợp nhiều dịch vụ như nghe nhạc, hình ảnh, tin tức, địa điểm, truyện, cẩm nang tư vấn và trong tương lai có thể mở rộng thêm nhiều dịch vụ khác.
Việc phát triển ứng dụng phia client này là trọng tâm chính của đồ án và sẽ được trình bày chi tiết hơn trong phần II của đồ án.
PHẦN II: XÂY DỰNG CHƯƠNG TRÌNH
CHƯƠNG 3: ỨNG DỤNG TRÊN IPHONE
3.1 Các loại ứng dụng trên iPhone
Các ứng dụng trên iPhone được chia làm 3 loại
- Immersive Application: các ứng dụng mang tính giải trí (game).
- Productivity Application: Các ứng dụng sản phẩm giúp quản lý thông tin và hoàn thiện các tác vụ. Thông tin được tổ chức theo cây phân cấp và người dùng có thể di chuyển qua lại giữa các mức. Ứng dụng Petto được xây dựng trong đồ án này là một ứng dụng thuộc loại này.
- Utility Application: các ứng dụng tiện ích, hiển thị một tập các đặc tả của thông tin cho người dùng. Màn hình hiển thị đơn giản và ít tương tác. Ví dụ như các tiện ích thời tiết, xem lịch trên iPhone.
3.2 Phát biểu bài toán
Tìm kiếm di động là một dịch vụ giúp người sử dụng tìm kiếm thông tin trên điện thoại di động và các thiết bị không dây. Dịch vụ này cho phép người sử dụng có thể tra cứu, đọc các thông tin trên các trang web di động ở mọi lúc mọi nơi. Mục tiêu của dịch vụ tìm kiếm di động là đáp ứng tối đa nhu cầu tìm kiếm của người dùng ở mọi lúc mọi nơi. Áp dụng công nghệ tìm kiếm thông thường trên máy tính để bàn vào nền tảng di động.
Ứng dụng tìm kiếm trên điện thoại di động Mobile Search của Socbay là một sản phẩm khá thành công nhưng mới chỉ sử dụng được trên các dòng điện thoại chạy Java. Kể từ khi ra mắt năm 2007 đến nay, iPhone vẫn luôn là một hiện tượng và cũng là sản phẩm di động đi đầu về công nghệ. Mong muốn đưa ứng dụng tìm kiếm trên điện thoại lên iPhone nên ứng dụng Petto đã được xây dựng.
Ứng dụng bao gồm các dịch vụ
- Tin tức: cho phép xem danh mục các tin tức chia theo chủ đề và xem chi tiết của các tin tức đó.
- Truyện: đọc truyện
- Địa điểm: xem thông tin về các địa điểm
- Cẩm nang tư vấn: chứa các thông tin hữu ích về văn hóa - xã hội
- Hình ảnh
- Nhạc MP3
CHƯƠNG 4: XÂY DỰNG CÁC DỊCH VỤ TÌM KIẾM ĐA PHƯƠNG TIỆN DỰA TRÊN MÁY TÌM KIẾM SOCBAY
4.1 Xác định yêu cầu hệ thống:
Các chức năng chính của hệ thống được miêu tả như hình dưới:
Hình 4.1 Usercase tổng thể của hệ thống
* Chức năng Tin tức:
- Xem tin tức theo chuyên mục
- Xem chi tiết tin
* Đọc truyện
- Đọc truyện theo chuyên mục
* Địa điểm
- Tìm kiếm địa điểm
- Xem địa chỉ và giới thiệu về địa điểm
* Cẩm nang tư vấn
- Đọc các thông tin tư vấn
* Hình ảnh
- Xem trước hình
- Xem hình với kích thước thật
* Nhạc Mp3
- Chọn nhạc theo chủ đê
- Nghe nhạc
4.2 Đặc tả user case:
4.2.1. Tin tức
Tác nhân (actors)
Người sử dụng
Mô tả
Use case cho phép người sử dụng đọc tin tức theo chuyên mục và đọc tin chi tiết
Điều kiện đầu vào
Không
Kết quả đầu ra
Hiển thị tin theo chuyên mục, hiển thị tin chi tiết
Luồng sự kiện
TT
Tác nhân
Hành động
1.
Người dùng
Chọn chuyên mục hay tin chi tiết cần xem
2.
Hệ thống
- Gửi một request lên server lấy thông tin về
- Bắt các ngoại lệ nếu xảy ra
- Xử lý dữ liệu nhận được từ máy chủ trước khi hiển thị
Luồng sự kiện khác
Nếu không lấy được dữ liệu về sẽ hiển thị thông báo cho người dùng
Các yêu cầu đặc biệt
- Khi người dùng yêu cầu xem một chuyên mục, request gửi lên server sẽ lấy về và hiển thị 10 kết quả. Nếu người dùng muốn xem thêm mới tiếp tục gửi request lên server để lấy tiếp 10 tin tiếp theo.
Uses
Không
Extends
Không
Bảng 4.2 Đặc tả usercase dịch vụ Tin Tức
4.2.2. Đọc truyện
Tác nhân (actors)
Người sử dụng
Mô tả
Use case cho phép người sử dụng tìm kiếm truyện theo chủ đề và đọc nội dung của truyện mà người dùng chọn
Điều kiện đầu vào
Không
Kết quả đầu ra
Hiển thị truyện theo chủ đề, hiển thị nội dung truyện
Luồng sự kiện
TT
Tác nhân
Hành động
1.
Người dùng
Chọn chủ đề hay truyện cụ thể muốn xem
2.
Hệ thống
- Gửi một request lên server lấy thông tin về
- Bắt các ngoại lệ nếu xảy ra
- Xử lý dữ liệu nhận được từ máy chủ trước khi hiển thị
Luồng sự kiện khác
Nếu không lấy được dữ liệu về sẽ hiển thị thông báo cho người dùng
Các yêu cầu đặc biệt
- Khi người dùng yêu cầu xem một chủ đề, request gửi lên server sẽ lấy về và hiển thị 10 kết quả. Nếu người dùng muốn xem thêm mới tiếp tục gửi request lên server để lấy tiếp 10 tin tiếp theo.
Uses
Không
Extends
Không
Bảng 4.3 Đặc tả usercase dịch vụ Truyện
4.2.3. Địa điểm
Tác nhân (actors)
Người sử dụng
Mô tả
Use case cho phép người sử dụng tìm kiếm địa điểm theo chủ đề, xem thông tin của địa điểm cụ thể
Điều kiện đầu vào
Không
Kết quả đầu ra
Hiển thị địa điểm theo chủ đề, hiển thị thông tin của địa điểm cụ thể
Luồng sự kiện
TT
Tác nhân
Hành động
1.
Người dùng
Chọn chủ đề hay địa điểm cụ thể cần xem thông tin
2.
Hệ thống
- Gửi một request lên server lấy thông tin về
- Bắt các ngoại lệ nếu xảy ra
- Xử lý dữ liệu nhận được từ máy chủ trước khi hiển thị
Luồng sự kiện khác
Nếu không lấy được dữ liệu về sẽ hiển thị thông báo cho người dùng
Các yêu cầu đặc biệt
- Khi người dùng yêu cầu xem một chuyên mục, request gửi lên server sẽ lấy về và hiển thị 10 kết quả. Nếu người dùng muốn xem thêm mới tiếp tục gửi request lên server để lấy tiếp 10 tin tiếp theo.
- Khi người dùng tiến sâu tới mức hiển thị lên danh sách các địa điểm thuộc chủ đề nào đó, dưới phần tên địa điểm sẽ có một chủ đề con chứa một số thông tin cơ bản về địa chỉ của địa điểm đó để người dùng không nhất thiết phải xem chi tiết về địa điểm.
Uses
Không
Extends
Không
Bảng 4.4 Đặc tả usercase dịch vụ Địa điểm
4.2.4. Cẩm nang tư vấn
Tác nhân (actors)
Người sử dụng
Mô tả
Use case cho phép người sử dụng đọc thông tin theo chuyên mục và đọc chi tiết thông tin tư vấn
Điều kiện đầu vào
Không
Kết quả đầu ra
Hiển thị thông tin theo chuyên mục, hiển thị chi tiết thông tin tư vấn
Luồng sự kiện
TT
Tác nhân
Hành động
1.
Người dùng
Chọn chuyên mục hay tin chi tiết cần xem
2.
Hệ thống
- Gửi một request lên server lấy thông tin về
- Bắt các ngoại lệ nếu xảy ra
- Xử lý dữ liệu nhận được từ máy chủ trước khi hiển thị
Luồng sự kiện khác
Nếu không lấy được dữ liệu về sẽ hiển thị thông báo cho người dùng
Các yêu cầu đặc biệt
- Khi người dùng yêu cầu xem một chuyên mục, request gửi lên server sẽ lấy về và hiển thị 10 kết quả. Nếu người dùng muốn xem thêm mới tiếp tục gửi request lên server để lấy tiếp 10 tin tiếp theo.
Uses
Không
Extends
Không
Bảng 4.5 Đặc tả usercase dịch vụ Cẩm nang tư vấn
4.2.5. Hình ảnh
Tác nhân (actors)
Người sử dụng
Mô tả
Use case cho phép người sử dụng xem các chủ đề ảnh, danh mục các ảnh kèm hình xem trước, xem hình ảnh đúng kích cỡ
Điều kiện đầu vào
Không
Kết quả đầu ra
Hiển thị ảnh theo chủ đề, hiển thị ảnh xem trước, hiển thị ảnh lớn
Luồng sự kiện
TT
Tác nhân
Hành động
1.
Người dùng
Chọn chủ đề hay ảnh muốn xem
2.
Hệ thống
- Gửi một request lên server lấy thông tin về
- Bắt các ngoại lệ nếu xảy ra
- Xử lý dữ liệu nhận được từ máy chủ trước khi hiển thị: tách phần thông tin ảnh ra khỏi các thông tin khác, khôi phục lại ảnh ban đầu.
Luồng sự kiện khác
Nếu không lấy được dữ liệu về sẽ hiển thị thông báo cho người dùng
Các yêu cầu đặc biệt
- Khi người dùng yêu cầu xem một chuyên mục, request gửi lên server sẽ lấy về và hiển thị 10 kết quả. Nếu người dùng muốn xem thêm mới tiếp tục gửi request lên server để lấy tiếp 10 tin tiếp theo.
- Với các ảnh lớn hơn kích thước màn hình, thu nhỏ ảnh lại cho vừa với kích thước màn hình
Uses
Không
Extends
Không
Bảng 4.6 Đặc tả usercase dịch vụ Hình Ảnh
4.2.6. Nhạc MP3
Tác nhân (actors)
Người sử dụng
Mô tả
Use case cho phép người sử dụng xem danh mục các bài nhạc theo chủ đề, người sử dụng có thể chọn nghe một bài nhạc
Điều kiện đầu vào
Không
Kết quả đầu ra
Hiển thị kết quả tìm kiếm
Luồng sự kiện
TT
Tác nhân
Hành động
1.
Người dùng
Chọn bản nhạc, sau đó ấn nút chơi nhạc
2.
Hệ thống
Hệ thống khởi tạo bộ chơi nhạc
Hệ thống gửi yêu cầu chơi nhạc đến máy chủ
Hệ thống nhận thông tin dưới dạng các gói tin từ máy chủ trả về
3
Người dùng
Nhấn vào vị trí bất kì để seek trên thanh chỉ lượng nhạc đã được lấy về để chuyển tới vị trí bất kì trong bài nhạc
4
Hệ thống
Hệ thống kiểm tra nếu vị trí seek của người dùng nằm trong khoảng nhạc đã được lấy về thì cho phép chuyển đến vị trí đó còn không thì không cho phép.
Luồng sự kiện khác
Lỗi về đường dẫn : Hệ thống hiển thị thông báo lỗi trong trường hợp hệ thống không tìm thấy đường dẫn file hiện tại.
Uses
Không
Extends
Không
Bảng 4.7 Đặc tả usercase dịch vụ Nhạc MP3
4.3 Các vấn đề kỹ thuật, thuật toán
4.3.1. Việc kết nối, truyền nhận dữ liệu giữa client và server:
Vấn đề đặt ra khi tạo ứng dụng là làm sao có thể tạo một kết nối giữa client (iPhone) và server (máy tìm kiếm Socbay). iPhone SDK cung cấp một số cách:
- Download dữ liệu trực tiếp từ URL
- Sử dụng giao thức HTTP gửi yêu cầu lên server và nhận dữ liệu về theo kiểu không đồng bộ.
- Sử dụng Socket
* Download dữ liệu trực tiếp từ URL: đây là cách đơn giản nhất để nhận dữ liệu từ web server. Sử dụng một lớp có phương thức khởi tạo (init) có tên chứa “withContentsOfURL:” Đây là các phương thức đặc biệt sẽ xử lý tất cả các việc để nhận dữ liệu từ Internet. Tất cả những gì phải làm là truyền cho phương thức này một đối tượng NSURL chứa url và nó sẽ tạo và trả về một đối tượng chứa dữ liệu của url. Tuy nhiên, quá trình xử lý theo cách này là đồng bộ hóa, tức là khi hàm “withContentsOfURL” được gọi, chương trình sẽ bị dừng để chờ cho đến khi nó hoàn thành việc download dữ liệu. Với các dữ liệu nhỏ thì đây không phải là vấn đề, nhưng vơi các dữ liệu lớn thì nó sẽ dẫn tới việc người dùng không thể tương tác với ứng dụng cho đến khi dữ liệu được nhận về hết.
* Sử dụng giao thức HTTP: gọi trực tiếp đến các service. Cách này sẽ lấy dữ liệu theo kiểu không đồng bộ, đồng thời bắt được các lỗi xảy ra. Như vậy khắc phục được nhược điểm của việc download trực tiếp từ URL. Tuy nhiên, với giao thức HTTP, mỗi lần người dùng muốn thực hiện một request lên server sẽ phải mất thời gian tạo lại kết nối, làm chậm ứng dụng. Nó cũng không thể khống chế được luồng dữ liệu gửi lên và trả về như sử dụng kết nối socket. Hơn nữa là tính trong suốt của ứng dụng client với các service cung cấp bởi Socbay Search Engine. Thông thường, những service như vậy thường được giữ trong suốt với tất cả các client để đảm bảo tính bảo mật và có khả năng thay đổi khi cần thiết. Việc gọi trực tiếp đến những server này sẽ không an toàn, và trong trường hợp muốn bảo trì và thay đổi sẽ làm ảnh hưởng đến toàn bộ hệ thống.
* Sử dụng socket: người lập trình có thể điều khiển được việc truyền nhận dữ liệu theo kiểu đồng bộ hay không đồng bộ, đồng thời kiểm soát được luồng dữ liệu gửi lên và trả về. Với cách thức này thì phải xây dựng 2 module client và server. Module client các trách nhiệm tạo thread để xử lý các dữ liệu trả về từ server. Module server có trách nhiệm lắng nghe những gói tin được gửi lên từ client, xử lý, sau đó gọi và lấy thông tin từ service được cung cấp bởi Socbay Search Engine và trả lại cho client.
4.3.2. Hiển thị
Khi gửi yêu cầu lấy chuyên mục lên server, server sẽ trả về danh sách các chuyên mục tương ứng. Yêu cầu đặt ra là khi người dùng chọn một chuyên mục, người dùng có thể vào các chuyên mục con của chuyên mục đó, hoặc nếu chuyên mục đó không còn chuyên mục con thì sẽ hiển thị thông tin chi tiết của nó. Các chuyên mục được tổ chức phân cấp, người dùng có khả năng lựa chọn đi sâu xuống các mức ở dưới thấp hay trở lại các mức ở trên cao. Như vậy ứng dụng cần một navigation để chuyển đổi giữa các mức.
Đối với các chuyên mục, do là hiển thị một danh sách, cho phép người dùng chọn một phần tử trong danh sách đó. Mỗi phần tử của chuyên mục cần có tiêu đề (của chuyên mục con hay tin chi tiết), ảnh preview, thông tin bổ sung. Rất may là iPhone SDK cung cấp đối tượng UITableView đáp ứng được các yêu cầu này.
Đối với việc hiển thị chi tiết. Do thông tin trả về có thể là chứa text, text kèm hình ảnh, hay hình ảnh.. nên cần một đối tượng cho phép hiển thị cả text và hình ảnh, có khả năng tùy biến cho phép người dùng điều khiển việc hiển thị. UIWebView được sử dụng
4.3.3. MP3 streaming
Với tác vụ MP3 streaming thì khá là khác so với các dịch vụ khác. Không phải là chỉ gửi request lên server, nhận về và hiển thị ra, với MP3 streaming thì còn cần phải chuyển dữ liệu nhận được từ server về thành các packet âm thanh để có thể phát lại ngay mà không cần phải download toàn bộ bài hát về. Quá trình streaming MP3:
- Gửi request lên server và nhận dữ liệu trả về là dãy các byte
- Sử dụng dịch vụ Audio File Stream để phân tích dãy byte nhận về, tập hợp lại thành cách gói âm thanh.
- Các gói âm thanh được lần lượt đẩy vào một buffer
- Khi buffer đầy, buffer này sẽ được đưa vào một hàng đợi để chuẩn bị phát lại.
- Với hàng đợi buffer, nó sẽ đẩy các buffer cho đối tượng AVAudioPlayer để phát lại, sau một buffer được phát lại, nó giải phóng hết dữ liệu đang giữ và quay trở lại chờ nhận dữ liệu mới.
- Nếu dữ liệu gửi về quá nhanh, AVAudioPlayer không kịp xử lý hết, thì các gói âm thanh sẽ phải đợi khi có buffer trống để được đẩy vào, và các buffer thì phải “xếp hàng lần lượt” để đến khi mình được phát lại.
Hình 4.2 MP3 Streaming
4.4 Thiết kế giao diện:
4.4.1. Giao diện chính:
Hình 4.3 Giao diện chính của ứng dụng
4.4.2. Dịch vụ Tin Tức:
Hình 4.4 Giao diện chính của dịch vụ Tin Tức
4.4.3. Dịch vụ Truyện:
Hình 4.5 Giao diện chính của dịch vụ Truyện
4.4.4. Dịch vụ Địa Điểm:
Hình 4.6 Giao diện chính của Địa Điểm
4.4.5. Dịch vụ Cẩm Nang Tư Vấn:
Hình 4.7 Giao diện chính của dịch vụ Cẩm Nang Tư Vấn
4.4.6. Dịch vụ Hình Ảnh:
Hình 4.8 Giao diện chính của dịch vụ Hình Ảnh
4.4.7. Dịch vụ Nhạc MP3:
Hình 4.9 Giao diện chính của dịch vụ Nhạc MP3
4.5 Thiết kế lớp:
4.5.1. Tầng Cocoa Touch Application
Hình 4.10 Biểu đồ lớp của tầng ứng dụng Cocoa Touch
Để thấy rõ các thuộc tính và phương thức của các lớp, biểu đồ lớp sẽ được chia nhỏ thành các phần. Nhằm mục đích đơn giản hóa nên các liên kết với các phần khác sẽ được giản lược đi. Và vì các lớp được xây dựng khá là tương đồng nhau nên em xin phép chỉ trình bày các lớp ứng dụng và các lớp trong dịch vụ Tin Tức và Nhạc MP3
1. Lớp ứng dụng:
Hình 4.11 Biểu đồ lớp của lớp ứng dụng
- Lớp ApplicationDelegate có nhiệm vụ nhận các sự kiện liên quan tới vòng đời của ứng dụng và đáp ứng lại các sự kiện này
+ applicationDidFinishLauching: sự kiện này xảy ra ngay sau khi khởi đầu ứng dụng
+ applicationWillTerminate: sự kiện này xảy ra ngay trước khi đóng ứng dụng
- Lớp MainViewController: hiển thị giao diện chính của chương trình, tùy thuộc vào lựa chọn của người dùng mà chuyển đến chức năng tương ứng.
+ Khi ứng dụng được mở ra, lớp MainViewController được khởi tạo, tạo ngay một kết nối socket tới server.
+ Tùy thuộc vào lựa chọn của người sử dụng chuyển đến chức năng tương ứng.
2. Dịch vụ Tin Tức:
Hình 4.12 Biểu đồ lớp của dịch vụ Tin Tức
- Lớp TinTucChuyenMucViewController: hiển thị danh sách các chuyên mục có chuyên mục con.
+ Mỗi khi một đối tượng của lớp TinTucChuyenMucViewController được khởi tạo, đối tượng sẽ gửi một request lên server thông qua hàm connectionSocketWithParameter với các tham số truyền vào chỉ rõ yêu cầu chuyên mục thuộc chuyên mục cha nào, lấy bao nhiêu phần tử, bắt đầu từ phần tử nào.
- Lớp TinTucTinMoiViewController: hiển thị danh sách cách chuyên mục không có chuyên mục con.
- Lớp TinTucChiTietViewController: hiển thị tin tức chi tiết.
3. Dịch vụ nhạc MP3
Hình 4.13 Biểu đồ lớp của dịch vụ Nhạc MP3
4.5.2. Tầng Mobile Interface:
Hình 4.14 Biểu đồ lớp của tầng Mobile Interface
- Lớp Socket có nhiệm vụ tạo một kết nối socket tới server, gửi request lên server và nhận về trả lời của server.
- Lớp Packet chứa thông tin về một gói thông tin tương ứng với một request của client hay một trả lời của server. Với trả lời của server, lớp packet sẽ nhận nhiệm vụ phân tích dữ liệu lấy về thành thông tin hữu ích để có thể hiển thị lên màn hình.
4.5.3. Quan hệ giữa tầng Mobile Interface và Cocoa Touch Application:
Mỗi lớp của tầng Cocoa Touch Application đều chứa một biến thành phần là thể hiện của lớp Socket, và một mảng chứa các thể hiện của lớp Packet thuộc tầng Mobile Interface.
TỔNG KẾT ĐÁNH GIÁ
1. Một số kết quả đạt được
Về cơ bản đã tìm hiểu được những kiến thức cơ bản nhất về môi trường lập trình cho điện thoại iPhone. Hiểu được cấu trúc một chương trình ứng dụng trên iPhone và có thể tự xây dựng một chương trình của riêng mình.
Ứng dụng Petto đã được xây dựng tương đối hoàn thiện với các chức năng được đặt ra.
Một số ưu điểm của ứng dụng
Giao diện bắt mắt người sử dụng.
Cung cấp cho người dùng nhiều dịch vụ để có thể chọn lựa
Có khả năng hiển thị tiếng Việt.
Ứng dụng có khả năng tích hợp nhanh chóng đối với các dịch vụ tìm kiếm, hoặc các dịch vụ giá trị gia tăng mới (như nhắn tin)…
2 Nhược điểm
Tuy đã cố gắng hoàn thiện sản phẩm ở mức tốt nhất tuy nhiên ứng dụng không tránh khỏi những mặt hạn chê:
Dữ liệu được chuẩn hóa cho thiết bị di động cũng không tránh khỏi sai sót.
Việc sử dụng socket và stream để trao đổi dữ liệu giữa client và server được thiết lập và bắt được các lỗi cơ bản như không có kết nối mạng, kết nối và truyền nhận dữ liệu sai.. nhưng vẫn chưa bắt được time out. Nếu như việc kết nối socket thành công nhưng nếu quá trình truyền nhận dữ liệu quá lâu, ứng dụng vẫn chưa có cách xử lý.
Việc tìm kiếm mới chỉ dừng ở mức tĩnh, tức là người dùng chỉ có thể lựa chọn trên danh sách các mục hiển thị ra. Ví dụ như dịch vụ tin tức, người dùng muốn xem thông tin trong mục tin mới nhất, chẳng có cách nào khác là phải tự tìm trong danh sách các chuyên mục hiển thị ra. Chưa có chức năng cho người dùng nhập từ khóa vào và tìm kiếm.
Dịch vụ ảnh, nghe nhạc MP3 chưa còn chưa có chức năng download.
3 Hướng phát triển:
Trong thời gian tới, ứng dụng sẽ tập trung vào việc nâng cấp các tính năng hiện có, giải quyết các vấn đề còn tồn tại, bổ sung các tính năng mới để có thể đáp ứng được nhu cầu của thị trường.
Bổ sung thêm dịch vụ chứng khoán, bóng đá.
Cho phép người dùng khả năng tương tác với hệ thống như upload thông tin rao vặt, upload hình ảnh, nhạc….
Nghiên cứu, cải tiến tính năng chơi nhạc của ứng dụng, tiến tới việc cho xem video online trên môi trường thiết bị di động.
Cho phép người dùng download nhạc, hình ảnh
TÀI LIỆU THAM KHẢO
1. iPhone Developer: của Apple
2. Dave Mark| Jeff LaMache, Beginning iPhone 3 Development - Exploring the iPhone SDK , Appress,2009
3. Dave Mark| Jeff LaMache, More iPhone 3 Development - Tackling iPhone SDK 3 , Appress,2009
4. Jonathan Zdziarski, iPhone SDK Application Development, 1st Edition, O’Reilly Media, Inc, 2009.
5. James A.Brannan, iPhone SDK Programming - A Beginning’s Guide, McGraw-Hill, 2010.
6. Jiva DeVoe, Cocoa Touch for iPhone OS 3, Wiley Publishing, Inc, 2009
Các file đính kèm theo tài liệu này:
- 71677865-Datn-an-Thi-Hong-k50-Cnpm.doc