# পারসিস্টেন্ট ডিভাইস আইডি (কিচেইন)

`PushwooshKeychain` মডিউলটি একটি স্থায়ী ডিভাইস আইডেন্টিফিকেশন (HWID) প্রদান করে যা অ্যাপ পুনরায় ইনস্টল করার পরেও টিকে থাকে। এটি টেস্টিং এবং ডেভেলপমেন্টের জন্য খুবই উপকারী, যেখানে অ্যাপ পুনরায় ইনস্টল করার পরেও একই ডিভাইসের পরিচয় বজায় রাখা প্রয়োজন।

<Aside type="note">
**SDK সংস্করণ 7.0.16** থেকে উপলব্ধ।
</Aside>

## এটি কিভাবে কাজ করে

ডিফল্টভাবে, iOS প্রতিবার অ্যাপ পুনরায় ইনস্টল করার সময় একটি নতুন `identifierForVendor` (IDFV) তৈরি করে, যার ফলে Pushwoosh-এ একটি নতুন HWID রেজিস্টার হয়। `PushwooshKeychain` মডিউলটি HWID-কে iOS Keychain-এ সংরক্ষণ করে, যা অ্যাপ পুনরায় ইনস্টল করার পরেও টিকে থাকে।

### এনভায়রনমেন্ট সনাক্তকরণ

মডিউলটি স্বয়ংক্রিয়ভাবে অ্যাপের এনভায়রনমেন্ট শনাক্ত করে এবং ভিন্নভাবে কাজ করে:

| এনভায়রনমেন্ট | পারসিস্টেন্ট HWID |
|---|---|
| Simulator | সক্রিয় |
| Debug/Development | সক্রিয় |
| TestFlight | সক্রিয় |
| App Store | **নিষ্ক্রিয়** |

<Aside type="caution" title="গুরুত্বপূর্ণ">
গোপনীয়তা রক্ষার জন্য App Store বিল্ডগুলিতে এই মডিউলটি **স্বয়ংক্রিয়ভাবে নিষ্ক্রিয়** করা থাকে। এটি নিশ্চিত করে যে প্রোডাকশন ব্যবহারকারীরা যখন তাদের অ্যাপ পুনরায় ইনস্টল করেন, তখন তারা সবসময় একটি নতুন HWID পান।

আপনি যদি আপনার প্রোডাকশন অ্যাপে এই মডিউলটি একেবারেই অন্তর্ভুক্ত করতে না চান, তাহলে আপনি আপনার রিলিজ বিল্ড কনফিগারেশন থেকে `PushwooshKeychain` নিরাপদে সরিয়ে ফেলতে পারেন অথবা শুধুমাত্র Debug/TestFlight বিল্ডগুলির জন্য কন্ডিশনাল লিঙ্কিং ব্যবহার করতে পারেন।
</Aside>

## ইনস্টলেশন

### সুইফট প্যাকেজ ম্যানেজার

Pushwoosh SDK ইন্টিগ্রেট করার সময় আপনার টার্গেটে `PushwooshKeychain` যোগ করুন:

1. Xcode-এ, **File → Add Package Dependencies**-এ যান
2. প্যাকেজ URL লিখুন: `https://github.com/Pushwoosh/Pushwoosh-XCFramework`
3. প্রয়োজনীয় ফ্রেমওয়ার্কগুলির সাথে `PushwooshKeychain` নির্বাচন করুন

<Tabs>
<TabItem label="প্রয়োজনীয় ফ্রেমওয়ার্ক">
* `PushwooshFramework`
* `PushwooshCore`
* `PushwooshBridge`
</TabItem>
<TabItem label="ঐচ্ছিক ফ্রেমওয়ার্ক">
* `PushwooshKeychain` — পারসিস্টেন্ট ডিভাইস আইডি
* `PushwooshLiveActivities` — লাইভ অ্যাক্টিভিটিজ সাপোর্ট
* `PushwooshVoIP` — ভিওআইপি পুশ নোটিফিকেশন
* `PushwooshForegroundPush` — কাস্টম ফোরগ্রাউন্ড নোটিফিকেশন
</TabItem>
</Tabs>

### কোকোপডস

আপনার `Podfile`-এ Keychain সাবস্পেক যোগ করুন:

```ruby
target 'MyApp' do
  use_frameworks!

  pod 'PushwooshXCFramework'
  pod 'PushwooshXCFramework/PushwooshKeychain'
end
```

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

```bash
pod install
```

## ব্যবহার

**কোনো কোড পরিবর্তনের প্রয়োজন নেই।** একবার আপনি আপনার প্রজেক্টে `PushwooshKeychain` মডিউলটি যোগ করলে, এটি স্বয়ংক্রিয়ভাবে কাজ করে:

1. প্রথমবার অ্যাপ চালু হলে, মডিউলটি একটি HWID তৈরি করে এবং এটি Keychain-এ সংরক্ষণ করে
2. পরবর্তী লঞ্চগুলিতে (পুনরায় ইনস্টল করার পরেও), মডিউলটি সংরক্ষিত HWID পুনরুদ্ধার করে
3. SDK এই পারসিস্টেন্ট HWID ব্যবহার করে Pushwoosh-এর সাথে ডিভাইস রেজিস্টার করে

## ব্যবহারের ক্ষেত্র

`PushwooshKeychain` মডিউলটি বিশেষত নিম্নলিখিত ক্ষেত্রে উপকারী:

- **QA টেস্টিং** — টেস্টিংয়ের সময় একাধিক অ্যাপ ইনস্টল জুড়ে একই ডিভাইসের পরিচয় বজায় রাখা
- **ডেভেলপমেন্ট** — আপনার অ্যাপে কাজ করার সময় ডিভাইসের টার্গেটিং সামঞ্জস্যপূর্ণ রাখা
- **TestFlight বিটা টেস্টিং** — অ্যাপ আপডেট এবং পুনরায় ইনস্টল করার সময় একই বিটা টেস্টারদের ট্র্যাক করা

<Aside type="tip">
যেহেতু App Store বিল্ডগুলিতে মডিউলটি নিষ্ক্রিয় থাকে, তাই আপনাকে শর্তসাপেক্ষে এটি অন্তর্ভুক্ত করার প্রয়োজন নেই — এটি আপনার প্রোডাকশন অ্যাপের সাথে পাঠানো নিরাপদ।
</Aside>

## সমস্যা সমাধান

### মডিউলটি সক্রিয় আছে কিনা তা যাচাই করা

আপনার অ্যাপ চালু হওয়ার সময় Xcode কনসোল লগগুলি পরীক্ষা করুন। আপনার এই ধরনের একটি লগ বার্তা দেখা উচিত:

```
[Pushwoosh] Detected environment: Debug. Persistent HWID: ENABLED
```

অথবা

```
[Pushwoosh] Detected environment: App Store. Persistent HWID: DISABLED
```

### সংরক্ষিত HWID পরিষ্কার করা

ডেভেলপমেন্টের সময় যদি আপনার পারসিস্টেন্ট HWID রিসেট করার প্রয়োজন হয়, আপনি কল করতে পারেন:

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

// Keychain থেকে সংরক্ষিত HWID পরিষ্কার করুন
Pushwoosh.Keychain.clearPersistentHWID()
```
</TabItem>
<TabItem label="Objective-C">
```objective-c
@import PushwooshFramework;

// Keychain থেকে সংরক্ষিত HWID পরিষ্কার করুন
[Pushwoosh.Keychain clearPersistentHWID];
```
</TabItem>
</Tabs>

<Aside type="note">
পরিষ্কার করার পরে, পরবর্তী অ্যাপ লঞ্চ একটি নতুন HWID তৈরি করবে এবং সংরক্ষণ করবে।
</Aside>