# iOS অ্যাপ ক্লিপস

অ্যাপ ক্লিপস ব্যবহারকারীদের আপনার সম্পূর্ণ অ্যাপ ডাউনলোড না করেই দ্রুত একটি কাজ সম্পন্ন করতে দেয়। Pushwoosh-এর সাহায্যে, আপনি অ্যাপ ক্লিপ ব্যবহারকারীদের পুশ নোটিফিকেশন পাঠাতে পারেন — অ্যাপ ক্লিপ খোলার সময় iOS স্বয়ংক্রিয়ভাবে **৮-ঘন্টার নোটিফিকেশন অ্যাক্সেস** প্রদান করে।


## আপনার যা প্রয়োজন

- Pushwoosh iOS SDK **7.0.33+**
- Xcode 15+
- আপনার অ্যাপ ক্লিপের জন্য একটি **আলাদা Pushwoosh অ্যাপ্লিকেশন** (ভিন্ন বান্ডেল আইডি = আলাদা অ্যাপ)
- পরীক্ষার জন্য একটি আসল ডিভাইস (পুশ টোকেন সিমুলেটরে কাজ করে না)

## ১. একটি Pushwoosh অ্যাপ্লিকেশন তৈরি করুন

আপনার অ্যাপ ক্লিপের একটি ভিন্ন বান্ডেল আইডি আছে (যেমন `com.yourapp.Clip`), তাই এটির নিজস্ব APNs কী সহ একটি **আলাদা Pushwoosh অ্যাপ** প্রয়োজন।

1. [Pushwoosh কন্ট্রোল প্যানেল](https://app.pushwoosh.com/)-এ যান
2. অ্যাপ ক্লিপ বান্ডেল আইডি দিয়ে একটি নতুন অ্যাপ্লিকেশন তৈরি করুন
3. আপনার APNs প্রমাণীকরণ কী আপলোড করুন
4. **অ্যাপ্লিকেশন কোড** এবং **API টোকেন** কপি করুন



## ২. একটি অ্যাপ ক্লিপ টার্গেট তৈরি করুন

1. Xcode-এ: **File → New → Target → App Clip**
2. অ্যাপ ক্লিপ টার্গেটে **Push Notifications** ক্যাপাবিলিটি যোগ করুন

ক্যাপাবিলিটি যোগ করার বিস্তারিত স্ক্রিনশটের জন্য, [বেসিক ইন্টিগ্রেশন গাইড](/bn/developer/pushwoosh-sdk/ios-sdk/setting-up-pushwoosh-ios-sdk-7-0/basic-integration-guide/) দেখুন।


## ৩. Pushwoosh ফ্রেমওয়ার্ক যোগ করুন

অ্যাপ ক্লিপ টার্গেটের **Build Phases → Link Binary With Libraries**-এ, যোগ করুন:

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


## ৪. 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>
```



## ৫. 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>

ক্ষণস্থায়ী অনুমতিসহ, iOS স্বয়ংক্রিয়ভাবে ৮ ঘন্টার জন্য পুশ অ্যাক্সেস প্রদান করে। আপনি যদি **অনুমতি ডায়ালগ না দেখিয়ে** ক্ষণস্থায়ী মোড ব্যবহার করতে চান, তাহলে `Pushwoosh.configure.registerForPushNotifications()` এর পরিবর্তে সরাসরি `UIApplication.shared.registerForRemoteNotifications()` কল করুন।

**স্থায়ী** পুশ অনুমতির (স্ট্যান্ডার্ড ডায়ালগ) অনুরোধ করতে, উপরে দেখানো হিসাবে `Pushwoosh.configure.registerForPushNotifications()` ব্যবহার করুন।



## ক্ষণস্থায়ী পুশ অনুমতি

যখন একজন ব্যবহারকারী আপনার অ্যাপ ক্লিপ খোলে, iOS জিজ্ঞাসা না করেই **৮ ঘন্টার** জন্য পুশ নোটিফিকেশন অ্যাক্সেস প্রদান করে। ৮ ঘন্টা পরে, অনুমতির মেয়াদ শেষ হয়ে যায়। আরও ৮ ঘন্টা পেতে ব্যবহারকারীকে অবশ্যই অ্যাপ ক্লিপটি পুনরায় খুলতে হবে।

**অনুমতি ডায়ালগ না দেখিয়ে** ৮ ঘন্টার জন্য একটি পুশ টোকেন পেতে:

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

একটি **স্থায়ী** পুশ টোকেন পেতে (স্ট্যান্ডার্ড অনুমতি ডায়ালগ দেখায়):

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

## সীমাবদ্ধতা

| সীমাবদ্ধতা | বিবরণ |
|---|---|
| **কোনো রিচ নোটিফিকেশন নেই** | অ্যাপ ক্লিপে নোটিফিকেশন সার্ভিস এক্সটেনশন অন্তর্ভুক্ত করা যায় না — কোনো ছবি নেই, কোনো কমিউনিকেশন নোটিফিকেশন নেই |
| **আকারের সীমাবদ্ধতা** | ১৫ এমবি (iOS 16) / ৫০ এমবি (iOS 17+) |
| **৮-ঘন্টার পুশ উইন্ডো** | ক্ষণস্থায়ী অনুমতির মেয়াদ ৮ ঘন্টা পরে শেষ হয়ে যায় |
| **কোনো ব্যাকগ্রাউন্ড প্রসেসিং নেই** | সাইলেন্ট পুশের কার্যকারিতা সীমিত |
| **ডিভাইস আইডি** | `identifierForVendor` শূন্য রিটার্ন করে — SDK এটি স্বয়ংক্রিয়ভাবে পরিচালনা করে (7.0.33+) |



## এটি দেখতে কেমন

<center>

<img src="/ios-appclip-push.png" alt="আইফোনে অ্যাপ ক্লিপ পুশ নোটিফিকেশন" width="300" />

*ক্ষণস্থায়ী অনুমতিসহ একটি অ্যাপ ক্লিপে প্রাপ্ত পুশ নোটিফিকেশন*

</center>