Разработка мобильного приложения для цифровой визитки (vCard)
Цифровая визитка в мобильном приложении — это прежде всего три сценария: создать/редактировать свой профиль, поделиться им (NFC, QR, ссылка), получить чужую визитку и сохранить в контакты. Технически несложно, но детали — генерация vCard-файла, работа с NFC Core Framework, deep link при сканировании QR — требуют аккуратной реализации.
Формат vCard и стандарт
vCard 3.0 / 4.0 — стандарт для обмена контактными данными. При экспорте в системные контакты формат имеет значение:
BEGIN:VCARD
VERSION:3.0
FN:Иван Петров
ORG:Название компании
TEL;TYPE=CELL:+79001234567
EMAIL:[email protected]
URL:https://mycard.app/ivan
PHOTO;ENCODING=b;TYPE=JPEG:/9j/...base64...
END:VCARD
На iOS генерируем через CNMutableContact → CNContactVCardSerialization.data(with:). На Android — ContactsContract или ручная генерация строки vCard. Импорт в системные контакты: iOS — CNContactStore.add(_:toContainerWithIdentifier:) с запросом разрешения Contacts; Android — Intent(ContactsContract.Intents.Insert.ACTION) с предзаполненными полями (без разрешений — пользователь подтверждает).
QR-код
Генерация QR с ссылкой на профиль — библиотеки: CoreImage.CIFilter.qrCodeGenerator на iOS (встроено, без зависимостей), ZXing или QRose на Android, qr_flutter во Flutter.
Размер QR в UI: минимум 200x200 dp. QR должен содержать HTTPS-ссылку с deeplink на профиль, не vCard-файл напрямую — иначе при сканировании стандартной камерой не откроется приложение.
Сканирование QR: на iOS AVFoundation с AVCaptureMetadataOutput и metadataObjectTypes = [.qr]. На Android — CameraX с ImageAnalysis и BarcodeScanning из ML Kit. Сканирование работает без специальных разрешений на iOS (только NSCameraUsageDescription).
NFC-шеринг
На iOS — CoreNFC. Запись NDEF-тега:
let session = NFCNDEFReaderSession(delegate: self, queue: nil, invalidateAfterFirstRead: false)
session.begin() // Запрашивает поднесение телефона к тегу
// В delegate:
func readerSession(_ session: NFCNDEFReaderSession, didDetect tags: [NFCNDEFTag]) {
let payload = NFCNDEFPayload.wellKnownTypeURIPayload(url: URL(string: "https://mycard.app/ivan")!)!
let message = NFCNDEFMessage(records: [payload])
tags.first?.writeNDEF(message) { error in ... }
}
Чтение NFC — аналогично, тип NFCNDEFReaderSession. Ограничение iOS: NFC-запись доступна только начиная с iPhone 7, iOS 13+. Фоновое чтение NFC-тегов (без открытия приложения) — iOS 14+, только если тег содержит Universal Link.
На Android — NfcAdapter, NdefMessage, NdefRecord.createUri. Android поддерживает Android Beam (deprecated в Android 10) и прямую запись на физический NFC-тег. Также работает P2P через NfcAdapter.setNdefPushMessage для передачи данных между двумя Android-устройствами.
Физические NFC-карточки (пластик с чипом) — программируются через приложение. NTAG213/215 — популярные чипы для визиток.
Профиль и редактор
Поля визитки: имя, должность, компания, телефоны (несколько), email, сайт, соцсети, аватар, фон карточки. Редактор — стандартные текстовые поля + ImagePicker для аватара.
Аватар: загрузка через presigned S3 URL, хранение в CDN. На карточке показываем через URLSession/Coil/CachedNetworkImage с placeholder.
Дизайн визитки: либо один из шаблонов (выбор темы/цвета), либо полный кастом с редактором. Кастомный редактор — отдельная задача на 3-5 дней.
Ссылка на визитку и web-fallback
https://mycard.app/ivan — при открытии с мобильного с установленным приложением → deep link в приложение. Без приложения → красивая web-страница с кнопкой «Скачать vCard». SEO-значимые Open Graph теги для предпросмотра в мессенджерах.
Сроки
Базовое приложение (профиль, QR, ссылка, экспорт в контакты) — 3-5 дней. С NFC-записью и чтением — ещё 1-2 дня. Стоимость рассчитывается индивидуально.







