Last Updated on 11 years by Mas Herdi
Yo man! Ini adalah masalah yang sedang saya geluti selama beberapa hari terakhir, dan akhirnya ketemu juga solusinya. 😀 Bagi yang belum tau, XMPP adalah protokol instant messaging yang paling populer dan sering digunakan, dikarenakan modulnya yang bisa ditambah-tambah (punya banyak ekstension) dan juga mempunyai support group yang besar. XMPP protokol digunakan oleh beberapa messenger terkenal, seperti WhatsApp, Google Hangout, dan Facebook Messenger. Cara penyetingannya baik di sisi klien dan server juga relatif mudah.
ASmack
Ketika ingin membuat XMPP klien untuk Android, salah satu library yang populer digunakan adalah ASmack, atau singkatan dari Android SMACK. SMACK sendiri adalah API library XMPP yang dikembangkan oleh IgniteRealtime menggunakan bahasa Java murni. Sehingga ASmack adalah turunan dari SMACK yang dikhususkan untuk Android.
DeliveryReceipt
Apa itu DeliveryReceipt? Bagi yang sering menggunakan WhatsApp, pasti akrab dengan tanda centang satu, dan centang dua. 🙂 Tanda centang satu berarti pesan yang dikirim sudah sampai di server, dan tanda centang dua berarti pesan sudah sampai ke penerima. 🙂 Kurang lebih seperti itulah fungsi DeiveryReceipt pada XMPP, yaitu memberitahukan kepada pengirim bahwa pesan sudah sampai ke pengguna.
Pada XMPP, spesifikasi dari DeliveryReceipt diatur pada dokumen XEP-0184 yang bisa dibaca di sini.
So, jadi permasalahan timbul ketika saya mengupdate library ASmack ke versi yang lebih baru (0.8.9). Karena sudah lama sekali tidak diupdate, ternyata sudah banyak sekali method yang deprecated dan mekanisme yang sudah berubah. Sehingga ketika diupdate, langsung muncul banyak error. 😀 Seperti itulah ketika kita bergantung pada third party library.
Jadi library ASmack yang baru ini memang jauh lebih stabil, namun kendalanya adalah DeliveryReceipt yang dulu berfungsi, ketika saya update menjadi tidak berfungsi. 😀 Muncul deh puzzle baru haha
Untuk mengaktifkan DeliveryReceipt pada ASmack v0.8.9, berikut ini yang harus diubah :
Yang pertama, tambahkan kode berikut sebelum inisiasi koneksi dengan server :
ProviderManager.getInstance().addExtensionProvider(DeliveryReceipt.ELEMENT, DeliveryReceipt.NAMESPACE, new DeliveryReceipt.Provider()); ProviderManager.getInstance().addExtensionProvider(DeliveryReceiptRequest.ELEMENT, new DeliveryReceiptRequest().getNamespace(), new DeliveryReceiptRequest.Provider());
Kemudian tambahkan kode ini pada saat mengirim paket :
Message m = new Message(); m.setType(Message.Type.chat); m.setFrom(connection.getUser()); m.setTo(me.to); //m.addExtension(new DeliveryReceiptRequest()); m.addExtension(new DeliveryReceipt(m.getPacketID()));
Bisa dilihat, baris kode yang diberi komentar adalah baris kode yang lama, dan sudah diganti dengan yang baru. ASmack tidak lagi menggunakan DeliveryReceiptRequest, namun menggunakan kelas DeliveryReceipt yang dibuat dengan mem-passing packetID dari message tersebut, supaya lebih bisa ditrack mana message yang terkirim dan yang tidak.
Kemudian untuk paket listener-nya, yang ada di sisi penerima. Gunakan kode ini untuk memeriksa apakah ada DeliveryReceipt yang dibawa oleh pesan yang datang.
DeliveryReceipt dr = (DeliveryReceipt)m.getExtension(DeliveryReceipt.ELEMENT, DeliveryReceipt.NAMESPACE); // if dr != null // change status to delivered m.status = STATUS_DELIVERED; // updateMessageView()
Apabila DeliveryReceipt tidak null, maka pesan bahwa paket sudah sampai akan dikirimkan kepada pengirim, dan kita bisa mengubah status pesan tersebut menjadi terkirim/delivered. Langkah selanjutnya adalah mengupdate view dari message tersebut, mungkin bisa dengan menambahkan tanda centang dua seperti whatsapp, atau menambahkan simbol D, dan sebagainya.
Semoga bermanfaat. 🙂