Sử dụng công nghệ push notification cho phép một ứng dụng thông báo cho bạn
các tin nhắn hoặc sự kiện mới mà không cần phải thực sự mở ứng dụng đó ra, các
ứng dụng máy chủ có thể gửi nội dung phong phú cho các ứng dụng đã cài đặt trên
các thiết bị iOS hay Android, tránh cho bạn những rắc rối và chi phí sử dụng tin
nhắn SMS (Short Message Service) hoặc tin nhắn MMS (Multimedia Messaging
Service) trong các ứng dụng di động của mình. Michael Yuan giới thiệu cách hỗ
trợ tính năng quan trọng này trong các ứng dụng iOS của bạn. Bạn cũng sẽ thấy
cách sử dụng một thư viện Java nguồn mở để đơn giản hoá qui trình tin nhắn này.
13 trang |
Chia sẻ: lylyngoc | Lượt xem: 1572 | Lượt tải: 1
Bạn đang xem nội dung tài liệu Gửi tin nhắn push đến các thiết bị iOS, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
Gửi tin nhắn push đến
các thiết bị iOS
Sử dụng công nghệ push notification cho phép một ứng dụng thông báo cho bạn
các tin nhắn hoặc sự kiện mới mà không cần phải thực sự mở ứng dụng đó ra, các
ứng dụng máy chủ có thể gửi nội dung phong phú cho các ứng dụng đã cài đặt trên
các thiết bị iOS hay Android, tránh cho bạn những rắc rối và chi phí sử dụng tin
nhắn SMS (Short Message Service) hoặc tin nhắn MMS (Multimedia Messaging
Service) trong các ứng dụng di động của mình. Michael Yuan giới thiệu cách hỗ
trợ tính năng quan trọng này trong các ứng dụng iOS của bạn. Bạn cũng sẽ thấy
cách sử dụng một thư viện Java nguồn mở để đơn giản hoá qui trình tin nhắn này.
Bối cảnh
Tin nhắn SMS và tin nhắn MMS được các nhà cung cấp dịch vụ di động cung cấp
cho các thiết bị cụ thể thông qua các số điện thoại của họ. Các nhà phát triển các
ứng dụng phía máy chủ có khả năng thực hiện gửi tin nhắn SMS/MMS phải cố
gắng hết sức để tương tác với cơ sở hạ tầng viễn thông hiện có—bao gồm cả việc
vẫn dùng các số điện thoại. (Hãy đọc thêm các chi tiết về phát triển các ứng dụng
SMS/MMS phía máy chủ trong bài "Tích hợp tính năng gửi tin nhắn di động vào
ứng dụng web của bạn"). Các tin nhắn SMS/MMS không biết rõ về các ứng dụng
được cài đặt trên thiết bị của người nhận.
Sự phổ biến của nhiều điện thoại thông minh cao cấp như các thiết bị iPhone và
Android (và anh em họ hàng Wi-Fi của chúng, chẳng hạn như iPod Touch và iPad)
đã tạo ra một nhu cầu về một cơ sở hạ tầng gửi tin nhắn di động hiện đại có thể
cung cấp thông tin đa phương tiện phong phú trực tiếp cho các ứng dụng đã cài
đặt—chứ không phải cho các số điện thoại—và đó là cơ sở hạ tầng gửi tin nhắn di
động mở hơn và ít tốn kém hơn so với cơ sở hạ tầng SMS/MMS.
Cả Apple và Google đã cùng đương đầu với thách thức đó bằng cách phát triển cơ
sở hạ tầng trên Internet để có thể cung cấp các tin nhắn cho các thiết bị iOS và
Android tương ứng từ các ứng dụng máy chủ. Các tin nhắn Push được thiết kế từ
đầu để giao tiếp với các ứng dụng đã cài đặt trên các thiết bị di động. Chúng có thể
gửi văn bản, các tệp đa phương tiện và dữ liệu đặc trưng ứng dụng như âm thanh
cảnh báo và các nhãn hiển thị trên biểu tượng ứng dụng.
Bài này giải thích công nghệ tin nhắn push hoạt động như thế nào trên nền tảng
iOS và làm thế nào để kết hợp nó trong các ứng dụng của bạn. Để nhận được nhiều
thông tin nhất từ bài này, bạn nên có một số kinh nghiệm phát triển iOS và Java.
Căn bản về tin nhắn push trong iOS
Apple sử dụng các chứng chỉ số khóa-công khai để xác thực các yêu cầu tin nhắn
push từ ứng dụng iOS của bạn, nên trước tiên bạn cần phải tạo ra các khóa xác
thực và đăng ký chúng với Apple. Tôi sẽ giới thiệu quá trình đơn giản nhưng khá
dài này trong phần tiếp theo.
Tiếp theo, cần nhận diện mỗi thiết bị đã cài đặt ứng dụng và chọn nhận các tin
nhắn push cho ứng dụng. Trình tự hoạt động như sau:
1. Một hộp thoại cảnh báo trong ứng dụng iOS yêu cầu giấy phép của người
dùng để nhận các tin nhắn push.
2. Nếu người dùng chấp nhận giấy phép, ứng dụng iOS tiếp xúc với Dịch vụ
tin nhắn puah của Apple (Apple Push Notification - APN) để lấy một chuỗi
mã định danh (ID) là ID duy nhất nhận biết ứng dụng này đã cài đặt trên
thiết bị này. (Bạn có thể hình dung ID này giống như số điện thoại của người
nhận trong việc gửi tin nhắn truyền thống).
3. Ứng dụng IOS tải ID đó lên ứng dụng máy chủ của bạn.
4. Khi ứng dụng máy chủ cần gửi một tin nhắn push, nó xác thực dựa vào các
máy chủ tin nhắn push của Apple và sau đó sử dụng ID từ bước 2 và 3 để chỉ
rõ người nhận tin nhắn.
5. Nếu thiết bị của người nhận đang nối mạng, nó sẽ nhận và xử lý tin nhắn đó.
Nếu thiết bị đang tắt mạng, tin nhắn sẽ được xếp hàng và sau đó được
chuyển giao cho thiết bị trong lần nối mạng tới.
6. Các Dịch vụ tin nhắn push của Apple (APN) cũng cho phép các ứng dụng
máy chủ của bạn xác nhận hợp lệ danh sách các ID của ứng dụng đã lưu của
bạn theo định kỳ. Điều đó mang lại cho bạn cơ hội để loại bỏ các ID của
những người dùng mà sau này họ xóa ứng dụng hoặc thay đổi trạng thái lựa
chọn tin nhắn push của họ.
7. Nghe có vẻ nhiều việc đấy và đúng như vậy. Đó là lý do tại sao các dịch vụ
như Urban Airship (xem ô cửa sổ bên cạnh) tồn tại để môi giới các tin nhắn
có phí.
8. Sau khi hiển thị cho bạn cách đăng ký ứng dụng của mình, tôi sẽ đi sâu vào
các chi tiết phát triển một ứng dụng tin nhắn push của iOS và các thành phần
máy chủ của nó với sự trợ giúp của một thư viện Java nguồn mở.
Đăng ký ứng dụng
Để đăng ký ứng dụng của bạn để nhận tin nhắn push, trước tiên bạn cần tạo ra một
cặp khóa private/public để xác thực các cuộc gọi API của mình dựa vào các máy
chủ của Dịch vụ tin nhắn push của Apple. Bạn có thể làm điều này trên Mac thông
qua ứng dụng Keychain Access. Chọn KeyChain Access > Certificate Assistant
> Request a Certificate from a Certificate Authority để tạo ra một tệp yêu cầu
chứng chỉ. Tệp yêu cầu này chứa cặp khóa public đã tạo và khóa private tương ứng
đã lưu trong Keychain Access. Hãy chắc chắn chọn tùy chọn Saved to disk (Đã lưu
vào đĩa) trong hộp thoại, như trong Hình 1:
Hình 1. Tạo một cặp khóa và yêu cầu ký từ chương trình Keychain Access trên
Mac
Tiếp theo, hãy đăng nhập vào cổng thông tin cung cấp-ứng dụng của Apple (xem
phần Tài nguyên) và tải lên tệp yêu cầu ký của bạn, tệp này sẽ được liên kết với
lược tả cung cấp thích hợp. Hầu hết các ứng dụng đều có một lược tả cung cấp phát
triển cho những người thử nghiệm và một lược tả sản xuất cho App Store (Kho
ứng dụng), do đó bạn sẽ hầu như có thể tạo và tải lên hai yêu cầu. Sau khi bạn tải
lên yêu cầu ký đó, cổng thông tin tạo ra một chứng chỉ số để bạn có thể tải về.
Chứng chỉ này có chứa khóa công khai và bây giờ các Dịch vụ tin nhắn push của
Apple công nhận khóa đó vì đang được gắn với ứng dụng của bạn. Hình 2 cho thấy
một ví dụ:
Hình 2. Chứng chỉ số từ Apple
Tải về chứng chỉ số và nhấn đúp vào tệp tải về. Keychain Access bây giờ sẽ tự
động nhập khẩu chứng chỉ số và liên kết nó với khóa riêng mà bạn đã tạo ra khi
bạn tạo yêu cầu ký. Hình 3 cho thấy một cặp khóa public và private trong
Keychain Access:
Hình 3. Cặp khóa public và private trong Keychain Access
Bây giờ, bạn xuất khẩu (export) cặp khóa đó tới một tệp bằng cách sử dụng một
định dạng được gọi là Trao đổi thông tin cá nhân - Personal Information Exchange
(p12). Khi bạn tạo tệp p12, Keychain Access yêu cầu bạn gán cho một mật khẩu để
bảo vệ khóa private. Bạn có thể sử dụng một mật khẩu rỗng nếu muốn.
Từ lúc này, tất cả các yêu cầu API của bạn đến máy chủ push tin nhắn của các
Dịch vụ tin nhắn push của Apple phải được mã hóa bằng khóa private trong tệp
p12 và sau đó được ký số bằng khóa public trong tệp p12, để kiểm tra xem bạn đã
thực sự tạo cuộc gọi API đó chưa. Tôi sẽ giới thiệu cách sử dụng các khóa sau
trong bài này, khi tôi mô tả cách tương tác với các máy chủ của các Dịch vụ tin
nhắn push của Apple. (Nếu bạn sử dụng Urban Airship, nó sẽ yêu cầu bạn tải tệp
p12 cùng với bất kỳ mật khẩu nào lên máy chủ của nó để nó có thể gửi các tin nhắn
push thay cho bạn).
Bây giờ bạn có các chứng chỉ tin nhắn push, bạn phải tải về lại và cài đặt lại các
lược tả cung cấp ứng dụng của bạn—vì các lược tả này được cập nhật để hỗ trợ tin
nhắn push cho ứng dụng.
Yêu cầu và lưu một thẻ xác thực thiết bị
Ứng dụng iOS của bạn cần yêu cầu giấy phép người dùng để nhận được các tin
nhắn push trên các thiết bị đã cài đặt ứng dụng. Thông thường, bạn làm điều này
trong khi ủy thác ứng dụng thông qua một cuộc gọi API đơn giản, như trong Liệt
kê 1:
Liệt kê 1. Yêu cầu giấy phép của người dùng
[[UIApplication sharedApplication]
registerForRemoteNotificationTypes:
(UIRemoteNotificationTypeBadge |
UIRemoteNotificationTypeSound |
UIRemoteNotificationTypeAlert)];
Nếu người dùng chấp nhận giấy phép, ứng dụng sẽ tự động tiếp xúc với máy chủ
của các Dịch vụ tin nhắn push của Apple (APNs) để tìm một thẻ xác thực thiết bị.
Thẻ xác thực cho phép các APNs nhận ra ứng dụng cụ thể đã cài đặt trên thiết bị cụ
thể này là một điểm gửi tin nhắn đến. Quá trình này là tự động và xảy ra bên dưới.
Bạn không cần phải viết bất kỳ mã nào cho nó.
Sau các máy chủ APNs phản hồi, phương thức
didRegisterForRemoteNotificationsWithDeviceToken trong ủy thác ứng dụng
được gọi, với thẻ xác thực thiết bị được chuyển giao làm một tham số cuộc gọi.
Bạn phải lưu thẻ xác thực thiết bị và tải nó lên máy chủ tin nhắn push của bạn, như
trong Liệt kê 2:
Liệt kê 2. Nhận một ID và tải nó lên máy chủ tin nhắn push
- (void)application:(UIApplication*)application
didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken {
NSString *tokenStr = [deviceToken description];
NSString *pushToken = [[[[tokenStr
stringByReplacingOccurrencesOfString:@"<" withString:@""]
stringByReplacingOccurrencesOfString:@">" withString:@""]
stringByReplacingOccurrencesOfString:@" " withString:@""] retain];
// Save the token to server
NSString *urlStr = [NSString stringWithFormat:@"https://%@/push_token",
RINGFULDOMAIN];
NSURL *url = [NSURL URLWithString:urlStr];
NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:url];
[req setHTTPMethod:@"POST"];
[req setValue:@"application/x-www-form-urlencoded"
forHTTPHeaderField:@"Content-type"];
NSMutableData *postBody = [NSMutableData data];
[postBody appendData:[[NSString stringWithFormat:@"username=%@",
username]
dataUsingEncoding:NSUTF8StringEncoding]];
[postBody appendData:[[NSString stringWithFormat:@"&token=%@",
pushToken] dataUsingEncoding:NSUTF8StringEncoding]];
[req setHTTPBody:postBody];
[[NSURLConnection alloc] initWithRequest:req delegate:nil];
}
Điều lý tưởng là bạn gắn thẻ xác thực với một số thông tin để nhận ra người dùng
(chẳng hạn như username của người đó trong hệ thống của bạn) để cho máy chủ
của bạn biết mà gửi tin nhắn tới sau này. (Bạn có thể hình dung điều này giống như
việc gắn một số điện thoại theo tên của một người). Nếu bạn không gắn các thẻ xác
thực với thông tin nhận dạng người dùng riêng của mình, bạn vẫn có thể gửi các tin
nhắn cho những thiết bị đó, nhưng bạn không thể tuỳ chỉnh tin nhắn cho mỗi người
dùng, vì tất cả những gì bạn có là một chuỗi thẻ xác thực chữ số cho thiết bị đích.
Máy chủ nên lưu thẻ xác thực và thông tin nhận dạng người dùng liên quan của nó
trong một cơ sở dữ liệu. Trong hầu hết các ứng dụng, thẻ xác thực và thông tin liên
quan được lưu trong cơ sở dữ liệu lược tả-người dùng.
Gửi tin nhắn push
Để gửi tin nhắn push, máy chủ của bạn cần:
1. Tìm kiếm một danh sách về các ID ứng dụng để gửi tin nhắn tới.
2. Cá nhân hoá tin nhắn cho mỗi người nhận dựa trên lược tả người dùng của
người nhận đó.
3. Tiếp xúc với máy chủ gửi tin nhắn APNs.
API Web services cho APNs rất phức tạp. May mắn cho các nhà phát triển Java,
thư viện JavaPNS nguồn mở giúp cho việc thực hiện với API này trở nên đơn giản
hơn nhiều. Xem phần Tài nguyên để tìm đường link tải về và tài liệu JavaPNS.
Mã trong Liệt kê 3 cho thấy cách gửi một tin nhắn giống như SMS tới thiết bị bằng
cách sử dụng thư viện JavaPNS:
Liệt kê 3. Gửi tin nhắn nhấn push
String[] devices = {"token1", "token2};
List notifications
= Push.alert("Hello World!", "keypair.p12", "password", false, devices);
Các phương thức giao diện chính của thư viện JavaPNS là các phương thức tĩnh
trong lớp Push. Các APNs cho phép bạn nhúng nhiều nội dung tin nhắn của mình.
Hãy tham khảo hướng dẫn gửi tin nhắn push của iOS với một danh sách đầy đủ về
các loại tải tin được hỗ trợ (xem phần Tài nguyên). Lớp Push cung cấp các phương
thức thuận tiện cho từng loại tin nhắn và nó xử lý chuyển đổi tin nhắn sang định
dạng JSON (JavaScript Object Notation) được các máy chủ của các APNs chấp
nhận. Trong Liệt kê 3, keypair.p12 là tệp p12 được xuất khẩu từ Keychain Access
và password là mật khẩu cho tệp p12. Mảng devices là một danh sách các thẻ xác
thực thiết bị nhận được từ ứng dụng iOS. Tất cả các thiết bị trong mảng đó sẽ nhận
được tin nhắn push này. Giá trị false trong tham số này chỉ rõ rằng tin nhắn nên
được gửi đến máy chủ phát triển APNs (sandbox) thay vì máy chủ sản xuất ra nó.
(Nhớ lại rằng bạn thường tạo ra một cặp khóa p12 cho sandbox - hộp dùng để thử
nghiệm và phát triển phần mềm - và một cặp khóa p12 khác cho máy chủ sản
xuất).
Giá trị trả về của lời gọi phương thức này là một danh sách các các đối tượng
PushedNotification mà bạn có thể sử dụng chúng để xác định trạng thái của việc
cung cấp tin nhắn push, như trong Liệt kê 4:
Liệt kê 4. Kiểm tra trạng thái của việc cung cấp tin nhắn push
for (PushedNotification notification : notifications) {
if (notification.isSuccessful()) {
/* Apple accepted the notification and should deliver it */
} else {
String invalidToken = notification.getDevice().getToken();
/* Add code here to remove invalidToken from your database */
}
}
Nếu đối tượng notification (tin nhắn) nói cho bạn biết rằng một thẻ xác thực thiết
bị nào đó không còn hoạt động nữa—ví dụ, nếu người dùng đã loại bỏ ứng dụng
khỏi thiết bị hoặc vô hiệu hóa tin nhắn đó trong các thiết lập ứng dụng—thì bạn
nên loại bỏ thẻ xác thực đó ra khỏi cơ sở dữ liệu để bạn không gửi các tin nhắn tới
thiết bị đó nữa.
Một cách khác để giữ cho danh sách các thẻ xác thực thiết bị đang hoạt động của
bạn luôn cập nhật là kiểm tra ứng dụng máy chủ của bạn theo định kỳ với các máy
chủ APNs. Liệt kê 5 cho thấy cách truy vấn dịch vụ phản hồi của các APNs bằng
cách sử dụng JavaPNS để nhận một danh sách các thẻ xác thực thiết bị không hợp
lệ từ APNs sandbox:
Liệt kê 5. Kiểm tra để cập nhật các thẻ xác thực thiết bị đang hoạt động
List inactiveDevices = Push.feedback("keypair.p12", "password", false);
/* remove inactive devices from your own list of devices */
Điều quan trọng là không để lãng phí tài nguyên do việc gửi các tin nhắn đến các
thiết bị đã xóa ứng dụng của bạn hoặc quyết định không tham gia nhận các tin
nhắn nữa.
Các vấn đề cần xem xét thêm
Không thể thử nghiệm các tin nhắn push trên các bộ giả lập iOS; bạn phải triển
khai ứng dụng trên một thiết bị thực để thử nghiệm nó. Vì chứng chỉ số được sử
dụng để xác thực tin nhắn được gắn vào lược tả cung cấp của ứng dụng, nên bạn
cần thử nghiệm với chứng chỉ phát triển khi bạn đang phát triển hoặc phân phối
các ứng dụng đặc biệt. Bạn phải chuyển sang chứng chỉ sản xuất sau khi ứng dụng
được phê duyệt để sẵn sàng đưa lên App Store.
Ngoài ra, điều quan trọng cần hiểu là việc tùy chỉnh và gửi các tin nhắn push cho
một cơ sở dữ liệu người dùng lớn là công việc chuyên sâu về tài nguyên. Ví dụ, để
thu thập dữ liệu thông qua một cơ sở dữ liệu hàng triệu người dùng mỗi lần 5 giây
để nhận ra 10 người dùng cần nhận một tin nhắn vào thời điểm đó rất tốn kém. Cơ
sở hạ tầng phía máy chủ cần phải được thiết kế và lập kế hoạch thận trọng để hỗ
trợ thường xuyên các tin nhắn push cho một số lượng lớn người dùng. Ngược lại,
việc gửi một tin nhắn push cho một triệu người dùng cùng một lúc tạo ra một lưu
lượng dữ liệu rất lớn, có thể xử lý lưu lượng lớn đó tốt hơn thông qua một nhóm
luồng, chứ không phải làm tắc nghẽn một luồng riêng lẻ. Thư viện JavaPNS cung
cấp một API để dễ dàng sử dụng các nhóm luồng đẩy các tin nhắn tới một số lượng
lớn các thiết bị đồng thời.
Kết luận
Công nghệ tin nhắn push cho phép các ứng dụng máy chủ của bạn bỏ qua các nhà
cung cấp viễn thông và gửi tin nhắn trực tiếp đến các ứng dụng của thiết bị iOS
trên Internet. Mặc dù việc thực hiện tin nhắn push là quan trọng—nhu cầu về các
chứng chỉ SSL phía máy khách để xác thực dựa vào các máy chủ của Apple rất
phức tạp —sự giúp đỡ của các bên thứ ba như Urban Airship và JavaPNS có thể
giúp cho việc gửi các tin nhắn dễ dàng hơn. SMS và MMS có vị trí của mình và
vẫn còn đáng tin cậy hơn so với công nghệ tin nhắn push, nhưng bạn có thể làm
cho các ứng dụng iOS của mình phong phú hơn và linh hoạt hơn bằng cách thực
hiện gửi tin nhắn push này.