Nguyên lý chữ ký
Sử dụng kênh phân phối Ad-Hoc mà Apple cung cấp cho nhà phát triển, xử lý các thiết bị cài đặt như các thiết bị phát triển để phân phối.
Ưu điểm:
- Phân phối trực tiếp, cài đặt là chạy được ngay
- Ổn định, không có rủi ro do chứng chỉ bị thu hồi
Nhược điểm:
- Mỗi tài khoản nhà phát triển chỉ có thể đăng ký tối đa 100 thiết bị iPhone
Kiến trúc hệ thống tổng thể
- Thiết bị cài đặt tệp cấu hình mô tả, sau đó gửi UDID của thiết bị đến máy chủ.
- Máy chủ nhận được UDID và đăng ký UDID vào một tài khoản nhà phát triển cụ thể.
- Tạo tệp cấu hình mô tả dùng để ký, sau đó tiến hành ký cho tệp IPA.
- Tệp IPA được tải lên máy chủ, người dùng tải về thông qua cơ chế itms-services.
Triển khai kỹ thuật
1. Lấy UDID thông qua tệp cấu hình
- Tạo một tệp .mobileconfig trên máy chủ web của bạn;
- Người dùng nhấn vào để hoàn tất việc cài đặt tệp cấu hình;
- Dữ liệu cần thiết từ máy chủ, ví dụ: UDID, cần được cấu hình trong tệp .mobileconfig, cùng với địa chỉ URL nhận dữ liệu;
- Sau khi thiết bị người dùng cài đặt tệp cấu hình, thiết bị sẽ gọi lại URL bạn đã thiết lập
Lưu ý: Demo tệp .mobileconfig như sau:
<?xml version="1.0" encoding="UTF-8"?>
<plist version="1.0">
<dict>
<key>PayloadContent</key>
<dict>
<key>URL</key>
<string>http://192.168.1.40/data/receive.php</string> <!--Địa chỉ giao diện nhận dữ liệu-->
<key>DeviceAttributes</key>
<array>
<string>UDID</string>
<string>IMEI</string>
<string>ICCID</string>
<string>VERSION</string>
<string>PRODUCT</string>
</array>
</dict>
<key>PayloadOrganization</key>
<string>com.example.orgName</string> <!--Tên tổ chức-->
<key>PayloadDisplayName</key>
<string>Lấy UDID thiết bị</string> <!--Tiêu đề hiển thị khi cài đặt-->
<key>PayloadVersion</key>
<integer>1</integer>
<key>PayloadUUID</key>
<string>A1B2C3D4-E5F6-7890-ABCD-EF0123456789</string> <!--Chuỗi ngẫu nhiên-->
<key>PayloadIdentifier</key>
<string>com.example.udid-service</string>
<key>PayloadDescription</key>
<string>Lấy UDID thiết bị</string> <!--Mô tả-->
<key>PayloadType</key>
<string>Profile Service</string>
</dict>
</plist>
Lưu ý: Khi tải về tệp mobileconfig, cần thiết lập Content Type là: application/x-apple-aspen-config
Tệp trên máy chủ HTTPS
Khi truy cập tệp mobileconfig không thể tải trực tiếp, có thể cần thiết lập mime content type là application/x-apple-aspen-config.
Có hai phương pháp thiết lập content type:
Sử dụng .htaccess thêm cấu hình sau:
<IfModule mod_mime.c>
AddType application/x-apple-aspen-config .mobileconfig
</IfModule>
Sử dụng ngôn ngữ động như PHP thiết lập trực tiếp:
//Đọc luồng tệp vào biến $mobileconfig
header('Content-type: application/x-apple-aspen-config; charset=utf-8');
header('Content-Disposition: attachment; filename="device_config.mobileconfig"');
echo $mobileconfig;
Máy chủ nhận dữ liệu trả về và hiển thị
Sau khi thiết lập URL trong tệp mobileconfig và tải về cài đặt mobileconfig, thiết bị iOS sẽ POST luồng dữ liệu XML đến URL được thiết lập trong nút PayloadContent của tệp mobileconfig. Dưới đây là định dạng dữ liệu trả về:
<plist version="1.0">
<dict>
<key>IMEI</key>
<string>*********</string>
<key>PRODUCT</key>
<string>iPhone7,1</string>
<key>UDID</key>
<string>*************</string>
<key>VERSION</key>
<string>15B206</string>
</dict>
</plist>
tệp receive_data.php:
<?php
$input_data = file_get_contents('php://input');
//Có thể thực hiện phân tích cú pháp xml tại đây
header('HTTP/1.1 301 Moved Permanently'); //Phải chuyển hướng 301, nếu không thiết bị sẽ báo "Tệp cấu hình không hợp lệ"
header("Location: http://192.168.1.40/device_info.php?".$query_params);
?>
tệp display_udid.php:
<?php
$device_udid = $_GET['UDID'] ?? $_POST['UDID'];
?>
UDID:<input style="width:300px;" name="" value="<?php echo $device_udid;?>" />
Lưu ý rằng chuyển hướng phải sử dụng chuyển hướng 301, một số chuyển hướng mặc định là 302, điều này sẽ dẫn đến thất bại khi cài đặt, thiết bị sẽ báo "Tệp cấu hình không hợp lệ".
Công cụ tự động hóa Trung tâm Nhà phát triển Apple
Các bước tiếp theo sau khi lấy được UDID người dùng là đăng ký thiết bị mới + cập nhật Provisioning Profile. Cần sử dụng công cụ mã nguồn mở: Spaceship
Trung tâm Nhà phát triển Apple
Lệnh thêm thiết bị:
Spaceship::Portal.device.register!(device_name: "iPhone 6 cá nhân", device_udid: "987654321...")
Tải về tệp cấu hình mô tả:
adhoc_profiles = Spaceship::Portal.provisioning_profile.ad_hoc.all
File.open("app_profile.mobileprovision", "wb") { |file| file.write(profile.download) }
Tự động ký
Khuyến nghị sử dụng framework Sigh (chỉ hỗ trợ môi trường Mac), hoặc có thể sử dụng công cụ dòng lệnh ký vui vẻ, tận dụng chứng chỉ p12 để thực hiện lại quá trình ký trên máy chủ Linux.
Công cụ đóng gói và ký tự động
Phân phối ứng dụng đã ký
Có thể tham khảo cách triển khai gói doanh nghiệp