# คำถามที่พบบ่อยเกี่ยวกับ iOS SDK

### คำถามที่พบบ่อยเกี่ยวกับการผสานรวม iOS

#### ถาม: ฉันจะติดตั้ง Pushwoosh SDK ลงในโปรเจกต์ iOS ของฉันได้อย่างไร
คุณสามารถผสานรวม Pushwoosh SDK โดยใช้ Swift Package Manager หรือ CocoaPods

#### ถาม: ฉันจะติดตั้ง Pushwoosh SDK โดยใช้ Swift Package Manager ได้อย่างไร
ใน Xcode ไปที่ส่วน **Package Dependencies** และเพิ่ม package โดยใช้ URL ต่อไปนี้: `https://github.com/Pushwoosh/Pushwoosh-XCFramework`

#### ถาม: ฉันจะติดตั้ง Pushwoosh SDK โดยใช้ CocoaPods ได้อย่างไร
เปิด `Podfile` ของโปรเจกต์ของคุณและเพิ่มบรรทัด `pod 'PushwooshXCFramework'` จากนั้นรันคำสั่ง `pod install` ใน terminal

#### ถาม: ฉันต้องเพิ่ม capabilities ใดบ้างในโปรเจกต์ของฉันเพื่อเปิดใช้งาน Push Notifications
ในส่วน Signing & Capabilities ของการตั้งค่าโปรเจกต์ของคุณ คุณต้องเพิ่ม capabilities `Push Notifications` และ `Background Modes` เมื่อเพิ่ม `Background Modes` ตรวจสอบให้แน่ใจว่าคุณได้เลือกช่องสำหรับ `Remote notifications`

#### ถาม: ต้องใช้ capability เพิ่มเติมใดสำหรับ Time Sensitive Notifications
หากคุณต้องการใช้ Time Sensitive Notifications (iOS 15+) คุณต้องเพิ่ม capability `Time Sensitive Notifications` ด้วย

#### ถาม: ฉันต้องเพิ่มโค้ดเริ่มต้นของ Pushwoosh ที่ไหน
ต้องเพิ่มโค้ดเริ่มต้นในคลาส `AppDelegate` ของคุณ

#### ถาม: ฉันควรเพิ่มโค้ดเริ่มต้นใดใน AppDelegate ของ SwiftUI
โปรดดู [ตัวอย่างโค้ด Swift ที่ให้ไว้สำหรับการผสานรวม Pushwoosh ในโปรเจกต์ SwiftUI](/th/developer/pushwoosh-sdk/ios-sdk/setting-up-pushwoosh-ios-sdk/basic-integration-guide/#appdelegate)


#### ถาม: ฉันควรเพิ่มโค้ดเริ่มต้นใดใน AppDelegate ของ Swift มาตรฐาน
โปรดดู [ตัวอย่างโค้ด Swift ที่ให้ไว้สำหรับการผสานรวม Pushwoosh ในโปรเจกต์ Swift มาตรฐาน](/th/developer/pushwoosh-sdk/ios-sdk/setting-up-pushwoosh-ios-sdk/basic-integration-guide/#appdelegate)

#### ถาม: ฉันควรเพิ่มโค้ดเริ่มต้นใดใน AppDelegate ของ Objective-C
โปรดดู [ตัวอย่างโค้ด Objective-C ที่ให้ไว้สำหรับการผสานรวม Pushwoosh ในโปรเจกต์ Objective-C](/th/developer/pushwoosh-sdk/ios-sdk/setting-up-pushwoosh-ios-sdk/basic-integration-guide/#appdelegate)

#### ถาม: ฉันต้องเพิ่มคีย์ใดบ้างในไฟล์ Info.plist ของฉัน
คุณต้องเพิ่มคีย์ `Pushwoosh_APPID` ที่ตั้งค่าเป็น Application Code ของคุณ และคีย์ `PW_API_TOKEN` ที่ตั้งค่าเป็น API Token ของคุณในไฟล์ `Info.plist` ของแอป

#### ถาม: วัตถุประสงค์ของการติดตามการส่งข้อความคืออะไร
Pushwoosh รองรับการติดตามเหตุการณ์การส่งสำหรับการแจ้งเตือนแบบพุชโดยใช้ Notification Service Extension

#### ถาม: ฉันจะเพิ่ม Notification Service Extension ในโปรเจกต์ของฉันได้อย่างไร
ใน Xcode ไปที่ **File** > **New** > **Target...** เลือก **Notification Service Extension** และกด **Next** ป้อนชื่อ target แล้วกด **Finish** เมื่อได้รับแจ้งให้เปิดใช้งาน ให้กด **Cancel**

#### ถาม: ฉันจะเพิ่ม Pushwoosh SDK ไปยัง Notification Service Extension ได้อย่างไร
เพิ่ม [ตัวอย่างโค้ด Swift หรือ Objective-C ที่ให้ไว้](/th/developer/pushwoosh-sdk/ios-sdk/setting-up-pushwoosh-ios-sdk/basic-integration-guide/#add-pushwoosh-sdk-to-notification-service-extension) ไปยังไฟล์ `.swift` หรือ `.m` หลักของ Notification Service Extension ของคุณ โค้ดนี้ใช้ `PWNotificationExtensionManager` เพื่อจัดการคำขอการแจ้งเตือน

#### ถาม: วัตถุประสงค์ของ App Groups คืออะไร
จำเป็นต้องมี capability ของ App Groups เพื่อให้ Notification Service Extension สามารถสื่อสารกับแอปพลิเคชันหลักได้

#### ถาม: ฉันจะเปิดใช้งาน App Groups สำหรับ target หลักและ Notification Service Extension ของฉันได้อย่างไร
สำหรับทั้งสอง target ไปที่ **Signing & Capabilities** เพิ่ม capability **App Groups** และสร้างกลุ่มใหม่โดยกดปุ่ม + ตรวจสอบให้แน่ใจว่าชื่อกลุ่มขึ้นต้นด้วย `group.` และใช้ชื่อกลุ่มเดียวกันสำหรับทั้งสอง target

#### ถาม: ฉันต้องเพิ่มคีย์ใดบ้างใน Info.plist ของ target หลักสำหรับ App Groups
ใน `Info.plist` ของ target หลักของคุณ ให้เพิ่มคีย์ `PW_APP_GROUPS_NAME` และตั้งค่าเป็นชื่อกลุ่ม App Groups ของคุณ

#### ถาม: ฉันต้องเพิ่มคีย์ใดบ้างใน Info.plist ของ Notification Service Extension ของฉัน
ใน `Info.plist` ของ Notification Service Extension ของคุณ ให้เพิ่มคีย์ `PW_APP_GROUPS_NAME` (ตั้งค่าเป็นชื่อ App Groups ของคุณ) และคีย์ `Pushwoosh_APPID` (ตั้งค่าเป็น Application Code ของคุณ)

#### ถาม: ฉันจะตรวจสอบการผสานรวม Pushwoosh ได้อย่างไร
หลังจากสร้างและรันโปรเจกต์ของคุณแล้ว ให้ไปที่ Pushwoosh Control Panel และส่งการแจ้งเตือนแบบพุชไปยังแอปพลิเคชันของคุณ คุณควรเห็นการแจ้งเตือนปรากฏบนอุปกรณ์ของคุณ

#### ถาม: callback หลักสองตัวสำหรับการจัดการการแจ้งเตือนแบบพุชใน Pushwoosh SDK คืออะไร
callback หลักสองตัวคือ `onMessageReceived` และ `onMessageOpened`

#### ถาม: callback `onMessageReceived` ถูกเรียกใช้เมื่อใด
เมธอด `onMessageReceived` จะถูกเรียกเมื่อแอปพลิเคชันได้รับการแจ้งเตือนแบบพุช

#### ถาม: callback `onMessageOpened` ถูกเรียกใช้เมื่อใด
เมธอด `onMessageOpened` จะถูกเรียกเมื่อผู้ใช้โต้ตอบและเปิดการแจ้งเตือนแบบพุช

#### ถาม: ฉันจะเข้าถึง payload ของการแจ้งเตือนแบบพุชที่ได้รับหรือเปิดได้อย่างไร
payload ของอ็อบเจกต์ `PWMessage` (ที่ส่งไปยัง callback `onMessageReceived` และ `onMessageOpened`) สามารถเข้าถึงได้ผ่านคุณสมบัติ `payload` ของมัน

#### ถาม: ฉันจะตั้งค่า User ID ใน Pushwoosh ได้อย่างไร
ใช้เมธอด `setUserId(_:)` ของอ็อบเจกต์ `Pushwoosh.sharedInstance()` โดยส่ง ID ของผู้ใช้เป็นอาร์กิวเมนต์

#### ถาม: ฉันจะตั้งค่าที่อยู่อีเมลของผู้ใช้ใน Pushwoosh ได้อย่างไร
ใช้เมธอด `setEmail(_:)` ของอ็อบเจกต์ `Pushwoosh.sharedInstance()` โดยระบุอีเมลของผู้ใช้

#### ฉันจะตั้งค่าข้อมูลผู้ใช้เพิ่มเติมเป็น tag ใน Pushwoosh ได้อย่างไร
ใช้เมธอด `setTags(_:)` ของอ็อบเจกต์ `Pushwoosh.sharedInstance()` โดยส่ง dictionary ที่คีย์เป็นชื่อ tag และค่าเป็นค่า tag ที่สอดคล้องกัน

#### ฉันจะติดตาม event ของผู้ใช้พร้อมกับ attribute เพิ่มเติมได้อย่างไร**
ใช้เมธอด `postEvent(_:withAttributes:)` ของ `PWInAppManager.shared()` โดยระบุชื่อ event (เช่น `"login"`) และ dictionary ของ attribute (เช่น `"name"`, `"last_login"`)

#### ถาม: ฉันจะติดตาม event การซื้อของผู้ใช้พร้อมรายละเอียดสินค้าได้อย่างไร
ใช้เมธอด `postEvent(_:withAttributes:)` ของ `PWInAppManager.shared()` ด้วยชื่อ event `"purchase"` และ dictionary ที่มีรายละเอียดสินค้า เช่น `"product_id"`, `"product_name"`, `"price"` และ `"quantity"`

#### ถาม: ฉันจะตั้งค่า delegate เพื่อจัดการการนำเสนอ rich media ได้อย่างไร
ใน view controller ของคุณหรือคลาสที่เหมาะสมอื่น ๆ ให้สอดคล้องกับโปรโตคอล `PWRichMediaPresentingDelegate` และตั้งค่าคุณสมบัติ `delegate` ของ `PWRichMediaManager.shared()` เป็นอินสแตนซ์ที่สอดคล้องของคุณ

#### ถาม: ฉันจะกำหนดค่ารูปแบบการนำเสนอของ rich media ได้อย่างไร
ใช้อ็อบเจกต์ `PWModalWindowConfiguration.shared()` เพื่อกำหนดค่าคุณสมบัติต่างๆ เช่น ตำแหน่งหน้าต่างโมดอล และแอนิเมชันการนำเสนอ/ปิด โดยใช้เมธอด `configureModalWindow(with:present:dismiss:)`

#### ถาม: ฉันสามารถเข้าถึงข้อมูลใดได้บ้างในเมธอด delegate ของ rich media**
เมธอด delegate ให้การเข้าถึงอ็อบเจกต์ `PWRichMedia` ซึ่งมีข้อมูลเกี่ยวกับเนื้อหา rich media รวมถึง `pushPayload` ของมัน เมธอด `presentingDidFailForRichMedia:withError:` ยังให้อ็อบเจกต์ `Error` ที่อธิบายถึงความล้มเหลวด้วย


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

<Aside type="caution">
เพื่อวัตถุประสงค์ในการทำ load balancing เราอาจต้องเปลี่ยน API endpoints ในแอปพลิเคชันของคุณ สิ่งนี้จะเกิดขึ้นโดยอัตโนมัติและจัดการโดย SDK ของเรา **โปรดตรวจสอบให้แน่ใจว่าไม่มีสิ่งใดในแอปของคุณที่บล็อกการเข้าถึง URL ใดๆ ที่มี \*.pushwoosh.com**
</Aside>

<Aside type="note">
#### หากคุณอยู่หลัง Firewall หรือเราเตอร์ WiFi ของคุณทำหน้าที่เป็น Firewall

หากอุปกรณ์ของคุณเชื่อมต่อกับอินเทอร์เน็ตผ่าน WiFi และข้อความไม่ส่งถึงอุปกรณ์ โปรด**ตรวจสอบให้แน่ใจว่าพอร์ต APNs ไม่ได้ถูกบล็อกโดย firewall ของคุณ**\
ผู้ให้บริการ Push, อุปกรณ์ iOS และคอมพิวเตอร์ Mac มักจะอยู่หลัง firewall หากต้องการส่งการแจ้งเตือน คุณจะต้องอนุญาตแพ็กเก็ต TCP ขาเข้าและขาออกผ่านพอร์ต 2195 อุปกรณ์และคอมพิวเตอร์ที่เชื่อมต่อกับบริการ push ผ่าน **Wi-Fi จะต้องอนุญาตแพ็กเก็ต TCP ขาเข้าและขาออกผ่านพอร์ต 5223**\
ช่วงที่อยู่ IP สำหรับบริการ push อาจเปลี่ยนแปลงได้ ผู้ให้บริการควรเชื่อมต่อด้วยชื่อโฮสต์แทนที่อยู่ IP บริการ Push ใช้รูปแบบการทำ load balancing ซึ่งให้ที่อยู่ IP ที่แตกต่างกันสำหรับชื่อโฮสต์เดียวกัน อย่างไรก็ตาม บล็อกที่อยู่ 17.0.0.0/8 ทั้งหมดถูกกำหนดให้กับ Apple ดังนั้นคุณสามารถระบุช่วงนั้นในกฎ firewall ของคุณได้
</Aside>

#### ถาม: ข้อผิดพลาด "Your provisioning profile does not have APS entry"

หากคุณเห็นข้อความแสดงข้อผิดพลาด "Your provisioning profile does not have APS entry." ตรวจสอบให้แน่ใจว่า provisioning profile ของคุณเข้ากันได้กับ push และมีสตริง `aps-environment` อยู่ในนั้นพร้อมกับค่า `production` หรือ `development` วิธีที่ง่ายที่สุดในการตรวจสอบคือการเปิด mobile provisioning profile ในโปรแกรมแก้ไขข้อความใดๆ และมองหาสตริง `aps-environment` ซึ่งควรจะอยู่ที่นั่น

หากมีอยู่แล้ว และคุณยังคงได้รับข้อผิดพลาด แสดงว่า XCode ยังคงเลือกโปรไฟล์ที่ "ไม่รองรับ push" โปรดตรวจสอบให้แน่ใจว่าคุณได้ลงนามด้วยโปรไฟล์ที่ถูกต้อง - บางครั้งหากคุณมีสองโปรไฟล์สำหรับ App ID เดียวกัน XCode อาจทำให้เกิดความสับสนและลงนามด้วยโปรไฟล์เก่า

ขั้นตอนที่แนะนำคือ:

1. [ลบ](https://stackoverflow.com/questions/18923095/delete-provisioning-profile-from-xcode-5) โปรไฟล์ XCode ทั้งหมด
2. เพิ่มโปรไฟล์ใหม่เพียงโปรไฟล์เดียว
3. สร้างแอปขึ้นมาใหม่

#### ถาม: iOS push token และ hwid มีลักษณะอย่างไร

iOS device push token เป็นสตริงที่มีสัญลักษณ์เลขฐานสิบหก 64 ตัวอย่าง push token:\
`03df25c845d460bcdad7802d2vf6fc1dfde97283bf75cc993eb6dca835ea2e2f`\
ตรวจสอบให้แน่ใจว่า iOS push token ที่คุณใช้เมื่อกำหนดเป้าหมายอุปกรณ์เฉพาะในคำขอ API ของคุณเป็น**ตัวพิมพ์เล็ก**

Pushwoosh ใช้ IDFV เป็น HWID ของอุปกรณ์ โปรดทราบว่าอาจมีการเปลี่ยนแปลงในกรณีที่ผู้ใช้ติดตั้งแอปทั้งหมดจากผู้จำหน่ายรายเดียวกันใหม่

`CBAF8ED1-17FB-49A3-73BD-DC79B63AEF93`

#### ถาม: ฉันจะเปิดและปิดแบนเนอร์เมื่อแอปของฉันกำลังทำงานได้อย่างไร

โดยค่าเริ่มต้น iOS SDK ล่าสุดของเราจะแสดงแบนเนอร์การแจ้งเตือนเมื่อแอปทำงานในเบื้องหน้า (foreground)\
คุณสามารถควบคุมพฤติกรรมนี้ได้โดยการเปลี่ยน flag ต่อไปนี้ใน Info.plist:

Flag `Pushwoosh_ALERT_TYPE` – ประเภทสตริง ค่าคือ:

* `BANNER` – ค่าเริ่มต้น แสดงการแจ้งเตือนแบนเนอร์ในแอป
* `ALERT` – การแจ้งเตือนแบบ alert
* `NONE` – ไม่แสดงการแจ้งเตือนเมื่อแอปอยู่ในเบื้องหน้า

#### ถาม: ฉันจะรับ iOS device push token ของฉันเพื่อใช้ใน Test Devices ได้อย่างไร

หากต้องการรับ iOS device push token ของคุณ

1. เปิด Xcode => Devices & Simulators;
2. เชื่อมต่ออุปกรณ์ทดสอบกับคอมพิวเตอร์ของคุณ
3. เลือกอุปกรณ์ที่เชื่อมต่อของคุณในรายการอุปกรณ์ทางด้านซ้าย
4. คลิกปุ่ม Open Console

<img src="/ios-push-notifications-ios-faq-1.webp" alt=""/>

เปิดแอปพลิเคชันที่คุณต้องการ device push token และค้นหา device push token ที่เป็นอักขระเลขฐานสิบหก 64 ตัวของคุณในบรรทัด “Registered for push notifications”:

<img src="/ios-push-notifications-ios-faq-2.webp" alt=""/>

#### ถาม: ทำไม badge ถึงไม่ถูกล้างหลังจากที่ฉันถอนการติดตั้งแอปและติดตั้งใหม่ในระยะเวลาสั้นๆ

นี่เป็นพฤติกรรมที่คาดไว้ - badge จะถูกจัดการโดย iOS เองและค่าของมันจะถูกเก็บไว้ในการตั้งค่าของแอปพลิเคชัน ซึ่งจะไม่ถูกลบออกทันทีเมื่อคุณถอนการติดตั้งแอปของคุณ ค่า badge จะยังคงอยู่ที่นั่นชั่วขณะหนึ่งในกรณีที่มีการติดตั้งใหม่ทันที ส่งผลให้ badge เดิมยังคงแสดงอยู่หลังจากติดตั้งแอปใหม่