Tại WWDC 20 vào tháng 6 năm 2020, Apple đã thông báo rằng bắt đầu từ iOS 14, các nhà phát triển cần phải xin phép người dùng trước khi được phép “tracking” họ. Nói cách khác, các ứng dụng sẽ không thể truy cập IDFA (Mã định danh dành cho nhà quảng cáo) của thiết bị trừ khi được cấp phép.
Đến tháng 9 năm 2020, Apple đã trì hoãn sự thay đổi này để các nhà phát triển có thêm thời gian thích ứng với sự thay đổi quyền riêng tư mới này.
Tuy nhiên vào tháng 4 năm 2021, Apple đã đưa ra thông báo công khai, yêu cầu tất cả các nhà phát triển sẵn sàng cho AppTrackingTransparency, cho biết rằng Apple sẽ thực thi đầy đủ quyền theo dõi trong bản phát hành công khai iOS 14.5.
Nếu ứng dụng của bạn trước đó có truy cập IDFA thì bạn cần phải tuân thủ AppTrackingTransparency ở bản update sắp tới, nêu không muốn bị Apple reject.
Understanding IDFA
Trước khi đi sâu vào code, đầu tiên chúng ta hãy tìm hiểu xem IDFA là gì? Trước hết, hãy đảm bảo rằng bạn không nhầm lẫn IDFA và IDFV (Mã định danh cho nhà cung cấp), Apple chỉ thực thi hỏi quyền trên IDFA. Nói cách khác, nếu ứng dụng của bạn chỉ sử dụng IDFV, thì không cần thay đổi.
IDFA là một chuỗi unique chữ và số cho mỗi thiết bị, nó chủ yếu được sử dụng để nhằm mục tiêu quảng cáo, giới hạn tần suất, phát hiện gian lận quảng cáo, đo lường v.v. Dưới đây là ví dụ về IDFA có thể trông như thế nào:1
CE3BB49C-0F44-4DB9-9F6D-B2025A8A4FF7
IDFA có các đặc tính sau:
- Mỗi thiết bị sẽ có IDFA duy nhất của riêng nó.
- Đây là mã nhận dạng cấp thiết bị, có nghĩa là các ứng dụng của các nhà cung cấp khác nhau được cài đặt trên cùng một thiết bị sẽ có cùng một IDFA.
- Việc xóa ứng dụng sẽ không thay đổi IDFA (vì nó là mã định danh thiết bị).
- Việc tắt và bật lại tính năng app-tracking của một thiết bị sẽ đặt lại IDFA của thiết bị đó.
Pro tip:
iOS 14, bạn có thể disable app tracking bằng cách vào Settings > Privacy > Tracking > Turn off “Allow Apps to Request to Track” > Ask Apps to Stop Tracking.
Asking Permission to Track
Trước iOS 14.5, bạn có thể dễ dàng lấy IDFA mà không bị hạn chế bằng cách sử dụng code sau:1
let idfa = ASIdentifierManager.shared().advertisingIdentifier
Tuy nhiên đối với iOS 14.5, IDFA sẽ bị xóa nếu bạn cố gắng truy cập nó mà không có sự cho phép của người dùng:1
2Zeroed out IDFA:
00000000-0000-0000-0000-000000000000
Để có được quyền của người dùng, trước tiên bạn phải thêm khóa NSUserTrackingUsageDescription
vào info.plist. Giá trị String mô tả cho người dùng biết lý do tại sao ứng dụng yêu cầu quyền theo dõi người dùng hoặc thiết bị.
Với điều đó, bây giờ bạn có thể sử dụng framework AppTrackingTransparency để hiển thị yêu cầu cảnh báo về quyền hệ thống:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19import AdSupport
import AppTrackingTransparency
ATTrackingManager.requestTrackingAuthorization { status in
DispatchQueue.main.async {
switch status {
case .authorized:
// Authorized
let idfa = ASIdentifierManager.shared().advertisingIdentifier
self.label.text = idfa.uuidString
case .denied,
.notDetermined,
.restricted:
break
@unknown default:
break
}
}
}
Trong đoạn mã trên, có 3 điều bạn cần lưu ý:
- Hàm
requestTrackingAuthorization (completeHandler : )
sẽ chỉ hiển thị cảnh báo cấp quyền hệ thống khi trạng thái app’s tracking của ứng dụng là .notDetined. Khi trạng thái ủy quyền đã được set, việc gọi hàm sẽ chỉ trả về completeHandler mà không hiển thị cảnh báo. - Cảnh báo cấp quyền hệ thống sẽ không hiển thị nếu “Allow Apps to Request to Track” bị tắt trong cài đặt quyền riêng tư của hệ thống.
- completeHandler sẽ không được thực thi trên main thread, vì vậy bạn cần sử dụng main thread nếu muốn update UI của ừng dụng khi việc cấp quyền được hoàn thành.
Cuối cùng, bạn cũng có thể sử dụng mã bên dưới để xác định trạng thái app’s tracking hiện tại của ứng dụng:1
let status = ATTrackingManager.trackingAuthorizationStatus
Handling Access Denied
Bây giờ bạn đã biết cách yêu cầu quyền theo dõi ứng dụng, điều gì sẽ xảy ra nếu người dùng từ chối quyền truy cập của bạn vào IDFA?
Một cách để xử lý điều này là đưa người dùng đến Cài đặt để người dùng có thể dễ dàng thay đổi quyền theo dõi. Đây là cách thực hiện:1
2
3
4
5
6
7
8
9func gotoAppPrivacySettings() {
guard let url = URL(string: UIApplication.openSettingsURLString),
UIApplication.shared.canOpenURL(url) else {
assertionFailure("Not able to open App privacy settings")
return
}
UIApplication.shared.open(url, options: [:], completionHandler: nil)
}
Wrapping Up
Một lần nữa, Apple đã thắt chặt kiểm soát quyền riêng tư trong hệ sinh thái sản phẩm của họ. Nó một lần nữa cho thấy Apple thực sự quan tâm đến quyền riêng tư của người dùng.
Với tư cách là nhà phát triển, chúng ta có nhiệm vụ đảm bảo rằng các ứng dụng luôn tuân thủ chính sách bảo mật của Apple, để người dùng có thể cảm thấy an toàn và bảo mật khi sử dụng các ứng dụng.
Link tham khảo: https://swiftsenpai.com/development/get-ready-apptrackingtransparency/