Langsung ke konten utama

Alternatif Capacitor Community Contacts

Alternatif untuk plugin @capacitor-community/contacts: update kontak, grup, pagination, dan pemilihan kontak tanpa izin, lengkap dengan panduan migrasi.

Ilustrasi plugin Capgo untuk perbandingan plugin kontak Capacitor

Jika Anda membutuhkan alternatif kontak komunitas Capacitor, pengganti drop-in paling lengkap adalah @capgo/capacitor-contacts. Ini mencakup apa yang @capacitor-community/contacts lakukan (membaca, membuat, menghapus, dan memilih kontak) serta menambahkan pembaruan kontak tanpa mengubah ID-nya, pagination, grup, akun, layar kontak native, dan pemilihan tanpa izin di Android, yang penting untuk kebijakan kontak Google Play 2027. Panduan ini membandingkan keduanya dan memetakan setiap panggilan agar Anda dapat bermigrasi dalam satu sore.

Mengapa mencari alternatif

@capacitor-community/contacts dipelihara dan memiliki rilis Capacitor 8. Ini pilihan yang baik untuk alur baca dan buat yang sederhana. Tim biasanya melampauinya karena alasan berikut:

  • Tidak ada metode update. Anda dapat membuat dan menghapus kontak, tetapi tidak dapat mengedit satu kontak. Menghapus dan membuat ulang akan memberikan ID baru pada kontak, yang merusak referensi yang Anda simpan dan dapat kehilangan data yang tidak dibaca oleh plugin.
  • Tidak ada pagination. getContacts mengembalikan seluruh buku alamat dalam satu panggilan. Pada perangkat dengan 5.000 kontak dan foto, itu lambat dan berat secara memori.
  • Picking membutuhkan izin di Android. Android pickContact meminta grup izin kontak sebelum membuka picker, lalu membaca kontak dari buku alamat. Di bawah Kebijakan Izin Kontak Google Play, aplikasi yang menargetkan Android 17 hanya dapat menyimpan READ_CONTACTS untuk fitur inti.
  • Tanpa grup, akun, atau layar native. Tidak ada cara untuk mendaftar grup, memilih akun tempat kontak baru disimpan, atau membuka formulir “kontak baru” sistem.

Perbandingan fitur

Fitur @capacitor-community/contacts 8.0 @capgo/capacitor-contacts 8.1
Baca satu / semua kontak getContact, getContacts getContactById, getContacts
Pemilihan field projection object fields array
Pagination Tidak limit, offset
Hitung kontak Tidak countContacts
Buat createContact createContact
Update di tempat Tidak updateContactById
Hapus deleteContact deleteContactById
Pilih satu kontak pickContact pickContact
Pilih beberapa Tidak pickContacts({ multiple: true })
Pilih satu telepon/email/alamat tanpa izin Tidak pickContacts({ property })
Grup Tidak getGroups, getGroupById, createGroup, deleteGroupById
Akun Tidak getAccounts
Layar native buat / lihat / edit Tidak displayCreateContact, displayContactById, displayUpdateContactById
Pisahkan status izin baca dan tulis Tidak (alias tunggal) readContacts, writeContacts
Status akses terbatas iOS limited limited
Buka pengaturan Tidak openSettings

Instal

bun add @capgo/capacitor-contacts
bunx cap sync

Plugin ini tidak menambahkan izin ke manifest Android Anda. Tambahkan hanya yang Anda gunakan:

<!-- Needed for getContacts, getContactById, countContacts, groups, accounts -->
<uses-permission android:name="android.permission.READ_CONTACTS" />
<!-- Needed for createContact, updateContactById, deleteContactById, groups writes -->
<uses-permission android:name="android.permission.WRITE_CONTACTS" />

Di iOS, tambahkan NSContactsUsageDescription ke Info.plist jika Anda membaca atau menulis buku alamat. Memilih kontak tidak membutuhkannya.

Panduan migrasi, panggilan per panggilan

Izin

// Before
import { Contacts } from '@capacitor-community/contacts';
const perm = await Contacts.requestPermissions();
if (perm.contacts !== 'granted') return;

// After
import { CapacitorContacts } from '@capgo/capacitor-contacts';
const status = await CapacitorContacts.requestPermissions({ permissions: ['readContacts'] });
if (status.readContacts !== 'granted' && status.readContacts !== 'limited') {
  await CapacitorContacts.openSettings();
  return;
}

Di iOS 18 dan versi lebih baru, pengguna dapat memberikan akses ke sebagian kontak. Plugin melaporkan hal itu sebagai limited. Anggap saja sudah diberikan dan hanya harapkan kontak yang dibagikan.

Baca semua kontak

// Before: whole address book, projection object
const { contacts } = await Contacts.getContacts({
  projection: { name: true, phones: true, emails: true },
});
const first = contacts[0];
console.log(first.name?.display, first.phones?.[0]?.number);

// After: fields array, paginated
const pageSize = 200;
let offset = 0;
for (;;) {
  const { contacts } = await CapacitorContacts.getContacts({
    fields: ['displayName', 'givenName', 'familyName', 'phoneNumbers', 'emailAddresses'],
    limit: pageSize,
    offset,
  });
  render(contacts);
  if (contacts.length < pageSize) break;
  offset += pageSize;
}

declare function render(list: unknown[]): void;

Gunakan countContacts() terlebih dahulu jika Anda ingin menampilkan progress bar.

Baca satu kontak

// Before
const { contact } = await Contacts.getContact({
  contactId: id,
  projection: { name: true, phones: true },
});

// After
const { contact } = await CapacitorContacts.getContactById({
  id,
  fields: ['displayName', 'phoneNumbers'],
});
if (!contact) console.log('Not found');

Create a contact

// Before
const { contactId } = await Contacts.createContact({
  contact: {
    name: { given: 'Ada', family: 'Lovelace' },
    phones: [{ type: PhoneType.Mobile, number: '+44 20 7946 0000' }],
    emails: [{ type: EmailType.Work, address: 'ada@example.com' }],
  },
});

// After
const { id } = await CapacitorContacts.createContact({
  contact: {
    givenName: 'Ada',
    familyName: 'Lovelace',
    phoneNumbers: [{ type: 'MOBILE', value: '+44 20 7946 0000' }],
    emailAddresses: [{ type: 'WORK', value: 'ada@example.com' }],
  },
});

displayName hanya bisa dibaca di plugin Capgo. Tulis givenName dan familyName, dan perangkat akan memformat nama tampilan.

Perbarui kontak (baru)

await CapacitorContacts.updateContactById({
  id,
  contact: {
    givenName: 'Ada',
    familyName: 'King',
    jobTitle: 'Analyst',
    phoneNumbers: [{ type: 'MOBILE', value: '+44 20 7946 0000' }],
  },
});

ID tetap sama, jadi referensi yang Anda simpan masih berfungsi. Baca kontak terlebih dahulu dan kembalikan field yang ingin dipertahankan, agar Anda tidak menghapus sesuatu secara tidak sengaja.

Jika Anda lebih suka membiarkan pengguna mengedit, buka editor sistem:

await CapacitorContacts.displayUpdateContactById({ id });

Hapus kontak

// Before
await Contacts.deleteContact({ contactId: id });

// After
await CapacitorContacts.deleteContactById({ id });

Pilih kontak

// Before: requests the contacts permission on Android first
const { contact } = await Contacts.pickContact({
  projection: { name: true, phones: true },
});

// After: one phone number, no permission on Android or iOS
import { ContactProperty } from '@capgo/capacitor-contacts';

const { contacts } = await CapacitorContacts.pickContacts({
  property: ContactProperty.PhoneNumber,
});
const phone = contacts[0]?.phoneNumbers?.[0]?.value;

Jika Anda membutuhkan catatan kontak lengkap dari picker, panggil pickContact() tanpa property. Di Android, ini mengembalikan kontak lengkap hanya jika READ_CONTACTS diberikan.

Pemetaan field

Payload komunitas Capgo Contact
contactId id
name.display displayName (hanya baca)
name.given / middle / family givenName / middleName / familyName
name.prefix / suffix namePrefix / nameSuffix
organization.company organizationName
organization.jobTitle jobTitle
birthday { day, month, year } birthday { day, month, year }
note note
phones[].number phoneNumbers[].value
emails[].address emailAddresses[].value
urls[] (string) urlAddresses[].value
postalAddresses[].region / postcode postalAddresses[].state / postalCode
image.base64String photo (string base64)

Nilai tipe juga berubah: plugin Capgo menggunakan string kapital seperti 'MOBILE', 'HOME', 'WORK' untuk telepon dan email.

Migrasikan satu layar dalam satu waktu

Kedua plugin terdaftar dengan nama native yang berbeda (Contacts dan CapacitorContacts), sehingga keduanya bisa diinstal bersamaan saat Anda memindahkan call site. Adapter kecil menjaga sisa aplikasi Anda tetap tidak berubah:

import { CapacitorContacts } from '@capgo/capacitor-contacts';

export interface AppContact {
  id: string;
  name: string;
  phones: string[];
}

export async function listContacts(limit = 200, offset = 0): Promise<AppContact[]> {
  const { contacts } = await CapacitorContacts.getContacts({
    fields: ['displayName', 'phoneNumbers'],
    limit,
    offset,
  });
  return contacts.map((c) => ({
    id: c.id ?? '',
    name: c.displayName ?? '',
    phones: (c.phoneNumbers ?? []).map((p) => p.value),
  }));
}

Setelah call site terakhir dipindahkan, hapus plugin community tersebut, jalankan bunx cap sync, dan periksa Android manifest yang telah digabung untuk memastikan hanya izin yang Anda butuhkan yang tersisa.

Pemecahan Masalah

getContacts mengembalikan list kosong pada iOS. Pengguna memberikan akses terbatas dan tidak membagikan kontak apa pun, atau menolak akses. Periksa readContacts dan tawarkan openSettings().

Kontak yang dibuat tidak muncul di akun tertentu pada Android. Berikan account (dari getAccounts()) pada kontak yang Anda buat.

Foto membuat list menjadi lambat. Jangan minta photo di tampilan daftar. Muat dengan getContactById ketika pengguna membuka kontak.

Play Console menandai READ_CONTACTS. Pindahkan alur undangan dan berbagi ke pickContacts({ property }) dan hapus izinnya jika tidak ada yang lain yang membutuhkannya.

Rilis

Mengganti plugin adalah perubahan native, jadi butuh build store. Build Capgo bisa menghasilkan build iOS dan Android di cloud. Setelah itu, perbaikan pada layar kontak Anda berupa JavaScript dan bisa dikirim bersama Live updates Capgo. Seluruh API ada di dokumentasi plugin contacts.

Live updates untuk aplikasi Capacitor

Saat bug web-layer sudah live, kirim perbaikannya lewat Capgo alih-alih menunggu berhari-hari untuk persetujuan app store. Pengguna mendapat update di background, sementara perubahan native tetap mengikuti jalur review normal.

Terbaru dari Blog kami

Capgo memberikan insight terbaik yang Anda butuhkan untuk membuat aplikasi mobile yang benar-benar profesional.