07/09/2018, 15:33

Build Multi-App from 1 source XCode

Có bao giờ bạn gặp phải trường hợp muốn làm 2 app giống nhau gần như hoàn toàn chỉ khác nhau ở chỗ thay màu sắc thay một số tên hay thay đổi data của nó chưa? (Bạn nào hay làm app từ điển hoặc chuyên đi clone app chắc sẽ hay gặp hehe :P) Giờ các bạn xử lý thế nào bây giờ? Bình thường nếu là minh ...

Có bao giờ bạn gặp phải trường hợp muốn làm 2 app giống nhau gần như hoàn toàn chỉ khác nhau ở chỗ thay màu sắc thay một số tên hay thay đổi data của nó chưa? (Bạn nào hay làm app từ điển hoặc chuyên đi clone app chắc sẽ hay gặp hehe :P) Giờ các bạn xử lý thế nào bây giờ? Bình thường nếu là minh thì mình sẽ clone thẳng source ra rồi thay đổi những thứ cần đổi. Thế nhưng khi làm 3 app thì sao, khi các bạn phát hiện ra bug thì sao bây giờ? 1 bug mà 3 cái app bị, 3 source code cần sửa. Thật là thảm hoạ. Có vẻ giải pháp này không hay ho cho lắm. Thật may quá XCode có cung cấp một công cụ giúp chúng ta làm việc này một cách khá dễ dàng: Multi-target trong 1 project. Giờ chúng ta cùng tìm hiểu xem làm thế nào nhé.

Select info Project các bạn sẽ thấy:
Screen Shot 2015-07-16 at 10.05.23 PM

Các bạn để ý mục target, đó chính là những sản phẩm các bạn tạo được khi build project với những schema khác nhau. Giờ muốn clone app, đầu tiên các bạn duplicate target hiện tại ra, lúc này bạn sẽ có target mới y change target cũ. và lúc này sẽ có 1 file plist mới cho target này.

Screen_Shot_2015-07-16_at_10_30_47_PM

Để đổi tên theo ý muốn của mình, các bạn search tên vừa mới copy tạo ra trong build -setting và đổi tên Product Name theo ý muốn. Nếu đổi tên file plist thì thay tên plist trong build-setting luôn.
Screen_Shot_2015-07-16_at_10_33_54_PM
Giờ các bạn để ý shema phía trên tên chưa khớp nhau giờ làm sao rename cho nó khớp để build ko bị lộn :D. Các bạn vào manage Schema.
alt
remove het schema hiện tại. Và tạo lại schema mới tương ứng với cái target của các bạn.
alt

Đối mỗi mỗi file hay như thư mục Images.xcassets, các bạn để ý mũi tên bên phải trong hình trên đều có target membership. Có nghĩa là file đó build cho những target được lựa chọn. Do đó muốn thiết lập file nào ảnh nào các bạn chỉ cần đưa vào project và lựa chọn target cho phù hợp.
Screen_Shot_2015-07-16_at_10_37_02_PM

Ở đây có nhiều cách thiết lập. Và đây là cách của mình

Screen_Shot_2015-07-16_at_10_53_42_PM

Mình chia resoure ra theo từng tên app đối với những thứ ko xài chung được. và trong đó sẽ được tick vào target phù hợp. Những thứ xài chung thì bỏ vào global resource tick vào toàn bộ target. Chi tiết các bạn có thể xem trong demo. Lưu ý quan trọng ở đây là dấu tick vào target thích hợp.

Phía trên là cho các file ảnh. Thế còn trường hợp các bạn code app client server thì sao, mỗi app là một server khác nhau vậy thì nên làm thế nào giờ.

Các bạn tạo một file (mình đặt tên là projectdefine) rồi địnhg nghĩa link biến chưa link mà các bạn muốn với từ khoá extern:

extern const NSString * const productionURL;

Tiếp theo bạn tạo define dành riêng cho từng target:

const NSString * const productionURL = @"http://feelgrafix.com/data_images/out/15/899679-sunrise-wallpaper.jpg";

Khi sử dụng các bạn chỉ cần lấy

NSString *ImageURL = productionURL;

Lúc này thì XCode tự động lấy đúng cho bạn. Chi tiết các bạn coi ở demo nhé.

Còn trường hợp các target khác nhau có đôi khi cần những logic nhỏ khác nhau thì sao? Chúng ta xử lý thế nào?
Các bạn define marcro cho nó rồi xử lý:
Screen_Shot_2015-07-16_at_10_57_30_PM
Khi đó vào code các bạn xử lý

#ifdef APP2

    self.lblTestMacro.hidden = YES;

#endif

Code các bạn có thể tham khảo tại: Demo

Thắc mắc hoặc góp ý gì các bạn có thể comment phía dưới. Cảm ơn các bạn.

0