# tvOS মোডাল রিচ মিডিয়া

Pushwoosh SDK সংস্করণ 6.11.0 থেকে, আপনি tvOS ডিভাইসগুলিতে (Apple TV) **মোডাল রিচ মিডিয়া** পাঠাতে পারবেন।

tvOS-এর জন্য মোডাল রিচ মিডিয়া একটি ইন্টারেক্টিভ HTML-ভিত্তিক কন্টেন্ট ডিসপ্লে প্রদান করে যা Apple TV-এর রিমোট কন্ট্রোল নেভিগেশনের জন্য অপ্টিমাইজ করা হয়েছে। এই রিচ মিডিয়া বিভিন্ন পজিশন, অ্যানিমেশন এবং ফোকাস নেভিগেশন সাপোর্ট সহ কাস্টমাইজ করা যেতে পারে।

<video src="/tv_os_rich_media.webm" title="tvOS রিচ মিডিয়ার উদাহরণ" autoplay loop muted playsinline />

<Aside type="caution">
tvOS-এ স্ট্যান্ডার্ড পুশ নোটিফিকেশন সাপোর্ট করে না। Apple TV প্রচলিত পুশ নোটিফিকেশন ব্যানার বা অ্যালার্ট প্রদর্শন করে না। শুধুমাত্র সাইলেন্ট পুশ নোটিফিকেশনের মাধ্যমে পাঠানো রিচ মিডিয়া কন্টেন্ট PushwooshTVOS মডিউল ব্যবহার করে প্রদর্শন করা যেতে পারে।
</Aside>

> রিচ মিডিয়া পেজ সম্পর্কে আরও তথ্যের জন্য, অনুগ্রহ করে [আমাদের গাইড](/bn/product/content/rich-media) দেখুন।

## ইনস্টলেশন

PushwooshTVOS মডিউলটি ঐচ্ছিক এবং এটি Swift Package Manager বা CocoaPods ব্যবহার করে আপনার tvOS প্রজেক্টে ইন্টিগ্রেট করা যেতে পারে।

### Swift Package Manager

আপনার tvOS প্রজেক্টে Pushwoosh প্যাকেজ যোগ করুন:

1. Xcode-এ, **File** → **Add Package Dependencies...** নির্বাচন করুন
2. রিপোজিটরি URL লিখুন: `https://github.com/Pushwoosh/Pushwoosh-XCFramework`
3. সর্বশেষ সংস্করণ নির্বাচন করুন
4. আপনার tvOS টার্গেটে নিম্নলিখিত ফ্রেমওয়ার্কগুলি যোগ করুন:
   * **PushwooshFramework**
   * **PushwooshCore**
   * **PushwooshBridge**
   * **PushwooshLiveActivities**
   * **PushwooshTVOS**

### CocoaPods

আপনার Podfile-এ যোগ করুন:

```ruby
target 'YourTvOSApp' do
  platform :tvos, '13.0'

  pod 'PushwooshXCFramework'
  pod 'PushwooshXCFramework/PushwooshTVOS'
end
```

তারপর রান করুন:

```bash
pod install
```

## বেসিক ইন্টিগ্রেশন

### ১. আপনার AppDelegate-এ Pushwoosh কনফিগার করুন

প্রয়োজনীয় মডিউলগুলি ইম্পোর্ট করুন এবং আপনার অ্যাপ্লিকেশন কোড দিয়ে Pushwoosh কনফিগার করুন:

```swift
import UIKit
import PushwooshTVOS
import PushwooshFramework

@main
class AppDelegate: UIResponder, UIApplicationDelegate {

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

        // Configure Pushwoosh with your app code
        Pushwoosh.TVoS.setAppCode("XXXXX-XXXXX")

        // Register for push notifications
        Pushwoosh.TVoS.registerForTvPushNotifications()

        return true
    }
}
```

### ২. ডিভাইস টোকেন রেজিস্ট্রেশন হ্যান্ডেল করুন

Pushwoosh-এর সাথে ডিভাইস রেজিস্টার করার জন্য ডিভাইস টোকেন হ্যান্ডলার ইমপ্লিমেন্ট করুন:

```swift
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    Pushwoosh.TVoS.registerForTvPushNotifications(withToken: deviceToken) { error in
        if let error = error {
            print("Failed to register: \(error)")
        } else {
            print("Successfully registered for push notifications")
        }
    }
}

func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
    Pushwoosh.TVoS.handleTvPushRegistrationFailure(error)
}
```

### ৩. ইনকামিং পুশ নোটিফিকেশন হ্যান্ডেল করুন

রিচ মিডিয়া কন্টেন্ট সহ ইনকামিং পুশ নোটিফিকেশন প্রসেস করুন:

```swift
func application(_ application: UIApplication,
                 didReceiveRemoteNotification userInfo: [AnyHashable: Any],
                 fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {

    // Handle push notification and display rich media if present
    if Pushwoosh.TVoS.handleTVOSPush(userInfo: userInfo) {
        completionHandler(.newData)
    } else {
        completionHandler(.noData)
    }
}
```

<Aside type="note">
tvOS শুধুমাত্র `content-available: 1` ফ্ল্যাগ সহ সাইলেন্ট পুশ নোটিফিকেশন সাপোর্ট করে। Pushwoosh-এর মাধ্যমে Apple TV ডিভাইসে পুশ নোটিফিকেশন পাঠানোর সময়, নিশ্চিত করুন যে:
- আপনার পুশ নোটিফিকেশন পেলোডে "content-available" ফ্ল্যাগ সক্রিয় করুন
- নোটিফিকেশনে রিচ মিডিয়া কন্টেন্ট অন্তর্ভুক্ত করুন
</Aside>

## রিচ মিডিয়া কনফিগারেশন

### পজিশনিং

tvOS-এর জন্য মোডাল রিচ মিডিয়া স্ক্রিনের পাঁচটি স্থানে পজিশন করা যেতে পারে:

```swift
// সেন্টার পজিশন (ডিফল্ট)
Pushwoosh.TVoS.configureRichMediaWith(position: .center, presentAnimation: .none, dismissAnimation: .none)

// স্ক্রিনের বাম দিকে
Pushwoosh.TVoS.configureRichMediaWith(position: .left, presentAnimation: .fromLeft, dismissAnimation: .toLeft)

// স্ক্রিনের ডান দিকে
Pushwoosh.TVoS.configureRichMediaWith(position: .right, presentAnimation: .fromRight, dismissAnimation: .toRight)

// স্ক্রিনের উপরে
Pushwoosh.TVoS.configureRichMediaWith(position: .top, presentAnimation: .fromTop, dismissAnimation: .toTop)

// স্ক্রিনের নিচে
Pushwoosh.TVoS.configureRichMediaWith(position: .bottom, presentAnimation: .fromBottom, dismissAnimation: .toBottom)
```

উপলব্ধ পজিশন অপশন:

```swift
enum PWTVOSRichMediaPosition {
    case center     // কন্টেন্ট স্ক্রিনের কেন্দ্রে পজিশন করা (ডিফল্ট)
    case left       // কন্টেন্ট স্ক্রিনের বাম দিকে পজিশন করা
    case right      // কন্টেন্ট স্ক্রিনের ডান দিকে পজিশন করা
    case top        // কন্টেন্ট স্ক্রিনের উপরে পজিশন করা
    case bottom     // কন্টেন্ট স্ক্রিনের নিচে পজিশন করা
}
```

### প্রেজেন্ট অ্যানিমেশন

রিচ মিডিয়া কন্টেন্ট স্ক্রিনে কীভাবে প্রদর্শিত হবে তা নিয়ন্ত্রণ করুন:

```swift
enum PWTVOSRichMediaPresentAnimation {
    case none        // কোনো অ্যানিমেশন নেই, কন্টেন্ট অবিলম্বে প্রদর্শিত হয় (ডিফল্ট)
    case fromTop     // কন্টেন্ট স্ক্রিনের উপর থেকে স্লাইড করে আসে
    case fromBottom  // কন্টেন্ট স্ক্রিনের নিচ থেকে স্লাইড করে আসে
    case fromLeft    // কন্টেন্ট স্ক্রিনের বাম দিক থেকে স্লাইড করে আসে
    case fromRight   // কন্টেন্ট স্ক্রিনের ডান দিক থেকে স্লাইড করে আসে
}
```

### ডিসমিস অ্যানিমেশন

রিচ মিডিয়া কন্টেন্ট স্ক্রিন থেকে কীভাবে অদৃশ্য হবে তা নিয়ন্ত্রণ করুন:

```swift
enum PWTVOSRichMediaDismissAnimation {
    case none       // কোনো অ্যানিমেশন নেই, কন্টেন্ট অবিলম্বে অদৃশ্য হয়ে যায় (ডিফল্ট)
    case toTop      // কন্টেন্ট স্ক্রিনের উপরের দিকে স্লাইড করে বেরিয়ে যায়
    case toBottom   // কন্টেন্ট স্ক্রিনের নিচের দিকে স্লাইড করে বেরিয়ে যায়
    case toLeft     // কন্টেন্ট স্ক্রিনের বাম দিকে স্লাইড করে বেরিয়ে যায়
    case toRight    // কন্টেন্ট স্ক্রিনের ডান দিকে স্লাইড করে বেরিয়ে যায়
}
```

### কনফিগারেশন উদাহরণ

অ্যানিমেশন সহ বাম দিকে প্রদর্শিত হওয়ার জন্য রিচ মিডিয়া কনফিগার করুন:

```swift
Pushwoosh.TVoS.configureRichMediaWith(
    position: .left,
    presentAnimation: .fromBottom,
    dismissAnimation: .toLeft
)
```

স্লাইড অ্যানিমেশন সহ নিচে প্রদর্শিত হওয়ার জন্য রিচ মিডিয়া কনফিগার করুন:

```swift
Pushwoosh.TVoS.configureRichMediaWith(
    position: .bottom,
    presentAnimation: .fromBottom,
    dismissAnimation: .toBottom
)
```

অ্যানিমেশন ছাড়া কেন্দ্রে প্রদর্শিত হওয়ার জন্য রিচ মিডিয়া কনফিগার করুন:

```swift
Pushwoosh.TVoS.configureRichMediaWith(
    position: .center,
    presentAnimation: .none,
    dismissAnimation: .none
)
```

## ক্লোজ বাটন কনফিগারেশন

ডিফল্টরূপে, রিচ মিডিয়া প্রেজেন্টেশনের নিচে একটি ক্লোজ বাটন প্রদর্শিত হয়। প্রয়োজনে আপনি এই বাটনটি লুকাতে পারেন:

```swift
// সিস্টেম ক্লোজ বাটনটি লুকান
Pushwoosh.TVoS.configureCloseButton(false)
```

<Aside type="caution">
আপনি যদি ক্লোজ বাটনটি লুকান, তাহলে নিশ্চিত করুন যে আপনার রিচ মিডিয়া HTML কন্টেন্টে `closeInApp` অ্যাকশন সহ একটি বাটন রয়েছে যাতে ব্যবহারকারীরা কন্টেন্টটি ডিসমিস করতে পারে:

```html
<button onclick="closeInApp()">Close</button>
```
</Aside>

## Apple TV-এর জন্য ফোকাস নেভিগেশন

tvOS SDK স্বয়ংক্রিয়ভাবে Apple TV-এর রিমোট কন্ট্রোলের জন্য ফোকাস নেভিগেশন পরিচালনা করে। আপনার রিচ মিডিয়া HTML কন্টেন্টের ইন্টারেক্টিভ এলিমেন্টগুলি (বাটন, লিঙ্ক) Apple TV রিমোট ব্যবহার করে ফোকাসযোগ্য হবে।

### ফোকাস আচরণ

- HTML কন্টেন্টে ফোকাসযোগ্য এলিমেন্টগুলি স্বয়ংক্রিয়ভাবে সনাক্ত করা হয়
- ব্যবহারকারীরা Apple TV রিমোটের ডিরেকশনাল প্যাড ব্যবহার করে এলিমেন্টগুলির মধ্যে নেভিগেট করতে পারে
- বর্তমানে ফোকাস করা এলিমেন্টটি একটি ভিজ্যুয়াল হাইলাইট পায়
- ব্যবহারকারীরা রিমোটের সেন্টার বাটন টিপে ফোকাস করা এলিমেন্টগুলি সক্রিয় করতে পারে
- সিস্টেম ক্লোজ বাটন (যখন দৃশ্যমান থাকে) ফোকাস নেভিগেশনের একটি অংশ

### HTML কন্টেন্টের জন্য সেরা অনুশীলন

tvOS রিচ মিডিয়ার জন্য HTML কন্টেন্ট তৈরি করার সময়:

1. স্ট্যান্ডার্ড ইন্টারেক্টিভ HTML এলিমেন্ট ব্যবহার করুন: `<button>`, `<a>`, `<input />`
2. পরিষ্কার ফোকাস ইঙ্গিতের জন্য ইন্টারেক্টিভ এলিমেন্টগুলির মধ্যে পর্যাপ্ত ব্যবধান নিশ্চিত করুন
3. ফোকাস নেভিগেশন যাচাই করতে Apple TV সিমুলেটর দিয়ে আপনার কন্টেন্ট পরীক্ষা করুন
4. iOS-এর তুলনায় বড় টাচ টার্গেট ব্যবহার করার কথা বিবেচনা করুন (ন্যূনতম 250pt প্রস্থ প্রস্তাবিত)

## সম্পূর্ণ ইন্টিগ্রেশন উদাহরণ

এখানে সমস্ত ফিচার দেখানো একটি সম্পূর্ণ উদাহরণ দেওয়া হলো:

```swift
import UIKit
import PushwooshTVOS
import PushwooshFramework

@main
class AppDelegate: UIResponder, UIApplicationDelegate {

    func application(_ application: UIApplication,
                     didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

        // Pushwoosh কনফিগার করুন
        Pushwoosh.TVoS.setAppCode("XXXXX-XXXXX")

        // রিচ মিডিয়ার অ্যাপিয়ারেন্স কনফিগার করুন
        Pushwoosh.TVoS.configureRichMediaWith(
            position: .center,
            presentAnimation: .fromBottom,
            dismissAnimation: .toTop
        )

        // ক্লোজ বাটন দেখান (ডিফল্ট)
        Pushwoosh.TVoS.configureCloseButton(true)

        // পুশ নোটিফিকেশনের জন্য রেজিস্টার করুন
        Pushwoosh.TVoS.registerForTvPushNotifications()

        return true
    }

    func application(_ application: UIApplication,
                     didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        Pushwoosh.TVoS.registerForTvPushNotifications(withToken: deviceToken) { error in
            if let error = error {
                print("Failed to register: \(error)")
            } else {
                print("Successfully registered")
            }
        }
    }

    func application(_ application: UIApplication,
                     didFailToRegisterForRemoteNotificationsWithError error: Error) {
        Pushwoosh.TVoS.handleTvPushRegistrationFailure(error)
    }

    func application(_ application: UIApplication,
                     didReceiveRemoteNotification userInfo: [AnyHashable: Any],
                     fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {

        if Pushwoosh.TVoS.handleTVOSPush(userInfo: userInfo) {
            completionHandler(.newData)
        } else {
            completionHandler(.noData)
        }
    }
}
```

## ট্রাবলশুটিং

### ফোকাস নেভিগেশন সমস্যা

যদি ফোকাস নেভিগেশন সঠিকভাবে কাজ না করে:

1. যাচাই করুন যে আপনার HTML কন্টেন্ট স্ট্যান্ডার্ড ইন্টারেক্টিভ এলিমেন্ট (`<button>`, `<a>`) ব্যবহার করছে
2. ফোকাস আচরণ যাচাই করতে Apple TV সিমুলেটরে পরীক্ষা করুন
3. নিশ্চিত করুন যে ইন্টারেক্টিভ এলিমেন্টগুলির পর্যাপ্ত আকার এবং ব্যবধান রয়েছে
4. চেক করুন যে আপনার HTML/CSS ফোকাস স্টেটগুলির সাথে হস্তক্ষেপ করছে না

## রিয়েল ডিভাইস উদাহরণ

একটি আসল Apple TV ডিভাইসে রিচ মিডিয়া কেমন দেখায় তা এখানে দেওয়া হলো:

![tvOS Rich Media on Apple TV](/tv_os_simulator.webp)

স্ক্রিনশটটি Apple TV-তে প্রদর্শিত রিচ মিডিয়া কন্টেন্ট দেখাচ্ছে যেখানে রয়েছে:
- গ্রেডিয়েন্ট ব্যাকগ্রাউন্ড সহ কাস্টম HTML লেআউট
- Apple TV রিমোট কন্ট্রোলের জন্য অপ্টিমাইজ করা ইন্টারেক্টিভ বাটন
- সমস্ত ইন্টারেক্টিভ এলিমেন্টের জন্য ফোকাস নেভিগেশন সাপোর্ট

## রেফারেন্স

- [iOS SDK সোর্স কোড](https://github.com/Pushwoosh/pushwoosh-ios-sdk)
- [tvOS হিউম্যান ইন্টারফেস গাইডলাইন](https://developer.apple.com/design/human-interface-guidelines/tvos)
- [রিচ মিডিয়া কন্টেন্ট তৈরি করা](/bn/product/content/rich-media)