# คู่มือการผสานรวมขั้นสูงสำหรับ iOS SDK 7.0+

import { Badge } from '@astrojs/starlight/components';

ส่วนนี้ให้ข้อมูลเกี่ยวกับการผสานรวมขั้นสูงของ Pushwoosh iOS SDK

## โหมดเบื้องหลัง (Background modes)

<Aside type="caution" title="">
โดยค่าเริ่มต้น iOS ไม่อนุญาตให้แอปประมวลผล push notifications เมื่อแอปทำงานในเบื้องหลัง ซึ่งรวมถึง silent push notifications ที่มีประโยชน์สำหรับการอัปเดตข้อมูลแอปโดยไม่มีการโต้ตอบจากผู้ใช้
</Aside>

เพื่อให้สามารถใช้งานฟังก์ชันนี้ได้ คุณต้องเพิ่ม Background Modes ในโปรเจกต์ของคุณ


#### ขั้นตอนการเปิดใช้งานโหมดเบื้องหลัง

1. เปิดโปรเจกต์ของคุณใน **Xcode** และเลือกโปรเจกต์ใน **Project Navigator**
2. เลือก target ของแอปของคุณจากแผงด้านซ้าย
3. ไปที่แท็บ **Signing & Capabilities**
4. คลิกปุ่ม **+ Capability** ที่มุมบนซ้าย
5. ค้นหาและเลือก **Background Modes** จากรายการ
6. ในส่วน **Background Modes** ให้เปิดใช้งาน **Remote notifications** โดยทำเครื่องหมายในช่อง

เมื่อเสร็จสิ้น แอปของคุณจะสามารถจัดการ push notifications รวมถึง silent push notifications ในขณะที่ทำงานในเบื้องหลังได้

## โหมดเบื้องหน้า (Foreground modes)

โดยค่าเริ่มต้น Pushwoosh iOS SDK จะแสดงแบนเนอร์การแจ้งเตือนเมื่อแอปทำงานในเบื้องหน้า

คุณสามารถควบคุมพฤติกรรมนี้ได้โดยการตั้งค่าแฟล็กบูลีนต่อไปนี้ในโค้ดของคุณ (เช่น ใน `AppDelegate` ของคุณ):

<Tabs syncKey="code-example">
    <TabItem label="Swift">
    ```swift
    // ตั้งค่าเป็น false เพื่อปิดการแจ้งเตือนเบื้องหน้า, true เพื่อเปิดใช้งาน
    Pushwoosh.configure.showPushnotificationAlert = true
    ```

    <LinkCard
        title="ตัวอย่าง (Swift)"
        href="https://github.com/Pushwoosh/pushwoosh-quickstart-ios/blob/main/customizing/customizing/ViewController.swift#L30"
    />

  </TabItem>

  <TabItem label="Objective-C">

  ```objective-c
  // ตั้งค่าเป็น 0 เพื่อปิดการแจ้งเตือนเบื้องหน้า, 1 เพื่อเปิดใช้งาน
  [[Pushwoosh configure] setShowPushnotificationAlert:0];
  ```

    <LinkCard
        title="ตัวอย่าง (Objective-C)"
        href="https://github.com/Pushwoosh/pushwoosh-quickstart-ios/blob/main/customizing/customizingObjC/customizingObjC/ViewController.m#L35"
    />

  </TabItem>
</Tabs>

## ระดับการบันทึก (Log level)

Pushwoosh iOS SDK รองรับระดับการบันทึกต่อไปนี้:

- `NONE` - ไม่มีบันทึกจาก SDK
- `ERROR` - แสดงเฉพาะข้อความข้อผิดพลาดในคอนโซล
- `WARNING` - แสดงคำเตือนเพิ่มเติมจากข้อผิดพลาด
- `INFO` - รวมข้อความข้อมูล (การตั้งค่าเริ่มต้น)
- `DEBUG` - รวมข้อมูลการดีบักอย่างละเอียด

โดยค่าเริ่มต้น ระดับการบันทึกจะถูกตั้งค่าเป็น INFO เพื่อให้แน่ใจว่า SDK ให้ข้อมูลที่เกี่ยวข้องโดยไม่ทำให้คอนโซลของนักพัฒนาซอฟต์แวร์รก

หากต้องการแก้ไขระดับการบันทึก ให้อัปเดตคีย์ `Pushwoosh_LOG_LEVEL` ในไฟล์ `Info.plist` ของแอปของคุณ:

```xml
<key>Pushwoosh_LOG_LEVEL</key>
<string>YOUR_LOG_LEVEL</string>
```

หรือคุณสามารถเปลี่ยนระดับการบันทึกโดยใช้โค้ดด้านล่าง:

```swift
Pushwoosh.Debug.setLogLevel(.PW_LL_DEBUG)
```

แทนที่ `YOUR_LOG_LEVEL` ด้วยระดับที่ต้องการ (เช่น `DEBUG` หรือ `ERROR`)

## Custom `UNNotificationCenterDelegate`

หากคุณต้องการใช้ `UNNotificationCenterDelegate` ของคุณเอง (ตัวอย่างเช่น สำหรับการแจ้งเตือนในเครื่อง) คุณควรแจ้งให้ Pushwoosh SDK ทราบเพื่อการทำงานที่ถูกต้อง คุณสามารถทำได้ด้วยเมธอด `addNotificationCenterDelegate`:

<Tabs syncKey="code-example">
    <TabItem label="Swift">
    ```swift
    Pushwoosh.configure.addNotificationCenterDelegate(my_delegate)
    ```

    <LinkCard
        title="ตัวอย่าง (Swift)"
        href="https://github.com/Pushwoosh/pushwoosh-quickstart-ios/blob/main/customizing/customizing/Custom%20UNNotificationCenterDelegate/CustomNotificationCDViewConrtoller.swift#L23"
    />

    </TabItem>

    <TabItem label="Objective-C">
    ```objective-c
    [Pushwoosh.configure addNotificationCenterDelegate:my_delegate];
    ```

    <LinkCard
        title="ตัวอย่าง (Objective-C)"
        href="https://github.com/Pushwoosh/pushwoosh-quickstart-ios/blob/main/customizing/customizingObjC/customizingObjC/Custom%20UNNotificationCenterDelegate/PWCustomNotificationCDViewConrtoller.m#L28"
    />

    </TabItem>
</Tabs>

จากนั้น ให้ implement เมธอด `UNNotificationCenterDelegate` ใน delegate ของคุณ:

<Tabs syncKey="code-example">
  <TabItem label="Swift">

  ```swift
  func userNotificationCenter(
      _ center: UNUserNotificationCenter,
      willPresent notification: UNNotification,
      withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void
  ) {
      if (!PWMessage.isPushwooshMessage(notification.request.content.userInfo)) {
          // จัดการการแจ้งเตือนของคุณ
          completionHandler(UNNotificationPresentationOptions.alert)
      }
  }

  func userNotificationCenter(
      _ center: UNUserNotificationCenter,
      didReceive response: UNNotificationResponse,
      withCompletionHandler completionHandler: @escaping () -> Void
  ) {
      if (!PWMessage.isPushwooshMessage(response.notification.request.content.userInfo)) {
          // จัดการการแจ้งเตือนของคุณ
          completionHandler()
      }
  }
  ```

  <LinkCard title="ตัวอย่าง (Swift)" href="https://github.com/Pushwoosh/pushwoosh-quickstart-ios/blob/main/customizing/customizing/Custom%20UNNotificationCenterDelegate/CustomNotificationCDViewConrtoller.swift" />

  </TabItem>

  <TabItem label="Objective-C">

  ```objective-c
  - (void)userNotificationCenter:(UNNotificationCenter *)center
          willPresentNotification:(UNNotification *)notification
          withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler {
      if (![PWMessage isPushwooshMessage:notification.request.content.userInfo]) {
          // จัดการข้อความของคุณ
          completionHandler(UNNotificationPresentationOptionAlert);
      }
  }

  - (void)userNotificationCenter:(UNNotificationCenter *)center
          didReceiveNotificationResponse:(UNNotificationResponse *)response
          withCompletionHandler:(void (^)(void))completionHandler {
      if (![PWMessage.isPushwooshMessage:response.notification.request.content.userInfo]) {
          // จัดการข้อความของคุณ
          completionHandler();
      }
  }
  ```

  <LinkCard title="ตัวอย่าง (Objective-C)" href="https://github.com/Pushwoosh/pushwoosh-quickstart-ios/blob/main/customizing/customizingObjC/customizingObjC/Custom%20UNNotificationCenterDelegate/PWCustomNotificationCDViewConrtoller.m" />

  </TabItem>
</Tabs>

## การเริ่มต้น Pushwoosh แบบ Lazy (Lazy Initialization)

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

เมื่อเปิดใช้งานแฟล็กนี้ Pushwoosh SDK จะไม่เริ่มบริการจนกว่าจะมีการเรียกใช้เมธอดของ Pushwoosh iOS SDK อย่างชัดเจน

เพิ่มรายการต่อไปนี้ใน Info.plist:

```xml
<key>Pushwoosh_LAZY_INITIALIZATION</key>
<true/>
```

**กรณีการใช้งาน**
1. **การควบคุมการเริ่มต้น SDK** – แฟล็ก Pushwoosh_LAZY_INITIALIZATION ช่วยให้สามารถชะลอการเริ่มต้น Pushwoosh SDK ทำให้สามารถควบคุมเวลาที่บริการพุชจะเปิดใช้งานได้มากขึ้น

2. **การเลื่อนการเปิดใช้งานพุช** – ในบางแอปพลิเคชัน push notifications ควรเริ่มต้นภายใต้เงื่อนไขที่เฉพาะเจาะจงเท่านั้น การเปิดใช้งานแฟล็กนี้จะช่วยให้แน่ใจว่า Pushwoosh SDK จะเริ่มทำงานเมื่อมีการร้องขออย่างชัดเจนเท่านั้น

3. **การกำหนดค่าพุชเฉพาะผู้ใช้** – บางแอปพลิเคชันอาจต้องการปรับแต่งการตั้งค่า push notification ตามความต้องการของผู้ใช้หรือการตั้งค่าบัญชี ด้วยการเริ่มต้นแบบ lazy Pushwoosh SDK จะเริ่มทำงานหลังจากที่กำหนดค่าที่เหมาะสมแล้วเท่านั้น
## รายการคุณสมบัติ Info.plist ทั้งหมด

| คุณสมบัติ                                      | คำอธิบาย                                                                  | ค่าที่เป็นไปได้                                                                                  |
|-----------------------------------------------|------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------|
| `Pushwoosh_APPID`                             | ตั้งค่า Pushwoosh application ID สำหรับ production build                     | `XXXXX-XXXXX` <br /> **ประเภท**: String                                                             |
| `Pushwoosh_APPID_Dev`                         | ตั้งค่า Pushwoosh application ID สำหรับ development build                    | `XXXXX-XXXXX` <br /> **ประเภท**: String                                                             |
| `Pushwoosh_SHOW_ALERT`                        | แสดงการแจ้งเตือนเบื้องหน้า                                        | `YES` *(ค่าเริ่มต้น)* / `NO` <br /> **ประเภท**: Boolean                                                 |
| `Pushwoosh_ALERT_TYPE`                        | ตั้งค่ารูปแบบการแจ้งเตือน                                          | `BANNER` *(ค่าเริ่มต้น)* / `ALERT` / `NONE` <br /> **ประเภท**: String                                   |
| `Pushwoosh_BASEURL`                           | แทนที่ URL พื้นฐานของเซิร์ฟเวอร์ Pushwoosh                                    | [`https://cp.pushwoosh.com/json/1.3/`](https://cp.pushwoosh.com/json/1.3/) *(ค่าเริ่มต้น)* <br /> **ประเภท**: String |
| `Pushwoosh_AUTO_ACCEPT_DEEP_LINK_FOR_SILENT_PUSH` | หากเป็น `YES` Deep Links ที่ได้รับใน silent pushes จะถูกประมวลผลโดยอัตโนมัติ | `YES` *(ค่าเริ่มต้น)* / `NO` <br /> **ประเภท**: Boolean                                                 |
| `Pushwoosh_ALLOW_SERVER_COMMUNICATION`        | อนุญาตให้ SDK ส่งคำขอเครือข่ายไปยังเซิร์ฟเวอร์ Pushwoosh               | `YES` *(ค่าเริ่มต้น)* / `NO` <br /> **ประเภท**: Boolean                                                 |
| `Pushwoosh_ALLOW_COLLECTING_DEVICE_DATA`      | อนุญาตให้ SDK รวบรวมและส่งข้อมูลอุปกรณ์ (เวอร์ชัน OS, locale และรุ่น) ไปยังเซิร์ฟเวอร์ | `YES` *(ค่าเริ่มต้น)* / `NO` <br /> **ประเภท**: Boolean                                                 |
| `Pushwoosh_ALLOW_COLLECTING_DEVICE_OS_VERSION` | อนุญาตให้ SDK รวบรวมและส่งเวอร์ชัน OS ของอุปกรณ์ไปยังเซิร์ฟเวอร์   | `YES` *(ค่าเริ่มต้น)* / `NO` <br /> **ประเภท**: Boolean                                                 |
| `Pushwoosh_ALLOW_COLLECTING_DEVICE_LOCALE`    | อนุญาตให้ SDK รวบรวมและส่ง locale ของอุปกรณ์ไปยังเซิร์ฟเวอร์         | `YES` *(ค่าเริ่มต้น)* / `NO` <br /> **ประเภท**: Boolean                                                 |
| `Pushwoosh_ALLOW_COLLECTING_DEVICE_MODEL`     | อนุญาตให้ SDK รวบรวมและส่งรุ่นของอุปกรณ์ไปยังเซิร์ฟเวอร์          | `YES` *(ค่าเริ่มต้น)* / `NO` <br /> **ประเภท**: Boolean                                                 |
| `Pushwoosh_LOG_LEVEL`                         | ระดับการบันทึกของ Pushwoosh SDK สำหรับรายละเอียด โปรดดูที่ [การควบคุมระดับการบันทึก](#log-level) | `NONE` / `ERROR` / `WARNING` / `INFO` *(ค่าเริ่มต้น)* / `DEBUG` / `VERBOSE` <br /> **ประเภท**: String    |
| `Pushwoosh_PURCHASE_TRACKING_ENABLED`         | อนุญาตให้ SDK ติดตามการซื้อในแอป จำเป็นสำหรับ Customer Journey Builder | `YES` / `NO` *(ค่าเริ่มต้น)* <br /> **ประเภท**: Boolean                                                 |