# Flutter SDK 기본 통합 가이드

이 섹션에서는 Pushwoosh Flutter SDK를 애플리케이션에 통합하는 방법에 대한 정보를 제공합니다.

## 전제 조건

Pushwoosh Flutter SDK를 앱에 통합하려면 다음이 필요합니다:

<Aside type="note" title="요구 사항">
 - [Pushwoosh 계정](https://sso.pushwoosh.com/login).
 - 계정에 설정된 [Pushwoosh 프로젝트](/ko/product/first-steps/start-with-your-project/create-your-project).
 - **iOS 통합의 경우:**
    - 푸시 알림을 보내도록 구성된 iOS 플랫폼. 가장 간단한 접근 방식으로 [토큰 기반 인증 구성](/ko/developer/first-steps/connect-messaging-services/ios-configuration/ios-token-based-configuration/)을 사용하는 것을 권장합니다.
    - 시뮬레이터로 푸시를 보내려면 Gateway를 `Sandbox`로 설정하세요.
 - **Android 통합의 경우:**
    - [구성된 Android 플랫폼](/ko/developer/first-steps/connect-messaging-services/android-configuration/android-firebase-configuration)
    - Firebase 프로젝트의 `google-services.json` 파일 및 `package name`.
    - Android 애플리케이션에 연결된 Firebase 프로젝트. 필요한 경우 [Firebase 설정 가이드](https://firebase.google.com/docs/android/setup#manually_add_firebase)를 따르세요.
 - 애플리케이션에 대한 Pushwoosh 제어판의 `Pushwoosh Application Code` 및 [Pushwoosh Device API Token](/ko/developer/api-reference/api-access-token/#device-api-token).
</Aside>

## 통합 단계

### 1. Pushwoosh Flutter SDK 종속성 추가

`pubspec.yaml` 파일에 `pushwoosh_flutter` 패키지를 추가합니다:

```yaml title="pubspec.yaml"
dependencies:
  flutter:
    sdk: flutter
  # https://pub.dev/packages/pushwoosh_flutter 에서 최신 버전을 사용하세요
  pushwoosh_flutter: ^[LATEST_VERSION]
```
pub.dev에서 [최신 버전](https://pub.dev/packages/pushwoosh_flutter)을 확인하세요.

그런 다음, 프로젝트의 루트 디렉터리에서 다음 명령을 실행하여 종속성을 설치합니다:

```bash
flutter pub get
```

패키지가 올바르게 설치되었는지 다시 확인하세요:
```bash
flutter pub deps | grep pushwoosh_flutter

# 예시 출력:
# ❯ flutter pub deps | grep pushwoosh_flutter
# └── pushwoosh_flutter 2.3.11
```

### 2. Flutter SDK 초기화

`main.dart` 파일의 루트 컴포넌트에서:
- `pushwoosh_flutter` 패키지를 가져옵니다.
- Pushwoosh SDK를 초기화합니다.
- 초기화 로직에서 `registerForPushNotifications()`를 호출하여 푸시 알림을 등록합니다.

```dart title="main.dart"
import 'package:pushwoosh_flutter/pushwoosh_flutter.dart';

void main() async {
  runApp(const MyApp());
  Pushwoosh.initialize({
    "app_id": "__YOUR_APP_ID__"
  });
  Pushwoosh.getInstance.registerForPushNotifications();
}
```

여기서:
- `__YOUR_APP_ID__`는 Pushwoosh 제어판의 애플리케이션 코드입니다.


### 3. iOS 네이티브 설정

#### 3.1 기능(Capabilities)

프로젝트에서 푸시 알림을 활성화하려면 특정 기능을 추가해야 합니다.

Signing & Capabilities 섹션에서 다음 기능을 추가합니다:
- `Push Notifications`
- `Background Modes`. 이 기능을 추가한 후 `Remote notifications` 확인란을 선택합니다.

Time Sensitive Notifications(iOS 15+)를 사용하려는 경우 `Time Sensitive Notifications` 기능도 추가합니다.

#### 3.2 Info.plist

`Runner/Info.plist`에서 `__PUSHWOOSH_DEVICE_API_TOKEN__` 키를 [Pushwoosh Device API Token](/ko/developer/api-reference/api-access-token/#device-api-token)으로 설정합니다:
```swift title="info.plist"
<key>Pushwoosh_API_TOKEN</key>
<string>__PUSHWOOSH_DEVICE_API_TOKEN__</string>
```

#### 3.3 메시지 전송 추적

프로젝트에 Notification Service Extension 타겟을 추가해야 합니다. 이는 정확한 전송 추적 및 iOS의 Rich Media와 같은 기능에 필수적입니다.

[네이티브 가이드의 단계](/ko/developer/pushwoosh-sdk/ios-sdk/setting-up-pushwoosh-ios-sdk/basic-integration-guide/#4-message-delivery-tracking)에 따라 확장 타겟과 그 안에 필요한 Pushwoosh 코드를 추가하세요.

Notification Service Extension이 Flutter 프로젝트에 올바르게 통합되었는지 확인하려면 다음 Podfile 구성을 사용해야 합니다:

```ruby title="Podfile"
target 'NotificationServiceExtension' do
  use_frameworks!
  use_modular_headers!

  pod 'PushwooshXCFramework'

  inherit! :search_paths
end
```

#### 3.4 iOS Flutter 프로젝트용 종속성 설치

iOS Flutter 프로젝트용 종속성을 설치하려면 다음 명령을 실행합니다:

```bash
flutter run
```

또는 터미널에서 `ios` 폴더로 이동하여 다음을 실행합니다:

```bash
pod install --repo-update
```

### 4. Android 네이티브 설정

#### 4.1 종속성 설치

필요한 종속성과 플러그인이 Gradle 스크립트에 추가되었는지 확인합니다:

프로젝트 수준의 `build.gradle` 종속성에 Google Services Gradle 플러그인을 추가합니다:

```groovy title="android/build.gradle"
buildscript {
  dependencies {
    classpath 'com.google.gms:google-services:4.3.15'
  }
}
```

앱 수준의 `build.gradle` 파일에 플러그인을 적용합니다:

```groovy title="app/build.gradle"
apply plugin: 'com.google.gms.google-services'
```

#### 4.2 Firebase 구성 파일 추가

프로젝트 디렉터리의 `android/app` 폴더에 `google-services.json` 파일을 넣습니다.

#### 4.3 Pushwoosh 메타데이터 추가

`main/AndroidManifest.xml`의 `<application>` 태그 안에 [Pushwoosh Device API Token](/ko/developer/api-reference/api-access-token/#device-api-token)을 추가합니다:

```xml title="AndroidManifest.xml"
<meta-data android:name="com.pushwoosh.apitoken" android:value="__YOUR_DEVICE_API_TOKEN__" />
```

> **중요:** Pushwoosh 제어판에서 토큰이 올바른 앱에 액세스할 수 있도록 하세요. [자세히 알아보기](/ko/developer/api-reference/api-access-token/#edit-token)

### 5. 프로젝트 실행

1. 프로젝트를 빌드하고 실행합니다.
2. Pushwoosh 제어판으로 이동하여 [푸시 알림을 보냅니다](/ko/product/messaging-channels/push-notifications/send-push-notifications/one-time-push).
3. 앱에서 알림을 볼 수 있습니다.

## 확장 통합

이 단계에서는 이미 SDK를 통합하여 푸시 알림을 보내고 받을 수 있습니다. 이제 핵심 기능을 살펴보겠습니다.

### 푸시 알림 이벤트 리스너

Pushwoosh SDK에는 푸시 알림 처리를 위해 설계된 두 개의 이벤트 리스너가 있습니다:

- `onPushReceived` 이벤트는 푸시 알림을 수신할 때 트리거됩니다.
- `onPushAccepted` 이벤트는 사용자가 알림을 열 때 트리거됩니다.

애플리케이션 시작 시 SDK 초기화 직후에 이러한 이벤트 리스너를 설정해야 합니다:

```dart
import 'package:pushwoosh_flutter/pushwoosh_flutter.dart';

class PushwooshNotificationHandler {
  void setupPushListeners(Pushwoosh pushwoosh) {

    pushwoosh.onPushReceived.listen((event) {
      print("Push received: ${event.pushwooshMessage.payload}");
    });

    pushwoosh.onPushAccepted.listen((event) {
      print("Push accepted: ${event.pushwooshMessage.payload}");
    });
    
  }
}
```

### 사용자 구성

개별 사용자 행동 및 선호도에 초점을 맞춤으로써 개인화된 콘텐츠를 제공하여 사용자 만족도와 충성도를 높일 수 있습니다.

```dart
import 'package:pushwoosh_flutter/pushwoosh_flutter.dart';

class Registration {
  void afterUserLogin(User user) {
  
    // 사용자 ID 설정
    Pushwoosh().setUserId(user.getId());
    
    // 사용자 이메일 설정
    Pushwoosh().setEmail(user.getEmail());

    // SMS 번호 등록
    // SMS 및 WhatsApp 번호는 E.164 형식(예: "+1234567890")이어야 하며 유효해야 합니다.
    Pushwoosh().registerSmsNumber(user.getSmsNumber());

    // WhatsApp 번호 등록
    Pushwoosh().registerWhatsappNumber(user.getWhatsappNumber());
    
    // Pushwoosh에 대한 추가 사용자 정보를 태그로 설정
    Pushwoosh().setTags({
      "age": user.getAge(),
      "name": user.getName(),
      "last_login": user.getLastLoginDate()
    });
  }
}
```

### 태그

태그는 사용자나 기기에 할당된 키-값 쌍으로, 선호도나 행동과 같은 속성을 기반으로 세분화를 가능하게 하여 타겟 메시징을 할 수 있습니다.

```dart
import 'package:pushwoosh_flutter/pushwoosh_flutter.dart';

class UpdateUser {
  void afterUserUpdateProfile(User user) {

    // 선호 카테고리 목록 설정
    Pushwoosh().setTags({
      "favorite_categories": user.getFavoriteCategoriesList()
    });
    
    // 결제 정보 설정
    Pushwoosh().setTags({
      "is_subscribed": user.isSubscribed(),
      "payment_status": user.getPaymentStatus(),
      "billing_address": user.getBillingAddress()
    });
  }
}
```

### 이벤트

이벤트는 앱 내에서 발생하는 특정 사용자 행동이나 사건으로, 행동을 분석하고 해당 메시지나 작업을 트리거하기 위해 추적할 수 있습니다.

```dart
import 'package:pushwoosh_flutter/pushwoosh_flutter.dart';

class Registration {

  // 로그인 이벤트 추적
  void afterUserLogin(User user) {
    Pushwoosh().postEvent("login", {
      "name": user.getName(),
      "last_login": user.getLastLoginDate()
    });
  }

  void afterUserPurchase(Product product) {

  // 구매 이벤트 추적
  Pushwoosh().postEvent("purchase", {
    "product_id": product.getId(),
    "product_name": product.getName(),
    "price": product.getPrice(),
    "quantity": product.getQuantity()
  });
 }
}
```

## ProGuard 사용

<Aside type="note">
`flutter build apk` 명령은 기본적으로 코드를 난독화합니다.
</Aside>

따라서 다음과 같은 예외가 발생할 수 있습니다:

```java
java.lang.IllegalStateException: Could not find class for name: com.pushwoosh.plugin.PushwooshNotificationServiceExtension
```

이 경우 두 가지 해결책이 있습니다:

1. `flutter build apk --no-shrink` 명령을 사용하여 난독화 없이 코드를 컴파일합니다.
2. 또는 ProGuard를 수동으로 활성화하고 필요한 규칙을 추가할 수 있습니다.

프로젝트에 ProGuard를 활성화하려면 `build.gradle` 파일에 다음 문자열을 추가합니다:

```java title="build.gradle"
buildTypes {
        release {
            minifyEnabled true
            useProguard true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

            signingConfig signingConfigs.debug
        }
    }
```

그런 다음, `android/app/proguard-rules.pro`에 다음 규칙을 추가합니다.

```java title="proguard-rules.pro"
#Pushwoosh Flutter
-keep class com.pushwoosh.plugin.PushwooshPlugin { *; }
-keep class com.pushwoosh.plugin.PushwooshNotificationServiceExtension { *; }
```


## 문제 해결

통합 과정에서 문제가 발생하면 [지원 및 커뮤니티](/ko/developer/pushwoosh-sdk/support-and-community) 섹션을 참조하세요.