# App Clips do iOS

Os App Clips permitem que os usuários concluam uma tarefa rapidamente sem baixar seu aplicativo completo. Com a Pushwoosh, você pode enviar notificações push para usuários de App Clips — o iOS concede automaticamente **acesso a notificações por 8 horas** quando o App Clip é aberto.


## O que você precisa

- SDK da Pushwoosh para iOS **7.0.33+**
- Xcode 15+
- Um **aplicativo Pushwoosh separado** para o seu App Clip (ID de pacote diferente = aplicativo separado)
- Um dispositivo real para testes (tokens de push não funcionam no simulador)

## 1. Crie um aplicativo Pushwoosh

Seu App Clip tem um ID de pacote diferente (por exemplo, `com.yourapp.Clip`), então ele precisa de um **aplicativo Pushwoosh separado** com sua própria chave APNs.

1. Acesse o [Painel de Controle da Pushwoosh](https://app.pushwoosh.com/)
2. Crie um novo aplicativo com o ID de pacote do App Clip
3. Faça o upload da sua chave de autenticação APNs
4. Copie o **Código do Aplicativo** e o **Token da API**



## 2. Crie um alvo (target) de App Clip

1. No Xcode: **File → New → Target → App Clip**
2. Adicione a capacidade (capability) de **Push Notifications** ao alvo do App Clip

Para capturas de tela detalhadas sobre como adicionar capacidades, consulte o [guia de integração básica](/pt/developer/pushwoosh-sdk/ios-sdk/setting-up-pushwoosh-ios-sdk-7-0/basic-integration-guide/).


## 3. Adicione os frameworks da Pushwoosh

No alvo do App Clip, em **Build Phases → Link Binary With Libraries**, adicione:

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


## 4. Configure o Info.plist

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

<!-- Ephemeral push (8-hour auto-grant, no dialog) -->
<key>NSAppClip</key>
<dict>
    <key>NSAppClipRequestEphemeralUserNotification</key>
    <true/>
    <key>NSAppClipRequestLocationConfirmation</key>
    <false/>
</dict>

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



## 5. Inicialize o 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 opened: \(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 opened: \(message.payload ?? [:])")
    }
}
```
</TabItem>
</Tabs>

Com permissões efêmeras, o iOS concede acesso a push por 8 horas automaticamente. Se você quiser usar o modo efêmero **sem mostrar uma caixa de diálogo de permissão**, chame `UIApplication.shared.registerForRemoteNotifications()` diretamente em vez de `Pushwoosh.configure.registerForPushNotifications()`.

Para solicitar permissão de push **permanente** (caixa de diálogo padrão), use `Pushwoosh.configure.registerForPushNotifications()` como mostrado acima.



## Permissões de push efêmeras

Quando um usuário abre seu App Clip, o iOS concede acesso a notificações push por **8 horas** sem perguntar. Após 8 horas, a permissão expira. O usuário deve reabrir o App Clip para obter mais 8 horas.

Para obter um token de push por 8 horas **sem mostrar uma caixa de diálogo de permissão**:

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

Para obter um token de push **permanente** (mostra a caixa de diálogo de permissão padrão):

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

## Limitações

| Limitação | Detalhes |
|---|---|
| **Sem notificações ricas (rich notifications)** | App Clips não podem incluir uma Notification Service Extension — sem imagens, sem Communication Notifications |
| **Limite de tamanho** | 15 MB (iOS 16) / 50 MB (iOS 17+) |
| **Janela de push de 8 horas** | A permissão efêmera expira após 8 horas |
| **Sem processamento em segundo plano** | O push silencioso tem funcionalidade limitada |
| **ID do Dispositivo** | `identifierForVendor` retorna zeros — o SDK lida com isso automaticamente (7.0.33+) |



## Como fica

<center>

<img src="/ios-appclip-push.png" alt="Notificação push de um App Clip em um iPhone" width="300" />

*Notificação push recebida em um App Clip com permissões efêmeras*

</center>