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.

pdf13 trang | Chia sẻ: lylyngoc | Lượt xem: 1505 | Lượt tải: 1download
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.