# gRPC Transport

โมดูล `PushwooshGRPC` เป็นเลเยอร์การส่งข้อมูล gRPC ที่เป็นทางเลือก ซึ่งสามารถปรับปรุงประสิทธิภาพของเครือข่ายสำหรับการสื่อสารกับเซิร์ฟเวอร์ของ Pushwoosh ได้ เมื่อพร้อมใช้งาน SDK จะใช้ gRPC โดยอัตโนมัติสำหรับเมธอด API ที่รองรับ และจะกลับไปใช้ REST หาก gRPC ไม่พร้อมใช้งาน

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

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

โดยค่าเริ่มต้น Pushwoosh SDK จะสื่อสารกับเซิร์ฟเวอร์โดยใช้ REST API ผ่าน HTTPS โมดูล `PushwooshGRPC` จะเพิ่มการส่งข้อมูลทางเลือกแบบ gRPC ซึ่งมีข้อดีหลายประการ:

- **ความหน่วงต่ำกว่า** — gRPC ใช้ HTTP/2 พร้อมการเชื่อมต่อแบบถาวร
- **ขนาด payload เล็กกว่า** — Protocol Buffers มีขนาดกะทัดรัดกว่า JSON
- **การทำมัลติเพล็กซ์ (Multiplexing)** — สามารถส่งคำขอหลายรายการผ่านการเชื่อมต่อเดียวได้

### การกลับไปใช้ระบบสำรองอัตโนมัติ

โมดูลนี้มีความยืดหยุ่นในตัว:

| สถานการณ์ | การทำงาน |
|----------|----------|
| gRPC ใช้งานได้ | ใช้การส่งข้อมูลแบบ gRPC |
| gRPC ใช้งานไม่ได้ | กลับไปใช้ REST |
| เกิดข้อผิดพลาดของเครือข่าย | ลองใหม่อีกครั้งด้วย REST |

<Aside type="tip">
คุณไม่จำเป็นต้องจัดการการเลือกวิธีการส่งข้อมูลในโค้ดของคุณ SDK จะเลือกวิธีการส่งข้อมูลที่ดีที่สุดที่มีอยู่โดยอัตโนมัติ
</Aside>

## ข้อกำหนด

| ข้อกำหนด | เวอร์ชัน |
|-------------|---------|
| iOS | 13.0+ |
| Xcode | 14.0+ |
| Swift | 5.0+ |

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

### Swift Package Manager

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

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

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

### CocoaPods

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

```ruby
target 'MyApp' do
  use_frameworks!

  pod 'PushwooshXCFramework'
  pod 'PushwooshXCFramework/PushwooshGRPC'
end
```

จากนั้นรัน:

```bash
pod install
```

## การใช้งาน

**ไม่จำเป็นต้องเปลี่ยนแปลงโค้ด** เมื่อคุณเพิ่มโมดูล `PushwooshGRPC` ไปยังโปรเจกต์ของคุณแล้ว มันจะทำงานโดยอัตโนมัติ:

1. เมื่อแอปเปิดตัว SDK จะตรวจจับว่าการส่งข้อมูลแบบ gRPC พร้อมใช้งาน
2. การเรียก API จะถูกส่งผ่าน gRPC เมื่อเป็นไปได้
3. หาก gRPC ล้มเหลว SDK จะกลับไปใช้ REST โดยอัตโนมัติ

## เมธอดที่รองรับ

เมธอด API ต่อไปนี้รองรับการส่งข้อมูลแบบ gRPC:

| เมธอด | รองรับ gRPC |
|--------|--------------|
| การลงทะเบียนอุปกรณ์ | ใช่ |
| แท็ก (ตั้งค่า/ดึงข้อมูล) | ใช่ |
| การติดตามการเปิดแอป | ใช่ |
| สถิติของพุช | ใช่ |

<Aside type="note">
เมธอดที่ไม่ได้ระบุไว้ข้างต้นจะยังคงใช้การส่งข้อมูลแบบ REST ต่อไป SDK จะจัดการเรื่องนี้อย่างโปร่งใส
</Aside>

## กรณีการใช้งาน

โมดูล `PushwooshGRPC` มีประโยชน์อย่างยิ่งสำหรับ:

- **การติดตามอีเวนต์ความถี่สูง** — ลด overhead สำหรับแอปที่ส่งอีเวนต์จำนวนมาก
- **แอปพลิเคชันแบบเรียลไทม์** — ความหน่วงต่ำกว่าสำหรับการดำเนินการที่ต้องคำนึงถึงเวลา
- **สภาพแวดล้อมที่แบนด์วิดท์จำกัด** — ขนาด payload ที่เล็กกว่าช่วยประหยัดข้อมูล

## การแก้ไขปัญหา

### การตรวจสอบว่าโมดูลทำงานอยู่

ตรวจสอบบันทึกของคอนโซล Xcode เมื่อแอปของคุณเปิดตัว คุณควรเห็นข้อความบันทึกเช่น:

```
[Pushwoosh] gRPC transport: ENABLED
```

### การบังคับใช้การส่งข้อมูลแบบ REST

หากคุณต้องการปิดใช้งาน gRPC ชั่วคราวเพื่อการดีบัก คุณสามารถลบโมดูล `PushwooshGRPC` ออกจาก target ของคุณได้ SDK จะใช้การส่งข้อมูลแบบ REST โดยอัตโนมัติเมื่อ gRPC ไม่พร้อมใช้งาน

<Aside type="caution">
อย่ารวมโค้ดการส่งข้อมูลทั้ง gRPC และ REST ไว้ในแอปของคุณ — SDK จะจัดการการเลือกวิธีการส่งข้อมูลโดยอัตโนมัติตามความพร้อมใช้งานของโมดูล
</Aside>