Đặc biệt cảm ơn và lòng biết ơn sâu sắc tới anh Ninh Đắc Thêm, đã training iOS, hướng dẫn, giúp đỡ cho em tận tình cả những khó khăn trong công việc, đến những khó khăn việc làm quen với
Trang 1TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN
KHOA CÔNG NGHỆ PHẦN MỀM
BÁO CÁO THỰC TẬP
LẬP TRÌNH ỨNG DỤNG TRÊN NỀN TẢNG iOS
TP Hồ Chí Minh, tháng 07 năm 2020
Trang 2LỜI MỞ ĐẦU
Ngày nay, cùng với sự phát triển vượt bậc của điện thoại thông minh đã kéo theo sự phát triển thần tốc của những ứng dụng trên di động Theo thông tin đến từ công ty nghiên cứu thị trường Annie, đến năm 2022, người tiêu dùng sẽ chi khoảng 157 tỉ USD cho các ứng dụng hàng năm Con số đó đang khẳng định rằng ngành công nghiệp ứng dụng di động là một bộ phận không thể thiếu của ngành công nghiệp phần mềm
Không nằm ngoài cuộc chơi, Việt Nam cũng đang tích cực nỗ lực và phát triển ngành công nghiệp ứng dụng di động phát triển mạnh mẽ, để hòa nhập với những công ty hàng đầu về lập trình ứng dụng trên thế giới
Lĩnh vực lập trình ứng dụng di động phát triển bắt kịp xu hướng phát triển chung, đáp ứng tốt nhu cầu, đòi hỏi thực tế của con người Vì thế em quyết đinh lựa chọn lập trình ứng dụng trên điện thoại, cụ thể là trên nền tảng iOS để tìm hiểu và định hướng cho việc học cũng như nghề nghiệp sau này
Sau quá trình học tập, lĩnh hội được nhiều kiến thức nền tảng bổ ích từ thầy cô, để có thể ứng dụng vào thực tế, tích lũy kinh nghiệm cho bản thân Em đã lựa chọn Zalo Group, Công ty
cổ phần VNG – là môi trường lý tưởng và chuyên nghiệp giúp em có cơ hội thực hiện dự định bản thân
Trang 3Đặc biệt cảm ơn và lòng biết ơn sâu sắc tới anh Ninh Đắc Thêm, đã training iOS, hướng
dẫn, giúp đỡ cho em tận tình cả những khó khăn trong công việc, đến những khó khăn việc làm quen với môi trường mới cũng như trong việc tiếp cận các kiến thức công nghệ, các kỹ năng về
tư duy lập trình và tư duy sản phẩm để có thể làm ra một sản phẩm trong thời gian qua
Em cũng xin cảm ơn thầy cô trong khoa Công nghệ phần mềm đã nhiệt tình hỗ trợ, tạo điều kiện em làm bài báo cáo này
Nguyễn Hồng Phúc Tp.HCM, ngày 29 tháng 07 năm 2020
Trang 4NHẬN XÉT CỦA KHOA
Trang 5
Nội dung
LỜI MỞ ĐẦU 2
LỜI CẢM ƠN 3
CHƯƠNG 1: GIỚI THIÊU CÔNG TY THỰC TẬP 7
1.1 Giới thiệu VNG Corp 7
1.2 Sản phẩm của công ty 7
1.3 Lịch làm việc khi thực tập tại công ty 8
CHƯƠNG 2: NỘI DUNG THỰC TẬP 9
2.1 Tìm hiểu công ty và các kỹ năng cơ bản trong công ty 9
2.2 Nghiên cứu kỹ thuật 9
2.2.1 Các công cụ làm việc 9
2.2.2 Git / Git workflow 9
2.2.2 Tìm hiểu ngôn ngữ Objective-C 10
2.2.3 Lập trình iOS với Objective-C 12
2.2.4 Tìm hiểu ngôn ngữ Swift 14
2.2.5 Lập trình “Reactive programing” 20
3 Thực hiện project 21
CHƯƠNG 3: CHI TIẾT VỀ PROJECT 22
3.1 Giới thiệu về ứng dụng 22
3.2 Thực hiện 23
3.2.1 Màn hình lựa chọn chức năng 23
3.2.2 Màn hình chức năng nhiều đối tượng tiêu thụ từ camera 24
3.2.3 Màn hình áp dụng nhiều bộ lọc 25
3.2.4 Màn hình áp dụng hiệu ứng video 26
3.2.5 Màn hình chụp ảnh/quay video 27
3.2.6 Kết quả xử lý ảnh và video được lưu vào thư viện 29
TỔNG KẾT 32
Trang 7CHƯƠNG 1: GIỚI THIÊU CÔNG TY THỰC TẬP 1.1 Giới thiệu VNG Corp
VNG được thành lập ngày 09/09/2004, là một trong những công ty Internet và Công nghệ hàng đầu Việt Nam và Đông Nam Á, kỳ lân công nghệ 1 tỷ USD+ duy nhất của Việt Nam với hơn 3200 thành viên
VNG có văn phòng đặt tại 5 quốc gia, các lĩnh vực hoạt động của VNG tập trung vào 4 nhóm sản phẩm chủ lực, mang đến cho người dùng những trải nghiệm phong phú
và đơn giản hơn
Nhập khẩu và phát hành các trò chơi nổi tiếng thế giới
Sản phẩm: Võ Lâm Truyền Kỳ, Rules of Survival, Crossfire Legend…
Trang 8• Tài chính và thanh toán:
Các nền tảng và dịch vụ trung gian thanh toán, tài chính cá nhân theo xu hướng mới
Sản phẩm: Cổng trung gian thanh toán 123 Pay, Ví điện tử ZaloPay
1.3 Lịch làm việc khi thực tập tại công ty
Em tham gia làm việc tại công ty bắt đầu từ ngày 02/12/2019 tới 30/05/2020 Công việc hằng ngày bắt đầu từ lúc 9:00am tới 6:00pm Thời gian nghỉ trưa khoảng 1 tiếng rưỡi Sau mỗi ngày làm việc em sẽ báo cáo tiến độ công việc trong ngày, đặt câu hỏi và nhận chia sẻ, giải đáp từ anh hướng dẫn, đặt mục tiêu cho ngày làm việc tiếp theo Mỗi tuần sẽ họp tiến độ tuần 1 lần, thường sẽ là chiều thứ 6 Mọi người sẽ cùng họp và bàn bạc về các vấn đề đã giải quyết, tồn đọng, bài học, giải pháp và mục tiêu cho tuần tiếp theo
Trang 9CHƯƠNG 2: NỘI DUNG THỰC TẬP 2.1 Tìm hiểu công ty và các kỹ năng cơ bản trong công ty
Thời gian : 1 ngày
Nội dung : Giới thiệu về công ty, cách tổ chức của công ty
Được nghe người phụ trách giới thiệu về công ty, quá trình thành lập và phát triên, quy trình làm việc từ cao xuống thấp, cách thức tổ chức của công ty
Ngoài ra, thực tập sinh còn được giới thiệu về cách thức làm việc trong công ty như thời gian đi làm, các quy định cần phải tuân thủ, cách sử dụng email trong công việc…
Kết quả : Hiểu thêm về công ty cổ phần VNG, quá trình thành lập và phát triển Có
thêm các kỹ năng về việc sử dụng email trong công việc, làm việc có kế hoạch, có kỷ luật, có trách nhiệm hơn
2.2 Nghiên cứu kỹ thuật
2.2.1 Các công cụ làm việc
Thời gian : 1 ngày
Nội dung : Tìm hiểu về các công cụ sẽ được sử dụng trong quá trình làm việc
Trong thời gian này, anh lead đã hướng dẫn thực tập sinh tìm hiểu về các công cụ sẽ giúp ích cho trong công việc sau này Một số phần mềm trong số đó như Bộ công cụ XCode sử dụng để lập trình ứng dụng iOS, Zalo - ứng dụng trao đổi và làm việc nhóm, Source Tree - ứng dụng quản lý phiên bản mã nguồn
Thực hiện : Thực hành sử dụng các phần mềm đã nêu trên
Kết quả : Sử dụng thành thạo các chứng năng cơ bản của các phần mềm nêu trên, đáp
ứng nhu cầu làm việc trong suốt quãng thời gian thực tập
2.2.2 Git / Git workflow
Thời gian : 1 ngày
Nội dung: Được giới thiệu chi tiết về Git
Trang 10- Repository: nơi để lưu trữ, là thư mục chứa tất cả mã nguồn, phiên bản
- Head: một con trỏ chỉ vô mã nguồn mới nhất bạn đang làm việc
- Add: giúp Git biết được tập tin này cần được theo dõi
- Commit: yêu cầu Git lưu lại trạng thái của repo hiện tại
- Remote: nơi chứa repositories nhưng không không nằm trên máy của mình mà nằm
ở đâu đó khác (như Github, Gitlab )
- Pull: giúp lấy mã nguồn từ remote về
- Push: tải mã nguồn lên remote
- Merge: kết hợp 2 phiên bản khác nhau của mã nguồn lại thành một
- Status: hiển thị thôngtin về tình trạng hiện tại của repo
Ngoài những cơ bản mà người dùng Git nào cũng biết, em còn được biết thêm trong quá trình thực tập ở công ty các lệnh khác như:
- Git rebase: quá trình gắn một nhánh vào nhánh gốc
- Gitlog: ghi lại những thao tác xảy ra với repo
- Git branch: phân nhánh để làm việc với Git
Và để phối hợp nhịp nhàng giữa các thành viên với nhau, công ty sử dụng git workflow
Kết quả :
- Nắm được cơ bản về Git
- Biết được cách sử dụng và áp dụng vào công việc
2.2.2 Tìm hiểu ngôn ngữ Objective-C
Thời gian : 3 ngày
Nội dung : Được training về ngôn ngữ Objective-C, Foudation framework
- Biên dịch và chạy chương trình
Sử dụng Xcode để soạn thảo code , cấu trúc cơ bản của 1 chương trình
- Class, Object và Method :
Các khái niệm này tương tự với các khái niệm đã được học trong môn lập trình hướng đối tượng, tuy nhiên cách triển khai, cũ pháp có phần khác so với các ngôn ngữ như C++, Java
Trang 11Mỗi class sẽ được định nghĩa bằng từ khóa @interface và kết thúc bởi @end, class có thể kế thừa class khác bằng từ khóa “:”, tương tự java – Objective-C chỉ cho phép đơn
kế thừa và mặc định đều dẫn xuất từ lớp NSObject
Mỗi Class được khai báo trong file h và hiện thực trong file m Với file m class được bắt đầu với từ khóa @implement và kết thúc bởi @end
Method được khai báo theo cú pháp:
method type (return type) methodName: (argumentType) argumentName
- Kiểu dữ liệu và các toán tử
Thực tập sinh sẽ được hướng dẫn về các kiểu dữ liệu cơ bản các các toán tử trong Objective-C
- Vòng lặp, biểu thức quyết định :
Các phương pháp lặp như sử dụng câu lệnh for, while, do Biểu thức quyết định if, switch và toán tử điều kiện
Trang 12- Categories, Protocols, Delegate
Categories cung cấp cách đơn giản để module hóa định nghĩa class, nhóm chúng thành các phần chứa các method liên quan Nhờ vào chức năng này ta cũng có thể mở rộng các method cho các Method trên Object đã có
Protocols có thể xem như interface trong Java, chứa tập các method mà các class có thể định nghĩa hoặc không (@require or @optional)
Ta sử dụng delegate để ủy quyền thực thi 1 method nào đó trên class có implement protocols được yêu cầu bởi delegate
- Các phần được kế thừa từ ngôn ngữ C:
Bao gồm mảng, Hàm, Blocks, Structures, pointer,…
- Foundation Framework
Tìm hiểu về Numbers, Strings, Collections, quản lý bộ nhớ (retain – release), ARC
- Code complete and coding convention
Thực hiện :
- Tham gia đầy đủ các buổi training của công ty
- Làm các bài thực hành, kiểm tra về kiến thức đã học
Kết quả :
- Nâng cao kỹ năng lập trình với ngôn ngữ Objective-C
- Có được những kiến thức quan trọng cho việc lập trình iOS sau này
- Ngoài ra còn được biết thêm một số quy tắc trong việc viết code sao cho đúng chuẩn, dễ đọc, dễ hiểu, các phương pháp xử lý tránh việc crash app
2.2.3 Lập trình iOS với Objective-C
Thời gian : 5 ngày
Nội dung : Được training về các thành phần quan trọng trong lập trình iOS Các design
pattern thường dùng, tối ưu hiệu suốt chương trình, áp dụng kiến trúc MVC và MVVM trong ứng dụng
- Quản lý bộ nhớ:
Trang 13Hiểu về ARC và non ARC (sử dụng Grand Central Dispatch)
Giải quyết các vấn đề liên quan đến memory để tránh crash app
- View, Controller, Navigation:
Sử dụng view cho việc hiện thị và quản lý bằng controller Điều hưỡng giữa các màn hình bằng Navigation
- Table Views và AutoLayout:
Quản lý form input sử dụng tableview và auto layout
Tạo và sử dụng tableview template
Sử dụng auto layout để pin, center và align views
Debug auto layout runtime constrain conflicts
Quản lý intrinsic conten size, conten hunging và expansion
- Animation, Gestures và container View Controllers
- Custom views và View Controller Transitions:
Tạo View từ nib file
- Tham gia đầy đủ các buổi training của công ty
- Làm các bài thực hành, kiểm tra về kiến thức đã học
Kết quả :
- Sử dụng thành thạo các views cơ bản
Trang 14- Có khả năng tạo các wraper để thread-safe
- Custom view theo yêu cầu
- Hiểu về kiến trúc của 1 ứng dụng theo mô hình MVVM, auto binding bằng observer partten
- Sử dụng các design partten giúp code dễ đọc, lập trình tốt hơn
- Lập trình đa luồng sử dụng GDC
- Tối ưu chương trình bằng cách sử dụng cache, buzy loading
2.2.4 Tìm hiểu ngôn ngữ Swift
Thời gian : 3 ngày
Nội dung: Các kiến thức về ngôn ngữ lập trình Swift 5.2
Collection Type: Swift cung cấp 3 kiểu dữ liệu tập hợp cơ bản, bao gồm array, set,
dictionary
Mảng (array) là tập hợp các giá trị được lưu trữ theo thứ tự
Tập hợp (set) là tập hợp các giá trị riêng biệt và không theo thứ tự
Dictionary là tập hợp không có thứ tự, được lưu dưới dạng key – value
Trong 1 collection thì các giá trị được lưu theo cùng kiểu dữ liệu, ta không thể chèn 1 kiểu dữ liệu khác bởi sự bất cẩn
Control Folow: So với các ngôn ngữ khác, Swift cung cấp khá nhiều câu lệnh lên quan
đến điều khiển luồng Bao gồm for in loop, while, repeat – while Các câu lệnh điều kiện:
If, switch Control transfer statements: continue, break, fallthrough, return, throw
Function: hàm được khai báo và sử dụng theo cú pháp
Func functionName(label name: type,…) -> (return type) { body }
Theo mặc định, tham số được truyền vào hàm là hằng số nên nếu muốn thay đối giá trị của tham số trong quá trình sử dụng hàm ta cần dùng đến in-out parameters bằng cách
thêm từ khóa inout trước kiểu dữ liệu
Trang 15Hàm cũng được sử dụng như 1 biến bằng cách khai báo tham số, kiểu trả về và có thể gán bằng 1 closure bất cứ lúc nào
Tham số truyền vào và kiểu trả về của hàm cũng có thể là 1 (hay nhiều) hàm khác
Closures: Tương tự như block trong Objective-C, closure có thể capture và lưu giữ tham
chiếu đến biến và hằng từ context nó được định nghĩa
{ (parameters) -> return_type in
Statements }
Chúng ta có thể truy cập nhanh các tham số bằng ký hiệu $0, $1, … theo thứ tự tham số thay vì dùng tên tham số 1 cách tường minh
Khi closure được truyền qua hàm, ta có thể sử dụng nó để gọi lại sau này bằng kí hiệu
@escaping
Enumeration: Tương tự các ngôn ngữ khác, tuy nhiên nó không được mặc định ngầm
gán giá trị là kiểu nguyên
Ta có thể lặp qua các giá trị của enum bằng các thêm ký hiệu :CaseIterable ngay sau tên của enum Khi sử dụng ta gọi ten_enum.allCases
Mỗi case của enum có thể lưu giá trị kiểu associated values
Case name_case(type1, type2, …)
Structures and Class:
Cả 2 đều có thể:
- Định nghĩa properties để lưu trữ giá trị
- Định nghĩa các phương thức để cung cấp các chức năng
- Định nghĩa subscrip để truy cập nhanh phần tử
- Đinh nghĩa hàm khởi tạo
- Comform với protocol để cung cấp các hàm chuẩn cần thiết
Trang 16Tuy nhiên có những thứ chỉ có ở class như:
- Kế thừa
- Ép kiểu và sử dụng lúc runtime
- Hàm hủy để giải phóng vùng nhớ
- Reference counting để nhiều tham chiếu đến cùng 1 đối tượng
Properties: Có 2 kiểu properties
- Store property: Là biến hoặc hằng lưu trữ 1 phần thông tin của thể hiện lớp
- Lazy store properties: Giá trị sẽ được khởi tạo ngay sức khi gọi đến nó
- Computed properties: Không thực sự lưu giá trị mà cung cấp getter và optional setter
để lấy và gán giá trị 1 cách không trực tiếp
Subscripts: Class, structures và enumerations có thể định nghĩa subscript để truy cập
phần tử trong collection, list, sequence Tương tự như việc truy cấp và gán giá trị trên mảng
Subscript(parametters) -> return_type {
Get { } Set {newValue}
}
Inheritance: Một lớp có thể kế thừa method, properties và nhưng tính chất khác từ 1 lớp
cha Method có thể custom lại bằng cách thêm từ khóa Overide trước method
Truy cập method, properties, subscript của lớp cha bằng từ khóa supper.method()
Initialization: là quá trình chuẩn bị cho 1 thể hiện của class, structure, enumeration để sử
dụng Nó được tự động gọi để tạo 1 thể hiện mới của 1 kiểu cụ thể
Trang 17Init(parametters) {
statements }
Swift cung cấp 1 hàm khởi tạo mặc định cho class và structure có defaulf values cho tất
cả properties của nó nếu ta không cung cấp ít nhất 1 hàm khởi tạo cho nó
Structure có hàm khởi tạo memberwise initializer dù có cung cấp giá trị mặc định hay không
Designated initializers là kiểu khởi tạo chính của class, có thể gọi hàm khởi tạo phù hợp
từ class cha để tiếp tục chuỗi khởi tạo
Convinience initializers là kiểu hỗ trợ để khởi tạo cho 1 class Nó chỉ có thể gọi designated hoặc convinience có gọi designated
Trong quá trình khởi tạo được chia thành 2 pha:
- Pha đầu tiên, tất cả store properties mà nó khai báo sẽ được khởi tạo giá trị (trước khi gọi hàm khởi tạo lớp cha) Sau khi delegate cho lớp cho nó mới được quyền
sử dụng giá trị mà nó kế thừa để gán giá trị, cứ thế gọi cho đến lớp cha ở trên cùng
- Quay trở lại từ lớp cha trên cùng, mỗi hàm khởi tạo có cơ hội để custom lại, có thể gọi được self, các method của class Cuối cùng các convinience có thể custom lại các properties.s
Deinitialization: Được gọi ngay trước khi 1 thể hiện của class được giải phóng Chỉ có
trong class type Deinit được gọi tự động, sau khi deinit ucar subclass được gọi xong thì supper class sẽ được gọi
Optional chaining: Được sử dụng cho việc truy vấn các thuộc tính, phương thức và
subscripts có chứa optional value mà có thể nil trong quá trình gọi, tránh xảy ra lỗi trong quá trình runtime Kết quả của câu lệnh là 1 optional