Developing a Digital Business Card (vCard) Mobile Application
A digital business card in a mobile app represents three core scenarios: create/edit your own profile, share it (via NFC, QR, or link), receive someone else's card, and save it to contacts. Technically straightforward, but the details—vCard file generation, NFC Core Framework integration, deep linking on QR scan—require careful implementation.
vCard Format and Standard
vCard 3.0 / 4.0 is the standard for exchanging contact data. Format matters when exporting to system contacts:
BEGIN:VCARD
VERSION:3.0
FN:John Smith
ORG:Company Name
TEL;TYPE=CELL:+1-555-1234567
EMAIL:[email protected]
URL:https://mycard.app/john
PHOTO;ENCODING=b;TYPE=JPEG:/9j/...base64...
END:VCARD
On iOS, generate via CNMutableContact → CNContactVCardSerialization.data(with:). On Android, use ContactsContract or manually construct the vCard string. Importing to system contacts: iOS requires CNContactStore.add(_:toContainerWithIdentifier:) with Contacts permission; Android uses Intent(ContactsContract.Intents.Insert.ACTION) with pre-filled fields (no special permissions—user confirms).
QR Code
Generate QR with a link to the profile using CoreImage.CIFilter.qrCodeGenerator on iOS (built-in, no dependencies), ZXing or QRose on Android, or qr_flutter for Flutter.
Minimum QR size in UI: 200x200 dp. QR should contain an HTTPS link with a deep link to the profile, not the vCard file directly—otherwise, standard camera scanning won't open the app.
QR scanning: on iOS use AVFoundation with AVCaptureMetadataOutput and metadataObjectTypes = [.qr]. On Android, use CameraX with ImageAnalysis and BarcodeScanning from ML Kit. Scanning requires only NSCameraUsageDescription on iOS (no special permission).
NFC Sharing
On iOS with CoreNFC, write to NDEF tag:
let session = NFCNDEFReaderSession(delegate: self, queue: nil, invalidateAfterFirstRead: false)
session.begin() // Prompts to bring phone to tag
// In delegate:
func readerSession(_ session: NFCNDEFReaderSession, didDetect tags: [NFCNDEFTag]) {
let payload = NFCNDEFPayload.wellKnownTypeURIPayload(url: URL(string: "https://mycard.app/john")!)!
let message = NFCNDEFMessage(records: [payload])
tags.first?.writeNDEF(message) { error in ... }
}
Reading NFC works similarly with NFCNDEFReaderSession. iOS limitation: NFC write is available only on iPhone 7+, iOS 13+. Background NFC tag reading (without opening the app) requires iOS 14+ and Universal Links on the tag.
On Android with NfcAdapter, NdefMessage, and NdefRecord.createUri. Android supports Android Beam (deprecated in Android 10) and direct physical NFC tag writing. P2P via NfcAdapter.setNdefPushMessage for data transfer between Android devices.
Physical NFC cards (plastic with chips) are programmed through the app. NTAG213/215 are popular chips for business cards.
Profile and Editor
Card fields: name, title, company, phones (multiple), email, website, social links, avatar, card background. Editor uses standard text fields + ImagePicker for avatar.
Avatar: upload via presigned S3 URL, store in CDN. Display on card via URLSession/Coil/CachedNetworkImage with placeholder.
Card design: either select from templates (theme/color choices) or full custom with editor. Custom editor is a separate 3–5 day task.
Card Link and Web Fallback
https://mycard.app/john opens the deep link if the app is installed on mobile. Without the app, it shows a clean web page with a "Download vCard" button. Include SEO-relevant Open Graph tags for messenger previews.
Timeline
Basic app (profile, QR, link, contact export): 3–5 days. With NFC read/write: 1–2 additional days. Pricing calculated individually.







