Hướng dẫn cách chuyển đổi ứng dụng iOS sang macOS (Phần 1)

Nếu bạn là một lập trình viên iOS và bạn có kĩ năng lập trình cả macOS, thì có lẽ bạn cũng mong muốn việc tạo ra một ứng dụng có thể chạy trên đa nền tảng.

Giống như những lập trình viên khác, việc bạn không mong muốn nhất khi lập trình đa nền tảng đó là việc phải code lại hoàn toàn ứng dụng của mình từ đầu, điều này làm chúng ta mất rất nhiều công sức và tiền bạc. Nhưng sau những bài hướng dẫn này, bạn hoàn toàn có thể học được việc chuyển đổi ứng dụng từ iOS sang macOS bằng cách sử dụng phần code đã có của iOS và thêm vào một vài phần code phụ thuộc vào macOS rất nhanh chóng và hoàn toàn không tốn sức lực.

Mở đầu

Để bắt đầu bài hướng dẫn, các bạn hãy tải về project sau ở đây

Trong project mẫu này là một ứng dụng có tên là BeerTracker, nó cho phép chúng ta ghi lại số bia mà chúng ta đã uống, cùng với đó là các đánh giá, ghi chú, và hình ảnh của nó. Hãy chạy ứng dụng để tìm hiểu thêm nhé.

Vì ứng dụng này mới chỉ chạy trên iOS, nên việc đầu tiên cần làm đó là tạo một target để chạy macOS. Một target đơn thuần là một tập các chỉ dẫn cho Xcode có thể chạy ứng dụng.

Chọn project "BeerTracker" ở trong mục "Project Navigator". Ở dưới phần "Project and Targets", ấn vào dấu "+".

Một cửa sổ sẽ được hiện ra cho phép chúng ta thêm một target mới vào trong project. Trên cùng của cửa sổ, bạn sẽ thấy các thanh tabs riêng biệt theo từng mục tương ứng với các nền tảng được hỗ trợ. Chọn macOS, sau đó cuộn xuống phần "Application" và chọn "Cocoa App". Đặt tên cho target đó là "BeerTracker-mac".

Thêm Asset

Trong phần đầu bạn đã tải về project mẫu, bạn sẽ tìm thấy có một thư mục tên là "BeerTracker Mac Icons". Bạn còn phải thêm icon của ứng dụng vào trong "AppIcon" trong "Assets.xcassets" nằm bên dưới nhóm "BeerTracker-mac". Và thêm "beerMug.pdf" vào cùng trong đó. Chọn "beerMug", mở "Attributes Inspector" và đổi "Scales" sang "Single Scale". Điều này để đảm bảo việc bạn không cần phải thay đổi tỉ lệ ảnh cho phần resource này.

Khi bạn hoàn thành xong, phần Asset của bạn sẽ giống như sau:

Ở phần trên cùng bên trái của Xcode, bạn chọn scheme tên là "BeerTracker-mac". Bấm vào Build và chạy, sau đó bạn sẽ thấy một cửa sổ rỗng hiện lên. Trước khi bạn thêm phần code giao diện, bạn phải đảm bảo rằng code của mình không bị conflic giửa UIKit của iOS và AppKit của macOS.

Phần phải tách rời

Phần framework nền tảng cho phép chúng ta chia sẻ khá nhiều code, cho nhiều nền tảng. Tuy nhiên, phần UI lại không thể đa nền tảng. Thực tế, Apple đã khuyến cáo rằng, ứng dụng đa nền tảng không nên chia sẻ phần code về UI, và nền tảng sau được tạo mới dựa trên nền tảng trước.

iOS có một số guideline về UI khá chặt chẽ để đảm bảo rằng người dùng có thể đọc và chọn các phần tử có trên màn hình cảm ứng. Nhưng macOS lại hoàn toàn khác biệt, Laptop và desktop có chuột và bàn phím đã chọn và ấn, cho phép các phần tử ở trên màn hình có kích thước nhỏ hơn hẳn so với điện thoại.

Tạo ra những phần UI riêng biệt là cần thiết cho các nền tảng, nó còn quan trọng ở việc cho phép chúng ta đánh giá xem phần code nào có thể được tái sử dụng, phần nào phải viết lại. Hãy nhớ rằng không hề có một định nghĩa nào chính xác và cần thiết cho việc đúng hay sai trong tất cả các trường hợp, bạn cần phải chọn hướng đi phù hợp nhất cho ứng dụng của mình. Luôn luôn ghi nhớ rằng càng nhiều code được chia sẻ, càng ít bug.

Nói chúng, bạn hoàn toàn có thể chia sẻ phần code về model và model controller. Mở "Beer.swift", và mở phần "Utilities" trong Xcode, chọn "File Inspector".Vì cả 2 target đều dùng model này nên dưới "Target Membership", check vào "BeerTracker-mac". Làm như vậy với cả "BeerManager.swift" và "SharedAssets.xcassets".

Nếu bạn chạy thử, bạn sẽ gặp lỗi vì trong "Beer.swift" đang import "UIKit". Model này đang dùng thư viện thuộc về chỉ một nền tảng nên sẽ gây lỗi. Thay thế nó bằng đoạn code sau

Nếu bạn chạy bây giờ, ứng dụng sẽ không được compile vì "UIImage" thuộc về "UIKit". Vì phần model này thuộc về đa nền tảng, nên phần riêng biệt nền tảng cần phải được viết riêng ra. Trong "Beer.swift", xóa "Image Saving". Sau đó thêm đoạn code sau.

Vì mỗi target vẫn cần phải tham chiếu đến hình ảnh của Beer nên để lưu trữ hình ảnh, protocol này cho đưa ra một tham chiếu có thể sử dụng cho cả 2 nền tảng.

Ở phần sau chúng ta sẽ đi sâu hơn vào trong việc thay đổi model sao cho phù hợp và tạo phần UI đa nền tảng.

Ref: https://www.raywenderlich.com/161968/porting-your-ios-app-to-macos