Ionic: Lỗi nhấn thông báo nhưng app không mở trên Android

Ionic là công cụ rất hữu ích cho việc phát triển mobile app một cách nhanh chóng mà vẫn tận dụng được hiểu biết của bạn về công nghệ web. Và một trong những bước quan trọng trong quá trình viết app là thêm chức năng Push Notification. Trớ trêu thay, đôi khi bạn đã kiểm tra đi, kiểm tra lại nhiều lần mà không hiểu tại sao: thấy thông báo trên thanh thông báo rồi nhưng lúc nhấn vào nó thì app không mở ra, không có chuyện gì hết.

Càng bực mình hơn là khi thử trên iPhone, iPad thì hoạt động bình thường mà hễ chuyển sang Android là bị. Lỗi này rất nhỏ, tuy nhiên có thể làm ta tốn nhiều công sức và thời gian cho nó để rồi cuối cùng vẫn không giải quyết được.


Nói ngắn gọn

Khi sử dụng FCM, trong phần payload phải có trường notification, nhưng trong notification không chứa click_action.


Nếu bạn chưa biết thì Ionic — theo giới thiệu của chính họ — là bộ công cụ UI mã nguồn mở để xây dựng ứng dụng di động và desktop hiệu suất và chất lượng cao bằng cách sử dụng công nghệ web: HTML, CSS và JavaScript, với sự tích hợp những framework phổ biến như Angular hay React. Bạn có thể tìm hiểu thêm tại đây.

Lỗi này xảy ra khi bạn sử dụng Firebase Cloud Messaging (FCM) để gửi thông báo tới app. Có thể bạn không gặp lỗi với những app Ionic trước đây của mình mà chỉ thấy ở những app mới tạo hoặc mới được upgrade.

Nguyên nhân là do Ionic sử dụng Capacitor — runtime cây nhà lá vườn chính họ tự tạo — thay cho Apache Cordova rất quen thuộc mà họ sử dụng từ trước đến nay. Điều này được họ giải thích là sẽ giúp can thiệp sâu hơn, đem lại cách tiếp cận native hơn, từ đó cho hiệu suất tốt hơn. Tuy nhiên, cách hoạt động của Capacitor gây ra chút vấn đề.

Trong project Android, MainActivity — chính là activity của Capacitor — phải có android:launchMode="singleTask" (nói chung cứ không phải standard là ổn). Đó là vì các plugin của Capacitor lấy Intent thông qua Bridge (MainActivity extend từ BridgeActivity).

Hãy xem xét nếu không dùng singleTask thì sao. Khi app đang là trạng thái background thì activity của Capacitor không ở top. Mặt khác, app của bạn sử dụng một số plugin khiến Intent mới bị gọi. Một activity mới được tạo ra cho thằng plugin và thế là lặp activity.

Nếu gửi thông báo qua FCM mà trong payload có trường notification và trong notification có trường click_action thì điều tương tự xảy ra. (Tất nhiên phải có trường notification thì mới hiển thị thông báo được chứ). Khi bạn nhấn vào thông báo, một activity mới được tạo. Và nó bị huỷ (destroy) ngay để tránh lặp. Vì singleTask mà. Thế là bạn sẽ chẳng thấy app được mở dù có nhấn thông báo bao nhiêu lần.

Vậy thì bỏ click_action đi!

Đừng dùng:

{
    data: {
        title: 'foo',
        body: 'bar'
    }
}
{
    data: { 
        title: 'foo',
        body: 'bar' 
    },
    notification: {
        click_action: 'FCM_PLUGIN_ACTIVITY'
    } 
}

Mà hãy dùng:

{
    data: {
        title: 'foo',
        body: 'bar'
    },
    notification: {
        sound: true
    }
}
{
    data: {
        title: 'foo',
        body: 'bar'
    },
    notification: {}
}

Hy vọng sẽ giúp được những bạn nào đang gặp lỗi tương tự.

Trả lời

Email của bạn sẽ không được hiển thị công khai.