푸시
이 문서는 Flutter에 대한 푸시 알림을 설정하는 방법을 다룹니다. 푸시 알림을 통합하려면 각 기본 플랫폼을 별도로 설정해야합니다. 나열된 각 안내서를 따라 설치를 완료하십시오.
1. 플랫폼 별 초기 설정
Android 프로젝트에 Firebase 추가하기
Firebase에서 제공되는 Android 프로젝트에 Firebase 추가 의 지시사항에 따라 Android 프로젝트에 Firebase를 추가합니다.
Dfinery Console에서 Firebase 정보 등록하기
Console에서 부가설정/채널 부가 설정/푸시/Android 설정관리에 들어가 발신자 ID를 입력하고 JSON 형식의 Firebase 사용자 인증 정보 비공개 키 파일을 업로드합니다.
발신자 ID 확인 방법
Firebase Console로 이동합니다.
프로젝트를 선택합니다.
좌측 패널에서 프로젝트 개요 오른쪽에 ⚙️ 아이콘을 클릭합니다.
프로젝트 설정을 클릭합니다.
프로젝트 설정 상단 탭에서 클라우드 메시징을 클릭합니다.
발신자 ID를 확인합니다.
Firebase 사용자 인증 정보 비공개 키 파일 발급 방법
Firebase에서 제공하는 수동으로 사용자 인증 정보 제공을 참고하여 JSON 형식으로 키를 저장한다음 Console에 파일을 업로드 해주세요.
해당 페이지에서 확인할 수 있는 주요 내용은 다음과 같습니다.
Firebase Console에서 설정 > 서비스 계정을 엽니다.
새 비공개 키 생성을 클릭한 다음 키 생성을 클릭하여 확인합니다.
키가 들어 있는 JSON 파일을 안전하게 저장합니다.
만약 비공개 키 파일 발급에 어려움을 겪으실 경우 Firebase 사용자 인증 정보 비공개 키 파일 발급 따라해보기를 참고하여 주시기 바랍니다.
앱 매니페스트에 FirebaseMessagingService를 상속받는 서비스 추가
<application>
...
<service
android:name="com.igaworks.dfinery.DfineryFirebaseMessagingService"
android:exported="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
</application>
앱 매니페스트에 POST_NOTIFICATIONS
권한 추가하기
Android 13이상의 기기일 경우 POST_NOTIFICATIONS
권한이 필요합니다. android/app/src/main/AndroidManifest.xml
에 해당 권한을 추가해주시기 바랍니다.
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
다음은 작성이 완료된 android/app/src/main/AndroidManifest.xml
예시입니다.
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myapp">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="com.google.android.gms.permission.AD_ID"/>
<application
android:name=".MainApplication"
android:label="@string/app_name"
android:icon="@mipmap/ic_launcher"
android:allowBackup="false"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|screenSize|smallestScreenSize|uiMode"
android:launchMode="singleTask"
android:windowSoftInputMode="adjustResize"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service
android:name="com.igaworks.dfinery.DfineryFirebaseMessagingService"
android:exported="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
</application>
</manifest>
푸시 알림 채널을 Dfinery에 연동하기
푸시 알림 채널 생성
Android 8.0부터는 알림을 수신받기 위해 알림 채널 생성이 필요합니다. createNotificationChannel()
메소드를 사용하여 알림 채널을 생성할 수 있습니다.
final properties = {
DFAndroidNotificationChannelProperty.id: 'dfinery_channel',
DFAndroidNotificationChannelProperty.name: 'Default Notification Channel',
DFAndroidNotificationChannelProperty.importance: DFAndroidNotificationChannelImportance.high,
DFAndroidNotificationChannelProperty.badge: true,
DFAndroidNotificationChannelProperty.sound: true,
DFAndroidNotificationChannelProperty.visibility: DFAndroidNotificationChannelVisibility.public,
DFAndroidNotificationChannelProperty.vibration: true
};
Dfinery.createNotificationChannel(properties: properties);
생성한 푸시 알림 채널 ID 등록
Dfinery 초기화시 initWithConfig()
메소드를 사용하여 사용하여 생성한 알림 채널의 ID를 등록합니다.
final config = {
DFConfig.androidNotificationChannelId: 'dfinery_channel'
};
Dfinery.initWithConfig(serviceId: "YOUR_SERVICE_ID", config: config);
푸시 알림 채널 그룹 생성 (선택사항)
Andorid 알림 채널에는 선택적으로 알림 채널 그룹을 설정할 수 있습니다.
//알림 채널 그룹 생성
final notificationChannelGroupProperties = {
DFAndroidNotificationChannelGroupProperty.id : 'dfinery_channel_group',
DFAndroidNotificationChannelGroupProperty.name : 'Default Notification Channel Group'
};
Dfinery.createNotificationChannelGroup(properties: notificationChannelGroupProperties);
//알림 채널에 그룹 할당
final notificationChannelProperties = {
DFAndroidNotificationChannelProperty.id: 'dfinery_channel',
DFAndroidNotificationChannelProperty.groupId: 'dfinery_channel_group'
};
Dfinery.createNotificationChannel(properties: notificationChannelProperties);
푸시 알림 아이콘 설정하기
Android에서 푸시 알림을 표시하기 위해서는 아이콘 설정이 필요합니다. init시 config를 설정할때 아이콘 Drawable의 이름을 입력하여 설정합니다.
아이콘 설정은 drawable 만을 지원합니다. mipmap은 지원하지 않습니다.
final config = {
DFConfig.androidNotificationIconName: 'ic_dfinery',
};
Dfinery.initWithConfig(serviceId: "YOUR_SERVICE_ID", config: config);
푸시 알림 강조색 지정하기
알림 아이콘 강조색은 init시 config에 색상의 hexString 값을 입력하여 적용할 수 있습니다. 색상을 지정하지 않으면 시스템 기본 색상으로 표시됩니다.
final config = {
DFConfig.androidNotificationAccentColor: '#E00052',
};
Dfinery.initWithConfig(serviceId: "YOUR_SERVICE_ID", config: config);
2. 런타임 알림 권한 요청하기
permission_handler 패키지를 활용한 푸시 알림 권한 요청 예시입니다.
import 'package:permission_handler/permission_handler.dart';
Future<void> requestNotificationPermission() async {
final status = await Permission.notification.request();
if (status.isGranted) {
Dfinery.getPushToken().then((token) {
if (token != null) {
Dfinery.setPushToken(pushToken: token);
}
});
}
}
3. 토큰을 Dfinery에 연동하기
Firebase/APNS에서 발급된 토큰을 Dfinery에 연동하기 위해서 다음과 같이 작성해주시기 바랍니다.
아래는 가장 최근에 발급받은 푸시 토큰을 가져오고 Dfinery에 연동하는 예제입니다.
import 'package:flutter/material.dart';
import 'package:dfinery_plugin/dfinery_plugin.dart';
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
@override
void initState() {
super.initState();
Dfinery.getPushToken().then((token) {
if (token != null) {
Dfinery.setPushToken(pushToken: token);
}
});
}
@override
Widget build(BuildContext context) {
return MaterialApp(
// your app content
);
}
}
4. 푸시 클릭시 호출되는 딥링크 연동하기
Flutter 설정
app_links 패키지를 사용하여 딥링크를 처리할 수 있습니다.
pubspec.yaml에 패키지를 추가하세요:
dependencies:
app_links: ^3.4.3
Android 설정
앱 콘텐츠 딥 링크 만들기에 따라 딥링크 설정을 해주세요.
<activity
android:name=".MainActivity"
android:exported="true"
android:launchMode="singleTop"
android:theme="@style/LaunchTheme">
<!-- 기존 intent-filter -->
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
<!-- 딥링크를 위한 intent-filter -->
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="yourapp" />
</intent-filter>
</activity>
iOS 설정
ios/Runner/Info.plist
에 URL scheme을 추가합니다:
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLName</key>
<string>yourapp.deeplink</string>
<key>CFBundleURLSchemes</key>
<array>
<string>yourapp</string>
</array>
</dict>
</array>
Flutter 코드
import 'package:app_links/app_links.dart';
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
late AppLinks _appLinks;
StreamSubscription<Uri>? _linkSubscription;
@override
void initState() {
super.initState();
_initDeepLinks();
}
Future<void> _initDeepLinks() async {
_appLinks = AppLinks();
// 앱이 실행 중일 때 딥링크 처리
_linkSubscription = _appLinks.uriLinkStream.listen(
(Uri uri) {
print('Received deep link: $uri');
_handleDeepLink(uri);
},
onError: (err) {
print('Deep link error: $err');
},
);
// 앱이 종료된 상태에서 딥링크로 실행될 때 처리
final Uri? initialUri = await _appLinks.getInitialLink();
if (initialUri != null) {
print('Initial deep link: $initialUri');
_handleDeepLink(initialUri);
}
}
void _handleDeepLink(Uri uri) {
// 딥링크 처리 로직
print('Handling deep link: $uri');
}
@override
void dispose() {
_linkSubscription?.cancel();
super.dispose();
}
@override
Widget build(BuildContext context) {
return MaterialApp(
// your app content
);
}
}
5. 푸시 알림 수신 허용 유무 반영하기
광고성 목적이 있는 푸시의 경우 정보통신망법 에 따라 사용자에게 사전 수신동의를 받아야 합니다. 사용자에게 푸시 알림이 허용되었다는 정보를 Dfinery에 반영하기 위해서 다음의 일련의 작업을 수행하여 주시기 바랍니다.
사용자에게 푸시 알림 허용에 대한 고지하기
사용자의 허용/거부 의사에 대한 값을 반영하기 위해 다음의 코드를 작성
알림 수신 동의 설정하기를 참고하여 사용자가 동의한 항목에 대해 값을 입력해주시기 바랍니다. 아래 코드는 광고성 수신 동의를 허용한 예시입니다.
final param = {
DFUserProfile.pushAdsOptin: true
};
Dfinery.setUserProfiles(values: param);
6. 완료
이제 Dfinery에서 알림을 사용하기 위한 모든 준비가 완료되었습니다.
Last updated