# ID อุปกรณ์แบบถาวร (Keychain)

โมดูล `PushwooshKeychain` ช่วยให้มีรหัสประจำตัวอุปกรณ์ (HWID) แบบถาวรซึ่งจะยังคงอยู่แม้จะมีการติดตั้งแอปใหม่ ซึ่งมีประโยชน์สำหรับสถานการณ์การทดสอบและการพัฒนาที่คุณต้องการรักษารหัสประจำตัวอุปกรณ์เดิมไว้แม้ว่าจะติดตั้งแอปใหม่ก็ตาม

<Aside type="note">
พร้อมใช้งานตั้งแต่ **SDK เวอร์ชัน 7.0.16**
</Aside>

## วิธีการทำงาน

โดยปกติแล้ว iOS จะสร้าง `identifierForVendor` (IDFV) ใหม่ทุกครั้งที่มีการติดตั้งแอปใหม่ ซึ่งส่งผลให้มีการลงทะเบียน HWID ใหม่กับ Pushwoosh โมดูล `PushwooshKeychain` จะจัดเก็บ HWID ไว้ใน iOS Keychain ซึ่งจะยังคงอยู่แม้จะมีการติดตั้งแอปใหม่

### การตรวจจับสภาพแวดล้อม

โมดูลจะตรวจจับสภาพแวดล้อมของแอปโดยอัตโนมัติและทำงานแตกต่างกันไป:

| สภาพแวดล้อม | HWID แบบถาวร |
|---|---|
| Simulator | เปิดใช้งาน |
| Debug/Development | เปิดใช้งาน |
| TestFlight | เปิดใช้งาน |
| App Store | **ปิดใช้งาน** |

<Aside type="caution" title="สำคัญ">
โมดูลจะถูก **ปิดใช้งานโดยอัตโนมัติ** ในบิลด์ของ App Store เพื่อให้สอดคล้องกับความเป็นส่วนตัว ซึ่งจะช่วยให้แน่ใจว่าผู้ใช้ในเวอร์ชัน production จะได้รับ HWID ใหม่เสมอเมื่อพวกเขาติดตั้งแอปของคุณใหม่

หากคุณไม่ต้องการรวมโมดูลนี้ในแอปเวอร์ชัน production ของคุณเลย คุณสามารถลบ `PushwooshKeychain` ออกจากการกำหนดค่าบิลด์สำหรับ release ของคุณได้อย่างปลอดภัย หรือใช้การลิงก์แบบมีเงื่อนไขสำหรับบิลด์ Debug/TestFlight เท่านั้น
</Aside>

## การติดตั้ง

### Swift Package Manager

เพิ่ม `PushwooshKeychain` ไปยัง target ของคุณเมื่อทำการผสานรวม Pushwoosh SDK:

1. ใน Xcode ไปที่ **File → Add Package Dependencies**
2. ป้อน URL ของ package: `https://github.com/Pushwoosh/Pushwoosh-XCFramework`
3. เลือก `PushwooshKeychain` เพิ่มเติมจากเฟรมเวิร์กที่จำเป็น

<Tabs>
<TabItem label="เฟรมเวิร์กที่จำเป็น">
* `PushwooshFramework`
* `PushwooshCore`
* `PushwooshBridge`
</TabItem>
<TabItem label="เฟรมเวิร์กทางเลือก">
* `PushwooshKeychain` — ID อุปกรณ์แบบถาวร
* `PushwooshLiveActivities` — รองรับ Live Activities
* `PushwooshVoIP` — VoIP push notifications
* `PushwooshForegroundPush` — การแจ้งเตือนเบื้องหน้าแบบกำหนดเอง
</TabItem>
</Tabs>

### CocoaPods

เพิ่ม Keychain subspec ไปยัง `Podfile` ของคุณ:

```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 คุณจึงไม่จำเป็นต้องรวมแบบมีเงื่อนไข — สามารถส่งไปพร้อมกับแอปเวอร์ชัน production ของคุณได้อย่างปลอดภัย
</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

// ล้าง HWID ที่จัดเก็บไว้ออกจาก Keychain
Pushwoosh.Keychain.clearPersistentHWID()
```
</TabItem>
<TabItem label="Objective-C">
```objective-c
@import PushwooshFramework;

// ล้าง HWID ที่จัดเก็บไว้ออกจาก Keychain
[Pushwoosh.Keychain clearPersistentHWID];
```
</TabItem>
</Tabs>

<Aside type="note">
หลังจากล้างแล้ว การเปิดแอปครั้งต่อไปจะสร้างและจัดเก็บ HWID ใหม่
</Aside>