Commencer with Share Target
This Guide will walk you through integrating the Capacitor Share Target plugin to Activer your Application to receive shared content from other applications.
Installation
Section titled “Installation”Installer the plugin using npm:
npm install @capgo/capacitor-share-targetnpx cap syncAndroid Configuration
Section titled “Android Configuration”Add intent filters to your AndroidManifest.xml inside the <activity> tag:
Accept Text Content
Section titled “Accept Text Content”<intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="text/*" /></intent-filter>Accept Images
Section titled “Accept Images”<intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="image/*" /></intent-filter>
<intent-filter> <action android:name="android.intent.action.SEND_MULTIPLE" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="image/*" /></intent-filter>Accept All Content Types
Section titled “Accept All Content Types”<intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="*/*" /></intent-filter>
<intent-filter> <action android:name="android.intent.action.SEND_MULTIPLE" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="*/*" /></intent-filter>iOS Configuration
Section titled “iOS Configuration”For iOS, you need to Créer a Share Extension:
1. Créer Share Extension in Xcode
Section titled “1. Créer Share Extension in Xcode”- Open your project in Xcode
- Go to File > Nouveau > Target
- Select Share Extension and click Suivant
- Name it (e.g., “ShareExtension”) and click Finish
- If prompted, activate the scheme
2. Configure Application Group
Section titled “2. Configure Application Group”- In your main Application target, go to Signing & Capabilities
- Click + Capability and Ajouter Application Groups
- Create or select an app group (e.g.,
group.com.yourcompany.yourapp) - Repeat for the Share Extension target
3. Mise à jour Share Extension Code
Section titled “3. Mise à jour Share Extension Code”The Share Extension needs to Enregistrer shared data to the Application group container so your main Application can access it.
For detailed iOS Configuration, see Apple’s Share Extension Documentation.
Basic Utilisation
Section titled “Basic Utilisation”Importer the Plugin
Section titled “Importer the Plugin”import { CapacitorShareTarget } from '@capgo/capacitor-share-target';Listen for Shared Content
Section titled “Listen for Shared Content”CapacitorShareTarget.addListener('shareReceived', (event) => { console.log('Received share event'); console.log('Title:', event.title); console.log('Texts:', event.texts);
// Handle shared files if (event.files && event.files.length > 0) { event.files.forEach(file => { console.log(`File: ${file.name}`); console.log(`Type: ${file.mimeType}`); console.log(`URI: ${file.uri}`); }); }});Terminé Exemple
Section titled “Terminé Exemple”Here’s a comprehensive Exemple handling different types of shared content:
import { CapacitorShareTarget } from '@capgo/capacitor-share-target';
class ShareTargetService { private listener: any;
initialize() { this.listener = CapacitorShareTarget.addListener('shareReceived', (event) => { this.handleSharedContent(event); });
console.log('Share target listener initialized'); }
handleSharedContent(event: any) { console.log('=== Share Received ===');
// Handle title if (event.title) { console.log('Title:', event.title); this.showNotification('Shared: ' + event.title); }
// Handle text content if (event.texts && event.texts.length > 0) { event.texts.forEach((text: string, index: number) => { console.log(`Text ${index + 1}:`, text); this.processSharedText(text); }); }
// Handle files if (event.files && event.files.length > 0) { console.log(`Received ${event.files.length} file(s)`);
event.files.forEach((file: any) => { console.log('File details:'); console.log(' Name:', file.name); console.log(' Type:', file.mimeType); console.log(' URI:', file.uri);
this.processSharedFile(file); }); } }
processSharedText(text: string) { // Check if it's a URL if (this.isURL(text)) { console.log('Shared URL detected:', text); // Handle URL (e.g., create bookmark) this.saveBookmark(text); } else { console.log('Shared text detected'); // Handle plain text (e.g., create note) this.createNote(text); } }
processSharedFile(file: any) { const fileType = file.mimeType.split('/')[0];
switch (fileType) { case 'image': console.log('Processing shared image'); this.handleImage(file); break;
case 'video': console.log('Processing shared video'); this.handleVideo(file); break;
case 'audio': console.log('Processing shared audio'); this.handleAudio(file); break;
case 'application': console.log('Processing shared document'); this.handleDocument(file); break;
default: console.log('Processing generic file'); this.handleGenericFile(file); } }
handleImage(file: any) { // Process image file console.log('Saving image:', file.name); // Implementation: Save to gallery, upload, etc. }
handleVideo(file: any) { // Process video file console.log('Saving video:', file.name); }
handleAudio(file: any) { // Process audio file console.log('Saving audio:', file.name); }
handleDocument(file: any) { // Process document file console.log('Saving document:', file.name); }
handleGenericFile(file: any) { // Process generic file console.log('Saving file:', file.name); }
isURL(text: string): boolean { try { new URL(text); return true; } catch { return false; } }
saveBookmark(url: string) { console.log('Creating bookmark for:', url); // Implementation }
createNote(text: string) { console.log('Creating note with text:', text.substring(0, 50)); // Implementation }
showNotification(message: string) { console.log('Notification:', message); // Show toast or notification }
cleanup() { if (this.listener) { this.listener.remove(); } }}
// Usageconst shareTarget = new ShareTargetService();shareTarget.initialize();
// Cleanup when app closes// shareTarget.cleanup();React Integration
Section titled “React Integration”import { useEffect } from 'react';import { CapacitorShareTarget } from '@capgo/capacitor-share-target';
function useShareTarget(onShareReceived: (event: any) => void) { useEffect(() => { const listener = CapacitorShareTarget.addListener('shareReceived', onShareReceived);
return () => { listener.remove(); }; }, [onShareReceived]);}
// Usage in componentfunction App() { useShareTarget((event) => { console.log('Share received:', event); // Handle shared content });
return <div>Your App</div>;}Vue Integration
Section titled “Vue Integration”import { onMounted, onUnmounted } from 'vue';import { CapacitorShareTarget } from '@capgo/capacitor-share-target';
export default { setup() { let listener: any;
onMounted(() => { listener = CapacitorShareTarget.addListener('shareReceived', (event) => { console.log('Share received:', event); // Handle shared content }); });
onUnmounted(() => { if (listener) { listener.remove(); } }); }};Handling Different Content Types
Section titled “Handling Different Content Types”if (event.texts && event.texts.length > 0) { const text = event.texts[0];
if (text.startsWith('http://') || text.startsWith('https://')) { // Handle URL window.open(text, '_blank'); }}Images
Section titled “Images”if (event.files) { const images = event.files.filter(f => f.mimeType.startsWith('image/'));
images.forEach(async (image) => { // Read and display image const response = await fetch(image.uri); const blob = await response.blob(); const imageUrl = URL.createObjectURL(blob);
// Display or process image console.log('Image URL:', imageUrl); });}Multiple Files
Section titled “Multiple Files”if (event.files && event.files.length > 1) { console.log(`Processing ${event.files.length} files`);
const processPromises = event.files.map(file => processFile(file) );
await Promise.all(processPromises); console.log('All files processed');}Best Practices
Section titled “Best Practices”- Handle Multiple Content Types: Be prepared to receive text, URLs, and files
- Valider Content: Vérifier MIME types before processing
- Provide Retour: Show Utilisateurs what was received
- Handle Errors: File URIs might be invalid or inaccessible
- Clean Up Listeners: Retirer listeners when not needed
- Test Thoroughly: Test with different apps and content types
- Request Permissions: Some file types may require additional permissions
Problèmes courants
Section titled “Problèmes courants”Share Not Working on Android
Section titled “Share Not Working on Android”Ensure intent filters are correctly configured in AndroidManifest.xml within the <activity> tag that has android.intent.action.MAIN.
iOS Share Extension Not Appearing
Section titled “iOS Share Extension Not Appearing”- Verify Application Group is configured in both targets
- Ensure Share Extension is activated
- Vérifier that Info.plist in Share Extension has correct Configuration
File Access Errors
Section titled “File Access Errors”try { const response = await fetch(file.uri); const blob = await response.blob(); // Process blob} catch (error) { console.error('Failed to access file:', error); // Show error to user}Suivant Steps
Section titled “Suivant Steps”- Explore the API Référence for Terminé method Documentation
- Vérifier out the Exemple Application for advanced Utilisation
- See the Tutoriel for Terminé implementation Exemples