Tuesday, September 29, 2015

iOS9 - Một số điểm mới khi phát triển và upload lên AppStore

iOS9 đã được chính thức phát hành, và như thường lệ, rất nhiều người dùng đã nâng cấp phần mềm cho chiếc iPhone của mình. Lúc này cũng là lúc mà các lập trình viên phải vất vả để nâng cấp app của mình sao cho tương thích với iOS9. Dưới đây là một số điểm mới cần chú ý khi phát triển app cũng như là khi upload app lên AppStore.


Lỗi xuất hiện do thay đổi của iOS9


App Transport Security Policy Error

Failed to load resource: The resource could not be loaded because the App Transport Security policy requires the use of a secure connection.

Apple đã siết chặt thêm tính bảo mật ở iOS 9, và họ ngăn chặn các kết nối không an toàn. Điều này là rất tốt, nhưng nếu bạn, có cần có những kết nối không an toàn này trong app, thì bạn phải làm thêm một số bước trick để tạm vượt qua được hạn chế này bằng cách add đoạn code bên dưới vào trong file AppName-info.plist.


<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key><true>
</true></dict>


-canOpenURL: failed for URL


-canOpenURL: failed for URL: "://" - error: "This app is not allowed to query for scheme "
-canOpenURL: failed for URL: "about:blank" - error: "This app is not allowed to query for scheme about"



App của bạn có nhúng webview, và trong webview đó có thực hiện thao tác để mở một trang web? App của bạn sử dụng custom URL?
Thế thì khả năng cao bạn sẽ dính phải lỗi này.
Nguyên do là Apple đã thay đổi cách hoạt động của API canOpenURL trong iOS 9 bằng cách thêm 1 khoá là LSApplicationQueriesSchemes được cài đặt trong file Info.plist.

Giải pháp là bạn cần phải đặt URL Scheme vào danh sách Whitelist mà app có thể mở được.

Mở file Info.plist bằng Source Code view và thêm các schemes cần thiết cho app vào ví dụ:


<key>LSApplicationQueriesSchemes</key>
<array>
<string>twitter</string>
<string>whatsapp</string>
<string>fb</string>
</array>


Các thư viện của bên thứ 3 bị lỗi


Nếu app của bạn dùng thư viện 3rd party, bạn cũng cần check lại cẩn thận vì có thể một số hàm hoặc Categories trong các thư viện đó bị lỗi khi build bằng XCode 7 hoặc chạy trên iOS9.
Ví dụ JSONKit,...


Bàn phím ảo mới



Apple đã cải tiến lại bàn phím ảo cho iOS 9 mà họ gọi là "best keyboard yet" (chưa bao giờ tuyệt vời như thế) kế thừa các tính năng từ iOS 8 QuickType.

Bạn có thể đã gặp phải trường hợp khi mình gõ sai text, sau đó bạn phải nhấn và giữ ngón tay trên 1 con chuột hình thanh dọc nhấp nháy nhỏ xíu để di chuyển nó đến chỗ sai khi sửa đổi.
Con trỏ (cursor) khi edit text bây giờ có thể điều khiển 1 cách dễ dàng bằng cơ chế trượt 2 ngón tay trên bàn phím ảo. Với cải tiến này, iPad QuickType keyboard biến thành 1 trackpad như là trên các máy Mac. Với cải tiến đáng giá này, bạn sẽ dễ dàng hơn rất rất nhiều trong việc di chuyển con trỏ tiến lui lên xuống đến vị trí mong muốn khi edit text.


Hơn thế nữa, iOS 9 bây giờ cũng hỗ trợ các shortcuts để nếu bạn có sử dụng bàn phím wireless thì bạn cũng thực hiện các thao tác được nhanh và dễ dàng hơn thông qua built-in shortcut keys. Nhấn giữ các nút Command, Options hoặc Control sẽ hiển thị ra danh sách các shortcut.

Và là lập trình viên, bạn cũng cần biết được điều này để update app của mình sao cho tiện lợi cho người dùng nhất.


New San Francisco Font


Đây có lẽ là phần đau đầu nhất đối với việc update app. Có lẽ bạn đã quen với việc set các text or label của mình bằng font mặc định. Ở iOS8 trở về trước, HelveticaNeue là FontFamily cho system. Font HelveticaNeue được nhận định là không thích hợp cho các thiết bị có màn hình nhỏ như Apple Watch, do khi hiển thị các text có size nhỏ thì font này có thể làm cho text bị nhoè, khó đọc.
Do đó Apple đã quyết định thiết kế bộ Font mới là San Francisco cho iOS9 làm font system mặc định.
Điều này sẽ gây ra việc các label, button, có thể bị nhảy size do kích cỡ text cần hiển thị bị thay đổi. Nhất là đối với những app sử dụng cách tính size của text dựa trên font, hoặc không sử dụng Autolayout khi code giao diện, bạn sẽ nhanh chóng phải sửa lỗi này.


Swift2 được ra mắt

Nếu app của bạn được code bằng Swift thì Apple đã nâng cấp Swift lên phiên bản 2. Bạn có thể kiểm tra lại để nâng cấp app của mình.

Tham khảo

Ngoài những điểm hay gặp ở trên, Apple cũng cho biết các điểm thay đổi mà developer cần chú ý gồm:

  • OCR accessory setup
  • Search extensibility
  • Audio unit extension
  • VPN plug-in extension
  • Swift 2
  • Map customization
  • Direct document
  • UI testing in Xcode
  • Notification actions
  • Third party notifications
  • Sensor profile
  • App thinning
  • Motorized windows profile
  • New Health data types
  • Flyover and Walkthrough
  • Code Coverage
  • Gaming APIs
  • Layout guide
  • Shortcut bar
  • Automated shades profile
  • Object-oriented Contacts
  • New HomeKit profiles
  • iCloud open in place
  • Home security profile
  • Storyboard references
  • App transport security API
  • Stack view
  • Wireless CarPlay
  • HomeKit iCloud remote access

Một số chi tiết thay đổi khác bạn có thể tham khảo thêm ở đây: https://developer.apple.com/library/prerelease/ios/releasenotes/General/WhatsNewIniOS/Articles/iOS9.html#//apple_ref/doc/uid/TP40016198-SW1



Upload lên AppStore


Kết nối account itunesconnect vào XCode 7

Apple đã có một số thay đổi ở bản XCode7 so với bản cũ. Khi build và sign app của mình, bạn phải kết nối account itunesconnect vào mục XCode > Settings > Accounts. Nếu bạn là personal, ko sử dụng account team, có thể bạn không cần quan tâm do khi đó account itunesconnect và account developer của bạn sử dụng chung email. Tuy nhiên, khi bạn làm team, account itunesconnect có thể bị khác với account developer, lúc đó bạn sẽ phải làm thêm việc này.


Gặp lỗi khi upload: Invalid Bundle. iPad Multitasking support requires launch story board in bundle



Như bạn đã biết là Apple release iOS9, và trong cùng sự kiện đó là ra mắt iPad Pro. Và đây là cài đặt dành riêng cho iPad Pro, giúp thiết bị này nhận biết và xử lý khi app của bạn có sử dụng tính năng split-view/multitasking.

Bạn sẽ gặp lỗi này nếu app của bạn không chỉ ra cách mà iPad sẽ xử lý như nào để support multitask.

Một số nguyên nhân có thể là: Không sử dụng Storyboard để gán Launch screen; nhất là app của bạn sử dụng tính năng split screen. Nếu app của bạn không support multitasking, để khắc phục, bạn chỉ cần đơn giản check vào 'Requires full screen' trong tab General Options của target trong Xcode.