Một số chú ý khi code với iOS 13 (Phần 1)

Tram Ho

Introduction

Tại sự kiện tháng 9 vừa rồi, cùng với sự ra mắt của bộ ba sản phẩm iPhone chủ lực, Apple đã tung ra phiên bản iOS 13 với hàng loạt update mới.

Tuy nhiên đi cùng với những tính năng hữu ích, phiên bản iOS lần này cũng được đánh giá là nhiều lỗi nhất từ trước đến nay.

Tính từ thời điểm ngày 20 tháng 9 cho đến nay, chỉ trong vòng chưa đầy 2 tháng, Apple đã phải tung ra 6 bản vá lỗi liên tục – một con số kỷ lục.

Phiên bản iOS 13 ngoài việc nhiều lỗi gây phiền toái cho người dùng thì đối với các developer thì cũng đau đầu không kém. Khi mà có rất nhiều thay đổi nhỏ về UI mà Apple không có document cụ thể, dẫn đến hàng loạt bug khó fix.

Vì vậy trong bài viết này, chúng ta sẽ cùng chia sẻ và tìm hiểu một số thay đổi chú ý khi update UI trên iOS 13.

Adaptation Requirement

Starting April, 2020, all iPhone and iPad apps submitted to the App Store will need to be built with the iOS 13 SDK or later. They must also support the all-screen design of iPhone XS Max or the 12.9-inch iPad Pro (3rd Generation), or later.

Theo như trang Apple developer công bố, kể từ tháng 4 năm 2020, tất cả các game và app cho iPhone và iPad submit lên App Store đều phải được compile bằng bộ SDK của iOS 13 hoặc cao hơn (nghĩa là build bằng Xcode 11.0 trở lên).

Và tất cả phải support design full screen cho các loại màn hình mới từ iPhone XS Max hoặc iPad Pro 12.9 inch (thế hệ thứ 3) hoặc cao hơn.

Những app không đủ điều kiện sẽ bị reject submission hoặc tệ hơn có thể bị xóa khỏi App Store.

New Feature Adaptation

Dark Mode

iOS 13 giới thiệu chế độ Dark Mode mới bằng việc UIKit đã support các API, các system colors và adaptive images trong xcasset.

Tìm hiểu kỹ hơn về Dark Mode tại video WWDC 2019: Implementing Dark Mode on iOS

Nếu bạn thấy chưa sẵn sàng để implement Dark Mode thì có thể disable nó bằng 2 cách đơn giản sau:

  • Trong Info.plist, thêm key UIUserInterfaceStyle (Interface Style) và set giá trị này là Light thì app của bạn sẽ luôn hiển thị theme sáng mặc dù đang bật chế độ Dark Mode.
  • Dùng code, set property overrideUserInterfaceStyle thành .light ở bất kỳ UIView hay UIViewController nào mà bạn muốn.

Tuy nhiên các popup alert view mặc định của hệ thống, ví dụ như alert xin quyền notification, xin quyền camera… vẫn hiển thị màu đen ngay cả khi Dark Mode đang off.

Sign In with Apple

Kể từ iOS 13, Apple chính thức ra mắt một cách đăng nhập nhanh chóng và tiện lợi vào các app và website: Sign In with Apple.

Đây là một feature mới, vì vậy nó chỉ có thể implement trên Xcode 11. Theo như App Store App Review Guide mới nhất thì:

Apps that exclusively use a third-party or social login service (such as Facebook Login, Google Sign-In, Sign in with Twitter, Sign In with LinkedIn, Login with Amazon, or WeChat Login) to set up or authenticate the user’s primary account with the app must also offer Sign in with Apple as an equivalent option.

Nếu app của bạn có sử dụng các login service của các bên thứ 3 (như Facebook Login, Google Sign-in, Twitter, LinkedIn, Amazon, Zalo…) để xác thực tài khoản user thì bạn BẮT BUỘC phải implement thêm cả option Sign In with Apple.

Các trường hợp sau thì không bắt buộc:

  • Những app sử dụng các tài khoản internal của một công ty, tổ chức để register, login. (Ví dụ: app WSM của Sun*).
  • Những app giáo dục, enterprise, bussiness mà xác thực user sử dụng các tài khoản giáo dục, enterprise đã tồn tại trước đó. (Ví dụ: app Edumall).
  • Những app được hỗ trợ bởi chính phủ, tổ chức xác minh thông qua các hệ thống quản lý công dân, căn cước, ID điện tử… (Ví dụ: các app quản lý dân sự).
  • Những app là client cho dịch vụ của một bên thứ 3 cụ thể, yêu cầu user đăng nhập để có truy cập, sử dụng content, media của bên thứ 3 đó. (Ví dụ: app Netflix).

Cùng với sự xuất hiện của Sign In with Apple, Apple có đề cập trong mục News and Updates rằng:

Starting today, new apps submitted to the App Store can follow these guidelines. Existing apps and app updates must follow them by April 2020.

Bắt đầu từ ngày 12 tháng 9 năm 2019, các app mới submit để review lên App Store phải tuân thủ các tiêu chuẩn trên, được quy định trong App Review Guide.

Những app hiện tại và các update phải được hoàn thiện vào hạn chót vào tháng 4 năm 2020.

API Adaption

Private method KVC

Trong iOS 13, khi dùng các method KVC (Key Value Coding) như valueForKey hoặc setValue:forKey để get hoặc set các private property có thể gây ra crash runtime với log như sau:

Ở ví dụ trên, app đã bị crash khi chúng ta cố get private property _searchField của một UISearchBar.

Để giải quyết vấn đề trên, có thể sử dụng public property mới searchTextField:

hoặc viết method tìm view và sử dụng:

Một số tình huống bị crash cụ thể và cách fix sử dụng method findViewWithClassName trên:

Device Token

Khi user cung cấp quyền push notification, chúng ta sẽ nhận được device token định danh cho device đó và dùng nó để gửi lên server.

Bình thường, ta chỉ cần convert device token từ dạng NSData sang kiểu NSString và bỏ đi các ký tự thừa bằng code.

Tuy nhiên, trong iOS 13, đoạn code trên sẽ bị lỗi, không cho kết quả như mong muốn:

Cách parse đối với iOS 13 như sau:

Modal Pop-up Default Style

Kể từ iOS 13, khi sử dụng method presentViewController:animated:completion: để present một view controller thì sẽ có animation và behavior mới như sau:

Đó là bởi vì giá trị mặc định của property modalPresentationStyle của UIViewController đã bị thay đổi. Enum UIModalPresentationStyle có thêm một value mới là UIModalPresentationAutomatic. Giá trị này với hầu hết với các view controller được set bằng UIModalPresentationPageSheet.

Lưu ý rằng, với kiểu hiển thị cũ view controller mới full screen khi present thì presenting view controller sẽ call các method viewWillDisappearviewDidDisappear. Khi dismiss presenting view controller thì các method viewWillAppearviewDidAppear sẽ được call. Tuy nhiên với kểu present page sheet mới này thì các method trên sẽ không được call.

Solution: Set lại thủ công giá trị property này thành UIModalPresentationFullScreen.

UISearchBar Background

Để xóa bỏ phần background đen của UISearchBar, chúng ta thường dùng cách duyệt qua view structure của search bar và remove nó khỏi superview.

Tuy nhiên khi sử dụng cách này trên iOS 13 sẽ gây ra crash:

Solution: set layer.contents của UISearchBarBackground bằng nil:

UITabBarButton Structure

View structure của UITabBarButton và nhiều control mặc định trong iOS 13 đã bị thay đổi:

Như chúng ta có thể thấy UITabBarSwappableImageViewUITabBarButtonLabel đã được wrap vào một view mới kiểu _UIVisualEffectContentView. Và khi custom tab bar button, chúng ta thường duyệt qua các subview để tìm UITabBarSwappableImageView và thay đổi.

Nhưng vì nó đã được wrap trong view khác nên sẽ cần chú ý nếu muốn set frame, customize…

UINavigationBar Button Margins

Bắt đầu từ iOS 11 thì UINavigationBar sử dụng auto layout với các button trái, phải cách mép 16 pts (đối với các device có width <= 375 pts) hoặc 20 pts (đối với các device có width > 375 pts).

Để tăng kích thước vùng tap action của button, chúng ta thường định nghĩa một subclass của UINavigationBar và override method layoutSubviews. Sau đó duyệt qua các subview, tìm _UINavigationBarContentView và set layoutMargins bằng UIEdgeInsetsZero.

Cách này cũng sẽ lại gây crash trên iOS 13, error message:

Solution: sử dụng frame để mở rộng các chiều kích thước:

Còn rất nhiều bug, thay đổi khác trên iOS 13, chúng ta sẽ tìm hiểu trong bài viết lần sau.

Source article: https://juejin.im/post/5d8af88ef265da5b6e0a23ac

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo