TỔNG QUAN
Khảo sát hiện trạng
Ngày nay, sự phát triển của phần mềm ứng dụng công nghệ thông tin đã mang lại nhiều lợi ích cho cuộc sống, đặc biệt trong lĩnh vực âm nhạc Sau những giờ làm việc căng thẳng, nhiều đồng nghiệp thường chọn về nhà nghỉ ngơi và nghe nhạc không lời nhẹ nhàng để thư giãn Là một người từng chơi nhạc cụ, tôi cảm thấy thật tuyệt vời khi có thể tự mình trình bày những bản nhạc Các ứng dụng hiện nay giúp người dùng dễ dàng tiếp cận với nhạc cụ, mang đến trải nghiệm âm nhạc thú vị và đơn giản hơn bao giờ hết.
Tính cấp thiết của đề tài
Trong thời đại công nghệ số, việc tìm kiếm trung tâm dạy nhạc cụ trở nên dễ dàng hơn bao giờ hết Tuy nhiên, chi phí mua dụng cụ và học phí có thể khá cao Hơn nữa, trong bối cảnh dịch COVID-19 đang diễn biến phức tạp, việc di chuyển từ nhà đến trung tâm dạy nhạc cũng là một thách thức lớn.
Với ứng dụng này, người đi làm, trẻ em, và những ai đã biết chơi nhạc hoặc đang tìm hiểu sẽ dễ dàng luyện tập và cải thiện kỹ năng âm nhạc của mình trong giai đoạn này.
Mục tiêu của đề tài
- Tìm hiểu về hệ điều hành iOS và ngôn ngữ lập trình Swift(4.2) xây dựng ứng dụng phía Client
- Xây dựng, quản lý cơ sở dữ liệu với Firebase Realtime Database và Firebase Storage
- Tìm hiểu và xây dựng kiến trúc hệ thống API dựa trên nền tảng mã nguồn mở Firebase Database REST API, YouTube Data API
- Phân tích, thiết kế và xây dựng ứng dụng gồm một số chức năng chính như sau o Chức năng đăng nhập/đăng xuất
Chức năng tìm kiếm bài hát trong ứng dụng bao gồm việc tìm kiếm trên cơ sở dữ liệu thông thường và trên PianoKaraoke Gold Người dùng có thể chơi đàn theo cảm âm với khả năng ghi âm thanh đầu ra, chỉnh sửa bản ghi và chia sẻ lên tường cá nhân, cũng như điều chỉnh tone bàn phím và âm thanh theo thể loại bài hát Bàn phím được thiết kế với ba tầng tách biệt và có thể giả lập như piano thực tế Ứng dụng còn cung cấp chức năng bảng tin để kết nối người dùng, trang chủ gợi ý bài karaoke, cùng với các tính năng thích, bình luận và chia sẻ bài đăng Ngoài ra, người dùng có thể phát nhạc khi tắt máy, gia hạn tài khoản gold để truy cập tính năng bị khóa, quản lý bài hát đã tải xuống và quản lý thành viên cho tài khoản admin.
Yêu cầu
Ứng dụng gồm 3 actor là: quản trị hệ thống (adminstrator), người dùng trả phí (user gold) và người dùng miễn phí (user)
• Quản trị hệ thống (adminstrator): là những user quản lý hệ thống, xoá những user
• Người dùng trả phí (user gold): là những user đã thanh toán với admin để sử dụng những tính năng bị khoá
Người dùng miễn phí là những cá nhân mới tạo tài khoản hoặc đã sử dụng tài khoản từ lâu nhưng chỉ khai thác các tính năng miễn phí Họ bị giới hạn trong việc tải xuống tối đa 5 bài mỗi ngày và chỉ có thể truy cập vào các bản karaoke miễn phí.
Công nghệ lập trình
- Hệ thống ứng dụng hầu hết là công nghệ của Apple với ngôn ngữ lập trình Swift4.2 Phía server là open source của Google (Firebase, YouTube SDK)
- Xây dựng ứng dụng giao tiếp thông qua Firebase Database REST API
- Dữ liệu hệ thống sẽ được quản lý với Firebase Realtime Database và Firebase Storage.
Phạm vi nghiên cứu
Tìm hiểu các công nghệ được sử dụng trong đề tài:
Phương pháp nghiên cứu
• Phương pháp tổng hợp lý thuyết: Nghiên cứu và tìm hiểu các tài liệu, website liên quan đến các công nghệ đang tìm hiểu
Để đảm bảo tính chính xác và khoa học cho đề tài khóa luận, cần tham khảo ý kiến từ thầy hướng dẫn, các anh chị và bạn bè có kinh nghiệm liên quan Đồng thời, việc khảo sát nghiệp vụ xây dựng hệ thống cũng rất quan trọng.
• Phương pháp mô hình hóa: Mô phỏng ứng dụng từ bước thiết kế cài đặt cho đến kết quả thành phẩm của ứng dụng
Ý nghĩa khoa học thực tiễn
Hệ thống có giao diện trực quan và rõ ràng, giúp giảm thiểu thao tác không cần thiết, từ đó người dùng có thể dễ dàng và nhanh chóng tiếp cận với nhạc cụ.
CƠ SỞ LÝ THUYẾT
Về ngôn ngữ lập trình Swift
Swift là ngôn ngữ lập trình hướng đối tượng do Apple phát triển, được giới thiệu tại hội nghị WWDC 2014 để phục vụ cho việc phát triển ứng dụng trên iOS và OS X Ngôn ngữ này được kỳ vọng sẽ song song tồn tại với Objective-C, ngôn ngữ lập trình hiện tại của Apple Swift được thiết kế với tính năng phòng chống lỗi cao và được biên dịch bằng trình biên dịch LLVM (Low Level Virtual Machine).
Swift là ngôn ngữ lập trình hướng đối tượng do Apple phát triển cho iOS và OS X, được giới thiệu tại hội nghị WWDC 2014 Ngôn ngữ này được kỳ vọng sẽ tồn tại song song với Objective-C, ngôn ngữ lập trình hiện tại của Apple Swift được thiết kế để có khả năng phòng chống lỗi cao và sử dụng trình biên dịch LLVM (Low Level Virtual Machine).
Swift là ngôn ngữ lập trình hiện đại với hiệu suất vượt trội so với Objective-C, nhanh hơn cả Python trong các thử nghiệm benchmark Trên nền tảng IDE Xcode của Apple, mã nguồn Swift được đồ thị hóa theo thời gian thực, giúp lập trình viên dễ dàng chạy và kiểm lỗi mã nguồn tương tự như với Python.
Swift là ngôn ngữ lập trình kịch bản, cho phép thực thi trực tiếp từng dòng lệnh, giúp lập trình viên tiết kiệm thời gian biên dịch Nhờ đó, việc kiểm tra kết quả trở nên nhanh chóng và dễ dàng hơn, cho phép người dùng lập trình mà không cần chờ đợi quá trình biên dịch.
Mã nguồn Swift ngắn gọn và dễ hiểu, cho phép ba dòng code Objective C có thể được thay thế bằng một dòng code Swift Điều này không chỉ tăng tốc độ phát triển ứng dụng mà còn nâng cao hiệu quả bảo trì và sửa lỗi trong tương lai.
Lập trình với Swift trở nên trực quan hơn nhờ vào giao diện sắp xếp hợp lý và khả năng hiển thị kết quả theo thời gian thực trong Xcode Runtime Khi viết mã, kết quả sẽ ngay lập tức hiển thị, giúp dễ dàng chỉnh sửa và xem hình ảnh trực tiếp từ IDE Bên cạnh đó, Xcode còn cung cấp các kịch bản thực hiện trong ứng dụng, tính năng này hỗ trợ lập trình viên quản lý ứng dụng hiệu quả, ngăn ngừa sự cố tràn bộ nhớ.
Cuối cùng, Swift mang lại hiệu suất phần cứng tốt hơn so với Objective-C, giúp người dùng có trải nghiệm chơi game ấn tượng hơn trên các thiết bị iOS.
Swift là ngôn ngữ mới, các nhà phát triển ứng dụng iOS sẽ mất một khoảng thời gian đáng kể để làm chủ ngôn ngữ mới của Apple.
Giảm tốc độ phát triển của hệ sinh thái ứng dụng Apple.
Một mối lo ngại khác là sự gia tăng của các ứng dụng rác, do Swift đã làm cho quá trình phát triển ứng dụng trở nên dễ dàng hơn Điều này có thể dẫn đến sự xuất hiện ngày càng nhiều ứng dụng chất lượng kém trên App Store, liên quan đến các cấu trúc, hàm, biến hằng và các control trong Swift.
2.1.2 Các đặc trưng của Swift
2.1.2.1 Các dữ liệu cơ bản
Trong Swift, kiểu số nguyên bao gồm Signed và Unsigned integer với các mẫu 8, 16, 32 và 64 bit, được đặt tên theo quy ước tương tự như C Ví dụ, kiểu số nguyên không dấu 8-bit là Uint8, trong khi kiểu số nguyên có dấu 32-bit là Int32 Tất cả các kiểu số nguyên trong Swift đều có tên viết hoa Bên cạnh đó, Swift cũng cung cấp thông tin về giá trị thấp nhất và cao nhất của các kiểu số nguyên.
Có thể kiểm tra giá trị cao nhất của từng kiểu integer với thuộc tính Max, thấp nhất của integer với thuộc tính Min
7 let maxValue = UInt8.max // giá trị cao nhất của UInt8 là 255
Kiểu Int là một loại dữ liệu thay thế cho tất cả các kích thước cụ thể, phù hợp với từng nền tảng Trên nền tảng 32 bit, kích thước của kiểu Int là Int32, trong khi trên nền tảng 64 bit, kích thước này là Int64 Đối với nền tảng 32 bit, miền giá trị của kiểu Int nằm trong khoảng từ -2147483648 đến 147438647.
Trong Swift, kiểu số nguyên không dấu UInt cung cấp kích thước tương ứng với các nền tảng hiện tại: trên nền tảng 32-bit, UInt có kích thước tương đương với UInt32, trong khi trên nền tảng 64-bit, kích thước của UInt tương ứng với UInt64.
Chỉ nên sử dụng UINT khi người dùng cần một số nguyên không dấu có kích thước tương tự như nền tảng Trong các trường hợp khác, Int là lựa chọn ưu tiên hơn.
2.1.2.1.2 Kiểu Float và kiểu Double
Là một dạng phân số, Có thể lưu trữ những số thập phân mà kiểu integer không lưu trữ được Swift cung cấp 2 kiểu là:
//Giá trị lưu trữ lớn nhất của kiểu float var float: Float = FLT_MAX
//Giá trị lưu trữ lớn nhất của kiểu double var double:Double = DBL_MAX
2.1.2.1.3 An toàn kiểu và kiểu suy luận - Kiểu Safe và Kiểu Inference
Swift là một ngôn ngữ lập trình an toàn, yêu cầu người dùng khai báo rõ ràng các kiểu giá trị Khi khai báo kiểu String, người dùng không thể truyền giá trị kiểu Int và ngược lại Swift thực hiện kiểm tra kiểu khi biên dịch, giúp phát hiện và thông báo lỗi về kiểu không phù hợp Điều này cho phép người dùng nhận diện và sửa lỗi sớm hơn trong quá trình phát triển.
Kiểm tra kiểu trong Swift giúp người dùng tránh lỗi khi làm việc với các kiểu giá trị khác nhau Người dùng không cần phải xác định kiểu cho mỗi hằng và biến khai báo, vì Swift sẽ tự động sử dụng kiểu Inference để xác định kiểu thích hợp dựa trên giá trị đã cung cấp.
Kiểu Inference đặt biệt hữu ích khi người dùng khai báo một hằng hoặc một biết có giá trị ban đầu: let meaningOfLife = 42
// meaningOfLife được hiểu là kiểu Int let pi = 3.14159
// pi được hiểu là kiểu Double Double let anotherPi = 3 + 0.14159
// anotherPi Được hiểu là kiểu Double
2.1.2.1.4 Chuyển đổi kiểu số (Numeric Type Conversion)
Chuyển đổi số nguyên là quá trình ép kiểu giữa các kiểu số khác nhau Trong ví dụ này, hằng số so1 và so2 có kiểu số nguyên khác nhau, do đó cần phải chuyển đổi hằng số so1 sang kiểu Int16 để thực hiện phép cộng Cụ thể, với so2 là UInt16 và so1 là UInt8, ta có thể tính tổng bằng cách chuyển đổi so1 sang UInt16 trước khi cộng với so2.
Về Xcode
2.2.1 Xcode IDE (Môi trường phát triển tích hợp) Được thiết kế dựa trên các công nghệ mới nhất của Apple Xcode IDE tích hợp tất cả các công cụ cần thiết và cửa sổ làm việc như: giao diện, soạn mã nguồn, gỡ lỗi Trong quá trình soạn thảo, Xcode kiểm tra giá trị của một biến bằng cách:
- IDE Xcode xác định những lỗi trong cú pháp dễ dàng và dự đoán lỗi chính xác đồng thời tự sửa lỗi
Xcode, với vai trò là một IDE (Môi trường phát triển tích hợp), mang đến cho người dùng nhiều công cụ và tính năng hữu ích để cải thiện quá trình lập trình Một trong những tính năng nổi bật của Xcode là khả năng hiển thị danh sách các lớp trong thư viện cùng với các thuộc tính và phương pháp của từng lớp, giúp lập trình viên dễ dàng truy cập và sử dụng.
Hình 2.15 Các hỗ trợ của IDE Xcode 2.2.2 Cách tạo ứng dụng trên Xcode
Bước 1: Khởi động Xcode à “Create a new Xcode project”
Hình 2.16 Giao diện khởi động Xcode
Bước 2: Cây thư mục trái: Chọn Appliction của mục iOS Màn hình bên phải: chọn
Single View Application Nhấn nút next
Hình 2.17 Chọn loại ứng dụng
Bước 3: Nhập các thông tin:
Product Name: Tên ứng dụng của người dùng
Organization Name: tên cơ quan, tổ chức, hoặc tên lập trình viên
Organization Identifier: tên định danh của cơ quan, tổ chức hoặc của lập trình viên Language: Chọn ngôn ngữ lập trình là Objective C hoặc Swift
Devices: thiết bị mà người dùng sẽ lập trình để ứng dụng chạy Có thể là iPhone, iPad và Universal
Sử dụng Core Data: Đây là một hệ thống cơ sở dữ liệu cục bộ, người dùng cần tích chọn nếu có nhu cầu Hãy điền đầy đủ thông tin và nhấn nút Tiếp theo.
Hình 2.18 Thông tin của ứng dụng được tạo
Bước 4: Khi nhấn next sẽ hiện ra giao diện chọn thư mục lưu ứng dụng:
Hình 2.19 Chọn thư mục lưu ứng dụng 2.2.3 Giao diện chương trình (Interface Builder)
Hình 2.20 Giao diện chương trình
Giao diện Xcode có 5 thành phần chính: Toolbar, Editor area, Navigator area, Debug area, Utility area
Khu vực debug là nơi hỗ trợ người dùng trong quá trình xác định và sửa lỗi của chương trình Trong khi đó, khu vực thanh công cụ chứa các công cụ tiện ích giúp người dùng dễ dàng hơn trong việc chạy và debug ứng dụng, lựa chọn iOS Simulator, cũng như mở hoặc đóng các khu vực khác.
Editor area: vùng để người dùng thiết kế giao diện, viết và chỉnh sửa code của chương trình
Giao diện của Xcode cung cấp 87 biểu tượng, cho phép người dùng dễ dàng kéo thả và sử dụng các đối tượng có sẵn như Button, Label, Slider và các đoạn code mẫu như If, Switch.
Khu vực điều hướng cung cấp cho người dùng cái nhìn trực quan và tiện lợi để quản lý ứng dụng, theo dõi thông báo lỗi, tìm kiếm đoạn mã trong chương trình và kiểm tra hiệu suất của RAM, CPU trong quá trình chạy ứng dụng.
Để biên dịch và chạy ứng dụng, người dùng có thể sử dụng Simulator, một giải pháp hữu ích cho việc kiểm tra ứng dụng khi chưa có thiết bị thực.
IOS Simulator có sẵn các loại thiết bị khác nhau như: iPad, Iphone, phù hợp với các phiên bản màn hình khác nhau
Các bước chạy ứng dụng trên Simulator
Bước 1: Chọn iPhone 6 từ Scheme pop – up menu trong thanh Xcode toolbar
Hình 2.23 Mô phỏng ứng dụng
Bước 2: Nhấn nút Run hoặc chọn Product > Run (hoặc kích Command +R) Màn hình mô phỏng sẽ hiện ra:
Hình 2.24 Màn hình mô phỏng
Các tính năng của iPhone Simulator:
Hình 2.25 Thanh Toolbar cho màn hình mô phỏng
Xcode tự động cài đặt các ứng dụng trên iphone Simulator Simulator iPhone có thể mô phỏng các phiên bản khác nhau của hệ điều hành iPhone
Các tính năng có thể thử nghiệm trên Simulator iPhone bao gồm :
- Xoay màn hình : bên trái, bên phải,trên đầu
- Hỗ trợ cho hành động : Touch and Hold (chạm và giữ), vẽ, tap, …
- Tuy nhiên cũng có 1 số tính năng không có sẵn trên iPhone Simulator :
- Gửi và nhận tin nhắn
- Cài đặt các ứng dụng từ App Store
2.2.5 Trình biên dịch (Apple LLVM)
Trình biên dịch trong Xcode bao gồm một tập hợp các thư viện được tối ưu hóa, dễ dàng mở rộng
Xcode IDE cung cấp tính năng sửa lỗi tự động, giúp lập trình viên không chỉ nhận diện lỗi mà còn nhận được giải pháp khắc phục hiệu quả Khi người dùng di chuột vào lỗi, Xcode sẽ gợi ý cách sửa chữa, nâng cao trải nghiệm lập trình và tiết kiệm thời gian xử lý.
Ví dụ: sửa chữa một biểu tượng sai chính tả hoặc thêm một dấu chấm phẩy còn thiếu.
Về Firebase
Google cung cấp 91 mây điện toán giúp lập trình viên phát triển ứng dụng nhanh chóng bằng cách đơn giản hóa các thao tác với cơ sở dữ liệu.
Hình 2.27 Firebase hỗ trợ đa nền tảng 2.3.2 Các tính năng chính
Cơ sở dữ liệu Realtime là một giải pháp NoSQL trên nền tảng đám mây, cho phép lưu trữ và đồng bộ hóa dữ liệu giữa người dùng một cách tức thời Đây là một đối tượng JSON lớn, giúp các nhà phát triển quản lý dữ liệu theo thời gian thực một cách hiệu quả.
Authentication:cung cấp dịch vụ backend, SDKs sẵn sàng sử dụng, và các thư viện
UI được làm sẵn để giúp ứng dụng của bạn xác thực người dùng
Firebase Cloud Messaging (FCM) cung cấp kết nối hiệu quả và đáng tin cậy giữa server và thiết bị, cho phép gửi và nhận tin nhắn hoặc thông báo trên iOS, Android và Web mà không tốn thêm chi phí.
Firebase Database Query cung cấp cơ chế để truy xuất dữ liệu cụ thể thông qua các truy vấn Các truy vấn này được xây dựng bằng cách kết hợp một hoặc nhiều phương thức lọc thành chuỗi.
Firebase Storage là giải pháp lưu trữ độc lập cho nội dung do người dùng tải lên, bao gồm hình ảnh và video từ các nền tảng iOS, Android và Web Nó được thiết kế đặc biệt để mở rộng ứng dụng, cung cấp bảo mật cao và đảm bảo khả năng phục hồi mạng hiệu quả.
Remote Config cho phép chỉnh sửa ngay lập tức cho người dùng cuối mà không cần phát hành phiên bản mới Bạn có thể thay đổi màu sắc của màn hình, bố cục của một phần cụ thể, hoặc thực hiện các tùy chỉnh định kỳ thông qua các tham số phía server.
Để đảm bảo nội dung trong ứng dụng của bạn được Google đánh chỉ mục, ứng dụng cần sử dụng cùng URL với trang web, nhằm xác nhận rằng cả ứng dụng và trang web đều thuộc sở hữu của bạn.
Firebase Dynamic Links:liên kết đưa chúng ta đến với một nội dung Phần lớn liên kết trong trang web là các liên kết sâu
Cloud Firestore là một cơ sở dữ liệu NoSQL cho phép lưu trữ, đồng bộ hóa và truy vấn dữ liệu một cách dễ dàng cho các ứng dụng di động và web trên toàn cầu.
Người dùng tạo tài khoản và ứng dụng Firebase sẽ cung cấp cho họ một URL duy nhất trên firebaseio.com URL này được sử dụng để lưu trữ và đồng bộ dữ liệu một cách hiệu quả.
Firebase cung cấp một cơ sở dữ liệu cho phép người dùng xem và chỉnh sửa dữ liệu trong thời gian thực Qua bảng điều khiển, người dùng có thể thiết lập chế độ bảo mật và quy tắc cho ứng dụng Firebase của mình.
CocoaPods là cách dễ nhất để bắt đầu với Firebase IOS SDK Để khởi tạo CocoaPods trong project người dùng chạy lệnh dưới đây:
$ cd đường-dẫn-đến-project-của-người dùng
Sau khi chạy xong CocoaPods, người dùng thêm Firebase Pod đến Podfile vừa tạo với đoạn mã sau:
Sau đó quay trở lại màn hình terminal chạy đoạn mã sau:
2.3.3.3 Cài đặt bằng cách thêm thư viên trực tiếp
Bước 1: Tạo một ứng dụng trên Xcode
Bước 2: Tải FirebaseOSX framework theo đường dẫn: https://www.firebase.com/docs/ios/alternate-setup.html
Bước 3: Giải nén tập tin vừa tải về, bạn sẽ nhận được tập tin có tên Firebase.framework Bước 4: Kéo tập tin Firebase.framework vừa giải nén vào ứng dụng mà bạn đã tạo ở bước 1.
Bước 5: Ở mục Build Pharse \ Link Binary With Librarise, thêm vào:
Hình 2.29 Các thư việc sử dụng cho Xcode khi làm việc với Firebase
Bước 6: Chạy ứng dụng và tiến hành làm việc với Firebase
2.3.3.4 Cách sử dụng Để sử dụng firebase người dùng cần import vào tất cả các lớp mà mình sử dụng: import Firebase
Cấu trúc File JSON trong firebase: không có bản ghi
//Tất cả các key và value của file JSON ở “categories” được thêm
"categories": { "one": true, "three": true }
} Ở file này thì Swift có thể chuyển về các dạng như sau để lưu trữ:
Với kiểu BOOL nó có thể đại diện bời NSNumber numberWithBool:(BOOL)
Các thao tác liên kết giữa Firebase và Swift:
- Đầu tiên, tạo tham chiếu đến cơ sở dữ liệu Firbase: var myRootRef = Firebase(url:"https://docs-examples.firebaseio.com/")
- Các method để lấy dữ liệu:
Cập nhật giá trị đã tồn tại trong cơ sở dữ liệu của người dùng bằng cách sử dụng hàm updateChildValues Hàm childByAutoId tự động tạo ra một ID duy nhất cho mỗi người dùng, với định dạng URL là messages/users// Để xử lý dữ liệu phức tạp có thể bị ảnh hưởng bởi việc cập nhật đồng thời, bạn nên sử dụng hàm runTransactionBlock.
To create a structured data tree in Firebase, initialize a reference with the URL of your Firebase Realtime Database Define user data for individuals such as Alan Turing and Grace Hopper, including their full names and dates of birth Append a path to the reference for users and set the user data in the database, ensuring that the data is organized and accessible.
- Cập nhật dữ liệu đã lưu var hopperRef = usersRef.childByAppendingPath("gracehop") var nickname = ["nickname": "Amazing Grace"] hopperRef.updateChildValues(nickname)
Firebase automatically generates a unique ID when a child node is created and added to the database reference For example, by referencing the "posts" path, you can create a new post with an author and title Using the `childByAutoId()` method, a unique identifier is assigned to the post, which can then be saved with `setValue()`.
"title": "Announcing COBOL, a New Programming Language"
- Cách lấy dữ liệu từ Firebase
// Url là đường dẫn của database của chúng ta var ref = Firebase(url:"https://docs-examples.firebaseio.com/web/saving- data/fireblog/posts")
// Chúng ta phải truyền vào Event và một block, block này sẽ được callback khi dữ liệu thay đổi ref.observeEventType(.Value, withBlock: { snapshot in print(snapshot.value)
Chạy đoạn mã này sẽ tạo ra một đối tượng chứa tất cả các bài viết mà người dùng đã đăng, và kết quả sẽ được in ra console.