Skip to content
Showing 1-50 of 97 items.
@renovate
Admin 24/02/2021 16:20
Chương 5 Object oriented programming

Chương 5 Object oriented programming Tôi lần đầu tiên được giới thiệu về lập trình hướng đối tượng ở trường cao đẳng nơi tôi đã có một giới thiệu tóm tắc về c++. ở thời điểm này ngôn ngữ lập trình c++ thì vẫn tương đối mới mẻ. Thật sự thì phiên bản đầu tiên của ngôn ngữ này chỉ được xuất bản 3 năm trước khi tôi được giới thiệu về nó. Mô hình lập trình hướng đối...

Happy New Year #AppMobile Swift Object Oriented Programming
@renovate
Admin 25/02/2021 14:10
Làm hiệu ứng Animation Transition với Swift

Mở đầu Xin chào các bạn hôm này mình sẽ giới thiệu cho các bạn một cách đơn giản để có thể tạo ra hiệu ứng chuyển động trong Swift. Để bắt đầu vào demo thì các bạn hãy tải những ảnh mình sử dụng ở đây. Bắt đầu nào Bây giờ ta sẽ bắt đầu viết các hàm cần thiết vào trong view controller của ta . Storyboard Ở đây ta sẽ thêm vào storyboard các background và thêm vào đó hai UIImageView...

Happy New Year Swift iOS AndroidiOS Animation
@renovate
Admin 05/03/2021 16:50
Tạo hiệu ứng Story của Instagram bằng SwiftUI

Có lẽ chúng ta đã quá quen thuộc với Story ở trên Instagram hoặc trên Facebook. Nó là những video và hình ảnh được liên kết với nhau như một thư viện hình ảnh để kể câu truyện nào đó. Bên cạnh đó, bạn cũng có thể dùng những hình ảnh đã lưu trước đó bên Snapchat để tạo câu truyện bên Instagram. Chính vì thế hôm nay mình sẽ hướng dẫn các bạn tạo hiệu ứng giống như trong Story của...

Happy New Year Swift iOS Mobile SwiftUI
@renovate
Admin 06/03/2021 23:20
[SWIFT] Sử dụng Dependency Injection với Storyboards

1. Lời mở đầu: Dependency Injection (DI) là một kỹ thuật quan trọng giúp cho code của bạn dễ test hơn trong quá trình kiểm thử. Thay vì các objects tự tạo những dependencies hoặc truy cập objects dưới dạng singletons, DI cho phép mọi thứ mà object cần để thực thi công việc của nó nên được truyền từ bên ngoài. Điều này vừa giúp dễ dàng bao quát các dependencies mà object có, và cũng giúp việc kiểm...

Swift iOS Dependency Injection
@renovate
Admin 08/03/2021 07:40
Quản lý self và cancellable trong Combine.

Công việc quản lý bộ nhớ memory management thường trở nên phức tạp khi chúng ta thực hiện các tác vụ bất đồng bộ asynchronous vì chúng ta thường phải lưu giữ một số object nằm ngoài scope mà object được define trong khi vẫn phải đảm bảo được việc giải phóng object đó được thực hiện đúng quy trình. Mặc dù Apple đã giới thiệu framework Combine có thể tham chiếu reference đến các object...

Happy New Year Swift iOS combine
@renovate
Admin 08/03/2021 14:50
Ví dụ về UIActivityViewController

Trên iOS, UIActivityViewController cung cấp giao diện thống nhất để người dùng chia sẻ và thực hiện các hành động trên văn bản, hình ảnh, URL và các mục khác trong ứng dụng. Bạn tạo một UIActivityViewController bằng cách chuyển các mục bạn muốn chia sẻ và bất kỳ hoạt động tùy chỉnh nào bạn muốn hỗ trợ (chúng tôi sẽ hướng dẫn cách thực hiện điều đó sau). Sau đó, bạn present...

Swift iOS Activity UI share
@renovate
Admin 08/03/2021 20:40
Chương 6 Protocol oriented programming.

Cuốn sách này là về lập trình hướng protocol. Khi Apple thông báo swift 2 ở WWDC 2015. Họ cũng định nghĩa swift là ngôn ngữ đầu hướng protocol đầu tiên trên thế giới. Từ cái tên của nó chúng ta cũng giả định rằng lập trình hướng protocol thì tất cả là về protocol. Tuy nhiên đây là giả định sai lầm nhé. Lập trình hướng protocol có nhiều thứ hơn thế. Nó thật sự là một cách mới không...

Swift iOS Mobile Protocol Oriented Programming
@renovate
Admin 10/03/2021 10:40
Code ngắn gọn hơn với OptionSet trong Swift

Nếu bạn muốn biết cách xử lý với Bitmasks trong Swift hay là bạn đã từng nghe đến OptionSet chưa? Bài viết này sẽ giúp bạn hiểu hơn về điều đó 1. OptionSet là gì? Về cơ bản, OptionSet là một protocol, khi confirm nó chúng ta có thể làm việc với bit mask. Nó là một đại diện cho việc gán mỗi bit tương ứng với một option. Hãy cùng tìm hiểu thêm nhé. 2. Cách implement OptionSet. Dưới đây là một...

Happy New Year Swift
@renovate
Admin 10/03/2021 11:10
Swift: Tạo custom phép toán tử (Operator) của riêng bạn!

Swift cho phép bạn tạo các toán tử có thể tùy chỉnh của riêng bạn. Điều này đặc biệt hữu ích khi bạn xử lý các loại dữ liệu của riêng mình. Trong bài viết này, tôi sẽ chỉ cho bạn cách bạn có thể dễ dàng tạo toán tử tùy chỉnh của riêng mình trong Swift. Operator Types in Swift Có năm loại toán tử chính trong Swift. Tất cả các toán tử thuộc một trong các danh mục sau: Toán tử Infix - Sử...

Happy New Year Swift iOS
@renovate
Admin 15/03/2021 13:30
Using Dispatch Group iOS Async Tasks

Grand Central Dispatch (GCD) là một framework được cung cấp bởi Apple, được phát hành vào năm 2009 với OS X Snow Leopard & iOS 4. Nó cung cấp API dễ sử dụng cho các nhà phát triển để chạy các tác vụ nền bằng cách tạo hàng đợi theo kiểu nối tiếp hoặc đồng thời mà không cần quản lý threads của chính họ GCD tóm tắt việc gán các luồng để tính toán vào dispatch queue. Developer chỉ cần dispatch...

Swift
@renovate
Admin 15/03/2021 14:00
Closure in Swift 5

What is Closure? Closure là các khối function khép kín có thể được chuyển qua và sử dụng trong code của bạn. Closures trong Swift tương tự như blocks trong C và Objective-C và lambdas trong các ngôn ngữ lập trình khác. Closure là một function and với từ khoá “func” Closure là một block của code mà bạn có thể gán cho biến. Trong Swift “var” và “let” lưu trữ thông tin, Các hàm “func” thực thi các tác...

Swift
@renovate
Admin 15/03/2021 15:50
[Swift tricks] Preserving Initializers

Làm thế nào để tạo custom initializer và vẫn giữ được default initializer của structure? Trong bài viết này, chúng ta cùng sẽ dùng 1 struct Person để làm ví dụ. Struct này có 2 constant property là first và last. Swift sẽ tự động tạo cho chúng ta một default initializer, init(first:last:), và tất nhiên chúng ta có thể sử dụng initializer này để tạo 1 instance của struct Person: Nhưng trong thực tế sẽ có lúc...

Happy New Year Swift Swift Tricks
@renovate
Admin 17/03/2021 14:50
Làm thế nào để tạo ra Universal iOS Static libraries bằng XCFramework

Chắc hẳn các bạn làm dự án về iOS cũng sẽ hay sử dụng các bộ thư viện ngoài nhưng có lúc nào bạn phải tự làm một bộ thư viện để cung cấp cho các dự án khác sử dụng chưa? Tức nhiên sẽ có nhiều giải pháp để làm việc này như CocoaPod. Nhưng nếu yêu cầu là static libraries thì như thế nào? Vấn đề gặp phải Để build một static libraires là một việc rất khó khăn rồi. Tuy nhiên bản...

Swift iOS StaticFramework XCFramework framework
@renovate
Admin 17/03/2021 23:00
Khi nào sử dụng UserDefaults, Keychain, hay Core Data?

Có khá nhiều cách để lưu trữ dữ liệu local trong iOS app. UserDefaults, Keychain và Core Data là những cách phổ biến để persist data (những dữ liệu vẫn tồn tại trong app dù đã quit app và có thể sử dụng cho lần khởi động app tiếp theo). Vậy làm sao để chúng ta quyết định xem cách lưu trữ nào là phù hợp trong từng trường hợp? Chúng ta hãy cùng nhau tìm hiểu nhé! UserDefaults Theo tài liệu của...

Swift Xcode
@renovate
Admin 18/03/2021 08:30
Tạo custome view từ file xib một cách chuẩn xác nhất

Việc vẽ view trên storyboard bao giờ cũng trực quan hơn, nhanh hơn so với việc code frame bằng tay. Hôm nay mình sẽ hướng dẫn các bạn cách tạo một view có thể tái sử dụng từ file xib theo cách đơn giản và chính xác nhất. Hãy follow theo các bước sau Bước 1 Tạo một "Persion View" là UIView Bước 2 Tạo file xib đặt tên giống class đã tạo ở bước 1 Hãy vẽ thêm 2 label lastname, first name để...

Swift iOS CustomView
@renovate
Admin 18/03/2021 10:20
Swift, nâng cao kĩ thuật với 8 tips

Link bài viết gốc: https://medium.com/codex/swift-upgrade-your-skills-with-these-8-tips-da612111668 1. Cách viết lệch If...else ngắn hơn với Ternary Operators Ternary Operators cho phép chúng ta viết if...else ngắn hơn. Cấu trúc là: condition ? true : false. Hãy cùng xem ví dụ dưới đây: let money = 100 if money > 0 { print("Some money") } else { print("No money") } Phần if...else có thể viết lại với 1 ternary operator với chỉ 1...

Happy New Year Swift Tips
@renovate
Admin 19/03/2021 16:30
Sử dụng Singletons an toàn trong đa luồng và cách sử dụng trong Swift

Khi bắt đầu học trên trường về Design Pattern chúng ta đều biết Singletons Pattern, một pattern rất dễ sử dụng, và được sử dụng rất nhiều khi phát triển một ứng dụng iOS. Hôm nay tôi sẽ giúp các bạn cách sử dụng Singleton an toàn hơn cách các bạn đang dùng Cách sử dụng Singletons Tư tưởng chính của singleton là đảm bảo chúng ta chỉ tạo ra một instance của type được cho trước. Singletons...

Swift iOS Xcode singleton
@renovate
Admin 19/03/2021 22:30
Sử dụng @autoclosure trong Swift để cải thiện hiệu suất

@autoclosure trong Swift là một loại closure cho phép bỏ qua dấu ngoặc nhọn và làm cho nó trông giống như một biểu thức bình thường. Tuy nhiên đi sâu vào chi tiết hơn thì nó vẫn là một closure. Việc sử dụng nó cho phép chúng ta có thể cải thiện hiệu quả code của mình hơn. Từ khóa @autoclosure có thể là mới đối với bạn và đối với nhiều người trong chúng ta, thật khó để đưa ra các...

Swift
@renovate
Admin 21/03/2021 11:30
So sánh imperative programming và declarative programming

I. Giới thiệu Trong quá trình làm việc, chắc hẳn đã nhiều lần chúng ta thấy nhắc đến khái niệm imperative programming (lập trình mệnh lệnh) và declarative programming (lập trình khai báo). Tuy nhiên, liệu các bạn có chắc chắn được câu trả lời cho các câu hỏi: 2 loại lập trình này khác nhau chỗ nào? code mình viết ra là lập trình loại nào?… bài viết này sẽ giúp bạn tự tin hơn khi trả lời cho...

Happy New Year Swift iOS declarative programming imperative programming
@renovate
Admin 21/03/2021 12:10
Tại sao Swift Reference Type lại ảnh hưởng xấu đến thời gian khởi động app

Trải nghiệm ấn tượng đầu tiên của người dùng là trải nghiệm khởi động ứng dụng. Mỗi mili giây họ chờ đợi ứng dụng của bạn bắt đầu là thời gian quý báu họ có thể dành ở nơi khác. Nếu ứng dụng của bạn có sự truy cập cao và được sử dụng nhiều lần một ngày thì người dùng phải chờ khởi động nhiều lần. Apple khuyến nghị frame đầu tiên được vẽ dưới 400ms. Điều...

Swift
@renovate
Admin 22/03/2021 10:20
Swift - Access Control - iOS

Access controls thường chủ yếu được hỏi khi bạn đang ở giữa cuộc phỏng vấn technical của mình. Người phỏng vấn muốn biết liệu bạn có thể xác định những phần quan trọng trong code của mình và liệu bạn có thể đảm bảo những đoạn code đó được ẩn hay hiển thị tương ứng với các phần khác trong code base của bạn. Access Controls trong swift là gì? Swift cung cấp 5 kiểu khác nhau của Access...

Swift iOS
@renovate
Admin 22/03/2021 14:10
[SwiftUI] ContextMenu, Sheet (Modals)

ContextMenu cho bạn một cửa sổ bật lên bằng cách nhấn và giữ. Đó là giống y với việc bạn nhấp vào ứng dụng của mình bằng 3D Touch. ContextMenu không yêu cầu bật 3D Touch, nó kích hoạt đơn giản bằng cách nhấn và giữ. A container for views that you present as a menu items in a contextual menu in response to the standard system gesture. Apple Documentation. Trong hướng dẫn này, bạn sẽ tìm hiểu những gì cần thiết...

Swift iOS SwiftUI
@renovate
Admin 29/03/2021 21:10
Chương 7 Áp dụng các mẫu thiết kế bằng Swift

Chương 7 Áp dụng mẫu thiết kế hướng đối tượng trong swift (Chú ý Chương này rất dài) Trong xuất bản lần đầu của Gang of Four’s Design Patterns: Elements of Reusable Object- Oriented Software tháng 10 năm 1994. Tôi chỉ chú ý đến những mẫu thiết kế này từ 10 đến 12 năm về trước. Giống hầu hết những lập trình viên có kinh nghiệm, khi tôi lần đầu đọc về những mẫu thiết kế. Tôi nhận ra...

Swift Protocol Oriented Programming Design Patterns iOS Development
@renovate
Admin 08/04/2021 08:20
Future và Subject trong Combine.

Mặc dù Combine đã tập trung vào concept các publisher sẽ emit ra các sequence value theo dòng thời gian cũng như đã cung cấp một số API thuận tiện và đầy đủ chức năng để người sử dụng không cần phải thiết lập tùy chỉnh cho các publisher từ đầu. Lấy ví dụ như khi chúng ta muốn Combine hỗ trợ chúng ta với các API có sẵn như ImageProcessor để xử lý theo completion handle pattern trong closure trong...

Swift iOS combine
@renovate
Admin 06/05/2021 04:10
Hướng dẫn cơ bản về Unit test trong swift

Đợt này trong dự án của công ty mình đang chuẩn bị triển khai việc dùng Unit Test. Unit Test thì không còn xa lạ gì với anh em Dev, ngay cả bản thân mình hồi học đại học thì cũng đã từng học qua môn quản lý dự án liên quan Unit Test nhưng để áp dụng vào thực tế thì không phải chuyện dễ. Hôm nay , mình cũng thử vọc vặt bước đầu xem Unit Test nó có tác dụng gì, lý do nên viết Unit Test.Dưới...

Swift May Fest
@renovate
Admin 06/05/2021 10:40
Tìm hiểu các kiểu khởi tạo của Swift

Các kiểu khởi tạo trong Swift là câu hỏi quen thuộc trong buổi phỏng vấn. Khái niệm này tương đối dễ hiểu khi làm việc với Struct, nhưng sẽ gặp chút khó khăn khi hỏi các câu liên quan đến việc khởi tạo Class. Swift định nghĩa 2 cơ chế khởi tạo cho các Class là Designated Initializers và Convenience Initializers. Trong bài viết này, mình sẽ chia sẻ một số câu hỏi về nội dung này mà mình tìm hiểu...

Swift May Fest
@renovate
Admin 10/05/2021 08:50
Tùy chỉnh localized trong Swift.

Việc hỗ trợ nhiều ngôn ngữ là một yếu tố cần thiết để App của bạn trở nên phổ biến trên App Store vì chung quy lại thì người sử dụng nào cũng muốn sử dụng ngôn ngữ mẹ đẻ của mình. Chính vì tâm lý này mà Apple đã cung cấp cho chúng ta kha khá API để xử lý các resource như localized với các tuỳ chỉnh cần thiết để chúng ta có thể hiển thị đa ngôn ngữ cho App. Việc render UI cho...

Swift iOS
@renovate
Admin 11/05/2021 10:50
Tạo thư viện Public trên CocoaPods

Bạn có thể đã được hưởng lợi từ các thư viện của bên thứ ba mà người khác đã tạo. Thư viện của bên thứ ba có thể giúp bạn tiết kiệm rất nhiều thời gian khi xây dựng ứng dụng vì chúng là plug and play. Thư viện của bên thứ ba cũng có tên khác với các phần phụ thuộc. Trình quản lý Dependency phổ biến và được sử dụng rộng rãi nhất là CocoaPods. CocoaPods có hơn 82.000 thư viện và...

Swift iOS CocoaPods
@renovate
Admin 12/05/2021 16:20
[SWIFT] Custom Animated Splash Screen in iOS

Môi trường phát triển: Swift Language Version: Swift 5 Xcode: Version 12.1 Deployment Target: 11.0 Bước 1: Create Animation Image View Ta cần chuẩn bị 1 folder jpegs chứa các ảnh định dạng JPG được cắt từ 1 ảnh GIF. Sau đó, tạo class AnimationImageView kế thừa từ UIImageView và protocol AnimationImageViewDelegate protocol AnimationImageViewDelegate: NSObject { func didFinishAnimationImageView() } class AnimationImageView: UIImageView { ...

Swift iOS Animation Splash Screen
@renovate
Admin 13/05/2021 14:40
Custom SideMenu (Hambuger Menu) bằng Swift

Trong quá trình phát triển các ứng dụng iOS, rất dễ gặp các trường hợp có sử dụng SideMenu. Đây tuy là hướng Design đã cũ, nhưng vì tính tiện lợi, tới nay dạng thiết kế này vẫn được sử dụng phổ biến. Trong bài viết hôm nay, mình sẽ custom một SideMenu đơn giản. Tạo giao diện Đầu tiên, tạo MainController và layout trong Storyboard theo các bước sau Bước 1: Mình sẽ kéo 1 Label vào giữa màn...

Swift May Fest
@renovate
Admin 15/05/2021 16:50
Sử dụng Spotlight Search cho Indexed Swift App Record

Giới thiệu Spotlight Search cho phép người dùng tìm kiến bản ghi ứng dụng của mình trên thanh Search Bar của iPhone/iPad Kịch bản Ứng dụng của chúng ta sẽ cho phép người dùng thêm, xóa, chỉ định các trường bản ghi trong tiêu chí tìm kiếm của iPhone/iPad Spotlight. Ví dụ như trong ứng dụng Books, Book Title có thể sử dụng làm tiêu chí tìm kiếm Người dùng có thêm lựa chọn để thêm tiêu chí title...

Swift iOS
@renovate
Admin 16/05/2021 22:00
Quản lý retain cycles khi viết Unitest

Trong quá trình phát triển ứng dụng, chúng ta rất khó tránh khỏi việc tạo ra retain cycles kể cả với những lập trình viên giàu kinh nghiệm. Retain cycles không phải lúc nào cũng dễ dàng để phát hiện và có thể dẫn đến hàng giờ để debug. Tất nhiên có những công cụ tuyệt vời giúp chúng ta thực hiện debug dễ dàng hơn (như: memory graph debugger,...) nhưng quá trình debug vẫn khá là vất vả và mất...

Swift Xcode UniTest
@renovate
Admin 18/05/2021 12:30
Cơ chế Copy-On-Write trong Swift

Mở đầu Các kiểu dữ liệu trong Swift được chia làm 2 loại: Tham chiếu (reference type) và Tham trị (value type): Tham trị (value type): Mỗi thể hiện giữ 1 bản sao dữ liệu riêng biệt. Các thể hiện này thường được định nghĩa bởi Struct, Enum hoặc Tuple Tham chiếu (reference type): Các thể hiện dùng chung 1 bản sao data. Các thể hiện này thường là class hoặc closure Hãy cùng xem ví dụ để thấy được...

Swift
@renovate
Admin 18/05/2021 16:50
Một số phương pháp lắng nghe việc hoàn thành 2 hoặc nhiều request network trong Swift

Giả sử mình có trường hợp như sau: Trong một màn hình của ứng dụng yêu cầu thực thi hai yêu cầu khác nhau cùng một lúc. Cuối cùng, bạn chỉ được cập nhật giao diện người dùng sau khi cả hai hoàn thành. Ở bài viết này, mình sẽ hướng dẫn một số cách lắng nghe việc hoàn thành của 2 hoặc nhiều request network. Sử dụng Dispatch Group Dispatch group cho phép nhóm nhiều task với nhau và chờ cho...

Swift combine gcd
@renovate
Admin 21/05/2021 11:10
[SwiftUI] Rotation Animation

Điều kiện tiên quyết Để làm theo hướng dẫn này, bạn sẽ cần một số kiến thức cơ bản về: Cơ bản với Swift. Xcode 11 trở lên. Setup View Chúng ta sẽ tạo một Button và khi bấm sẽ tạo ra các animation. Điều đầu tiên cần làm là tạo một biến để biết nút có đang được nhấp hay không. @State private var isRotated = false Sau đó, bạn sẽ tạo một biến khác đại diện cho Animation để có...

Swift iOS SwiftUI
@renovate
Admin 09/06/2021 08:30
Những điểm cần lưu ý khi sử dụng enum trong Swift.

Enum là một trong những API mạnh mẽ được yêu thích nhất trong Swift. Thực tế là trong Swift thì Enum được phát triển cẩn thận để người dùng có thể sử dụng trong nhiều trường hợp với nhiều type khác nhau. Tuy nhiên vẫn có một số loại trường hợp chúng ta cần tránh khi sử dụng Enum vì rất có thể chúng ta sẽ tự làm chúng ta trở nên ngớ ngẩn cũng như việc code trở nên khó đọc khó...

Swift iOS
@renovate
Admin 11/06/2021 12:30
Các Modifier và View mới trong SwiftUI iOS 15

Khám phá một số tính năng mới nhất trong SwiftUI Chào mọi người. Hôm nay tôi sẽ nói về các tính năng được công bố tại WWDC mà tôi thấy quan trọng trong SwiftUI. Và tôi muốn chỉ ra rằng tôi sẽ chỉ đề cập ngắn gọn đến các chủ đề. Nếu bạn muốn biết thêm thông tin về SwiftUI, hãy xem tài liệu của Apple. Trong ví dụ của chúng ta, tôi sẽ sử dụng mô hình này: struct User : Identifiable{ ...

Swift iOS SwiftUI
@renovate
Admin 11/06/2021 15:30
Tìm hiểu về ARC và cách hoạt động của ARC trong iOS

Xin chào các bạn, khi bạn tiếp xúc về ngôn ngữ lập trình Swift thì chắc chắn bạn sẽ luôn nghe đến khái niệm như là ARC là gì và cách hoạt động ra làm sao... thì mình hi vọng sau bài này sẽ đem lại cho các bạn mới học Swift như mình 1 cái nhìn tổng quát về nó nhé. Giới thiệu ARC. Thì trước tiên đi đến ARC là gì thì mình muốn nói 1 chút về memory management là gì? Thì memory management được...

Swift iOS Memory management
@renovate
Admin 12/06/2021 15:50
[SWIFT] How to create Sound Visualizer

Môi trường phát triển: Swift Language Version: Swift 5.0 Xcode: Version 11.1 Deployment Target: 12.0 Ý tưởng: Bài viết hôm nay mình sẽ chia sẻ về cách sử dụng microphone tích hợp để lấy mẫu mức âm thanh theo dB, từ đó trực quan hóa nó trong Swift. Biểu đồ trên chính là sóng âm thanh. Sử dụng Swift, ta có thể bắt mức độ của âm thanh ở bất kỳ thời điểm nào. Ta có thể lấy nhiều mẫu âm thanh khác...

Swift iOS Animation audio visualization
@renovate
Admin 15/06/2021 13:50
Làm quen với AR trong iOS: Mang mặt trăng vào phòng của bạn

Gần đây mình đang tìm hiểu về AR và 3d rendering trong iOS, và thật sự mình thấy hứng thú với lĩnh vực (gần như) hoàn toàn mới đối với mình này. Mục đích bài viết của mình hôm nay là để giúp các bạn chưa từng làm việc với AR trong iOS có thể làm quen với nó, bằng cách code một ứng dụng giúp mang MẶT TRĂNG vào trong chính căn phòng của bạn. Và không chỉ mặt trăng, mà mặt trời, sao hoả,...

Swift iOS ARKit SceneKit Augmented Reality