# App Clips iOS

Les App Clips permettent aux utilisateurs d'accomplir une tâche rapidement sans télécharger votre application complète. Avec Pushwoosh, vous pouvez envoyer des notifications push aux utilisateurs d'App Clips — iOS accorde automatiquement un **accès aux notifications de 8 heures** lorsque l'App Clip est ouvert.


## Ce dont vous avez besoin

- SDK Pushwoosh pour iOS **7.0.33+**
- Xcode 15+
- Une **application Pushwoosh distincte** pour votre App Clip (ID de bundle différent = application distincte)
- Un appareil réel pour les tests (les jetons push ne fonctionnent pas sur le simulateur)

## 1. Créer une application Pushwoosh

Votre App Clip a un ID de bundle différent (par ex. `com.yourapp.Clip`), il nécessite donc une **application Pushwoosh distincte** avec sa propre clé APNs.

1. Allez dans le [Panneau de Contrôle Pushwoosh](https://app.pushwoosh.com/)
2. Créez une nouvelle application avec l'ID de bundle de l'App Clip
3. Téléchargez votre clé d'authentification APNs
4. Copiez le **Code d'Application** et le **Jeton d'API**



## 2. Créer une cible App Clip

1. Dans Xcode : **File → New → Target → App Clip**
2. Ajoutez la capacité **Push Notifications** à la cible App Clip

Pour des captures d'écran détaillées sur l'ajout de capacités, consultez le [guide d'intégration de base](/fr/developer/pushwoosh-sdk/ios-sdk/setting-up-pushwoosh-ios-sdk-7-0/basic-integration-guide/).


## 3. Ajouter les frameworks Pushwoosh

Dans les **Build Phases → Link Binary With Libraries** de la cible App Clip, ajoutez :

- `PushwooshFramework.framework`
- `PushwooshCore.framework`
- `PushwooshBridge.framework`


## 4. Configurer Info.plist

```xml
<!-- Pushwoosh -->
<key>Pushwoosh_APPID</key>
<string>XXXXX-XXXXX</string>
<key>Pushwoosh_API_TOKEN</key>
<string>YOUR_API_TOKEN</string>

<!-- Push éphémère (autorisation auto. de 8h, sans dialogue) -->
<key>NSAppClip</key>
<dict>
    <key>NSAppClipRequestEphemeralUserNotification</key>
    <true/>
    <key>NSAppClipRequestLocationConfirmation</key>
    <false/>
</dict>

<key>UIBackgroundModes</key>
<array>
    <string>remote-notification</string>
</array>
```



## 5. Initialiser le SDK

<Tabs>
<TabItem label="SwiftUI">
```swift
import SwiftUI
import PushwooshFramework

class AppClipDelegate: NSObject, UIApplicationDelegate, PWMessagingDelegate {

    func application(_ application: UIApplication,
                     didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil) -> Bool {
        Pushwoosh.configure.delegate = self
        Pushwoosh.configure.registerForPushNotifications()
        return true
    }

    func application(_ application: UIApplication,
                     didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        Pushwoosh.configure.handlePushRegistration(deviceToken)
    }

    func application(_ application: UIApplication,
                     didFailToRegisterForRemoteNotificationsWithError error: Error) {
        Pushwoosh.configure.handlePushRegistrationFailure(error as NSError)
    }

    func application(_ application: UIApplication,
                     didReceiveRemoteNotification userInfo: [AnyHashable: Any],
                     fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
        Pushwoosh.configure.handlePushReceived(userInfo)
        completionHandler(.noData)
    }

    func pushwoosh(_ pushwoosh: Pushwoosh, onMessageOpened message: PWMessage) {
        print("Push ouvert : \(message.payload ?? [:])")
    }
}

@main
struct YourAppClip: App {
    @UIApplicationDelegateAdaptor(AppClipDelegate.self) var appDelegate

    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}
```
</TabItem>
<TabItem label="UIKit">
```swift
import UIKit
import PushwooshFramework

@main
class AppDelegate: UIResponder, UIApplicationDelegate, PWMessagingDelegate {

    func application(_ application: UIApplication,
                     didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        Pushwoosh.configure.delegate = self
        Pushwoosh.configure.registerForPushNotifications()
        return true
    }

    func application(_ application: UIApplication,
                     didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        Pushwoosh.configure.handlePushRegistration(deviceToken)
    }

    func application(_ application: UIApplication,
                     didFailToRegisterForRemoteNotificationsWithError error: Error) {
        Pushwoosh.configure.handlePushRegistrationFailure(error as NSError)
    }

    func application(_ application: UIApplication,
                     didReceiveRemoteNotification userInfo: [AnyHashable: Any],
                     fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
        Pushwoosh.configure.handlePushReceived(userInfo)
        completionHandler(.noData)
    }

    func pushwoosh(_ pushwoosh: Pushwoosh, onMessageOpened message: PWMessage) {
        print("Push ouvert : \(message.payload ?? [:])")
    }
}
```
</TabItem>
</Tabs>

Avec les autorisations éphémères, iOS accorde automatiquement l'accès aux notifications push pour 8 heures. Si vous souhaitez utiliser le mode éphémère **sans afficher de dialogue d'autorisation**, appelez directement `UIApplication.shared.registerForRemoteNotifications()` au lieu de `Pushwoosh.configure.registerForPushNotifications()`.

Pour demander une autorisation push **permanente** (dialogue standard), utilisez `Pushwoosh.configure.registerForPushNotifications()` comme indiqué ci-dessus.



## Autorisations de push éphémères

Lorsqu'un utilisateur ouvre votre App Clip, iOS accorde l'accès aux notifications push pour **8 heures** sans demander. Après 8 heures, l'autorisation expire. L'utilisateur doit rouvrir l'App Clip pour obtenir 8 heures supplémentaires.

Pour obtenir un jeton push pour 8 heures **sans afficher de dialogue d'autorisation** :

```swift
UIApplication.shared.registerForRemoteNotifications()
```

Pour obtenir un jeton push **permanent** (affiche le dialogue d'autorisation standard) :

```swift
Pushwoosh.configure.registerForPushNotifications()
```

## Limitations

| Limitation | Détails |
|---|---|
| **Pas de notifications riches** | Les App Clips ne peuvent pas inclure de Notification Service Extension — pas d'images, pas de Communication Notifications |
| **Limite de taille** | 15 Mo (iOS 16) / 50 Mo (iOS 17+) |
| **Fenêtre de push de 8 heures** | L'autorisation éphémère expire après 8 heures |
| **Pas de traitement en arrière-plan** | Le push silencieux a des fonctionnalités limitées |
| **ID de l'appareil** | `identifierForVendor` renvoie des zéros — le SDK gère cela automatiquement (7.0.33+) |



## À quoi ça ressemble

<center>

<img src="/ios-appclip-push.png" alt="Notification push d'un App Clip sur iPhone" width="300" />

*Notification push reçue dans un App Clip avec des autorisations éphémères*

</center>