So Sánh Các Cơ Chế Thông Báo Đẩy của JPush và GeTui trên Nền tảng iOS

Trong phát triển ứng dụng di động iOS, việc tích hợp các dịch vụ thông báo đẩy là rất phổ biến để tương tác với người dùng và cập nhật dữ liệu. Bài viết này sẽ so sánh các cơ chế thông báo đẩy chính do hai nhà cung cấp dịch vụ phổ biến là JPush (Cực Quang) và GeTui (Cá Đẩy) cung cấp, đặc biệt tập trung vào cách chúng tương tác với APNS của Apple và các loại tin nhắn độc lập của từng nhà cung cấp.

1. Thông báo đẩy tiêu chuẩn (qua APNS)

Đây là loại thông báo đẩy cơ bản và phổ biến nhất, sử dụng dịch vụ Apple Push Notification Service (APNS). Cả JPush và GeTui đều tận dụng APNS để gửi các thông báo hiển thị trên màn hình khóa, trung tâm thông báo hoặc dưới dạng biểu ngữ (banner). Người dùng sẽ nhận được các thông báo này ngay cả khi ứng dụng đang bị đóng hoàn toàn (killed), chạy ngầm (background) hoặc đang hoạt động (foreground).

Xử lý khi người dùng tương tác với thông báo:

Khi người dùng chạm vào một thông báo đẩy, hệ thống sẽ kích hoạt phương thức ủy quyền sau trong ứng dụng của bạn để xử lý phản hồi:

-(void)userNotificationCenter:(UNUserNotificationCenter *)center
didReceiveNotificationResponse:(UNNotificationResponse *)interactionResponse
         withCompletionHandler:(void (^)(void))completionHandler {
    // Trích xuất thông tin từ thông báo được nhấp
    NSDictionary *userInfo = interactionResponse.notification.request.content.userInfo;
    NSLog(@"Người dùng đã tương tác với thông báo có dữ liệu: %@", userInfo);

    // Thực hiện hành động tương ứng, ví dụ: mở một màn hình cụ thể
    // ...

    completionHandler(); // Luôn gọi completionHandler
}

Xử lý khi nhận thông báo khi ứng dụng đang chạy ở foreground:

Nếu ứng dụng đang hoạt động ở foreground, thông báo đẩy mặc định sẽ không hiển thị UI cho người dùng. Để hiển thị thông báo dưới dạng biểu ngữ/âm thanh hoặc xử lý dữ liệu ẩn, bạn cần triển khai phương thức ủy quyền này:

-(void)userNotificationCenter:(UNUserNotificationCenter *)center
      willPresentNotification:(UNNotification *)notificationItem
        withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler {
    // Thông báo được nhận khi ứng dụng đang chạy ở foreground
    NSDictionary *payloadData = notificationItem.request.content.userInfo;
    NSLog(@"Đã nhận thông báo khi ứng dụng đang hoạt động với dữ liệu: %@", payloadData);

    // Quyết định cách hiển thị thông báo trong foreground
    // Ví dụ: hiển thị dưới dạng biểu ngữ, phát âm thanh và cập nhật số badge
    completionHandler(UNNotificationPresentationOptionAlert | UNNotificationPresentationOptionSound | UNNotificationPresentationOptionBadge);
}

2. Tin nhắn nội ứng dụng (In-App Messages) và Tin nhắn truyền tải (Passthrough Messages)

Các loại tin nhắn này có điểm chung là không đi qua dịch vụ APNS của Apple mà sử dụng kênh kết nối riêng của nhà cung cấp dịch vụ (JPush hoặc GeTui). Chúng thường được gọi là "tin nhắn thầm lặng" hoặc "truyền tải dữ liệu" và có thể được nhận ngay cả khi người dùng đã tắt quyền thông báo cho ứng dụng.

Ứng dụng phổ biến cho loại tin nhắn này bao gồm: cập nhật dữ liệu cấu hình ứng dụng, đồng bộ trạng thái người dùng theo thời gian thực, hoặc thông báo thay đổi quyền truy cập mà không cần hiển thị giao diện người dùng.

Tin nhắn nội ứng dụng của JPush (JPush In-App Message)

Khi ứng dụng đang chạy ở foreground, JPush sẽ gửi tin nhắn qua kết nối dài hạn và phát ra một thông báo nội bộ, kích hoạt phương thức xử lý. Nếu ứng dụng ở background, tin nhắn có thể được nhận và xử lý khi ứng dụng quay lại foreground.

#import "JPUSHService.h"

// Trong class của bạn (ví dụ: AppDelegate hoặc một MessageHandler riêng),
// bạn cần đăng ký lắng nghe thông báo này, thường là trong `application:didFinishLaunchingWithOptions:`
// [[NSNotificationCenter defaultCenter] addObserver:self
//                                          selector:@selector(jpushDidReceiveInternalMessage:)
//                                              name:kJPFNetworkDidReceiveMessageNotification
//                                            object:nil];

- (void)jpushDidReceiveInternalMessage:(NSNotification *)notification {
    NSDictionary *messageContent = [notification userInfo];
    NSString *notificationID = [messageContent valueForKey:@"_j_msgid"];
    NSString *messageText = [messageContent valueForKey:@"content"];
    NSDictionary *additionalData = [messageContent valueForKey:@"extras"];

    // Ví dụ truy cập một trường dữ liệu tùy chỉnh từ 'additionalData'
    NSString *updateKey = [additionalData valueForKey:@"configuration_key"];

    NSLog(@"JPush In-App Message - ID: %@, Nội dung: %@, Dữ liệu bổ sung: %@",
          notificationID, messageText, updateKey);

    // Thực hiện các hành động cần thiết dựa trên nội dung tin nhắn,
    // ví dụ: làm mới dữ liệu người dùng hoặc cấu hình ứng dụng.
}

Tin nhắn truyền tải của GeTui (GeTui Passthrough Message)

GeTui cung cấp cơ chế tương tự qua tin nhắn truyền tải. Dữ liệu được gửi trực tiếp đến ứng dụng qua kết nối riêng của GeTui và được xử lý qua phương thức ủy quyền của GeTui SDK:

#import 

// Class của bạn (ví dụ: AppDelegate) cần tuân thủ giao thức GeTuiSdkDelegate
// @interface AppDelegate () <GeTuiSdkDelegate>

- (void)GeTuiSdkDidReceivePayloadData:(NSData *)payloadData
                             andTaskId:(NSString *)currentTaskId
                               andMsgId:(NSString *)messageIdentifier
                             andOffLine:(BOOL)wasOffline
                            fromGtAppId:(NSString *)appIdentifier {
    // Xử lý dữ liệu truyền tải từ GeTui
    NSString *receivedDataString = [[NSString alloc] initWithData:payloadData encoding:NSUTF8StringEncoding];
    NSLog(@"GeTui Passthrough Message - ID: %@, Task ID: %@, Data: %@",
          messageIdentifier, currentTaskId, receivedDataString);

    // Bạn có thể phân tích cú pháp 'receivedDataString' (thường là JSON)
    // để trích xuất thông tin và thực hiện các hành động nội bộ.
    // Ví dụ:
    // NSError *jsonError = nil;
    // NSDictionary *jsonDictionary = [NSJSONSerialization JSONObjectWithData:payloadData
    //                                                             options:NSJSONReadingMutableContainers
    //                                                               error:&jsonError];
}

3. So sánh các loại tin nhắn riêng của JPush

JPush cung cấp ba loại tin nhắn chính với cách thức hoạt động và mục đích sử dụng khác nhau:

a. Thông báo hiển thị trên thanh trạng thái (Notification Bar Message)

  • Đây là thông báo đẩy tiêu chuẩn, sử dụng APNS.
  • Có thể được nhận và hiển thị UI (như biểu ngữ, cảnh báo, âm thanh, badge) trong tất cả các trạng thái của ứng dụng: đang hoạt động (foreground), chạy ngầm (background) hoặc đã bị tắt hoàn toàn (killed).
  • Loại tin nhắn này phù hợp cho các thông báo quan trọng cần thu hút sự chú ý của người dùng.

b. Tin nhắn tùy chỉnh (Custom Message)

  • Không sử dụng APNS, mà dựa vào kênh kết nối riêng của JPush.
  • Không hiển thị bất kỳ UI nào cho người dùng một cách mặc định (Silent Push).
  • Chỉ có thể được nhận và xử lý khi ứng dụng đang hoạt động ở foreground. Nếu ứng dụng ở background hoặc killed, tin nhắn này sẽ không được nhận.
  • Mục đích chính là truyền tải dữ liệu đến ứng dụng để xử lý nội bộ mà không làm phiền người dùng, ví dụ: cập nhật dữ liệu trong nền, đồng bộ trạng thái.

c. Thông báo trong ứng dụng (In-App Alert / Ứng dụng nội bộ nhắc nhở)

  • Cũng không sử dụng APNS, dựa vào kênh kết nối riêng của JPush.
  • Tương tự như "Tin nhắn tùy chỉnh", nó chỉ được nhận khi ứng dụng đang hoạt động ở foreground.
  • Điểm khác biệt chính là JPush có khả năng tạo một UI nhắc nhở (một thông báo cục bộ giả lập hoặc một view tùy chỉnh) nếu tính năng "In-app Alert" được bật trên nền tảng JPush. Điều này cho phép ứng dụng hiển thị một thông báo nhẹ nhàng cho người dùng trong khi họ đang sử dụng ứng dụng, ngay cả khi họ đã tắt quyền thông báo đẩy của APNS.
  • Để sử dụng chức năng này, bạn cần kích hoạt cài đặt "Ứng dụng nội bộ nhắc nhở" trong phần cấu hình thông báo nâng cao trên bảng điều khiển của JPush.

Thẻ: iOS PushNotifications JPush Getui APNS

Đăng vào ngày 25 tháng 6 lúc 12:04