├── example ├── android │ ├── gradle.properties │ ├── app │ │ ├── src │ │ │ ├── main │ │ │ │ ├── res │ │ │ │ │ ├── mipmap-hdpi │ │ │ │ │ │ └── ic_launcher.png │ │ │ │ │ ├── mipmap-mdpi │ │ │ │ │ │ └── ic_launcher.png │ │ │ │ │ ├── mipmap-xhdpi │ │ │ │ │ │ └── ic_launcher.png │ │ │ │ │ ├── mipmap-xxhdpi │ │ │ │ │ │ └── ic_launcher.png │ │ │ │ │ ├── mipmap-xxxhdpi │ │ │ │ │ │ └── ic_launcher.png │ │ │ │ │ ├── drawable │ │ │ │ │ │ └── launch_background.xml │ │ │ │ │ ├── drawable-v21 │ │ │ │ │ │ └── launch_background.xml │ │ │ │ │ ├── values │ │ │ │ │ │ └── styles.xml │ │ │ │ │ └── values-night │ │ │ │ │ │ └── styles.xml │ │ │ │ ├── java │ │ │ │ │ └── com │ │ │ │ │ │ └── flutterfcm │ │ │ │ │ │ └── flutter_fcm_example │ │ │ │ │ │ └── MainActivity.java │ │ │ │ └── AndroidManifest.xml │ │ │ ├── debug │ │ │ │ └── AndroidManifest.xml │ │ │ └── profile │ │ │ │ └── AndroidManifest.xml │ │ └── build.gradle │ ├── gradle │ │ └── wrapper │ │ │ └── gradle-wrapper.properties │ ├── settings.gradle │ └── build.gradle ├── ios │ ├── Flutter │ │ ├── Debug.xcconfig │ │ ├── Release.xcconfig │ │ ├── ephemeral │ │ │ ├── flutter_lldbinit │ │ │ └── flutter_lldb_helper.py │ │ └── AppFrameworkInfo.plist │ ├── Runner │ │ ├── AppDelegate.h │ │ ├── Assets.xcassets │ │ │ ├── LaunchImage.imageset │ │ │ │ ├── LaunchImage.png │ │ │ │ ├── LaunchImage@2x.png │ │ │ │ ├── LaunchImage@3x.png │ │ │ │ ├── README.md │ │ │ │ └── Contents.json │ │ │ └── AppIcon.appiconset │ │ │ │ ├── Icon-App-20x20@1x.png │ │ │ │ ├── Icon-App-20x20@2x.png │ │ │ │ ├── Icon-App-20x20@3x.png │ │ │ │ ├── Icon-App-29x29@1x.png │ │ │ │ ├── Icon-App-29x29@2x.png │ │ │ │ ├── Icon-App-29x29@3x.png │ │ │ │ ├── Icon-App-40x40@1x.png │ │ │ │ ├── Icon-App-40x40@2x.png │ │ │ │ ├── Icon-App-40x40@3x.png │ │ │ │ ├── Icon-App-60x60@2x.png │ │ │ │ ├── Icon-App-60x60@3x.png │ │ │ │ ├── Icon-App-76x76@1x.png │ │ │ │ ├── Icon-App-76x76@2x.png │ │ │ │ ├── Icon-App-1024x1024@1x.png │ │ │ │ ├── Icon-App-83.5x83.5@2x.png │ │ │ │ └── Contents.json │ │ ├── main.m │ │ ├── AppDelegate.m │ │ ├── Base.lproj │ │ │ ├── Main.storyboard │ │ │ └── LaunchScreen.storyboard │ │ └── Info.plist │ ├── Runner.xcodeproj │ │ ├── project.xcworkspace │ │ │ ├── contents.xcworkspacedata │ │ │ └── xcshareddata │ │ │ │ ├── WorkspaceSettings.xcsettings │ │ │ │ └── IDEWorkspaceChecks.plist │ │ ├── xcshareddata │ │ │ └── xcschemes │ │ │ │ └── Runner.xcscheme │ │ └── project.pbxproj │ ├── Runner.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ ├── WorkspaceSettings.xcsettings │ │ │ └── IDEWorkspaceChecks.plist │ └── Podfile ├── README.md ├── test │ └── widget_test.dart ├── lib │ └── main.dart ├── pubspec.yaml └── pubspec.lock ├── lib ├── flutter_fcm.dart └── notification │ ├── local_notification.dart │ └── fcm.dart ├── .metadata ├── LICENSE ├── analysis_options.yaml ├── .gitignore ├── pubspec.yaml ├── CHANGELOG.md ├── README.md └── pubspec.lock /example/android/gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx1536M 2 | android.useAndroidX=true 3 | android.enableJetifier=true 4 | -------------------------------------------------------------------------------- /example/ios/Flutter/Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" 2 | #include "Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /example/ios/Flutter/Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" 2 | #include "Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /example/ios/Runner/AppDelegate.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | 4 | @interface AppDelegate : FlutterAppDelegate 5 | 6 | @end 7 | -------------------------------------------------------------------------------- /example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wh120/flutter_fcm/HEAD/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wh120/flutter_fcm/HEAD/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wh120/flutter_fcm/HEAD/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wh120/flutter_fcm/HEAD/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /example/ios/Flutter/ephemeral/flutter_lldbinit: -------------------------------------------------------------------------------- 1 | # 2 | # Generated file, do not edit. 3 | # 4 | 5 | command script import --relative-to-command-file flutter_lldb_helper.py 6 | -------------------------------------------------------------------------------- /example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wh120/flutter_fcm/HEAD/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wh120/flutter_fcm/HEAD/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wh120/flutter_fcm/HEAD/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wh120/flutter_fcm/HEAD/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wh120/flutter_fcm/HEAD/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wh120/flutter_fcm/HEAD/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wh120/flutter_fcm/HEAD/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wh120/flutter_fcm/HEAD/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wh120/flutter_fcm/HEAD/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wh120/flutter_fcm/HEAD/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wh120/flutter_fcm/HEAD/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wh120/flutter_fcm/HEAD/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wh120/flutter_fcm/HEAD/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wh120/flutter_fcm/HEAD/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wh120/flutter_fcm/HEAD/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wh120/flutter_fcm/HEAD/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wh120/flutter_fcm/HEAD/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png -------------------------------------------------------------------------------- /lib/flutter_fcm.dart: -------------------------------------------------------------------------------- 1 | library flutter_fcm; 2 | 3 | export 'notification/fcm.dart'; 4 | export 'package:firebase_core/firebase_core.dart'; 5 | export 'package:firebase_messaging/firebase_messaging.dart'; 6 | -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wh120/flutter_fcm/HEAD/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wh120/flutter_fcm/HEAD/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png -------------------------------------------------------------------------------- /example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /example/ios/Runner.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /example/android/app/src/main/java/com/flutterfcm/flutter_fcm_example/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.flutterfcm.flutter_fcm_example; 2 | 3 | import io.flutter.embedding.android.FlutterActivity; 4 | 5 | public class MainActivity extends FlutterActivity { 6 | } 7 | -------------------------------------------------------------------------------- /example/ios/Runner/main.m: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | #import "AppDelegate.h" 4 | 5 | int main(int argc, char* argv[]) { 6 | @autoreleasepool { 7 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /example/android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Jun 23 08:50:38 CEST 2017 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.1-all.zip 7 | -------------------------------------------------------------------------------- /example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /.metadata: -------------------------------------------------------------------------------- 1 | # This file tracks properties of this Flutter project. 2 | # Used by Flutter tool to assess capabilities and perform upgrades etc. 3 | # 4 | # This file should be version controlled and should not be manually edited. 5 | 6 | version: 7 | revision: b1395592de68cc8ac4522094ae59956dd21a91db 8 | channel: stable 9 | 10 | project_type: package 11 | -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md: -------------------------------------------------------------------------------- 1 | # Launch Screen Assets 2 | 3 | You can customize the launch screen with your own desired assets by replacing the image files in this directory. 4 | 5 | You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. -------------------------------------------------------------------------------- /example/android/app/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /example/android/app/src/profile/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /example/ios/Runner/AppDelegate.m: -------------------------------------------------------------------------------- 1 | #import "AppDelegate.h" 2 | #import "GeneratedPluginRegistrant.h" 3 | 4 | @implementation AppDelegate 5 | 6 | - (BOOL)application:(UIApplication *)application 7 | didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 8 | [GeneratedPluginRegistrant registerWithRegistry:self]; 9 | // Override point for customization after application launch. 10 | return [super application:application didFinishLaunchingWithOptions:launchOptions]; 11 | } 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /example/android/settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | 3 | def localPropertiesFile = new File(rootProject.projectDir, "local.properties") 4 | def properties = new Properties() 5 | 6 | assert localPropertiesFile.exists() 7 | localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } 8 | 9 | def flutterSdkPath = properties.getProperty("flutter.sdk") 10 | assert flutterSdkPath != null, "flutter.sdk not set in local.properties" 11 | apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle" 12 | -------------------------------------------------------------------------------- /example/android/app/src/main/res/drawable/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /example/android/app/src/main/res/drawable-v21/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "LaunchImage.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "LaunchImage@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "LaunchImage@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /example/README.md: -------------------------------------------------------------------------------- 1 | # flutter_fcm_example 2 | 3 | A new Flutter application. 4 | 5 | ## Getting Started 6 | 7 | This project is a starting point for a Flutter application. 8 | 9 | A few resources to get you started if this is your first Flutter project: 10 | 11 | - [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab) 12 | - [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook) 13 | 14 | For help getting started with Flutter, view our 15 | [online documentation](https://flutter.dev/docs), which offers tutorials, 16 | samples, guidance on mobile development, and a full API reference. 17 | -------------------------------------------------------------------------------- /example/android/build.gradle: -------------------------------------------------------------------------------- 1 | buildscript { 2 | repositories { 3 | google() 4 | jcenter() 5 | } 6 | 7 | dependencies { 8 | classpath 'com.android.tools.build:gradle:4.1.0' 9 | } 10 | } 11 | 12 | allprojects { 13 | repositories { 14 | google() 15 | jcenter() 16 | } 17 | } 18 | 19 | rootProject.buildDir = '../build' 20 | subprojects { 21 | project.buildDir = "${rootProject.buildDir}/${project.name}" 22 | } 23 | subprojects { 24 | project.evaluationDependsOn(':app') 25 | } 26 | 27 | tasks.register("clean", Delete) { 28 | delete rootProject.buildDir 29 | } 30 | -------------------------------------------------------------------------------- /example/ios/Flutter/AppFrameworkInfo.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | App 9 | CFBundleIdentifier 10 | io.flutter.flutter.app 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | App 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1.0 23 | MinimumOSVersion 24 | 8.0 25 | 26 | 27 | -------------------------------------------------------------------------------- /example/android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 15 | 18 | 19 | -------------------------------------------------------------------------------- /example/android/app/src/main/res/values-night/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 15 | 18 | 19 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /example/test/widget_test.dart: -------------------------------------------------------------------------------- 1 | // This is a basic Flutter widget test. 2 | // 3 | // To perform an interaction with a widget in your test, use the WidgetTester 4 | // utility that Flutter provides. For example, you can send tap and scroll 5 | // gestures. You can also use WidgetTester to find child widgets in the widget 6 | // tree, read text, and verify that the values of widget properties are correct. 7 | 8 | import 'package:flutter/material.dart'; 9 | import 'package:flutter_test/flutter_test.dart'; 10 | 11 | import 'package:flutter_fcm_example/main.dart'; 12 | 13 | void main() { 14 | testWidgets('Counter increments smoke test', (WidgetTester tester) async { 15 | // Build our app and trigger a frame. 16 | await tester.pumpWidget(MyApp()); 17 | 18 | // Verify that our counter starts at 0. 19 | expect(find.text('0'), findsOneWidget); 20 | expect(find.text('1'), findsNothing); 21 | 22 | // Tap the '+' icon and trigger a frame. 23 | await tester.tap(find.byIcon(Icons.add)); 24 | await tester.pump(); 25 | 26 | // Verify that our counter has incremented. 27 | expect(find.text('0'), findsNothing); 28 | expect(find.text('1'), findsOneWidget); 29 | }); 30 | } 31 | -------------------------------------------------------------------------------- /example/ios/Flutter/ephemeral/flutter_lldb_helper.py: -------------------------------------------------------------------------------- 1 | # 2 | # Generated file, do not edit. 3 | # 4 | 5 | import lldb 6 | 7 | def handle_new_rx_page(frame: lldb.SBFrame, bp_loc, extra_args, intern_dict): 8 | """Intercept NOTIFY_DEBUGGER_ABOUT_RX_PAGES and touch the pages.""" 9 | base = frame.register["x0"].GetValueAsAddress() 10 | page_len = frame.register["x1"].GetValueAsUnsigned() 11 | 12 | # Note: NOTIFY_DEBUGGER_ABOUT_RX_PAGES will check contents of the 13 | # first page to see if handled it correctly. This makes diagnosing 14 | # misconfiguration (e.g. missing breakpoint) easier. 15 | data = bytearray(page_len) 16 | data[0:8] = b'IHELPED!' 17 | 18 | error = lldb.SBError() 19 | frame.GetThread().GetProcess().WriteMemory(base, data, error) 20 | if not error.Success(): 21 | print(f'Failed to write into {base}[+{page_len}]', error) 22 | return 23 | 24 | def __lldb_init_module(debugger: lldb.SBDebugger, _): 25 | target = debugger.GetDummyTarget() 26 | # Caveat: must use BreakpointCreateByRegEx here and not 27 | # BreakpointCreateByName. For some reasons callback function does not 28 | # get carried over from dummy target for the later. 29 | bp = target.BreakpointCreateByRegex("^NOTIFY_DEBUGGER_ABOUT_RX_PAGES$") 30 | bp.SetScriptCallbackFunction('{}.handle_new_rx_page'.format(__name__)) 31 | bp.SetAutoContinue(True) 32 | print("-- LLDB integration loaded --") 33 | -------------------------------------------------------------------------------- /example/ios/Podfile: -------------------------------------------------------------------------------- 1 | # Uncomment this line to define a global platform for your project 2 | # platform :ios, '11.0' 3 | 4 | # CocoaPods analytics sends network stats synchronously affecting flutter build latency. 5 | ENV['COCOAPODS_DISABLE_STATS'] = 'true' 6 | 7 | project 'Runner', { 8 | 'Debug' => :debug, 9 | 'Profile' => :release, 10 | 'Release' => :release, 11 | } 12 | 13 | def flutter_root 14 | generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) 15 | unless File.exist?(generated_xcode_build_settings_path) 16 | raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" 17 | end 18 | 19 | File.foreach(generated_xcode_build_settings_path) do |line| 20 | matches = line.match(/FLUTTER_ROOT\=(.*)/) 21 | return matches[1].strip if matches 22 | end 23 | raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" 24 | end 25 | 26 | require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) 27 | 28 | flutter_ios_podfile_setup 29 | 30 | target 'Runner' do 31 | flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) 32 | end 33 | 34 | post_install do |installer| 35 | installer.pods_project.targets.each do |target| 36 | flutter_additional_ios_build_settings(target) 37 | end 38 | end 39 | -------------------------------------------------------------------------------- /analysis_options.yaml: -------------------------------------------------------------------------------- 1 | # This file configures the analyzer, which statically analyzes Dart code to 2 | # check for errors, warnings, and lints. 3 | # 4 | # The issues identified by the analyzer are surfaced in the UI of Dart-enabled 5 | # IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be 6 | # invoked from the command line by running `flutter analyze`. 7 | 8 | # The following line activates a set of recommended lints for Flutter apps, 9 | # packages, and plugins designed to encourage good coding practices. 10 | include: package:flutter_lints/flutter.yaml 11 | 12 | linter: 13 | # The lint rules applied to this project can be customized in the 14 | # section below to disable rules from the `package:flutter_lints/flutter.yaml` 15 | # included above or to enable additional rules. A list of all available lints 16 | # and their documentation is published at https://dart.dev/lints. 17 | # 18 | # Instead of disabling a lint rule for the entire project in the 19 | # section below, it can also be suppressed for a single line of code 20 | # or a specific dart file by using the `// ignore: name_of_lint` and 21 | # `// ignore_for_file: name_of_lint` syntax on the line or in the file 22 | # producing the lint. 23 | rules: 24 | avoid_print: false # Uncomment to disable the `avoid_print` rule 25 | prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule 26 | # 27 | # Additional information about this file can be found at 28 | # https://dart.dev/guides/language/analysis-options 29 | -------------------------------------------------------------------------------- /example/ios/Runner/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /example/ios/Runner/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | flutter_fcm_example 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | $(FLUTTER_BUILD_NAME) 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | $(FLUTTER_BUILD_NUMBER) 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIMainStoryboardFile 28 | Main 29 | UISupportedInterfaceOrientations 30 | 31 | UIInterfaceOrientationPortrait 32 | UIInterfaceOrientationLandscapeLeft 33 | UIInterfaceOrientationLandscapeRight 34 | 35 | UISupportedInterfaceOrientations~ipad 36 | 37 | UIInterfaceOrientationPortrait 38 | UIInterfaceOrientationPortraitUpsideDown 39 | UIInterfaceOrientationLandscapeLeft 40 | UIInterfaceOrientationLandscapeRight 41 | 42 | UIViewControllerBasedStatusBarAppearance 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /example/android/app/build.gradle: -------------------------------------------------------------------------------- 1 | def localProperties = new Properties() 2 | def localPropertiesFile = rootProject.file('local.properties') 3 | if (localPropertiesFile.exists()) { 4 | localPropertiesFile.withReader('UTF-8') { reader -> 5 | localProperties.load(reader) 6 | } 7 | } 8 | 9 | def flutterRoot = localProperties.getProperty('flutter.sdk') 10 | if (flutterRoot == null) { 11 | throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") 12 | } 13 | 14 | def flutterVersionCode = localProperties.getProperty('flutter.versionCode') 15 | if (flutterVersionCode == null) { 16 | flutterVersionCode = '1' 17 | } 18 | 19 | def flutterVersionName = localProperties.getProperty('flutter.versionName') 20 | if (flutterVersionName == null) { 21 | flutterVersionName = '1.0' 22 | } 23 | 24 | apply plugin: 'com.android.application' 25 | apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" 26 | 27 | android { 28 | compileSdkVersion 30 29 | 30 | defaultConfig { 31 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). 32 | applicationId "com.flutterfcm.flutter_fcm_example" 33 | minSdkVersion flutter.minSdkVersion 34 | targetSdkVersion 30 35 | versionCode flutterVersionCode.toInteger() 36 | versionName flutterVersionName 37 | } 38 | 39 | buildTypes { 40 | release { 41 | // TODO: Add your own signing config for the release build. 42 | // Signing with the debug keys for now, so `flutter run --release` works. 43 | signingConfig signingConfigs.debug 44 | } 45 | } 46 | } 47 | 48 | flutter { 49 | source '../..' 50 | } 51 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Miscellaneous 2 | *.class 3 | *.log 4 | *.pyc 5 | *.swp 6 | .DS_Store 7 | .atom/ 8 | .buildlog/ 9 | .history 10 | .svn/ 11 | 12 | # IntelliJ related 13 | *.iml 14 | *.ipr 15 | *.iws 16 | .idea/ 17 | 18 | # The .vscode folder contains launch configuration and tasks you configure in 19 | # VS Code which you may wish to be included in version control, so this line 20 | # is commented out by default. 21 | #.vscode/ 22 | 23 | # Flutter/Dart/Pub related 24 | **/doc/api/ 25 | .dart_tool/ 26 | .flutter-plugins 27 | .flutter-plugins-dependencies 28 | .packages 29 | .pub-cache/ 30 | .pub/ 31 | build/ 32 | 33 | # Android related 34 | **/android/**/gradle-wrapper.jar 35 | **/android/.gradle 36 | **/android/captures/ 37 | **/android/gradlew 38 | **/android/gradlew.bat 39 | **/android/local.properties 40 | **/android/**/GeneratedPluginRegistrant.java 41 | 42 | # iOS/XCode related 43 | **/ios/**/*.mode1v3 44 | **/ios/**/*.mode2v3 45 | **/ios/**/*.moved-aside 46 | **/ios/**/*.pbxuser 47 | **/ios/**/*.perspectivev3 48 | **/ios/**/*sync/ 49 | **/ios/**/.sconsign.dblite 50 | **/ios/**/.tags* 51 | **/ios/**/.vagrant/ 52 | **/ios/**/DerivedData/ 53 | **/ios/**/Icon? 54 | **/ios/**/Pods/ 55 | **/ios/**/.symlinks/ 56 | **/ios/**/profile 57 | **/ios/**/xcuserdata 58 | **/ios/.generated/ 59 | **/ios/Flutter/App.framework 60 | **/ios/Flutter/Flutter.framework 61 | **/ios/Flutter/Flutter.podspec 62 | **/ios/Flutter/Generated.xcconfig 63 | **/ios/Flutter/app.flx 64 | **/ios/Flutter/app.zip 65 | **/ios/Flutter/flutter_assets/ 66 | **/ios/Flutter/flutter_export_environment.sh 67 | **/ios/ServiceDefinitions.json 68 | **/ios/Runner/GeneratedPluginRegistrant.* 69 | 70 | # Exceptions to above rules. 71 | !**/ios/**/default.mode1v3 72 | !**/ios/**/default.mode2v3 73 | !**/ios/**/default.pbxuser 74 | !**/ios/**/default.perspectivev3 75 | -------------------------------------------------------------------------------- /example/lib/main.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_fcm/flutter_fcm.dart'; 3 | 4 | void main() { 5 | Messaging.initFCM(); 6 | runApp(MyApp()); 7 | } 8 | 9 | class MyApp extends StatelessWidget { 10 | // This widget is the root of your application. 11 | @override 12 | Widget build(BuildContext context) { 13 | return MaterialApp( 14 | title: 'Flutter FCM Example', 15 | theme: ThemeData( 16 | primarySwatch: Colors.blue, 17 | ), 18 | home: MyHomePage(), 19 | ); 20 | } 21 | } 22 | 23 | class MyHomePage extends StatefulWidget { 24 | @override 25 | _MyHomePageState createState() => _MyHomePageState(); 26 | } 27 | 28 | class _MyHomePageState extends State { 29 | @override 30 | Widget build(BuildContext context) { 31 | return Container(); 32 | } 33 | } 34 | 35 | class Messaging { 36 | static String? token; 37 | 38 | static deleteToken() { 39 | Messaging.token = null; 40 | FCM.deleteRefreshToken(); 41 | } 42 | 43 | static subscribeToTopic(String topic) { 44 | FCM.subscribeToTopic(topic); 45 | } 46 | 47 | static unsubscribeFromTopic(String topic) { 48 | FCM.unsubscribeFromTopic(topic); 49 | } 50 | 51 | @pragma('vm:entry-point') 52 | static Future onNotificationReceived(RemoteMessage message) async { 53 | await Firebase.initializeApp(); 54 | //print('Handling a message ${message}'); 55 | } 56 | 57 | @pragma('vm:entry-point') 58 | static initFCM() async { 59 | try { 60 | await Firebase.initializeApp(); 61 | await FCM.initializeFCM( 62 | withLocalNotification: true, 63 | // navigatorKey: Keys.navigatorKey, 64 | onNotificationReceived: onNotificationReceived, 65 | onNotificationPressed: (Map data) {}, 66 | onTokenChanged: (String? token) { 67 | if (token != null) { 68 | Messaging.token = token; 69 | } 70 | }, 71 | // TODO add this icon to android/app/src/main/res/drawable/ic_launcher.png 72 | icon: 'ic_launcher', 73 | ); 74 | } catch (e) { 75 | print(e); 76 | } 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: flutter_fcm 2 | description: Flutter plugin for Firebase Cloud Messaging (FCM) , a cross-platform messaging solution that lets you reliably deliver messages on Android and iOS. 3 | version: 1.3.6 4 | #author: Mhd Wael Alhalabi 5 | homepage: https://github.com/wh120/flutter_fcm 6 | repository: https://github.com/wh120/flutter_fcm 7 | issue_tracker: https://github.com/wh120/flutter_fcm/issues 8 | 9 | environment: 10 | sdk: '>=2.12.0 <4.0.0' 11 | flutter: ">=1.17.0" 12 | 13 | dependencies: 14 | flutter: 15 | sdk: flutter 16 | firebase_messaging: ^16.1.0 17 | firebase_core: ^4.3.0 18 | flutter_local_notifications: ^19.5.0 19 | 20 | dev_dependencies: 21 | lints: ^5.1.1 22 | flutter_test: 23 | sdk: flutter 24 | 25 | # For information on the generic Dart part of this file, see the 26 | # following page: https://dart.dev/tools/pub/pubspec 27 | 28 | # The following section is specific to Flutter. 29 | flutter: 30 | 31 | # To add assets to your package, add an assets section, like this: 32 | # assets: 33 | # - images/a_dot_burr.jpeg 34 | # - images/a_dot_ham.jpeg 35 | # 36 | # For details regarding assets in packages, see 37 | # https://flutter.dev/assets-and-images/#from-packages 38 | # 39 | # An image asset can refer to one or more resolution-specific "variants", see 40 | # https://flutter.dev/assets-and-images/#resolution-aware. 41 | 42 | # To add custom fonts to your package, add a fonts section here, 43 | # in this "flutter" section. Each entry in this list should have a 44 | # "family" key with the font family name, and a "fonts" key with a 45 | # list giving the asset and other descriptors for the font. For 46 | # example: 47 | # fonts: 48 | # - family: Schyler 49 | # fonts: 50 | # - asset: fonts/Schyler-Regular.ttf 51 | # - asset: fonts/Schyler-Italic.ttf 52 | # style: italic 53 | # - family: Trajan Pro 54 | # fonts: 55 | # - asset: fonts/TrajanPro.ttf 56 | # - asset: fonts/TrajanPro_Bold.ttf 57 | # weight: 700 58 | # 59 | # For details regarding fonts in packages, see 60 | # https://flutter.dev/custom-fonts/#from-packages 61 | -------------------------------------------------------------------------------- /example/android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 13 | 17 | 21 | 26 | 30 | 31 | 32 | 33 | 34 | 35 | 37 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /example/ios/Runner/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## 1.3.6 2 | - **Update**: Update flutter_local_notifications, firebase dependencies to the latest releases . 3 | 4 | 5 | ## 1.3.4 6 | - **Update**: Update flutter_local_notifications, firebase dependencies to the latest releases . 7 | 8 | ## 1.3.2 9 | - **Update**: Update flutter_local_notifications, firebase dependencies to the latest releases . 10 | 11 | ## 1.3.1 12 | - **Update**: Update firebase dependencies to the latest releases . 13 | 14 | ## 1.3.0 15 | - **FIX**: fix On Notification Pressed. 16 | 17 | 18 | ## 1.2.8 19 | - **Update**: Update flutter_local_notifications, firebase dependencies to the latest releases . 20 | 21 | 22 | ## 1.2.7 23 | - **Update**: Update flutter_local_notifications, firebase dependencies to the latest releases . 24 | 25 | 26 | ## 1.2.6 27 | - **Update**: Update flutter_local_notifications, firebase dependencies to the latest releases . 28 | 29 | 30 | ## 1.2.4 31 | - **Update**: Update flutter_local_notifications, firebase dependencies to the latest releases . 32 | 33 | 34 | ## 1.2.1 35 | - **Update**: Update firebase dependencies to the latest releases . 36 | - **FEAT**: Ask Notifications permission. 37 | 38 | 39 | ## 1.1.1 40 | - **Update**: Update flutter_local_notifications,firebase dependencies to the latest releases . 41 | - **FEAT**: add subscribeToTopic method. 42 | - **FEAT**: add unsubscribeFromTopic method. 43 | 44 | ## 1.1.0 45 | **Update**: Update flutter_local_notifications,firebase dependencies to the latest releases . 46 | 47 | ## 1.0.12 48 | **Update**: Update flutter_local_notifications,firebase dependencies to the latest releases . 49 | 50 | ## 1.0.11 51 | **Update**: Update flutter_local_notifications dependency to the latest release . 52 | 53 | ## 1.0.10 54 | - **FIX**: Update a README.md . 55 | 56 | ## 1.0.9 57 | - **Update**: Update firebase dependency to the latest release . 58 | 59 | ## 1.0.8 60 | - **Update**: Update a dependency to the latest release . 61 | 62 | ## 1.0.1 63 | - **FIX**: Update a README.md . 64 | 65 | ## 1.0.0 66 | - **FIX**: Migrate to null safety & Update a dependencies. 67 | 68 | ## 0.0.14 69 | - **FIX**: Remove Flutter Favorite badge 70 | 71 | ## 0.0.13 72 | - **FIX**: Update a dependencies 73 | 74 | ## 0.0.12 75 | - **FIX**: Update a dependencies 76 | 77 | ## 0.0.11 78 | - **FIX**: fix bugs 79 | 80 | ## 0.0.10 81 | - **FIX**: fix bugs 82 | 83 | ## 0.0.9 84 | - **FIX**: fix bugs 85 | 86 | ## 0.0.8 87 | - **FIX**: fix bugs 88 | 89 | ## 0.0.7 90 | - **FIX**: fix bugs 91 | 92 | ## 0.0.6 93 | 94 | - **FEAT**: add refreshToken method. 95 | - **FEAT**: add onNotificationReceived method. 96 | - Update a dependency to the latest release. 97 | 98 | 99 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Firebase Messaging Plugin for Flutter 2 | 3 | A Flutter plugin to use the [Firebase Cloud Messaging API](https://firebase.google.com/docs/cloud-messaging). 4 | 5 | To learn more about Firebase Cloud Messaging, please visit the [Firebase website](https://firebase.google.com/products/cloud-messaging) 6 | 7 | ## Getting Started 8 | 9 | To get started with Firebase Cloud Messaging for Flutter, please [see the documentation](https://firebase.flutter.dev/docs/messaging/overview). 10 | 11 | 12 | ## Why flutter_fcm? 13 | 14 | - 🚀 Easy to use 15 | - ❤ Supports local notification 16 | - 🛡️ Null safety 17 | - ⚡ On notification Received/Pressed works in all states: foreground,background and even when app is closed(not running) 18 | 19 | ## Getting Started 20 | 21 | To get started with Firebase Cloud Messaging for Flutter, 22 | see [Android Installation](https://firebase.flutter.dev/docs/manual-installation/android). 23 | and [iOS Installation](https://firebase.flutter.dev/docs/manual-installation/ios). 24 | 25 | ## Usage 26 | 27 | The easiest way to use this library is via the top-level functions. 28 | 29 | ```dart 30 | 31 | import 'package:firebase_messaging/firebase_messaging.dart'; 32 | import 'package:firebase_core/firebase_core.dart'; 33 | import 'package:flutter_fcm/flutter_fcm.dart'; 34 | 35 | class Messaging { 36 | static String? token; 37 | 38 | static deleteToken() { 39 | Messaging.token = null; 40 | FCM.deleteRefreshToken(); 41 | } 42 | static subscribeToTopic(String topic) { 43 | FCM.subscribeToTopic(topic); 44 | } 45 | static unsubscribeFromTopic(String topic) { 46 | FCM.unsubscribeFromTopic(topic); 47 | } 48 | 49 | @pragma('vm:entry-point') 50 | static Future onNotificationReceived(RemoteMessage message) async { 51 | await Firebase.initializeApp(); 52 | //print('Handling a message ${message}'); 53 | 54 | } 55 | 56 | @pragma('vm:entry-point') 57 | static initFCM() async { 58 | try { 59 | await Firebase.initializeApp( 60 | options: DefaultFirebaseOptions.currentPlatform 61 | ); 62 | await FCM.initializeFCM( 63 | withLocalNotification: true, 64 | // navigatorKey: Keys.navigatorKey, 65 | onNotificationReceived: onNotificationReceived, 66 | onNotificationPressed: (Map data) { 67 | 68 | }, 69 | onTokenChanged: (String? token) { 70 | if (token != null) { 71 | //print('FCM token $token'); 72 | Messaging.token = token; 73 | 74 | 75 | } 76 | }, 77 | // TODO add this icon to android/app/src/main/res/drawable/ic_launcher.png 78 | icon: 'ic_launcher', 79 | ); 80 | } catch (e) { 81 | print(e); 82 | } 83 | } 84 | } 85 | 86 | ``` 87 | 88 | 89 | 90 | -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "20x20", 5 | "idiom" : "iphone", 6 | "filename" : "Icon-App-20x20@2x.png", 7 | "scale" : "2x" 8 | }, 9 | { 10 | "size" : "20x20", 11 | "idiom" : "iphone", 12 | "filename" : "Icon-App-20x20@3x.png", 13 | "scale" : "3x" 14 | }, 15 | { 16 | "size" : "29x29", 17 | "idiom" : "iphone", 18 | "filename" : "Icon-App-29x29@1x.png", 19 | "scale" : "1x" 20 | }, 21 | { 22 | "size" : "29x29", 23 | "idiom" : "iphone", 24 | "filename" : "Icon-App-29x29@2x.png", 25 | "scale" : "2x" 26 | }, 27 | { 28 | "size" : "29x29", 29 | "idiom" : "iphone", 30 | "filename" : "Icon-App-29x29@3x.png", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "size" : "40x40", 35 | "idiom" : "iphone", 36 | "filename" : "Icon-App-40x40@2x.png", 37 | "scale" : "2x" 38 | }, 39 | { 40 | "size" : "40x40", 41 | "idiom" : "iphone", 42 | "filename" : "Icon-App-40x40@3x.png", 43 | "scale" : "3x" 44 | }, 45 | { 46 | "size" : "60x60", 47 | "idiom" : "iphone", 48 | "filename" : "Icon-App-60x60@2x.png", 49 | "scale" : "2x" 50 | }, 51 | { 52 | "size" : "60x60", 53 | "idiom" : "iphone", 54 | "filename" : "Icon-App-60x60@3x.png", 55 | "scale" : "3x" 56 | }, 57 | { 58 | "size" : "20x20", 59 | "idiom" : "ipad", 60 | "filename" : "Icon-App-20x20@1x.png", 61 | "scale" : "1x" 62 | }, 63 | { 64 | "size" : "20x20", 65 | "idiom" : "ipad", 66 | "filename" : "Icon-App-20x20@2x.png", 67 | "scale" : "2x" 68 | }, 69 | { 70 | "size" : "29x29", 71 | "idiom" : "ipad", 72 | "filename" : "Icon-App-29x29@1x.png", 73 | "scale" : "1x" 74 | }, 75 | { 76 | "size" : "29x29", 77 | "idiom" : "ipad", 78 | "filename" : "Icon-App-29x29@2x.png", 79 | "scale" : "2x" 80 | }, 81 | { 82 | "size" : "40x40", 83 | "idiom" : "ipad", 84 | "filename" : "Icon-App-40x40@1x.png", 85 | "scale" : "1x" 86 | }, 87 | { 88 | "size" : "40x40", 89 | "idiom" : "ipad", 90 | "filename" : "Icon-App-40x40@2x.png", 91 | "scale" : "2x" 92 | }, 93 | { 94 | "size" : "76x76", 95 | "idiom" : "ipad", 96 | "filename" : "Icon-App-76x76@1x.png", 97 | "scale" : "1x" 98 | }, 99 | { 100 | "size" : "76x76", 101 | "idiom" : "ipad", 102 | "filename" : "Icon-App-76x76@2x.png", 103 | "scale" : "2x" 104 | }, 105 | { 106 | "size" : "83.5x83.5", 107 | "idiom" : "ipad", 108 | "filename" : "Icon-App-83.5x83.5@2x.png", 109 | "scale" : "2x" 110 | }, 111 | { 112 | "size" : "1024x1024", 113 | "idiom" : "ios-marketing", 114 | "filename" : "Icon-App-1024x1024@1x.png", 115 | "scale" : "1x" 116 | } 117 | ], 118 | "info" : { 119 | "version" : 1, 120 | "author" : "xcode" 121 | } 122 | } 123 | -------------------------------------------------------------------------------- /example/pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: flutter_fcm_example 2 | description: A new Flutter application. 3 | 4 | # The following line prevents the package from being accidentally published to 5 | # pub.dev using `pub publish`. This is preferred for private packages. 6 | publish_to: 'none' # Remove this line if you wish to publish to pub.dev 7 | 8 | # The following defines the version and build number for your application. 9 | # A version number is three numbers separated by dots, like 1.2.43 10 | # followed by an optional build number separated by a +. 11 | # Both the version and the builder number may be overridden in flutter 12 | # build by specifying --build-name and --build-number, respectively. 13 | # In Android, build-name is used as versionName while build-number used as versionCode. 14 | # Read more about Android versioning at https://developer.android.com/studio/publish/versioning 15 | # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. 16 | # Read more about iOS versioning at 17 | # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html 18 | version: 1.0.0+1 19 | 20 | environment: 21 | sdk: ">=2.12.0 <4.0.0" 22 | 23 | dependencies: 24 | flutter: 25 | sdk: flutter 26 | 27 | 28 | # The following adds the Cupertino Icons font to your application. 29 | # Use with the CupertinoIcons class for iOS style icons. 30 | cupertino_icons: ^1.0.2 31 | flutter_fcm: 32 | path: ../ 33 | dev_dependencies: 34 | flutter_test: 35 | sdk: flutter 36 | 37 | # For information on the generic Dart part of this file, see the 38 | # following page: https://dart.dev/tools/pub/pubspec 39 | 40 | # The following section is specific to Flutter. 41 | flutter: 42 | 43 | # The following line ensures that the Material Icons font is 44 | # included with your application, so that you can use the icons in 45 | # the material Icons class. 46 | uses-material-design: true 47 | 48 | # To add assets to your application, add an assets section, like this: 49 | # assets: 50 | # - images/a_dot_burr.jpeg 51 | # - images/a_dot_ham.jpeg 52 | 53 | # An image asset can refer to one or more resolution-specific "variants", see 54 | # https://flutter.dev/assets-and-images/#resolution-aware. 55 | 56 | # For details regarding adding assets from package dependencies, see 57 | # https://flutter.dev/assets-and-images/#from-packages 58 | 59 | # To add custom fonts to your application, add a fonts section here, 60 | # in this "flutter" section. Each entry in this list should have a 61 | # "family" key with the font family name, and a "fonts" key with a 62 | # list giving the asset and other descriptors for the font. For 63 | # example: 64 | # fonts: 65 | # - family: Schyler 66 | # fonts: 67 | # - asset: fonts/Schyler-Regular.ttf 68 | # - asset: fonts/Schyler-Italic.ttf 69 | # style: italic 70 | # - family: Trajan Pro 71 | # fonts: 72 | # - asset: fonts/TrajanPro.ttf 73 | # - asset: fonts/TrajanPro_Bold.ttf 74 | # weight: 700 75 | # 76 | # For details regarding fonts from package dependencies, 77 | # see https://flutter.dev/custom-fonts/#from-packages 78 | -------------------------------------------------------------------------------- /example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 43 | 44 | 54 | 56 | 62 | 63 | 64 | 65 | 66 | 67 | 73 | 75 | 81 | 82 | 83 | 84 | 86 | 87 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /lib/notification/local_notification.dart: -------------------------------------------------------------------------------- 1 | import 'dart:convert'; 2 | import 'package:firebase_messaging/firebase_messaging.dart'; 3 | import 'package:flutter/material.dart'; 4 | import 'package:flutter_local_notifications/flutter_local_notifications.dart'; 5 | 6 | typedef OnNotificationPressed = void Function(Map data); 7 | 8 | class LocalNotification { 9 | static OnNotificationPressed? onPressed; 10 | 11 | /// Create a [AndroidNotificationChannel] for heads up notifications 12 | static AndroidNotificationChannel channel = AndroidNotificationChannel( 13 | 'high_importance_channel', // id 14 | 'High Importance Notifications', // title 15 | // 'This channel is used for important notifications.', // description 16 | importance: Importance.high, 17 | ); 18 | 19 | /// Initialize the [FlutterLocalNotificationsPlugin] package. 20 | static final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = 21 | FlutterLocalNotificationsPlugin(); 22 | 23 | static initializeLocalNotification( 24 | {OnNotificationPressed? onNotificationPressed, 25 | required String icon}) async { 26 | onPressed = onNotificationPressed; 27 | // Create an Android notification Channel. 28 | /// 29 | /// We use this channel in the `AndroidManifest.xml` file to override the 30 | /// default FCM channel to enable heads up notifications. 31 | await flutterLocalNotificationsPlugin 32 | .resolvePlatformSpecificImplementation< 33 | AndroidFlutterLocalNotificationsPlugin>() 34 | ?.createNotificationChannel(channel); 35 | 36 | // initialise the plugin. app_icon needs to be a added as a drawable resource to the Android head project 37 | AndroidInitializationSettings initializationSettingsAndroid = 38 | AndroidInitializationSettings(icon); 39 | final DarwinInitializationSettings initializationSettingsIOS = 40 | DarwinInitializationSettings(); 41 | final InitializationSettings initializationSettings = 42 | InitializationSettings( 43 | android: initializationSettingsAndroid, 44 | iOS: initializationSettingsIOS); 45 | 46 | flutterLocalNotificationsPlugin.initialize( 47 | initializationSettings, 48 | onDidReceiveNotificationResponse: notificationTapBackground, 49 | onDidReceiveBackgroundNotificationResponse: notificationTapBackground, 50 | ); 51 | } 52 | 53 | static showNotification( 54 | {required RemoteNotification notification, 55 | Map? payload, 56 | String? icon}) { 57 | flutterLocalNotificationsPlugin.show( 58 | notification.hashCode, 59 | notification.title, 60 | notification.body, 61 | NotificationDetails( 62 | android: AndroidNotificationDetails( 63 | channel.id, 64 | channel.name, 65 | // channel.description, 66 | // Add a proper drawable resource to android, for now using 67 | // one that already exists in example app. 68 | icon: icon, 69 | ), 70 | ), 71 | payload: jsonEncode(payload), 72 | ); 73 | } 74 | 75 | @pragma('vm:entry-point') 76 | static void notificationTapBackground( 77 | NotificationResponse notificationResponse) { 78 | // ignore: avoid_print 79 | print('notification(${notificationResponse.id}) action tapped: ' 80 | '${notificationResponse.actionId} with' 81 | ' payload: ${notificationResponse.payload}'); 82 | if (notificationResponse.input?.isNotEmpty ?? false) { 83 | // ignore: avoid_print 84 | print( 85 | 'notification action tapped with input: ${notificationResponse.input}'); 86 | } 87 | 88 | final String? payload = notificationResponse.payload; 89 | if (notificationResponse.payload != null) { 90 | debugPrint('notification payload: $payload'); 91 | var jsonData = jsonDecode(payload!); 92 | onPressed?.call(jsonData); 93 | } 94 | } 95 | } 96 | -------------------------------------------------------------------------------- /lib/notification/fcm.dart: -------------------------------------------------------------------------------- 1 | import 'dart:async'; 2 | import 'package:firebase_messaging/firebase_messaging.dart'; 3 | import 'package:firebase_core/firebase_core.dart'; 4 | import 'package:flutter/material.dart'; 5 | import 'local_notification.dart'; 6 | 7 | class FCM { 8 | FCM._(); 9 | 10 | /// Callback for token changes. 11 | static late ValueChanged _onTokenChanged; 12 | 13 | /// Initialize Firebase Cloud Messaging and set up notification handling. 14 | /// 15 | /// [onTokenChanged] is a required callback function that is invoked when the FCM token changes. 16 | /// [onNotificationPressed] is an optional callback to handle notifications when pressed by the user. 17 | /// [onNotificationReceived] is a background message handler called when a notification is received while the app is in the background. 18 | /// [navigatorKey] is an optional `GlobalKey` for navigating within the app. 19 | /// [icon] is a string specifying the icon used for displaying notifications. icon must be in android/app/src/main/res/drawable/ic_launcher.png 20 | /// [withLocalNotification] is a boolean flag to enable or disable local notifications. 21 | /// 22 | /// This method initializes Firebase, sets up token handling, background message handling, and notification presentation options for iOS and Android. 23 | static Future initializeFCM( 24 | {required void Function(String? token) onTokenChanged, 25 | void Function(Map data)? onNotificationPressed, 26 | required BackgroundMessageHandler onNotificationReceived, 27 | GlobalKey? navigatorKey, 28 | required String icon, 29 | bool withLocalNotification = true}) async { 30 | _onTokenChanged = onTokenChanged; 31 | await Firebase.initializeApp(); 32 | 33 | FirebaseMessaging messaging = FirebaseMessaging.instance; 34 | 35 | NotificationSettings settings = await messaging.requestPermission( 36 | alert: true, 37 | announcement: false, 38 | badge: true, 39 | carPlay: false, 40 | criticalAlert: false, 41 | provisional: false, 42 | sound: true, 43 | ); 44 | 45 | print('User granted permission: ${settings.authorizationStatus}'); 46 | 47 | await LocalNotification.initializeLocalNotification( 48 | onNotificationPressed: onNotificationPressed, icon: icon); 49 | messaging.getToken().then(onTokenChanged); 50 | Stream tokenStream = messaging.onTokenRefresh; 51 | tokenStream.listen(onTokenChanged); 52 | 53 | // Set the background messaging handler early on, as a named top-level function 54 | FirebaseMessaging.onBackgroundMessage(onNotificationReceived); 55 | 56 | await messaging.setForegroundNotificationPresentationOptions( 57 | alert: true, 58 | badge: true, 59 | sound: true, 60 | ); 61 | 62 | messaging.getInitialMessage().then((RemoteMessage? message) { 63 | print('getInitialMessage'); 64 | print(message); 65 | if (message != null) { 66 | if (navigatorKey != null) { 67 | Timer.periodic( 68 | Duration(milliseconds: 500), 69 | (timer) { 70 | if (navigatorKey.currentState == null) return; 71 | onNotificationPressed!(message.data); 72 | timer.cancel(); 73 | }, 74 | ); 75 | } 76 | } 77 | }); 78 | 79 | FirebaseMessaging.onMessage.listen((RemoteMessage message) { 80 | print('A new onMessage event was published!'); 81 | 82 | onNotificationReceived(message); 83 | RemoteNotification? notification = message.notification; 84 | AndroidNotification? android = message.notification?.android; 85 | 86 | if (notification != null && android != null && withLocalNotification) { 87 | LocalNotification.showNotification( 88 | notification: notification, payload: message.data, icon: icon); 89 | } 90 | }); 91 | 92 | FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) { 93 | print('A new onMessageOpenedApp event was published!'); 94 | onNotificationPressed!(message.data); 95 | }); 96 | 97 | FirebaseMessaging.onBackgroundMessage((RemoteMessage message) async { 98 | print('A new onBackgroundMessage event was published!'); 99 | onNotificationPressed!(message.data); 100 | onNotificationReceived(message); 101 | }); 102 | } 103 | 104 | /// Delete the FCM refresh token and retrieve a new token. 105 | static void deleteRefreshToken() { 106 | FirebaseMessaging.instance.deleteToken(); 107 | FirebaseMessaging.instance.getToken().then(_onTokenChanged); 108 | } 109 | 110 | /// To subscribe to a topic, call subscribeToTopic() with the topic name. This method returns a Future, which resolves when the subscription succeeded: 111 | static void subscribeToTopic(String topic) { 112 | FirebaseMessaging.instance.subscribeToTopic(topic); 113 | } 114 | 115 | /// To unsubscribe from a topic, call the unsubscribeFromTopic method with the topic name: 116 | static unsubscribeFromTopic(String topic) { 117 | FirebaseMessaging.instance.unsubscribeFromTopic(topic); 118 | } 119 | } 120 | -------------------------------------------------------------------------------- /pubspec.lock: -------------------------------------------------------------------------------- 1 | # Generated by pub 2 | # See https://dart.dev/tools/pub/glossary#lockfile 3 | packages: 4 | _flutterfire_internals: 5 | dependency: transitive 6 | description: 7 | name: _flutterfire_internals 8 | sha256: e4a1b612fd2955908e26116075b3a4baf10c353418ca645b4deae231c82bf144 9 | url: "https://pub.dev" 10 | source: hosted 11 | version: "1.3.65" 12 | args: 13 | dependency: transitive 14 | description: 15 | name: args 16 | sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 17 | url: "https://pub.dev" 18 | source: hosted 19 | version: "2.7.0" 20 | async: 21 | dependency: transitive 22 | description: 23 | name: async 24 | sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63 25 | url: "https://pub.dev" 26 | source: hosted 27 | version: "2.12.0" 28 | boolean_selector: 29 | dependency: transitive 30 | description: 31 | name: boolean_selector 32 | sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" 33 | url: "https://pub.dev" 34 | source: hosted 35 | version: "2.1.2" 36 | characters: 37 | dependency: transitive 38 | description: 39 | name: characters 40 | sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 41 | url: "https://pub.dev" 42 | source: hosted 43 | version: "1.4.0" 44 | clock: 45 | dependency: transitive 46 | description: 47 | name: clock 48 | sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b 49 | url: "https://pub.dev" 50 | source: hosted 51 | version: "1.1.2" 52 | collection: 53 | dependency: transitive 54 | description: 55 | name: collection 56 | sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" 57 | url: "https://pub.dev" 58 | source: hosted 59 | version: "1.19.1" 60 | dbus: 61 | dependency: transitive 62 | description: 63 | name: dbus 64 | sha256: "79e0c23480ff85dc68de79e2cd6334add97e48f7f4865d17686dd6ea81a47e8c" 65 | url: "https://pub.dev" 66 | source: hosted 67 | version: "0.7.11" 68 | fake_async: 69 | dependency: transitive 70 | description: 71 | name: fake_async 72 | sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" 73 | url: "https://pub.dev" 74 | source: hosted 75 | version: "1.3.3" 76 | ffi: 77 | dependency: transitive 78 | description: 79 | name: ffi 80 | sha256: "289279317b4b16eb2bb7e271abccd4bf84ec9bdcbe999e278a94b804f5630418" 81 | url: "https://pub.dev" 82 | source: hosted 83 | version: "2.1.4" 84 | firebase_core: 85 | dependency: "direct main" 86 | description: 87 | name: firebase_core 88 | sha256: "29cfa93c771d8105484acac340b5ea0835be371672c91405a300303986f4eba9" 89 | url: "https://pub.dev" 90 | source: hosted 91 | version: "4.3.0" 92 | firebase_core_platform_interface: 93 | dependency: transitive 94 | description: 95 | name: firebase_core_platform_interface 96 | sha256: cccb4f572325dc14904c02fcc7db6323ad62ba02536833dddb5c02cac7341c64 97 | url: "https://pub.dev" 98 | source: hosted 99 | version: "6.0.2" 100 | firebase_core_web: 101 | dependency: transitive 102 | description: 103 | name: firebase_core_web 104 | sha256: a631bbfbfa26963d68046aed949df80b228964020e9155b086eff94f462bbf1f 105 | url: "https://pub.dev" 106 | source: hosted 107 | version: "3.3.1" 108 | firebase_messaging: 109 | dependency: "direct main" 110 | description: 111 | name: firebase_messaging 112 | sha256: "1ad663fbb6758acec09d7e84a2e6478265f0a517f40ef77c573efd5e0089f400" 113 | url: "https://pub.dev" 114 | source: hosted 115 | version: "16.1.0" 116 | firebase_messaging_platform_interface: 117 | dependency: transitive 118 | description: 119 | name: firebase_messaging_platform_interface 120 | sha256: ea620e841fbcec62a96984295fc628f53ef5a8da4f53238159719ed0af7db834 121 | url: "https://pub.dev" 122 | source: hosted 123 | version: "4.7.5" 124 | firebase_messaging_web: 125 | dependency: transitive 126 | description: 127 | name: firebase_messaging_web 128 | sha256: "7d0fb6256202515bba8489a3d69c6bc9d52d69a4999bad789053b486c8e7323e" 129 | url: "https://pub.dev" 130 | source: hosted 131 | version: "4.1.1" 132 | flutter: 133 | dependency: "direct main" 134 | description: flutter 135 | source: sdk 136 | version: "0.0.0" 137 | flutter_local_notifications: 138 | dependency: "direct main" 139 | description: 140 | name: flutter_local_notifications 141 | sha256: "19ffb0a8bb7407875555e5e98d7343a633bb73707bae6c6a5f37c90014077875" 142 | url: "https://pub.dev" 143 | source: hosted 144 | version: "19.5.0" 145 | flutter_local_notifications_linux: 146 | dependency: transitive 147 | description: 148 | name: flutter_local_notifications_linux 149 | sha256: e3c277b2daab8e36ac5a6820536668d07e83851aeeb79c446e525a70710770a5 150 | url: "https://pub.dev" 151 | source: hosted 152 | version: "6.0.0" 153 | flutter_local_notifications_platform_interface: 154 | dependency: transitive 155 | description: 156 | name: flutter_local_notifications_platform_interface 157 | sha256: "277d25d960c15674ce78ca97f57d0bae2ee401c844b6ac80fcd972a9c99d09fe" 158 | url: "https://pub.dev" 159 | source: hosted 160 | version: "9.1.0" 161 | flutter_local_notifications_windows: 162 | dependency: transitive 163 | description: 164 | name: flutter_local_notifications_windows 165 | sha256: "8d658f0d367c48bd420e7cf2d26655e2d1130147bca1eea917e576ca76668aaf" 166 | url: "https://pub.dev" 167 | source: hosted 168 | version: "1.0.3" 169 | flutter_test: 170 | dependency: "direct dev" 171 | description: flutter 172 | source: sdk 173 | version: "0.0.0" 174 | flutter_web_plugins: 175 | dependency: transitive 176 | description: flutter 177 | source: sdk 178 | version: "0.0.0" 179 | http: 180 | dependency: transitive 181 | description: 182 | name: http 183 | sha256: bb2ce4590bc2667c96f318d68cac1b5a7987ec819351d32b1c987239a815e007 184 | url: "https://pub.dev" 185 | source: hosted 186 | version: "1.5.0" 187 | http_parser: 188 | dependency: transitive 189 | description: 190 | name: http_parser 191 | sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" 192 | url: "https://pub.dev" 193 | source: hosted 194 | version: "4.1.2" 195 | leak_tracker: 196 | dependency: transitive 197 | description: 198 | name: leak_tracker 199 | sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" 200 | url: "https://pub.dev" 201 | source: hosted 202 | version: "11.0.2" 203 | leak_tracker_flutter_testing: 204 | dependency: transitive 205 | description: 206 | name: leak_tracker_flutter_testing 207 | sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" 208 | url: "https://pub.dev" 209 | source: hosted 210 | version: "3.0.10" 211 | leak_tracker_testing: 212 | dependency: transitive 213 | description: 214 | name: leak_tracker_testing 215 | sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" 216 | url: "https://pub.dev" 217 | source: hosted 218 | version: "3.0.2" 219 | lints: 220 | dependency: "direct dev" 221 | description: 222 | name: lints 223 | sha256: c35bb79562d980e9a453fc715854e1ed39e24e7d0297a880ef54e17f9874a9d7 224 | url: "https://pub.dev" 225 | source: hosted 226 | version: "5.1.1" 227 | matcher: 228 | dependency: transitive 229 | description: 230 | name: matcher 231 | sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 232 | url: "https://pub.dev" 233 | source: hosted 234 | version: "0.12.17" 235 | material_color_utilities: 236 | dependency: transitive 237 | description: 238 | name: material_color_utilities 239 | sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec 240 | url: "https://pub.dev" 241 | source: hosted 242 | version: "0.11.1" 243 | meta: 244 | dependency: transitive 245 | description: 246 | name: meta 247 | sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c 248 | url: "https://pub.dev" 249 | source: hosted 250 | version: "1.16.0" 251 | path: 252 | dependency: transitive 253 | description: 254 | name: path 255 | sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" 256 | url: "https://pub.dev" 257 | source: hosted 258 | version: "1.9.1" 259 | petitparser: 260 | dependency: transitive 261 | description: 262 | name: petitparser 263 | sha256: "07c8f0b1913bcde1ff0d26e57ace2f3012ccbf2b204e070290dad3bb22797646" 264 | url: "https://pub.dev" 265 | source: hosted 266 | version: "6.1.0" 267 | plugin_platform_interface: 268 | dependency: transitive 269 | description: 270 | name: plugin_platform_interface 271 | sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" 272 | url: "https://pub.dev" 273 | source: hosted 274 | version: "2.1.8" 275 | sky_engine: 276 | dependency: transitive 277 | description: flutter 278 | source: sdk 279 | version: "0.0.0" 280 | source_span: 281 | dependency: transitive 282 | description: 283 | name: source_span 284 | sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" 285 | url: "https://pub.dev" 286 | source: hosted 287 | version: "1.10.1" 288 | stack_trace: 289 | dependency: transitive 290 | description: 291 | name: stack_trace 292 | sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" 293 | url: "https://pub.dev" 294 | source: hosted 295 | version: "1.12.1" 296 | stream_channel: 297 | dependency: transitive 298 | description: 299 | name: stream_channel 300 | sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" 301 | url: "https://pub.dev" 302 | source: hosted 303 | version: "2.1.4" 304 | string_scanner: 305 | dependency: transitive 306 | description: 307 | name: string_scanner 308 | sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" 309 | url: "https://pub.dev" 310 | source: hosted 311 | version: "1.4.1" 312 | term_glyph: 313 | dependency: transitive 314 | description: 315 | name: term_glyph 316 | sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" 317 | url: "https://pub.dev" 318 | source: hosted 319 | version: "1.2.2" 320 | test_api: 321 | dependency: transitive 322 | description: 323 | name: test_api 324 | sha256: "522f00f556e73044315fa4585ec3270f1808a4b186c936e612cab0b565ff1e00" 325 | url: "https://pub.dev" 326 | source: hosted 327 | version: "0.7.6" 328 | timezone: 329 | dependency: transitive 330 | description: 331 | name: timezone 332 | sha256: dd14a3b83cfd7cb19e7888f1cbc20f258b8d71b54c06f79ac585f14093a287d1 333 | url: "https://pub.dev" 334 | source: hosted 335 | version: "0.10.1" 336 | typed_data: 337 | dependency: transitive 338 | description: 339 | name: typed_data 340 | sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 341 | url: "https://pub.dev" 342 | source: hosted 343 | version: "1.4.0" 344 | vector_math: 345 | dependency: transitive 346 | description: 347 | name: vector_math 348 | sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b 349 | url: "https://pub.dev" 350 | source: hosted 351 | version: "2.2.0" 352 | vm_service: 353 | dependency: transitive 354 | description: 355 | name: vm_service 356 | sha256: "0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14" 357 | url: "https://pub.dev" 358 | source: hosted 359 | version: "14.3.1" 360 | web: 361 | dependency: transitive 362 | description: 363 | name: web 364 | sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" 365 | url: "https://pub.dev" 366 | source: hosted 367 | version: "1.1.1" 368 | xdg_directories: 369 | dependency: transitive 370 | description: 371 | name: xdg_directories 372 | sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" 373 | url: "https://pub.dev" 374 | source: hosted 375 | version: "1.1.0" 376 | xml: 377 | dependency: transitive 378 | description: 379 | name: xml 380 | sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 381 | url: "https://pub.dev" 382 | source: hosted 383 | version: "6.5.0" 384 | sdks: 385 | dart: ">=3.8.0-0 <4.0.0" 386 | flutter: ">=3.22.0" 387 | -------------------------------------------------------------------------------- /example/pubspec.lock: -------------------------------------------------------------------------------- 1 | # Generated by pub 2 | # See https://dart.dev/tools/pub/glossary#lockfile 3 | packages: 4 | _flutterfire_internals: 5 | dependency: transitive 6 | description: 7 | name: _flutterfire_internals 8 | sha256: e4a1b612fd2955908e26116075b3a4baf10c353418ca645b4deae231c82bf144 9 | url: "https://pub.dev" 10 | source: hosted 11 | version: "1.3.65" 12 | args: 13 | dependency: transitive 14 | description: 15 | name: args 16 | sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 17 | url: "https://pub.dev" 18 | source: hosted 19 | version: "2.7.0" 20 | async: 21 | dependency: transitive 22 | description: 23 | name: async 24 | sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63 25 | url: "https://pub.dev" 26 | source: hosted 27 | version: "2.12.0" 28 | boolean_selector: 29 | dependency: transitive 30 | description: 31 | name: boolean_selector 32 | sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" 33 | url: "https://pub.dev" 34 | source: hosted 35 | version: "2.1.2" 36 | characters: 37 | dependency: transitive 38 | description: 39 | name: characters 40 | sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 41 | url: "https://pub.dev" 42 | source: hosted 43 | version: "1.4.0" 44 | clock: 45 | dependency: transitive 46 | description: 47 | name: clock 48 | sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b 49 | url: "https://pub.dev" 50 | source: hosted 51 | version: "1.1.2" 52 | collection: 53 | dependency: transitive 54 | description: 55 | name: collection 56 | sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" 57 | url: "https://pub.dev" 58 | source: hosted 59 | version: "1.19.1" 60 | cupertino_icons: 61 | dependency: "direct main" 62 | description: 63 | name: cupertino_icons 64 | sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 65 | url: "https://pub.dev" 66 | source: hosted 67 | version: "1.0.8" 68 | dbus: 69 | dependency: transitive 70 | description: 71 | name: dbus 72 | sha256: "79e0c23480ff85dc68de79e2cd6334add97e48f7f4865d17686dd6ea81a47e8c" 73 | url: "https://pub.dev" 74 | source: hosted 75 | version: "0.7.11" 76 | fake_async: 77 | dependency: transitive 78 | description: 79 | name: fake_async 80 | sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" 81 | url: "https://pub.dev" 82 | source: hosted 83 | version: "1.3.3" 84 | ffi: 85 | dependency: transitive 86 | description: 87 | name: ffi 88 | sha256: "289279317b4b16eb2bb7e271abccd4bf84ec9bdcbe999e278a94b804f5630418" 89 | url: "https://pub.dev" 90 | source: hosted 91 | version: "2.1.4" 92 | firebase_core: 93 | dependency: transitive 94 | description: 95 | name: firebase_core 96 | sha256: "29cfa93c771d8105484acac340b5ea0835be371672c91405a300303986f4eba9" 97 | url: "https://pub.dev" 98 | source: hosted 99 | version: "4.3.0" 100 | firebase_core_platform_interface: 101 | dependency: transitive 102 | description: 103 | name: firebase_core_platform_interface 104 | sha256: cccb4f572325dc14904c02fcc7db6323ad62ba02536833dddb5c02cac7341c64 105 | url: "https://pub.dev" 106 | source: hosted 107 | version: "6.0.2" 108 | firebase_core_web: 109 | dependency: transitive 110 | description: 111 | name: firebase_core_web 112 | sha256: a631bbfbfa26963d68046aed949df80b228964020e9155b086eff94f462bbf1f 113 | url: "https://pub.dev" 114 | source: hosted 115 | version: "3.3.1" 116 | firebase_messaging: 117 | dependency: transitive 118 | description: 119 | name: firebase_messaging 120 | sha256: "1ad663fbb6758acec09d7e84a2e6478265f0a517f40ef77c573efd5e0089f400" 121 | url: "https://pub.dev" 122 | source: hosted 123 | version: "16.1.0" 124 | firebase_messaging_platform_interface: 125 | dependency: transitive 126 | description: 127 | name: firebase_messaging_platform_interface 128 | sha256: ea620e841fbcec62a96984295fc628f53ef5a8da4f53238159719ed0af7db834 129 | url: "https://pub.dev" 130 | source: hosted 131 | version: "4.7.5" 132 | firebase_messaging_web: 133 | dependency: transitive 134 | description: 135 | name: firebase_messaging_web 136 | sha256: "7d0fb6256202515bba8489a3d69c6bc9d52d69a4999bad789053b486c8e7323e" 137 | url: "https://pub.dev" 138 | source: hosted 139 | version: "4.1.1" 140 | flutter: 141 | dependency: "direct main" 142 | description: flutter 143 | source: sdk 144 | version: "0.0.0" 145 | flutter_fcm: 146 | dependency: "direct main" 147 | description: 148 | path: ".." 149 | relative: true 150 | source: path 151 | version: "1.3.5" 152 | flutter_local_notifications: 153 | dependency: transitive 154 | description: 155 | name: flutter_local_notifications 156 | sha256: "19ffb0a8bb7407875555e5e98d7343a633bb73707bae6c6a5f37c90014077875" 157 | url: "https://pub.dev" 158 | source: hosted 159 | version: "19.5.0" 160 | flutter_local_notifications_linux: 161 | dependency: transitive 162 | description: 163 | name: flutter_local_notifications_linux 164 | sha256: e3c277b2daab8e36ac5a6820536668d07e83851aeeb79c446e525a70710770a5 165 | url: "https://pub.dev" 166 | source: hosted 167 | version: "6.0.0" 168 | flutter_local_notifications_platform_interface: 169 | dependency: transitive 170 | description: 171 | name: flutter_local_notifications_platform_interface 172 | sha256: "277d25d960c15674ce78ca97f57d0bae2ee401c844b6ac80fcd972a9c99d09fe" 173 | url: "https://pub.dev" 174 | source: hosted 175 | version: "9.1.0" 176 | flutter_local_notifications_windows: 177 | dependency: transitive 178 | description: 179 | name: flutter_local_notifications_windows 180 | sha256: "8d658f0d367c48bd420e7cf2d26655e2d1130147bca1eea917e576ca76668aaf" 181 | url: "https://pub.dev" 182 | source: hosted 183 | version: "1.0.3" 184 | flutter_test: 185 | dependency: "direct dev" 186 | description: flutter 187 | source: sdk 188 | version: "0.0.0" 189 | flutter_web_plugins: 190 | dependency: transitive 191 | description: flutter 192 | source: sdk 193 | version: "0.0.0" 194 | http: 195 | dependency: transitive 196 | description: 197 | name: http 198 | sha256: bb2ce4590bc2667c96f318d68cac1b5a7987ec819351d32b1c987239a815e007 199 | url: "https://pub.dev" 200 | source: hosted 201 | version: "1.5.0" 202 | http_parser: 203 | dependency: transitive 204 | description: 205 | name: http_parser 206 | sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" 207 | url: "https://pub.dev" 208 | source: hosted 209 | version: "4.1.2" 210 | leak_tracker: 211 | dependency: transitive 212 | description: 213 | name: leak_tracker 214 | sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" 215 | url: "https://pub.dev" 216 | source: hosted 217 | version: "11.0.2" 218 | leak_tracker_flutter_testing: 219 | dependency: transitive 220 | description: 221 | name: leak_tracker_flutter_testing 222 | sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" 223 | url: "https://pub.dev" 224 | source: hosted 225 | version: "3.0.10" 226 | leak_tracker_testing: 227 | dependency: transitive 228 | description: 229 | name: leak_tracker_testing 230 | sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" 231 | url: "https://pub.dev" 232 | source: hosted 233 | version: "3.0.2" 234 | matcher: 235 | dependency: transitive 236 | description: 237 | name: matcher 238 | sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 239 | url: "https://pub.dev" 240 | source: hosted 241 | version: "0.12.17" 242 | material_color_utilities: 243 | dependency: transitive 244 | description: 245 | name: material_color_utilities 246 | sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec 247 | url: "https://pub.dev" 248 | source: hosted 249 | version: "0.11.1" 250 | meta: 251 | dependency: transitive 252 | description: 253 | name: meta 254 | sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c 255 | url: "https://pub.dev" 256 | source: hosted 257 | version: "1.16.0" 258 | path: 259 | dependency: transitive 260 | description: 261 | name: path 262 | sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" 263 | url: "https://pub.dev" 264 | source: hosted 265 | version: "1.9.1" 266 | petitparser: 267 | dependency: transitive 268 | description: 269 | name: petitparser 270 | sha256: "07c8f0b1913bcde1ff0d26e57ace2f3012ccbf2b204e070290dad3bb22797646" 271 | url: "https://pub.dev" 272 | source: hosted 273 | version: "6.1.0" 274 | plugin_platform_interface: 275 | dependency: transitive 276 | description: 277 | name: plugin_platform_interface 278 | sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" 279 | url: "https://pub.dev" 280 | source: hosted 281 | version: "2.1.8" 282 | sky_engine: 283 | dependency: transitive 284 | description: flutter 285 | source: sdk 286 | version: "0.0.0" 287 | source_span: 288 | dependency: transitive 289 | description: 290 | name: source_span 291 | sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" 292 | url: "https://pub.dev" 293 | source: hosted 294 | version: "1.10.1" 295 | stack_trace: 296 | dependency: transitive 297 | description: 298 | name: stack_trace 299 | sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" 300 | url: "https://pub.dev" 301 | source: hosted 302 | version: "1.12.1" 303 | stream_channel: 304 | dependency: transitive 305 | description: 306 | name: stream_channel 307 | sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" 308 | url: "https://pub.dev" 309 | source: hosted 310 | version: "2.1.4" 311 | string_scanner: 312 | dependency: transitive 313 | description: 314 | name: string_scanner 315 | sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" 316 | url: "https://pub.dev" 317 | source: hosted 318 | version: "1.4.1" 319 | term_glyph: 320 | dependency: transitive 321 | description: 322 | name: term_glyph 323 | sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" 324 | url: "https://pub.dev" 325 | source: hosted 326 | version: "1.2.2" 327 | test_api: 328 | dependency: transitive 329 | description: 330 | name: test_api 331 | sha256: "522f00f556e73044315fa4585ec3270f1808a4b186c936e612cab0b565ff1e00" 332 | url: "https://pub.dev" 333 | source: hosted 334 | version: "0.7.6" 335 | timezone: 336 | dependency: transitive 337 | description: 338 | name: timezone 339 | sha256: dd14a3b83cfd7cb19e7888f1cbc20f258b8d71b54c06f79ac585f14093a287d1 340 | url: "https://pub.dev" 341 | source: hosted 342 | version: "0.10.1" 343 | typed_data: 344 | dependency: transitive 345 | description: 346 | name: typed_data 347 | sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 348 | url: "https://pub.dev" 349 | source: hosted 350 | version: "1.4.0" 351 | vector_math: 352 | dependency: transitive 353 | description: 354 | name: vector_math 355 | sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b 356 | url: "https://pub.dev" 357 | source: hosted 358 | version: "2.2.0" 359 | vm_service: 360 | dependency: transitive 361 | description: 362 | name: vm_service 363 | sha256: "0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14" 364 | url: "https://pub.dev" 365 | source: hosted 366 | version: "14.3.1" 367 | web: 368 | dependency: transitive 369 | description: 370 | name: web 371 | sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" 372 | url: "https://pub.dev" 373 | source: hosted 374 | version: "1.1.1" 375 | xdg_directories: 376 | dependency: transitive 377 | description: 378 | name: xdg_directories 379 | sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" 380 | url: "https://pub.dev" 381 | source: hosted 382 | version: "1.1.0" 383 | xml: 384 | dependency: transitive 385 | description: 386 | name: xml 387 | sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 388 | url: "https://pub.dev" 389 | source: hosted 390 | version: "6.5.0" 391 | sdks: 392 | dart: ">=3.8.0-0 <4.0.0" 393 | flutter: ">=3.22.0" 394 | -------------------------------------------------------------------------------- /example/ios/Runner.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 11 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 12 | 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */; }; 13 | 97C146F31CF9000F007C117D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 97C146F21CF9000F007C117D /* main.m */; }; 14 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 15 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 16 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; 17 | /* End PBXBuildFile section */ 18 | 19 | /* Begin PBXCopyFilesBuildPhase section */ 20 | 9705A1C41CF9048500538489 /* Embed Frameworks */ = { 21 | isa = PBXCopyFilesBuildPhase; 22 | buildActionMask = 2147483647; 23 | dstPath = ""; 24 | dstSubfolderSpec = 10; 25 | files = ( 26 | ); 27 | name = "Embed Frameworks"; 28 | runOnlyForDeploymentPostprocessing = 0; 29 | }; 30 | /* End PBXCopyFilesBuildPhase section */ 31 | 32 | /* Begin PBXFileReference section */ 33 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 34 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; 35 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; 36 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 37 | 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 38 | 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 39 | 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 40 | 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 41 | 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 42 | 97C146F21CF9000F007C117D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 43 | 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 44 | 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 45 | 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 46 | 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 47 | /* End PBXFileReference section */ 48 | 49 | /* Begin PBXFrameworksBuildPhase section */ 50 | 97C146EB1CF9000F007C117D /* Frameworks */ = { 51 | isa = PBXFrameworksBuildPhase; 52 | buildActionMask = 2147483647; 53 | files = ( 54 | ); 55 | runOnlyForDeploymentPostprocessing = 0; 56 | }; 57 | /* End PBXFrameworksBuildPhase section */ 58 | 59 | /* Begin PBXGroup section */ 60 | 9740EEB11CF90186004384FC /* Flutter */ = { 61 | isa = PBXGroup; 62 | children = ( 63 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, 64 | 9740EEB21CF90195004384FC /* Debug.xcconfig */, 65 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, 66 | 9740EEB31CF90195004384FC /* Generated.xcconfig */, 67 | ); 68 | name = Flutter; 69 | sourceTree = ""; 70 | }; 71 | 97C146E51CF9000F007C117D = { 72 | isa = PBXGroup; 73 | children = ( 74 | 9740EEB11CF90186004384FC /* Flutter */, 75 | 97C146F01CF9000F007C117D /* Runner */, 76 | 97C146EF1CF9000F007C117D /* Products */, 77 | CF3B75C9A7D2FA2A4C99F110 /* Frameworks */, 78 | ); 79 | sourceTree = ""; 80 | }; 81 | 97C146EF1CF9000F007C117D /* Products */ = { 82 | isa = PBXGroup; 83 | children = ( 84 | 97C146EE1CF9000F007C117D /* Runner.app */, 85 | ); 86 | name = Products; 87 | sourceTree = ""; 88 | }; 89 | 97C146F01CF9000F007C117D /* Runner */ = { 90 | isa = PBXGroup; 91 | children = ( 92 | 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */, 93 | 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */, 94 | 97C146FA1CF9000F007C117D /* Main.storyboard */, 95 | 97C146FD1CF9000F007C117D /* Assets.xcassets */, 96 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, 97 | 97C147021CF9000F007C117D /* Info.plist */, 98 | 97C146F11CF9000F007C117D /* Supporting Files */, 99 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, 100 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, 101 | ); 102 | path = Runner; 103 | sourceTree = ""; 104 | }; 105 | 97C146F11CF9000F007C117D /* Supporting Files */ = { 106 | isa = PBXGroup; 107 | children = ( 108 | 97C146F21CF9000F007C117D /* main.m */, 109 | ); 110 | name = "Supporting Files"; 111 | sourceTree = ""; 112 | }; 113 | /* End PBXGroup section */ 114 | 115 | /* Begin PBXNativeTarget section */ 116 | 97C146ED1CF9000F007C117D /* Runner */ = { 117 | isa = PBXNativeTarget; 118 | buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; 119 | buildPhases = ( 120 | 9740EEB61CF901F6004384FC /* Run Script */, 121 | 97C146EA1CF9000F007C117D /* Sources */, 122 | 97C146EB1CF9000F007C117D /* Frameworks */, 123 | 97C146EC1CF9000F007C117D /* Resources */, 124 | 9705A1C41CF9048500538489 /* Embed Frameworks */, 125 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */, 126 | ); 127 | buildRules = ( 128 | ); 129 | dependencies = ( 130 | ); 131 | name = Runner; 132 | productName = Runner; 133 | productReference = 97C146EE1CF9000F007C117D /* Runner.app */; 134 | productType = "com.apple.product-type.application"; 135 | }; 136 | /* End PBXNativeTarget section */ 137 | 138 | /* Begin PBXProject section */ 139 | 97C146E61CF9000F007C117D /* Project object */ = { 140 | isa = PBXProject; 141 | attributes = { 142 | LastUpgradeCheck = 1020; 143 | ORGANIZATIONNAME = ""; 144 | TargetAttributes = { 145 | 97C146ED1CF9000F007C117D = { 146 | CreatedOnToolsVersion = 7.3.1; 147 | }; 148 | }; 149 | }; 150 | buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; 151 | compatibilityVersion = "Xcode 9.3"; 152 | developmentRegion = en; 153 | hasScannedForEncodings = 0; 154 | knownRegions = ( 155 | en, 156 | Base, 157 | ); 158 | mainGroup = 97C146E51CF9000F007C117D; 159 | productRefGroup = 97C146EF1CF9000F007C117D /* Products */; 160 | projectDirPath = ""; 161 | projectRoot = ""; 162 | targets = ( 163 | 97C146ED1CF9000F007C117D /* Runner */, 164 | ); 165 | }; 166 | /* End PBXProject section */ 167 | 168 | /* Begin PBXResourcesBuildPhase section */ 169 | 97C146EC1CF9000F007C117D /* Resources */ = { 170 | isa = PBXResourcesBuildPhase; 171 | buildActionMask = 2147483647; 172 | files = ( 173 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, 174 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, 175 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 176 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, 177 | ); 178 | runOnlyForDeploymentPostprocessing = 0; 179 | }; 180 | /* End PBXResourcesBuildPhase section */ 181 | 182 | /* Begin PBXShellScriptBuildPhase section */ 183 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { 184 | isa = PBXShellScriptBuildPhase; 185 | buildActionMask = 2147483647; 186 | files = ( 187 | ); 188 | inputPaths = ( 189 | ); 190 | name = "Thin Binary"; 191 | outputPaths = ( 192 | ); 193 | runOnlyForDeploymentPostprocessing = 0; 194 | shellPath = /bin/sh; 195 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; 196 | }; 197 | 9740EEB61CF901F6004384FC /* Run Script */ = { 198 | isa = PBXShellScriptBuildPhase; 199 | buildActionMask = 2147483647; 200 | files = ( 201 | ); 202 | inputPaths = ( 203 | ); 204 | name = "Run Script"; 205 | outputPaths = ( 206 | ); 207 | runOnlyForDeploymentPostprocessing = 0; 208 | shellPath = /bin/sh; 209 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; 210 | }; 211 | /* End PBXShellScriptBuildPhase section */ 212 | 213 | /* Begin PBXSourcesBuildPhase section */ 214 | 97C146EA1CF9000F007C117D /* Sources */ = { 215 | isa = PBXSourcesBuildPhase; 216 | buildActionMask = 2147483647; 217 | files = ( 218 | 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */, 219 | 97C146F31CF9000F007C117D /* main.m in Sources */, 220 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, 221 | ); 222 | runOnlyForDeploymentPostprocessing = 0; 223 | }; 224 | /* End PBXSourcesBuildPhase section */ 225 | 226 | /* Begin PBXVariantGroup section */ 227 | 97C146FA1CF9000F007C117D /* Main.storyboard */ = { 228 | isa = PBXVariantGroup; 229 | children = ( 230 | 97C146FB1CF9000F007C117D /* Base */, 231 | ); 232 | name = Main.storyboard; 233 | sourceTree = ""; 234 | }; 235 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { 236 | isa = PBXVariantGroup; 237 | children = ( 238 | 97C147001CF9000F007C117D /* Base */, 239 | ); 240 | name = LaunchScreen.storyboard; 241 | sourceTree = ""; 242 | }; 243 | /* End PBXVariantGroup section */ 244 | 245 | /* Begin XCBuildConfiguration section */ 246 | 249021D3217E4FDB00AE95B9 /* Profile */ = { 247 | isa = XCBuildConfiguration; 248 | buildSettings = { 249 | ALWAYS_SEARCH_USER_PATHS = NO; 250 | CLANG_ANALYZER_NONNULL = YES; 251 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 252 | CLANG_CXX_LIBRARY = "libc++"; 253 | CLANG_ENABLE_MODULES = YES; 254 | CLANG_ENABLE_OBJC_ARC = YES; 255 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 256 | CLANG_WARN_BOOL_CONVERSION = YES; 257 | CLANG_WARN_COMMA = YES; 258 | CLANG_WARN_CONSTANT_CONVERSION = YES; 259 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 260 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 261 | CLANG_WARN_EMPTY_BODY = YES; 262 | CLANG_WARN_ENUM_CONVERSION = YES; 263 | CLANG_WARN_INFINITE_RECURSION = YES; 264 | CLANG_WARN_INT_CONVERSION = YES; 265 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 266 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 267 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 268 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 269 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 270 | CLANG_WARN_STRICT_PROTOTYPES = YES; 271 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 272 | CLANG_WARN_UNREACHABLE_CODE = YES; 273 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 274 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 275 | COPY_PHASE_STRIP = NO; 276 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 277 | ENABLE_NS_ASSERTIONS = NO; 278 | ENABLE_STRICT_OBJC_MSGSEND = YES; 279 | GCC_C_LANGUAGE_STANDARD = gnu99; 280 | GCC_NO_COMMON_BLOCKS = YES; 281 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 282 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 283 | GCC_WARN_UNDECLARED_SELECTOR = YES; 284 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 285 | GCC_WARN_UNUSED_FUNCTION = YES; 286 | GCC_WARN_UNUSED_VARIABLE = YES; 287 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 288 | MTL_ENABLE_DEBUG_INFO = NO; 289 | SDKROOT = iphoneos; 290 | SUPPORTED_PLATFORMS = iphoneos; 291 | TARGETED_DEVICE_FAMILY = "1,2"; 292 | VALIDATE_PRODUCT = YES; 293 | }; 294 | name = Profile; 295 | }; 296 | 249021D4217E4FDB00AE95B9 /* Profile */ = { 297 | isa = XCBuildConfiguration; 298 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 299 | buildSettings = { 300 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 301 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 302 | ENABLE_BITCODE = NO; 303 | INFOPLIST_FILE = Runner/Info.plist; 304 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 305 | PRODUCT_BUNDLE_IDENTIFIER = com.flutterfcm.flutterFcmExample; 306 | PRODUCT_NAME = "$(TARGET_NAME)"; 307 | VERSIONING_SYSTEM = "apple-generic"; 308 | }; 309 | name = Profile; 310 | }; 311 | 97C147031CF9000F007C117D /* Debug */ = { 312 | isa = XCBuildConfiguration; 313 | buildSettings = { 314 | ALWAYS_SEARCH_USER_PATHS = NO; 315 | CLANG_ANALYZER_NONNULL = YES; 316 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 317 | CLANG_CXX_LIBRARY = "libc++"; 318 | CLANG_ENABLE_MODULES = YES; 319 | CLANG_ENABLE_OBJC_ARC = YES; 320 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 321 | CLANG_WARN_BOOL_CONVERSION = YES; 322 | CLANG_WARN_COMMA = YES; 323 | CLANG_WARN_CONSTANT_CONVERSION = YES; 324 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 325 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 326 | CLANG_WARN_EMPTY_BODY = YES; 327 | CLANG_WARN_ENUM_CONVERSION = YES; 328 | CLANG_WARN_INFINITE_RECURSION = YES; 329 | CLANG_WARN_INT_CONVERSION = YES; 330 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 331 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 332 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 333 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 334 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 335 | CLANG_WARN_STRICT_PROTOTYPES = YES; 336 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 337 | CLANG_WARN_UNREACHABLE_CODE = YES; 338 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 339 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 340 | COPY_PHASE_STRIP = NO; 341 | DEBUG_INFORMATION_FORMAT = dwarf; 342 | ENABLE_STRICT_OBJC_MSGSEND = YES; 343 | ENABLE_TESTABILITY = YES; 344 | GCC_C_LANGUAGE_STANDARD = gnu99; 345 | GCC_DYNAMIC_NO_PIC = NO; 346 | GCC_NO_COMMON_BLOCKS = YES; 347 | GCC_OPTIMIZATION_LEVEL = 0; 348 | GCC_PREPROCESSOR_DEFINITIONS = ( 349 | "DEBUG=1", 350 | "$(inherited)", 351 | ); 352 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 353 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 354 | GCC_WARN_UNDECLARED_SELECTOR = YES; 355 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 356 | GCC_WARN_UNUSED_FUNCTION = YES; 357 | GCC_WARN_UNUSED_VARIABLE = YES; 358 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 359 | MTL_ENABLE_DEBUG_INFO = YES; 360 | ONLY_ACTIVE_ARCH = YES; 361 | SDKROOT = iphoneos; 362 | TARGETED_DEVICE_FAMILY = "1,2"; 363 | }; 364 | name = Debug; 365 | }; 366 | 97C147041CF9000F007C117D /* Release */ = { 367 | isa = XCBuildConfiguration; 368 | buildSettings = { 369 | ALWAYS_SEARCH_USER_PATHS = NO; 370 | CLANG_ANALYZER_NONNULL = YES; 371 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 372 | CLANG_CXX_LIBRARY = "libc++"; 373 | CLANG_ENABLE_MODULES = YES; 374 | CLANG_ENABLE_OBJC_ARC = YES; 375 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 376 | CLANG_WARN_BOOL_CONVERSION = YES; 377 | CLANG_WARN_COMMA = YES; 378 | CLANG_WARN_CONSTANT_CONVERSION = YES; 379 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 380 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 381 | CLANG_WARN_EMPTY_BODY = YES; 382 | CLANG_WARN_ENUM_CONVERSION = YES; 383 | CLANG_WARN_INFINITE_RECURSION = YES; 384 | CLANG_WARN_INT_CONVERSION = YES; 385 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 386 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 387 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 388 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 389 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 390 | CLANG_WARN_STRICT_PROTOTYPES = YES; 391 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 392 | CLANG_WARN_UNREACHABLE_CODE = YES; 393 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 394 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 395 | COPY_PHASE_STRIP = NO; 396 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 397 | ENABLE_NS_ASSERTIONS = NO; 398 | ENABLE_STRICT_OBJC_MSGSEND = YES; 399 | GCC_C_LANGUAGE_STANDARD = gnu99; 400 | GCC_NO_COMMON_BLOCKS = YES; 401 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 402 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 403 | GCC_WARN_UNDECLARED_SELECTOR = YES; 404 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 405 | GCC_WARN_UNUSED_FUNCTION = YES; 406 | GCC_WARN_UNUSED_VARIABLE = YES; 407 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 408 | MTL_ENABLE_DEBUG_INFO = NO; 409 | SDKROOT = iphoneos; 410 | SUPPORTED_PLATFORMS = iphoneos; 411 | TARGETED_DEVICE_FAMILY = "1,2"; 412 | VALIDATE_PRODUCT = YES; 413 | }; 414 | name = Release; 415 | }; 416 | 97C147061CF9000F007C117D /* Debug */ = { 417 | isa = XCBuildConfiguration; 418 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; 419 | buildSettings = { 420 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 421 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 422 | ENABLE_BITCODE = NO; 423 | INFOPLIST_FILE = Runner/Info.plist; 424 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 425 | PRODUCT_BUNDLE_IDENTIFIER = com.flutterfcm.flutterFcmExample; 426 | PRODUCT_NAME = "$(TARGET_NAME)"; 427 | VERSIONING_SYSTEM = "apple-generic"; 428 | }; 429 | name = Debug; 430 | }; 431 | 97C147071CF9000F007C117D /* Release */ = { 432 | isa = XCBuildConfiguration; 433 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 434 | buildSettings = { 435 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 436 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 437 | ENABLE_BITCODE = NO; 438 | INFOPLIST_FILE = Runner/Info.plist; 439 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 440 | PRODUCT_BUNDLE_IDENTIFIER = com.flutterfcm.flutterFcmExample; 441 | PRODUCT_NAME = "$(TARGET_NAME)"; 442 | VERSIONING_SYSTEM = "apple-generic"; 443 | }; 444 | name = Release; 445 | }; 446 | /* End XCBuildConfiguration section */ 447 | 448 | /* Begin XCConfigurationList section */ 449 | 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { 450 | isa = XCConfigurationList; 451 | buildConfigurations = ( 452 | 97C147031CF9000F007C117D /* Debug */, 453 | 97C147041CF9000F007C117D /* Release */, 454 | 249021D3217E4FDB00AE95B9 /* Profile */, 455 | ); 456 | defaultConfigurationIsVisible = 0; 457 | defaultConfigurationName = Release; 458 | }; 459 | 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { 460 | isa = XCConfigurationList; 461 | buildConfigurations = ( 462 | 97C147061CF9000F007C117D /* Debug */, 463 | 97C147071CF9000F007C117D /* Release */, 464 | 249021D4217E4FDB00AE95B9 /* Profile */, 465 | ); 466 | defaultConfigurationIsVisible = 0; 467 | defaultConfigurationName = Release; 468 | }; 469 | /* End XCConfigurationList section */ 470 | }; 471 | rootObject = 97C146E61CF9000F007C117D /* Project object */; 472 | } 473 | --------------------------------------------------------------------------------