# iOS SDK 자주 묻는 질문

### iOS 통합 FAQ

#### Q: Pushwoosh SDK를 제 iOS 프로젝트에 어떻게 설치할 수 있나요?
Swift Package Manager 또는 CocoaPods를 사용하여 Pushwoosh SDK를 통합할 수 있습니다.

#### Q: Swift Package Manager를 사용하여 Pushwoosh SDK를 어떻게 설치하나요?
Xcode에서 **Package Dependencies** 섹션으로 이동하여 다음 URL을 사용하여 패키지를 추가하세요: `https://github.com/Pushwoosh/Pushwoosh-XCFramework`.

#### Q: CocoaPods를 사용하여 Pushwoosh SDK를 어떻게 설치하나요?
프로젝트의 `Podfile`을 열고 `pod 'PushwooshXCFramework'` 줄을 추가합니다. 그런 다음 터미널에서 `pod install` 명령을 실행합니다.

#### Q: 푸시 알림을 활성화하기 위해 프로젝트에 어떤 기능을 추가해야 하나요?
프로젝트 설정의 Signing & Capabilities 섹션에서 `Push Notifications` 및 `Background Modes` 기능을 추가해야 합니다. `Background Modes`를 추가할 때 `Remote notifications` 확인란을 선택해야 합니다.

#### Q: Time Sensitive Notifications에 필요한 추가 기능은 무엇인가요?
Time Sensitive Notifications(iOS 15 이상)를 사용하려는 경우 `Time Sensitive Notifications` 기능도 추가해야 합니다.

#### Q: Pushwoosh 초기화 코드는 어디에 추가해야 하나요?
초기화 코드는 `AppDelegate` 클래스에 추가해야 합니다.

#### Q: SwiftUI의 AppDelegate에 어떤 초기화 코드를 추가해야 하나요?
[SwiftUI 프로젝트에 Pushwoosh를 통합하기 위해 제공된 Swift 코드 예제](/ko/developer/pushwoosh-sdk/ios-sdk/setting-up-pushwoosh-ios-sdk/basic-integration-guide/#appdelegate)를 참조하세요.


#### Q: 표준 Swift AppDelegate에 어떤 초기화 코드를 추가해야 하나요?
[표준 Swift 프로젝트에 Pushwoosh를 통합하기 위해 제공된 Swift 코드 예제](/ko/developer/pushwoosh-sdk/ios-sdk/setting-up-pushwoosh-ios-sdk/basic-integration-guide/#appdelegate)를 참조하세요.

#### Q: Objective-C AppDelegate에 어떤 초기화 코드를 추가해야 하나요?
[Objective-C 프로젝트에 Pushwoosh를 통합하기 위해 제공된 Objective-C 코드 예제](/ko/developer/pushwoosh-sdk/ios-sdk/setting-up-pushwoosh-ios-sdk/basic-integration-guide/#appdelegate)를 참조하세요.

#### Q: Info.plist 파일에 어떤 키를 추가해야 하나요?
앱의 `Info.plist` 파일에 Application Code로 설정된 `Pushwoosh_APPID` 키와 API Token으로 설정된 `PW_API_TOKEN` 키를 추가해야 합니다.

#### Q: 메시지 전송 추적의 목적은 무엇인가요?
Pushwoosh는 Notification Service Extension을 사용하여 푸시 알림의 전송 이벤트를 추적하는 것을 지원합니다.

#### Q: 프로젝트에 Notification Service Extension을 어떻게 추가하나요?
Xcode에서 **File** > **New** > **Target...**으로 이동하여 **Notification Service Extension**을 선택하고 **Next**를 누릅니다. 대상 이름을 입력하고 **Finish**를 누릅니다. 활성화하라는 메시지가 나타나면 **Cancel**을 누릅니다.

#### Q: Notification Service Extension에 Pushwoosh SDK를 어떻게 추가하나요?
Notification Service Extension의 메인 `.swift` 또는 `.m` 파일에 [제공된 Swift 또는 Objective-C 코드 스니펫](/ko/developer/pushwoosh-sdk/ios-sdk/setting-up-pushwoosh-ios-sdk/basic-integration-guide/#add-pushwoosh-sdk-to-notification-service-extension)을 추가하세요. 이 코드는 `PWNotificationExtensionManager`를 사용하여 알림 요청을 처리합니다.

#### Q: App Groups의 목적은 무엇인가요?
App Groups 기능은 Notification Service Extension이 메인 애플리케이션과 통신할 수 있도록 하는 데 필요합니다.

#### Q: 메인 타겟과 Notification Service Extension에 대해 App Groups를 어떻게 활성화하나요?
두 타겟 모두에 대해 **Signing & Capabilities**로 이동하여 **App Groups** 기능을 추가하고 + 버튼을 눌러 새 그룹을 만듭니다. 그룹 이름이 `group.`으로 시작하는지 확인하고 두 타겟에 동일한 그룹 이름을 사용하세요.

#### Q: App Groups를 위해 메인 타겟의 Info.plist에 어떤 키를 추가해야 하나요?
메인 타겟의 `Info.plist`에 `PW_APP_GROUPS_NAME` 키를 추가하고 그 값을 App Groups 그룹의 이름으로 설정하세요.

#### Q: Notification Service Extension의 Info.plist에 어떤 키를 추가해야 하나요?
Notification Service Extension의 `Info.plist`에 `PW_APP_GROUPS_NAME` 키(App Groups 이름으로 설정)와 `Pushwoosh_APPID` 키(Application Code로 설정)를 추가하세요.

#### Q: Pushwoosh 통합을 어떻게 확인하나요?
프로젝트를 빌드하고 실행한 후, Pushwoosh Control Panel로 이동하여 애플리케이션에 푸시 알림을 보냅니다. 기기에서 알림이 나타나는 것을 볼 수 있습니다.

#### Q: Pushwoosh SDK에서 푸시 알림을 처리하기 위한 두 가지 주요 콜백은 무엇인가요?
두 가지 주요 콜백은 `onMessageReceived`와 `onMessageOpened`입니다.

#### Q: `onMessageReceived` 콜백은 언제 호출되나요?
`onMessageReceived` 메서드는 애플리케이션이 푸시 알림을 수신할 때 호출됩니다.

#### Q: `onMessageOpened` 콜백은 언제 호출되나요?
`onMessageOpened` 메서드는 사용자가 푸시 알림과 상호 작용하고 열 때 호출됩니다.

#### Q: 수신되거나 열린 푸시 알림의 페이로드에 어떻게 접근할 수 있나요?
(`onMessageReceived` 및 `onMessageOpened` 콜백으로 전달되는) `PWMessage` 객체의 페이로드는 `payload` 속성을 통해 접근할 수 있습니다.

#### Q: Pushwoosh에서 사용자 ID를 어떻게 설정할 수 있나요?
`Pushwoosh.sharedInstance()` 객체의 `setUserId(_:)` 메서드를 사용하고 사용자의 ID를 인수로 전달하세요.

#### Q: Pushwoosh에서 사용자의 이메일 주소를 어떻게 설정할 수 있나요?
`Pushwoosh.sharedInstance()` 객체의 `setEmail(_:)` 메서드를 사용하여 사용자의 이메일을 제공하세요.

#### Pushwoosh에서 추가 사용자 정보를 태그로 어떻게 설정할 수 있나요?
`Pushwoosh.sharedInstance()` 객체의 `setTags(_:)` 메서드를 사용하고, 키가 태그 이름이고 값이 해당 태그 값인 딕셔너리를 전달하세요.

#### 추가 속성으로 사용자 이벤트를 어떻게 추적할 수 있나요?**
`PWInAppManager.shared()`의 `postEvent(_:withAttributes:)` 메서드를 사용하고, 이벤트 이름(예: `"login"`)과 속성 딕셔너리(예: `"name"`, `"last_login"`)를 제공하세요.

#### Q: 제품 세부 정보와 함께 사용자 구매 이벤트를 어떻게 추적할 수 있나요?
`PWInAppManager.shared()`의 `postEvent(_:withAttributes:)` 메서드를 이벤트 이름 `"purchase"`와 `"product_id"`, `"product_name"`, `"price"`, `"quantity"`와 같은 제품 세부 정보가 포함된 딕셔너리와 함께 사용하세요.

#### Q: 리치 미디어 표시를 처리하기 위해 델리게이트를 어떻게 설정하나요?
뷰 컨트롤러나 다른 적절한 클래스에서 `PWRichMediaPresentingDelegate` 프로토콜을 준수하고 `PWRichMediaManager.shared()`의 `delegate` 속성을 준수하는 인스턴스로 설정하세요.

#### Q: 리치 미디어의 표시 스타일을 어떻게 구성할 수 있나요?
`PWModalWindowConfiguration.shared()` 객체를 사용하여 `configureModalWindow(with:present:dismiss:)` 메서드를 통해 모달 창 위치 및 표시/해제 애니메이션과 같은 속성을 구성하세요.

#### Q: 리치 미디어 델리게이트 메서드에서 어떤 정보에 접근할 수 있나요?**
델리게이트 메서드는 리치 미디어 콘텐츠에 대한 정보( `pushPayload` 포함)를 담고 있는 `PWRichMedia` 객체에 대한 접근을 제공합니다. `presentingDidFailForRichMedia:withError:` 메서드는 실패를 설명하는 `Error` 객체도 제공합니다.


### 문제 해결

<Aside type="caution">
로드 밸런싱 목적으로 애플리케이션의 API 엔드포인트를 변경해야 할 수 있습니다. 이는 자동으로 발생하며 저희 SDK에서 처리합니다. **앱에서 \*.pushwoosh.com을 포함하는 모든 URL에 대한 접근을 차단하는 것이 없는지 확인해 주세요.**
</Aside>

<Aside type="note">
#### 방화벽 뒤에 있거나 WiFi 라우터가 방화벽 역할을 하는 경우

기기가 WiFi를 통해 인터넷에 연결되어 있고 메시지가 기기에 도달하지 않는 경우, **방화벽에 의해 APNs 포트가 차단되지 않았는지 확인해 주세요.**\
푸시 제공업체, iOS 기기 및 Mac 컴퓨터는 종종 방화벽 뒤에 있습니다. 알림을 보내려면 포트 2195를 통해 인바운드 및 아웃바운드 TCP 패킷을 허용해야 합니다. **Wi-Fi**를 통해 푸시 서비스에 연결하는 기기 및 컴퓨터는 포트 5223을 통해 인바운드 및 아웃바운드 TCP 패킷을 허용해야 합니다.\
푸시 서비스의 IP 주소 범위는 변경될 수 있으며, 제공업체는 IP 주소 대신 호스트 이름으로 연결해야 합니다. 푸시 서비스는 동일한 호스트 이름에 대해 다른 IP 주소를 생성하는 로드 밸런싱 체계를 사용합니다. 그러나 전체 17.0.0.0/8 주소 블록은 Apple에 할당되어 있으므로 방화벽 규칙에서 해당 범위를 지정할 수 있습니다.
</Aside>

#### Q: "Your provisioning profile does not have APS entry" 오류

"Your provisioning profile does not have APS entry." 오류 메시지가 표시되면 프로비저닝 프로필이 푸시와 호환되고 `production` 또는 `development` 값을 가진 `aps-environment` 문자열이 포함되어 있는지 확인하세요. 가장 쉬운 확인 방법은 모바일 프로비저닝 프로필을 텍스트 편집기에서 열고 `aps-environment` 문자열을 찾는 것입니다. 그곳에 있어야 합니다.

만약 있는데도 계속 오류가 발생한다면, XCode가 여전히 "푸시 비호환" 프로필을 선택하고 있다는 의미입니다. 올바른 프로필로 서명했는지 확인하세요. 때로는 동일한 App ID에 대해 두 개의 프로필이 있을 경우 XCode가 혼동하여 이전 프로필로 서명하는 경우가 있습니다.

권장되는 단계는 다음과 같습니다:

1. 모든 XCode 프로필을 [제거](https://stackoverflow.com/questions/18923095/delete-provisioning-profile-from-xcode-5)합니다;
2. 새 프로필 하나만 추가합니다;
3. 앱을 다시 빌드합니다.

#### Q: iOS 푸시 토큰과 hwid는 어떻게 생겼나요?

iOS 기기 푸시 토큰은 64개의 16진수 기호로 이루어진 문자열입니다. 푸시 토큰 예시:\
`03df25c845d460bcdad7802d2vf6fc1dfde97283bf75cc993eb6dca835ea2e2f`\
API 요청에서 특정 기기를 타겟팅할 때 사용하는 iOS 푸시 토큰이 **소문자**인지 확인하세요.

Pushwoosh는 기기 HWID로 IDFV를 사용합니다. 사용자가 특정 공급업체의 모든 앱을 다시 설치하는 경우 변경될 수 있다는 점에 유의하세요.

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

#### Q: 앱이 실행 중일 때 배너를 켜고 끄려면 어떻게 하나요?

기본적으로 최신 iOS SDK는 앱이 포그라운드에서 실행 중일 때 알림 배너를 표시합니다.\
Info.plist에서 다음 플래그를 변경하여 이 동작을 제어할 수 있습니다:

플래그 `Pushwoosh_ALERT_TYPE` – 문자열 유형, 값은 다음과 같습니다:

* `BANNER` – 기본값, 배너 인앱 알림을 표시합니다
* `ALERT` – 경고 알림
* `NONE` – 앱이 포그라운드에 있을 때 알림을 표시하지 않습니다

#### Q: Test Devices에서 사용할 iOS 기기 푸시 토큰을 어떻게 얻나요?

iOS 기기 푸시 토큰을 얻으려면,

1. Xcode => Devices & Simulators를 엽니다;
2. 테스트 기기를 컴퓨터에 연결합니다;
3. 왼쪽의 기기 목록에서 연결된 기기를 선택합니다;
4. Open Console 버튼을 클릭합니다.

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

기기 푸시 토큰이 필요한 애플리케이션을 실행하고, “Registered for push notifications” 줄에서 64자 16진수 기기 푸시 토큰을 찾으세요:

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

#### Q: 앱을 제거했다가 짧은 시간 내에 다시 설치하면 왜 배지가 지워지지 않나요?

이는 예상된 동작입니다. 배지는 iOS 자체에서 처리되며 그 값은 애플리케이션 환경 설정에 저장되는데, 앱을 제거할 때 즉시 제거되지 않습니다. 즉시 재설치할 경우를 대비해 배지 값은 일정 시간 동안 남아있게 되어, 앱을 다시 설치한 후에도 동일한 배지가 표시됩니다.