Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 137 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
137
Dung lượng
8,91 MB
Nội dung
ỦY BAN NHÂN DÂN TP HỒ CHÍ MINH TRƯỜNG CAO ĐẲNG CÔNG NGHỆ THỦ ĐỨC KHOA CÔNG NGHỆ THÔNG TIN GIÁO TRÌNH HỌC PHẦN: LẬP TRÌNH DI ĐỘNG TRÊN iOS NGÀNH/NGHỀ: CƠNG NGHỆ THƠNG TIN TRÌNH ĐỘ: CAO ĐẲNG Ban hành kèm theo Quyết định số: /QĐ-CNTĐ-CN ngày tháng….năm của……………………………… TP Hồ Chí Minh, năm 2020 TUYÊN BỐ BẢN QUYỀN Tài liệu thuộc loại sách giáo trình nên nguồn thơng tin phép dùng nguyên trích dùng cho mục đích đào tạo tham khảo Mọi mục đích khác mang tính lệch lạc sử dụng với mục đích kinh doanh thiếu lành mạnh bị nghiêm cấm LỜI GIỚI THIỆU Giáo trình Lập trình di động iOS viết cho học phần chuyên ngành bắt buộc, ngành Công nghệ Thông tin, trường Cao đẳng Công nghệ Thủ Đức Giáo trình viết theo hướng tích hợp khuyến khích tính chủ động tích cực từ người học Khác với lập trình Android, sinh viên có kiến thức Java trước học, môn học với 75 tiết, giáo trình vừa tích hợp việc giảng dạy cho sinh viên ngơn ngữ lập trình – Swift, vừa giảng dạy cho sinh viên công cụ Xcode để phát triển ứng dụng iOS ngôn ngữ Swift, đồng thời vừa hồn thiện, cải tiến kỹ phân tích, thiết kế phần mềm, tư lập trình, phân tích thiết kế sở liệu… thông qua việc bước phân tích, lập trình hồn thiện hai ứng dụng thực tiễn tồn giáo trình Điều giúp sinh viên có kiến thức, kỹ gần với nhu cầu doanh nghiệp giúp em có hứng thú suốt trình học tập Giáo trình viết ngắn gọn, đầy đủ kiến thức, kỹ cần thiết phát triển ứng dụng iOS Giáo trình chia thành chương trình bày ngơn ngữ Swift, Xcode phát triển ứng dụng iOS với Xcode, phân tích, thiết kế làm việc với sở liệu đồ trực tuyến ứng dụng iOS Mặc dù giáo trình tách biệt thành chương, trình giảng dạy, giảng viên cần linh động việc tích hợp giảng dạy đan xen kiến thức kỹ ngôn ngữ Swift (Chương 1) với cách phân tích, thiết kế xây dựng ứng dụng iOS dùng Xcode (Chương 2) đảm bảo thời lượng mơn học Còn chương chương giảng viên giảng dạy cần tích hợp q trình phân tích, thiết kế triển khai bước ứng dụng thực tiễn yêu cầu sinh viên thực theo hệ thống tập đề phần đạt yêu cầu Thành phố Hồ Chí Minh, ngày 15 tháng 01 năm 2021 Giảng viên biên soạn Tiêu Kim Cương ii MỤC LỤC TRANG DANH MỤC CÁC TỪ VIẾT TẮT VI DANH MỤC BẢNG BIỂU VÀ HÌNH VẼ VII CHƯƠNG TỔNG QUAN VỀ PHÁT TRIỂN ỨNG DỤNG TRÊN IOS VÀ NGÔN NGỮ SWIFT .2 1.1 Tổng quan phát triển ứng dụng iOS 1.1.1 IOS gì? Kiến trúc bên iOS? .2 1.1.2 Mơ hình MVC lập trình iOS 1.1.3 Phát triển ứng dụng iOS 1.1.4 Viết ứng dụng iOS .4 1.2 Ngơn ngữ lập trình Swift .8 1.2.1 Cơ ngơn ngữ lập trình Swift 1.2.2 Kiểu liệu, biến, 1.2.3 Biến kiểu Optional 10 1.2.4 Biến Tuples 12 1.2.5 Chuỗi thoát Swift .13 1.2.6 Các loại tốn tử ngơn ngữ Swift 13 1.2.7 Rẽ nhánh vòng lặp Swift 15 1.2.8 Xử lý chuỗi ký tự Swift 20 1.2.9 Mảng Swift 21 1.2.10 Tập hợp Swift 23 1.2.11 Làm việc với kiểu Dictionaries 25 1.2.12 Lệnh guard 27 1.2.13 Hàm Swift 27 1.2.14 Định nghĩa sử dụng Cấu trúc, Lớp đối tượng Swift .33 1.2.15 Ép kiểu 36 1.2.16 Protocol chế Delegate Swift 38 1.3 Câu hỏi tập chương 41 CHƯƠNG THIẾT KẾ GIAO DIỆN VÀ XỬ LÝ SỰ KIỆN TRÊN IOS 46 2.1 Thiết kế giao diện với Storyboard .46 2.1.1 Các thành phần iOS Project .46 2.1.2 Màn hình chờ LaunchScreen.storyboard 49 2.1.3 Màn hình thiết kế giao diện Main.storyboard .49 2.1.4 Case Study: Tạo ứng dụng Calculate 53 iii 2.2 Xử lý kiện iOS 56 2.2.1 Kết nối đối tượng với code .56 2.2.2 Cách viết hàm iOS với ngôn ngữ Swift .58 2.2.3 Hoàn thiện ứng dụng Calculate giai đoạn 59 2.3 Tổ chức code theo mơ hình MVC .62 2.3.1 Phân tích ứng dụng theo mơ hình MVC .62 2.3.2 Xây dụng ứng dụng theo mơ hình MVC 63 2.3.3 Mở rộng hoàn thiện ứng dụng Calculate 64 2.4 Autolayout iOS 68 2.4.1 Vấn đề giao diện ứng dụng Calculate 68 2.4.2 Cải tiến giao diện cho ứng dụng Calculate 68 2.5 Case Study: Thiết kế ứng dụng Quản lý ăn 71 2.5.1 Luyện tập thiết kế giao diện autolayout iOS .71 2.5.2 Xử lý kiện với Component .73 2.5.3 Làm việc với UITapGestureRecognizer .77 2.5.4 Xây dựng Control cho ứng dụng 79 2.5.5 Thêm thuộc tính vào Attributes Inspector 84 2.5.6 Table view 87 2.5.7 Navigation truyền tham số hình ứng dụng 92 2.6 Câu hỏi tập chương 103 CHƯƠNG LÀM VIỆC VỚI CƠ SỞ DỮ LIỆU 105 3.1 Thiết kế Data model cho ứng dụng 105 3.1.1 Phân tích ứng dụng Quản lý ăn 105 3.1.2 Thiết kế Datamodel cho ứng dụng 105 3.2 Kiểm thử tính đắn Data model 106 3.2.1 Xây dựng test cases kiểm thử tính đắn cho Datamodel ứng dụng .106 3.2.2 Kiểm thử điều chỉnh .107 3.3 Một số dạng lưu trữ liệu lâu dài ứng dụng iOS .108 3.3.1 Core Data 108 3.3.2 SQLite 108 3.3.3 Lưu trữ mạng .108 3.4 Cơ sở liệu SQLite với ứng dụng iOS .108 3.4.1 Cài đặt thư viện SQLite Framework FMDB 108 3.4.2 Thiết kế tầng truy xuất liệu DAL 110 iv 3.5 Xây dựng tầng truy xuất liệu cho ứng dụng iOS 111 3.5.1 Thiết kế chức bản: Đóng, mở, tạo bảng… 111 3.5.2 Thiết kế API cho tầng 113 a Đọc liệu từ sở liệu 113 b Ghi liệu vào sở liệu .114 c Cập nhật liệu vào sở liệu .114 d Xoá liệu từ sở liệu 115 e Tìm kiếm liệu từ sở liệu 115 3.6 Sử dụng tầng DAL cho ứng dụng iOS .115 3.7 Câu hỏi tập chương 117 CHƯƠNG BẢN ĐỒ TRỰC TUYẾN TRÊN IOS .118 4.1 Một số dạng đồ trực tuyến thông dụng .118 4.1.1 Map Kit .118 4.1.2 Google Map 119 4.2 Sử dụng đồ trực tuyến ứng dụng iOS 119 4.2.1 Tích hợp MapKit vào ứng dụng 119 4.2.2 Tạo đồ ứng dụng iOS 119 4.2.3 Đánh dấu đồ dùng Annotation 121 4.2.4 Lấy vị trí người dùng đồ 122 4.2.5 Tương tác với Annotation đồ 123 4.2.6 Xác định vị trí di chuyển đồ .123 4.2.7 Đánh dấu vị trí kiện LongPressGesture 124 4.2.8 Chỉ đường 124 4.3 Câu hỏi tập chương 127 TÀI LIỆU THAM KHẢO 129 v DANH MỤC CÁC TỪ VIẾT TẮT STT Từ viết tắt iOS MVC IB FMDB Cụm từ gốc Ghi iPhone Operation System Models – Views – Controllers Interface Builder Flying Meat Database vi DANH MỤC BẢNG BIỂU VÀ HÌNH VẼ Hình 1.1.1 Kiến trúc iOS Hình 1.1.4.1 hình khởi động Xcode Hình 1.1.4.2 Giao diện lựa chọn Template cho ứng dụng iOS .5 Hình 1.1.4.3 Cấu hình cho Project iOS Hình 1.1.4.4 Màn hình khởi tạo Project iOS Hình 1.1.4.5 Các vùng công cụ phát triển ứng dụng iOS Bảng 1.2.1 Một số cú pháp ngôn ngữ Swift Bảng 1.2.2 Một số kiểu liệu thông dụng Swift .10 Bảng 1.2.5 Chuỗi thoát Swift .13 Hình 1.2.7.1 Hoạt động câu lệnh rẽ nhánh loại 15 Hình 1.2.7.2 Hoạt động câu lệnh rẽ nhánh loại 15 Hình 1.2.7.3 Hoạt động vòng lặp while 18 Hình 1.2.7.4 Hoạt động vịng lặp repeat … while 19 Bảng 1.2.8.1 Một số thao tác xử lý chuỗi thông dụng 21 Hình 2.1.1.1 Các thành phần iOS Project 46 Hình 2.1.1.2 Màn hình Debug chương trình iOS 48 Hình 2.1.1.3 Cấu trúc iOS Project Xcode (trái) thư mục dự án (phải) 48 Hình 2.1.2.1 Cấu hình cho hình LaunchScreen ứng dụng iOS 49 Hình 2.1.3.1 Màn hình thiết kế giao diện Main.storyboard 50 Hình 2.1.3.2 Thư viện đối tượng cho thiết kế giao diện (Object Library) .51 Hình 2.1.3.3 Kéo – thả đối tượng từ thư viện vào hình thiết kế giao diện 51 Hình 2.1.3.4 Bảng thuộc tính đối tượng thiết kế giao diện iOS 52 Hình 2.1.3.5 Ví dụ thay đổi thuộc tính đối tượng trực tiếp hình thiết kế 53 Hình 2.1.4.1 Tạo ứng dụng iOS Calculator2020 (a) 53 Hình 2.1.4.2 Tạo ứng dụng iOS Calculator2020 (b) 54 Hình 2.1.4.3 Tạo ứng dụng iOS Calculator2020 (c) 54 Hình 2.1.4.4 Gom nhóm file hệ thống vào nhóm để quản lý 55 Hình 2.1.4.5 Kết gom nhóm file hệ thống System files 55 Hình 2.2.1.1 Màn hình liên kết code lập trình iOS .56 Hình 2.2.1.2 Thiết lập tham số cho việc liên kết code với đối tượng layout 57 Hình 2.2.1.3 Kết liên kết code dạng hành vi (Action) đối tượng 57 Hình 2.2.2.1 Kết điều chỉnh giao diện giai đoạn 59 Hình 2.2.2.2 Kết điều chỉnh chương trình .60 Hình 2.2.2.3 Bổ sung phím chức cho máy tính 61 Hình 2.2.2.4 Lấy ký tự đặc biệt Xcode 61 Hình 2.3.3.1 Giao diện chức bổ sung 66 Hình 2.4.1.1 Vấn đề thay đổi hướng nhìn giao diện iOS .68 Hình 2.4.2.1 Nhúng đối tượng Stack View 69 Hình 2.4.2.2 Kết sau nhúng đối tượng Stack View 69 Hình 2.4.2.3 Thêm dàng buộc cho Autolayout 70 vii Hình 2.4.2.4 Autolayout với chiều khác hình iPhone .71 Hình 2.5.1.1 Giao diện hình chi tiết ăn 72 Hình 2.5.1.2 Đưa ảnh default vào ứng dụng iOS 72 Hình 2.5.2.1 Các trạng thái cách chuyển trạng thái Controller 73 Hình 2.5.2.2 Kết nối đối tượng Tap Gesture Recognizer với ImageView 77 Hình 2.5.4.1 Tạo lớp RatingControl 80 Hình 2.5.4.2 Layout RatingControl .81 Hình 2.5.4.3 Ba ảnh cho đối tượng RatingControl 83 Hình 2.5.4.4 Thuộc tính Attributes Inspector 85 Hình 2.5.6.1 Thiết kế giao diện phần tử danh sách ăn 87 Hình 2.5.6.1 Tạo hình giao diện với Table View Controller 88 Hình 2.5.6.2 Lựa chọn Protoype Cell để thiết kế cấu hình 89 Hình 2.5.6.3 Thiết kế cho Prototype Cell .90 Hình 2.5.7.1 Sau nhúng Table View Controller vào Navigation Controller 93 Hình 2.5.7.2 Màn hình MealDetail sau đưa vào Navigation Stack .95 Hình 2.5.7.3 Kết sau nhúng MealDetail vào Navigation Controller 96 Hình 2.5.7.4 Tạo Unwind Segue cho nút Save kết nối với Unwind Action 99 Hình 2.5.7.5 Hiện thực hố chức cập nhật ăn có 101 Hình 3.2.1.1 Mở file để viết Unit Test iOS 106 Hình 3.2.2.1 Chỉ dừng lại test cases pass hết 107 Hình 3.4.1.1 Cài đặt thư viện SQLite cho ứng dụng iOS 109 Hình 3.4.1.2 Download code source FMDB 109 Hình 3.4.1.3 Tuỳ chọn tích hợp thư viện FMDB vào Project 110 Hình 3.4.1.4 Tạo cầu nối thư viện Objective-C với ngôn ngữ Swift 110 Hình 4.2.2.1 Tạo hình MapViewController 120 Hình 4.2.3.1 Đánh dấu đồ .121 Hình 4.2.4.1 Cấp quyền cho việc truy xuất vị trí đồ 122 Hình 4.2.4.2 Yêu cầu cấp quyền truy xuất 123 Hình 4.2.8.1 Màn hình MapView với chức đường 126 Hình 4.3.1 Cải tiến chức 4.2.5 127 viii GIÁO TRÌNH HỌC PHẦN Tên học phần: LẬP TRÌNH DI ĐỘNG TRÊN iOS Mã học phần: CNC107440 Vị trí, tính chất, ý nghĩa vai trị học phần: - Vị trí: Học phần chuyên ngành bắt buộc - Tính chất: Đây học phần bắt buộc ngành Công nghệ thông tin, cung cấp cho sinh viên nhìn tổng quát phương pháp thiết kế ứng dụng thiết bị di động thông qua ngôn ngữ Swift cơng cụ lập trình để phát triển ứng dụng cho hệ điều hành iOS Qua đó, Sinh viên vận dụng kỹ thiết kế phần mềm để xây dựng ứng dụng dụng chạy iOS Thông qua hoạt động học tập, giúp Sinh viên rèn luyện tư giải vấn đề tuân thủ quy định tham gia vào dự án vừa nhỏ Mục tiêu học phần: - Về kiến thức: + Hiểu ngôn ngữ Swift Thiết kế giao diện cho ứng dụng iOS; + Vận dụng mơ hình MVC vào phát triển ứng dụng iOS - Về kỹ năng: + Thiết kế xây dựng sở liệu cho ứng dụng iOS; + Xây dựng ứng dụng vừa nhỏ sử dụng Webservice dịch vụ (Map Location); + Hiện thực hoá ứng dụng vừa nhỏ iOS; + Xây dựng Phân tích, thiết kế cho án phần mềm vừa nhỏ; + Sử dụng công cụ quản lý triển khai Project nhóm - Về lực tự chủ trách nhiệm: + Luôn chủ động tìm hiểu vấn đề thực nhiệm vụ giao; + Luôn tuân thủ đầy đủ quy định lớp học CHƯƠNG TỔNG QUAN VỀ PHÁT TRIỂN ỨNG DỤNG TRÊN IOS VÀ NGÔN NGỮ SWIFT Mục tiêu: Hiểu ngôn ngữ Swift số khái niệm lập trình iOS Mơ tả nội dung: Trình bày tổng quan phát triển ứng dụng di động iOS sâu vào tìm hiểu thành phần ngơn ngữ lập trình Swift 1.1 Tổng quan phát triển ứng dụng iOS 1.1.1 IOS gì? Kiến trúc bên iOS? IOS hay iPhone OS hiểu hệ điều hành cho thiết bị di động (iPhone, iPad…) phát triển Apple Ban đầu thiết kế cho iPhone, hỗ trợ cho dạng thiết bị khác Apple iPod touch, iPad, Apple TV… IOS đời ngày phát triển qua nhiều hệ: IOS đời năm 2007 với xuất iPhone Đến năm 2008, iOS đời bổ sung thêm tính App Store Năm 2009 tính iPhone Enhancement bổ sung với xuất iOS Năm 2010 đánh dấu bước đột phá Apple công bố iOS với MultiTasking, Rentina FaceTime… (2020) sử dụng hệ iOS 14 với tính bổ sung: Cho phép sử sử dụng trình duyệt khác Safari làm trình duyệt mặc định; App Library iOS 14 chứa Widgets hình ứng dụng vào thư mục thay cho giao diện trang Ứng dụng trước với chế độ xem đơn giản dễ điều hướng; Giao diện gọi cải tiến thu gọn lại dạng biểu tượng giống thơng báo khác; Màn hình home thêm Widgets với kích thước tuỳ ý trực tiếp Home Screen; Thay đổi cách xuất trợ lý ảo Siri, thay chiếm trước, Siri xuất phía hình, cịn câu trả lời xuất phía trên; Bổ sung tính gõ lên lưng sau iPhone cho phép chụp ảnh hình, tăng giảm âm lượng (người dùng tự thiết lập cấu hình); Bổ sung tính Hiệu ứng âm không gian AirPod Pro; Thu hồi lại tin nhắn gửi Message thêm tính Picture in Picture cho ứng dụng YouTube iPhone Trên phương diện lập trình viên hiểu iOS Sofware Stack bao gồm tầng (Hình 1.1.1) Trong đó: - Tầng Core OS: Là hạt nhân hệ điều hành iOS dựa Unix } } d Xoá liệu từ sở liệu Mỗi xoá ăn danh sách ăn, rõ ràng ta cần xố khỏi sở liệu, hàm cần tham số ăn cần xoá: func deleteMeal(meal: Meal){ if db != nil { let sql = "DELETE FROM \(TABLE_NAME) WHERE \(MEAL_NAME) = ? AND \(MEAL_RATING) = ?" { try db!.executeUpdate(sql, values: [meal.mealName, meal.ratingValue]) os_log("The meal is deleted!") } catch { os_log("Fail to delete the meal!") } } else { os_log("Database is nil!") } } e Tìm kiếm liệu từ sở liệu Bài tập: Dựa vào hàm đọc liệu, hàm cập nhật hàm xoá liệu tự viết API cho việc tìm kiếm ăn sở liệu Hàm có biến truyền vào ăn cần tìm, tìm thấy sở liệu có ăn trùng tên trùng rating trả kết true, ngược lại trả false 3.6 Sử dụng tầng DAL cho ứng dụng iOS Sau thiết kế xong tầng DAL, sử dụng chúng tầng cho việc lưu trữ liệu ứng dụng Quản lý ăn Rõ ràng thao tác liên quan đến danh sách ăn nằm hình MealListController Nên việc sử dụng Database APIs nằm lớp Mở file MealListController, khai báo hai biến sau: private var dao = FoodManagementDatabase() static private var tableCreated: Bool = false Trong biến dao (Viết tắt Database Access Object) đối tượng sở liệu cho phép sử dụng Database APIs để thực thao tác đọc, ghi, cập nhật, tìm kiếm, xố… ăn từ/vào/trong sở liệu SQLite ứng dụng Còn biến tableCreated để đảm bảo không tạo lại bảng liệu có 115 Di chuyển đến hàm viewDidLoad điều chỉnh đoạn chương trình thêm liệu giả cho Table view nhằm đảm bảo liệu chưa có khởi tạo bảng liệu, đọc liệu từ sở liệu vào datasource table view (nếu có), khơng có tạo liệu ăn giả ghi ln vào sở liệu: //Load from database if dao.open() { if !MealTableViewController.tableCreated { MealTableViewController.tableCreated = dao.createTable() } dao.readMealList(meals: &meals) } if meals.count == { // Create an example of meal let image = UIImage(named: "default") if let meal = Meal(name: "Mon Hue", image: image, rating: 3) { meals += [meal] if dao.open() { dao.insertMeal(meal: meal) } } } Di chuyển đến hàm thực xố ăn menu Edit điều chỉnh thành: // Delete the meal from database if dao.open() { dao.deleteMeal(meal: meals[indexPath.row]) } // Delete the row from the data source meals.remove(at: indexPath.row) tableView.deleteRows(at: [indexPath], with: fade) Mỗi ăn bị xố khỏi table view xố khỏi sở liệu Bài tập: Tại lại cần thực xoá sở liệu trước xoá datasource table view? Di chuyển đến hàm unWindToMealList điều chỉnh thành: if sourceViewController.navigationType == newMeal { // The new indexPath of the new meal in the table let newIndexPath = IndexPath(row: meals.count, section: 0) // Put the new meal into the datasource of table view meals += [newMeal] // Update the new meal in the table view tableView.insertRows(at: [newIndexPath], with: automatic) // Insert into database if dao.open() { dao.insertMeal(meal: newMeal) } } 116 // For edit meal segue else if sourceViewController.navigationType == editMeal{ if let selectedIndexPath = tableView.indexPathForSelectedRow { // Update in the database if dao.open() { dao.updateMeal(oldMeal: meals[selectedIndexPath.row], newMeal: newMeal) } // Update in datasource array meals[selectedIndexPath.row] = newMeal // Update in table view tableView.reloadRows(at: [selectedIndexPath], with: none) } } Bài tập: Tại phần edit meal lại cần ghi thông tin vào sở liệu trước?Trong phần thêm ăn ghi thơng tin ăn vào sở liệu trước có khơng? Nếu cải tiến đưa thêm vào API tìm kiếm ăn để tránh ghi trùng lặp sở liệu đoạn chương trình ghi vào sở liệu nên đặt đâu? 3.7 Câu hỏi tập chương Thiết kế lại cấu trúc bảng liệu ta muốn lưu ăn dạng tên, đường dẫn đến file ảnh, giá trị đánh giá! Tìm hiểu viết lại chương trình! Thực yêu cầu tập toàn chương 3! Khi dùng SQLite hiệu hơn? Khi dùng Core Data? Khi dùng Firebase? Sửa lại hàm init cho trước khởi tạo sở liệu cần kiểm tra tồn file chứa database trước? Viết Database API dùng để tìm kiếm ăn sở liệu theo tên ăn trả danh sách ăn trùng tên nil? Viết Database API dùng để tìm kiếm ăn có rating lớn (nhỏ hơn) ăn đó, hàm trả danh sách ăn thoả điều kiện nil? 117 CHƯƠNG BẢN ĐỒ TRỰC TUYẾN TRÊN IOS Mục tiêu: - Về kiến thức: + Vận dụng ngôn ngữ Swift phát triển ứng dụng iOS; - Về kỹ năng: + Xây dựng ứng dụng vừa nhỏ sử dụng Webservice dịch vụ (Map Location); + Hiện thực hoá ứng dụng vừa nhỏ iOS; - Về lực tự chủ trách nhiệm: + Ln chủ động tìm hiểu vấn đề thực nhiệm vụ giao; + Luôn tuân thủ đầy đủ quy định lớp học Mơ tả nội dung: Chương trình bày kiến thức, kỹ cần thiết việc sử dụng dịch vụ tiện ích (Map Location) vào phát triển ứng dụng iOS 4.1 Một số dạng đồ trực tuyến thông dụng Khác với ứng dụng Android, với ứng dụng iOS có nhiều lựa chọn dùng đồ trực tuyến xác định vị trí (Map and Location) Ngồi dịch vụ hỗ trợ mạnh từ Google ra, thân Apple tự phát triển riêng dịch vụ có tính gần tương đương dễ sử dụng (Map Kit) 4.1.1 Map Kit Là dịch vụ Map and Location Apple tự phát triển nhằm cung cấp tính hiển thị đồ trực tuyến, tương tác với đồ trực tuyến, định vị tìm kiếm vị trí đồ trực tuyến, đường đồ trực tuyến … cho ứng dụng iOS MapKit tiếp cận dựa việc xây dựng tuyến đường (Khác với Google Map) Trước đây, Map Kit cịn nhiều tính không hỗ trợ tốt Google Map, nhiên thời điểm tại, Map Kit hồn tồn thay cho Google Map sử dụng rộng rãi với hầu hết ứng dụng iOS giao diện đẹp dễ sử dụng (do tích hợp sẵn thư viện Xcode) Ngồi ra, cịn hỗ trợ chương trình Siri tốt hiệu OK Google 118 4.1.2 Google Map Là dịch vụ đồ trực tuyến Google phát triển cung cấp đầy đủ tính cần thiết cho ứng dụng Android iOS với tiếp cận dựa Location Places Tuy nhiên, để sử dụng chúng ứng dụng iOS, cần tích hợp chúng vào Project iOS Điều thường gây khó khăn cho lập trình viên 4.2 Sử dụng đồ trực tuyến ứng dụng iOS Trong giáo trình này, chúng tơi tập trung hướng dẫn người học sử dụng dịch vụ Map and Location Map Kit vào phát triển ứng dụng iOS 4.2.1 Tích hợp MapKit vào ứng dụng Để tích hợp MapKit vào ứng dụng iOS, cần thực câu lệnh đơn giản để import thư viện MapKit vào ứng dụng (Với Google map phức tạp nhiều) Nếu muốn sử dụng dịch vụ Location cần import thư viện tương ứng: import MapKit import CoreLocation 4.2.2 Tạo đồ ứng dụng iOS Để sử dụng đồ trực tuyến iOS, cần thực hai thao tác là: Khai báo đồ (bằng lệnh var mapView: MKMapView!) khởi tạo cho đồ trực tuyến (init định nghĩa lại hàm viewDidLayoutSubview) Bước 1: Tạo hình MapViewController Với ứng dụng chúng ta, người dùng tap vào nút “Go to Map” hiển thị đồ trực tuyến thực chức đánh dấu, tìm đường… Như vậy, cần hình có tên MapViewCotroller: Kéo thả View Controller từ thư viện đối tượng vào Storyboard Sắp xếp hình nằm cạnh bên phải hình MealDetailController Tiếp theo Ctrol + Drag từ nút “Go to Map” hình MealDetailController sang hình tạo => Chọn Show (Kết hình 4.2.2.1) Tiếp theo, cần tạo lớp MapViewController.swift, kế thừa từ lớp UIViewController liên kết với hình vừa tạo Mở file MapViewController.swift để khai báo đồ trực tuyến khởi tạo cho 119 Hình 4.2.2.1 Tạo hình MapViewController Bước 2: Tích hợp MapKit, CoreLocation khởi tạo cho đồ trực tuyến Lớp MapViewController ban đầu có dạng sau: import UIKit import MapKit import CoreLocation class MapViewController: UIViewController { //MARK: Properties var mapView: MKMapView! override func viewDidLoad() { super.viewDidLoad() //MARK: Initialization for Map mapView = MKMapView.init() view.addSubview(mapView) } } //MARK: For Map override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() mapView.frame = CGRect.init(origin: CGPoint.zero, size: view.frame.size) } Do ban đầu lúc khởi tạo đồ trực tuyến chưa có kích thước (chiều dài, chiều rộng), nên không khởi tạo kích thước cho đồ hàm viewDidLayoutSubviews khơng nhìn thấy đồ chạy chương trình Ở cho đồ từ toạ độ (góc bên trái hình) đến toạ độ max (góc bên phải hình) 120 Bài tập: Chạy thử chương trình di chuyển đến hình MapViewController cho nhận xét! 4.2.3 Đánh dấu đồ dùng Annotation Trên đồ online nhiều ta cần đánh dấu (Marker) lại số điểm cho nhiều mục đích khác nhau, điểm có thơng tin toạ độ (kinh độ, vĩ độ), tên, hình ảnh,… Để đánh dấu đồ online trước tiên ta cần định nghĩa lớp Map annotation có tên MyMapAnntation sau: import UIKit import MapKit class MapAnnotation: NSObject, MKAnnotation { //MARK: MKAnnotation protocol public var coordinate: CLLocationCoordinate2D public var title: String? public var subtitle: String? //MARK: Initializer init(coordinate: CLLocationCoordinate2D, title: String?, subtitle: String?) { self.coordinate = coordinate self.title = title self.subtitle = subtitle super.init() } } Trong hàm viewDidLoad thực công việc sau để đánh dấu toạ độ trường Cao đẳng Công nghệ Thủ Đức đồ: // Add a marker on the Map let tdc = CLLocation(latitude: 10.851261907187268, longitude: 106.75824763345204) let tdcMarker = MyMapAnnotation(coordinate: tdc.coordinate, title: "TDC", subtitle: "Cao dang Cong nghe Thu Duc") mapView.addAnnotation(tdcMarker) Nếu sử dụng kết tập số chương này, chạy chương trình ta có kết hình 4.2.3.1 biến tdc chứa toạ độ (kinh độ, vĩ độ) trường Cao đẳng Cơng nghệ Thủ Đức, phạm vi nhìn 500 m Hình 4.2.3.1 Đánh dấu đồ 121 4.2.4 Lấy vị trí người dùng đồ Để lấy vị trí người dùng đồ, cần thực thi hàm cần thiết CLLocationManagerDelegate đồng thời cần cho phép truy xuất vào vị trí người dùng Để yêu cầu cấp quyền truy xuất vị trí tại, mở file info.plist, thêm vào Key: “Privacy - Location When In Use Usage Description” với thông báo “Allow to access user's Location!” (Hình 4.2.4.1) Hình 4.2.4.1 Cấp quyền cho việc truy xuất vị trí đồ Cần khai báo hai biến để chứa toạ độ ví trí biến quản lý việc truy xuất vị trí đồ: private var locationManager: CLLocationManager! private var currentLocation: CLLocation? Tiếp đến viết hàm lấy toạ độ tại: // Get curent Location func getCurrentLocation(){ locationManager = CLLocationManager() locationManager.delegate = self // Define how to update location (immediate) locationManager.desiredAccuracy = kCLLocationAccuracyBest // Check for Location Services if CLLocationManager.locationServicesEnabled() { locationManager.requestWhenInUseAuthorization() locationManager.startUpdatingLocation() } } 122 Hàm gọi hàm viewDidLoad Tiếp đến viết hàm uỷ quyền thực cập nhật vị trí liên tục với hàm centerMapOnLocation kết tập 1: //MARK: For Location func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { defer { currentLocation = locations.last locationManager.stopUpdatingLocation() } if currentLocation == nil { // Zoom to user location if let userLocation = locations.last { centerMapOnLocation(location: userLocation, radius: 500) } } } Chọn máy ảo => Chọn Features => Location => Custom Location => Nhập vào toạ độ (Do máy ảo khơng có cảm biến) Thực chạy chương trình, xuất yêu cầu cho phép truy xuất vị trí đồ (Hình 4.2.4.2), chọn cho phép (Allow While Using App) Bài tập: Chạy chương trình máy ảo, chạy chương trình máy thật, di chuyển cho nhận xét! 4.2.5 Tương tác với Annotation đồ Với Annotation đánh dấu đồ, ta tuỳ biến chúng người sử dụng tương tác dễ dàng với Annotation Trước tiên cần thực uỷ quyền hàm MKMapViewDelegate Hình 4.2.4.2 Yêu cầu cấp quyền truy xuất Bài tập: Tìm hiểu thực tương tác với Annotation! 4.2.6 Xác định vị trí di chuyển đồ Bài tập: Dựa kết mục 4.2.4 ln lấy vị trí mà người dùng đứng đồ Sửa chương trình mục 4.2.4 người sử dụng di chuyển toạ độ vị trí di chuyển theo đồ ta thấy hướng di chuyển người dùng đồ 123 Gợi ý: Sử dụng lệnh hiển thị vị trí người dùng đồ: // Show the current location as a blue point mapView.showsUserLocation = true 4.2.7 Đánh dấu vị trí kiện LongPressGesture Một thao tác thường hay định nghĩa cho ứng dụng di động bắt kiện long press (Tap giữ tay lúc hình điện thoại) Thực sau: // For long press gesture func addLongPressGesture(){ let longPressRecognizer:UILongPressGestureRecognizer = UILongPressGestureRecognizer(target: self, action:#selector(handleLongPress(_:))) longPressRecognizer.minimumPressDuration = 1.0 mapView.addGestureRecognizer(longPressRecognizer) } Trước tiên khai báo đối tượng kiểu UILongPressGestureRecognizer đối tượng truyền vào action selector trỏ đến hàm handleLongPress xuất kiện LongPress hàm gọi Hàm handleLongPress có tham số truyền vào UIGestureRecognizer cho phép nhận biết toạ độ vị trí chỗ ngón tay tap đồ Đơn giản ta viết hàm cho người dùng LongPress vị trí đồ đánh dấu Annotation vị trí đó: @objc func handleLongPress(_ gestureRecognizer:UIGestureRecognizer){ // Get the position of user's touch point let touchPoint = gestureRecognizer.location(in: mapView) let touchCoordinate = mapView.convert(touchPoint, toCoordinateFrom: mapView) markLocation = CLLocation(latitude: touchCoordinate.latitude, longitude: touchCoordinate.longitude) let annotation = MyMapAnnotation(coordinate: markLocation!.coordinate, title: "You mark here!", subtitle: "") mapView.addAnnotation(annotation) } 4.2.8 Chỉ đường Chỉ đường công việc tương đối phức tạp cho ứng dụng di động Trong MapKit cần thực bước sau: Bước 1: Đánh dấu điểm điểm đến đồ map let sourcePlaceMark = MKPlacemark(coordinate: sourceCoordinate, addressDictionary: nil) let destinationPlaceMark = MKPlacemark(coordinate: destinationCoordinate, addressDictionary: nil) 124 Bước 2: Lấy MapItem cho điểm điểm đến dựa kết bước let sourceMapItem = MKMapItem(placemark: sourcePlaceMark) let destinationMapItem = MKMapItem(placemark: destinationPlaceMark) Bước 3: Dựa MapItem xác định yêu cầu hương cho điểm điểm đến let directRequest = MKDirections.Request() directRequest.source = sourceMapItem directRequest.destination = destinationMapItem directRequest.transportType = automobile Bước 4: Tính tốn điểm theo hướng xác định bước tiến hành vẽ đường let direction = MKDirections(request: directRequest) direction.calculate { (response, error) in if error == nil { if let route = response?.routes.first { self.mapView.addOverlay(route.polyline, level: aboveRoads) let rect = route.polyline.boundingMapRect self.mapView.setVisibleMapRect(rect, edgePadding: UIEdgeInsets.init(top: 40, left: 40, bottom: 20, right: 20), animated: true) } } else { print(error?.localizedDescription ?? "Unknown error!") } } Bước 5: Định nghĩa lại hàm vẽ nối điểm đồ với nét vẽ mầu xanh dương, độ rộng nét vẽ 3: // Draw the route func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer { let renderer = MKPolylineRenderer(overlay: overlay) renderer.strokeColor = UIColor.blue renderer.lineWidth = 3.0 return renderer } Điều chỉnh lại hàm handleLongPress để kiện LongPress xuất lấy toạ độ đồ điệm tap, thêm vào Annotation cho thực vẽ đường hàm đường bước trên: // Get the position of user's touch point let touchPoint = gestureRecognizer.location(in: mapView) let touchCoordinate = mapView.convert(touchPoint, toCoordinateFrom: mapView) markLocation = CLLocation(latitude: touchCoordinate.latitude, longitude: touchCoordinate.longitude) // Clear all previous Annotations mapView.removeAnnotations(mapView.annotations) if let meal = self.meal { 125 addAnnotation(coordinate: touchCoordinate, title: meal.mealName, subtitle: "", type: MapAnnotationType.specific) } else { addAnnotation(coordinate: touchCoordinate, title: defaultMess, subtitle: "", type: MapAnnotationType.specific) } mapView.removeOverlays(mapView.overlays) routeFromSourceToDes(sourceCoordinate: (currentLocation?.coordinate)!, destinationCoordinate: touchCoordinate) Kết chạy chương trình (Hình 4.2.8.1): Hình 4.2.8.1 Màn hình MapView với chức đường 126 4.3 Câu hỏi tập chương Trong mục 4.2.2 sau khởi tạo hiển thị đồ hình điện thoại, viết hàm thực cơng việc sau: Truyền vào hàm hai tham số toạ độ điểm cần đến (Có kiểu CLLocation) phạm vi khu vực cần hiển thị (Có kiểu CLLocationDistance), gọi hàm đồ di chuyển đến toạ độ truyền tham số thứ bao phủ vùng xung quanh toạ độ với khoảng cách bao phủ tham số thứ 2 Cải tiến chương trình mục 4.2.3 để đánh dấu danh lam thắng cảnh tiếng Việt Nam giới! Thực tập 4.2.5 cho chạy ứng dụng, tap vào nút “Go to Map” chuyển sang hình MapViewController, đánh dấu điểm xác định (vị trí quán có bán ăn đó) Mỗi tap lên điểm Marker hiển thị ảnh ăn tương ứng, tap lên nút (!) hiển thị thơng tin qn (Hình 4.3.1) Hình 4.3.1 Cải tiến chức 4.2.5 Cải tiến chương trình mục 4.2.7 cho vị trí người dùng đứng đồ đánh dấu Annotation (khác mầu sắc, hình ảnh…) người sử dụng LongPress vị trí khác đồ đánh dấu Annotation khác 5* Sửa chương trình để từ hình MealDetail chuyển sang hình MapView thơng tin ăn truyền sang hình MapView Nếu ăn có toạ độ quán bán hiển thị Annotation vị trí quán ăn đồ Nếu tương tác vào Annotation biết thông tin khác quán ăn Nếu ăn thêm vào danh sách chưa có toạ độ quán đồ, LongPress lên vị trí lấy toạ độ điểm làm toạ độ quán ăn bán 6* Cải tiến chương trình mục 4.2.8 kết hợp với chương trình cải tiến tập số điều chỉnh chương trình cho có toạ độ qn bán ăn vẽ đường từ vị trí đến qn ăn đó, cịn Long Press vị trí khác hiển 127 thị Dialog hỏi xem người dùng có muốn thay đổi địa quán hay không? Nếu muốn cập nhật địa Nếu ăn chưa có toạ độ, LongPess hỏi xem có muốn lấy toạ độ làm địa quán hay không? Nếu muốn, cập nhật địa 128 TÀI LIỆU THAM KHẢO [1] Neil Smyth, iOS 11 App Development Essentials, eBookFrenzy, 2018 [2] Vandad Nahavandipoor, iOS 10 Swift Programming Cookbook, O’Reilly Media USA, 2017 [3] Stefan Kaczmarek, Brad Lees, Gary Bennett, Swift for Absolute Beginners: Learn to Develop Apps for iOS, Apress 2019 129 ... nghiêm cấm LỜI GIỚI THIỆU Giáo trình Lập trình di động iOS viết cho học phần chuyên ngành bắt buộc, ngành Công nghệ Thông tin, trường Cao đẳng Công nghệ Thủ Đức Giáo trình viết theo hướng tích... >= print("Diem } else if diem >= print("Diem } else if diem >= print("Diem } else { print("Diem } diem < { (diem) la loai Yeu") && diem < { (diem) la loai Trung binh") && diem < { (diem) la... DỤNG TRÊN IOS VÀ NGÔN NGỮ SWIFT Mục tiêu: Hiểu ngôn ngữ Swift số khái niệm lập trình iOS Mơ tả nội dung: Trình bày tổng quan phát triển ứng dụng di động iOS sâu vào tìm hiểu thành phần ngơn ngữ lập