├── Plugin.FirebaseAnalytics.Sample
├── Plugin.FirebaseAnalytics.Sample.iOS
│ ├── Assets.xcassets
│ │ ├── Contents.json
│ │ └── AppIcon.appiconset
│ │ │ ├── ItunesArtwork@2x.png
│ │ │ ├── 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-57x57@1x.png
│ │ │ ├── Icon-App-57x57@2x.png
│ │ │ ├── Icon-App-60x60@1x.png
│ │ │ ├── Icon-App-60x60@2x.png
│ │ │ ├── Icon-App-60x60@3x.png
│ │ │ ├── Icon-App-72x72@1x.png
│ │ │ ├── Icon-App-72x72@2x.png
│ │ │ ├── Icon-App-76x76@1x.png
│ │ │ ├── Icon-App-76x76@2x.png
│ │ │ ├── Icon-App-76x76@3x.png
│ │ │ ├── Icon-App-83.5x83.5@2x.png
│ │ │ ├── Icon-Small-50x50@1x.png
│ │ │ ├── Icon-Small-50x50@2x.png
│ │ │ └── Contents.json
│ ├── iTunesArtwork@1x.png
│ ├── iTunesArtwork@2x.png
│ ├── Resources
│ │ ├── Default.png
│ │ ├── Default@2x.png
│ │ ├── Default-568h@2x.png
│ │ ├── Default-Portrait.png
│ │ ├── Default-Portrait@2x.png
│ │ └── LaunchScreen.storyboard
│ ├── Entitlements.plist
│ ├── Main.cs
│ ├── AppDelegate.cs
│ ├── Properties
│ │ └── AssemblyInfo.cs
│ ├── Info.plist
│ └── Plugin.FirebaseAnalytics.Sample.iOS.csproj
├── Plugin.FirebaseAnalytics.Sample.Android
│ ├── Resources
│ │ ├── mipmap-hdpi
│ │ │ └── ic_launcher.png
│ │ ├── mipmap-ldpi
│ │ │ └── ic_launcher.png
│ │ ├── mipmap-mdpi
│ │ │ └── ic_launcher.png
│ │ ├── mipmap-xhdpi
│ │ │ └── ic_launcher.png
│ │ ├── mipmap-xxhdpi
│ │ │ └── ic_launcher.png
│ │ ├── mipmap-xxxhdpi
│ │ │ └── ic_launcher.png
│ │ ├── values
│ │ │ ├── Strings.xml
│ │ │ └── styles.xml
│ │ ├── layout
│ │ │ ├── Main.axml
│ │ │ ├── Toolbar.axml
│ │ │ └── Tabbar.axml
│ │ └── AboutResources.txt
│ ├── Properties
│ │ ├── AndroidManifest.xml
│ │ └── AssemblyInfo.cs
│ ├── Assets
│ │ └── AboutAssets.txt
│ ├── MainActivity.cs
│ └── Plugin.FirebaseAnalytics.Sample.Android.csproj
└── Plugin.FirebaseAnalytics.Sample
│ ├── Views
│ ├── SecondPage.xaml.cs
│ ├── MainPage.xaml.cs
│ ├── MainPage.xaml
│ └── SecondPage.xaml
│ ├── App.xaml
│ ├── Plugin.FirebaseAnalytics.Sample.csproj
│ ├── ViewModels
│ ├── SecondPageViewModel.cs
│ ├── MainPageViewModel.cs
│ └── ViewModelBase.cs
│ └── App.xaml.cs
├── Plugin.FirebaseAnalytics
├── Shared
│ ├── UserPropertyName.cs
│ ├── IFirebaseAnalytics.cs
│ ├── Parameter.cs
│ ├── CrossFirebaseAnalytics.cs
│ ├── EventName.cs
│ └── ParameterName.cs
├── Android
│ ├── AnalyticsProvider.cs
│ ├── OnCompleteHandlerListener.cs
│ ├── FirebaseAnalytics.cs
│ └── FirebaseAnalyticsImplementation.cs
├── Plugin.FirebaseAnalytics.csproj
└── iOS
│ └── FirebaseAnalyticsImplementation.cs
├── .gitignore
├── LICENSE
├── README.md
└── Plugin.FirebaseAnalytics.sln
/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info": {
3 | "version": 1,
4 | "author": "xcode"
5 | }
6 | }
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/iTunesArtwork@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/f-miyu/Plugin.FirebaseAnalytics/HEAD/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/iTunesArtwork@1x.png
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/iTunesArtwork@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/f-miyu/Plugin.FirebaseAnalytics/HEAD/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/iTunesArtwork@2x.png
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/Resources/Default.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/f-miyu/Plugin.FirebaseAnalytics/HEAD/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/Resources/Default.png
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/Resources/Default@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/f-miyu/Plugin.FirebaseAnalytics/HEAD/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/Resources/Default@2x.png
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/Resources/Default-568h@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/f-miyu/Plugin.FirebaseAnalytics/HEAD/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/Resources/Default-568h@2x.png
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/Resources/Default-Portrait.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/f-miyu/Plugin.FirebaseAnalytics/HEAD/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/Resources/Default-Portrait.png
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/Resources/Default-Portrait@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/f-miyu/Plugin.FirebaseAnalytics/HEAD/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/Resources/Default-Portrait@2x.png
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.Android/Resources/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/f-miyu/Plugin.FirebaseAnalytics/HEAD/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.Android/Resources/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.Android/Resources/mipmap-ldpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/f-miyu/Plugin.FirebaseAnalytics/HEAD/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.Android/Resources/mipmap-ldpi/ic_launcher.png
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.Android/Resources/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/f-miyu/Plugin.FirebaseAnalytics/HEAD/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.Android/Resources/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.Android/Resources/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/f-miyu/Plugin.FirebaseAnalytics/HEAD/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.Android/Resources/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.Android/Resources/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/f-miyu/Plugin.FirebaseAnalytics/HEAD/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.Android/Resources/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.Android/Resources/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/f-miyu/Plugin.FirebaseAnalytics/HEAD/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.Android/Resources/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/Assets.xcassets/AppIcon.appiconset/ItunesArtwork@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/f-miyu/Plugin.FirebaseAnalytics/HEAD/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/Assets.xcassets/AppIcon.appiconset/ItunesArtwork@2x.png
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/Entitlements.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.Android/Resources/values/Strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Hello World, Click Me!
4 | Plugin.FirebaseAnalytics.Sample.Droid
5 |
6 |
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/f-miyu/Plugin.FirebaseAnalytics/HEAD/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/f-miyu/Plugin.FirebaseAnalytics/HEAD/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/f-miyu/Plugin.FirebaseAnalytics/HEAD/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/f-miyu/Plugin.FirebaseAnalytics/HEAD/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/f-miyu/Plugin.FirebaseAnalytics/HEAD/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/f-miyu/Plugin.FirebaseAnalytics/HEAD/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/f-miyu/Plugin.FirebaseAnalytics/HEAD/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/f-miyu/Plugin.FirebaseAnalytics/HEAD/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/f-miyu/Plugin.FirebaseAnalytics/HEAD/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/f-miyu/Plugin.FirebaseAnalytics/HEAD/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/f-miyu/Plugin.FirebaseAnalytics/HEAD/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/f-miyu/Plugin.FirebaseAnalytics/HEAD/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@1x.png
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/f-miyu/Plugin.FirebaseAnalytics/HEAD/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/f-miyu/Plugin.FirebaseAnalytics/HEAD/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/f-miyu/Plugin.FirebaseAnalytics/HEAD/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/f-miyu/Plugin.FirebaseAnalytics/HEAD/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/f-miyu/Plugin.FirebaseAnalytics/HEAD/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/f-miyu/Plugin.FirebaseAnalytics/HEAD/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/f-miyu/Plugin.FirebaseAnalytics/HEAD/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@3x.png
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/f-miyu/Plugin.FirebaseAnalytics/HEAD/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/Assets.xcassets/AppIcon.appiconset/Icon-Small-50x50@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/f-miyu/Plugin.FirebaseAnalytics/HEAD/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/Assets.xcassets/AppIcon.appiconset/Icon-Small-50x50@1x.png
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/Assets.xcassets/AppIcon.appiconset/Icon-Small-50x50@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/f-miyu/Plugin.FirebaseAnalytics/HEAD/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/Assets.xcassets/AppIcon.appiconset/Icon-Small-50x50@2x.png
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample/Views/SecondPage.xaml.cs:
--------------------------------------------------------------------------------
1 | namespace Plugin.FirebaseAnalytics.Sample.Views
2 | {
3 | public partial class SecondPage
4 | {
5 | public SecondPage()
6 | {
7 | InitializeComponent();
8 | }
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics/Shared/UserPropertyName.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | namespace Plugin.FirebaseAnalytics
3 | {
4 | public static class UserPropertyName
5 | {
6 | public static readonly string SignUpMethod = "sign_up_method";
7 | public static readonly string AllowAdPersonalizationSignals = "allow_personalized_ads";
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics/Android/AnalyticsProvider.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using Plugin.CurrentActivity;
3 |
4 | namespace Plugin.FirebaseAnalytics
5 | {
6 | public static class AnalyticsProvider
7 | {
8 | public static Firebase.Analytics.FirebaseAnalytics GetAnalytics()
9 | {
10 | return Firebase.Analytics.FirebaseAnalytics.GetInstance(CrossCurrentActivity.Current.Activity);
11 | }
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.Android/Resources/layout/Main.axml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.Android/Resources/layout/Toolbar.axml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample/App.xaml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample/Views/MainPage.xaml.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.Threading.Tasks;
6 | using Xamarin.Forms;
7 |
8 | namespace Plugin.FirebaseAnalytics.Sample.Views
9 | {
10 | public partial class MainPage : ContentPage
11 | {
12 | public MainPage()
13 | {
14 | InitializeComponent();
15 | }
16 | }
17 | }
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.Android/Properties/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.Android/Resources/layout/Tabbar.axml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample/Views/MainPage.xaml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics/Android/OnCompleteHandlerListener.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using Android.Gms.Tasks;
3 |
4 | namespace Plugin.FirebaseAnalytics
5 | {
6 | public delegate void OnCompleteHandler(Task task);
7 |
8 | public class OnCompleteHandlerListener : Java.Lang.Object, IOnCompleteListener
9 | {
10 | private OnCompleteHandler _handler;
11 |
12 | public OnCompleteHandlerListener(OnCompleteHandler handler)
13 | {
14 | _handler = handler;
15 | }
16 |
17 | public void OnComplete(Task task)
18 | {
19 | _handler?.Invoke(task);
20 | }
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample/Views/SecondPage.xaml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/Main.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 |
5 | using Foundation;
6 | using UIKit;
7 |
8 | namespace Plugin.FirebaseAnalytics.Sample.iOS
9 | {
10 | public class Application
11 | {
12 | // This is the main entry point of the application.
13 | static void Main(string[] args)
14 | {
15 | // if you want to use a different Application Delegate class from "AppDelegate"
16 | // you can specify it here.
17 | UIApplication.Main(args, null, "AppDelegate");
18 | }
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | netstandard2.0
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Autosave files
2 | *~
3 |
4 | # build
5 | [Oo]bj/
6 | [Bb]in/
7 | packages/
8 | TestResults/
9 |
10 | # globs
11 | Makefile.in
12 | *.DS_Store
13 | *.sln.cache
14 | *.suo
15 | *.cache
16 | *.pidb
17 | *.userprefs
18 | *.usertasks
19 | config.log
20 | config.make
21 | config.status
22 | aclocal.m4
23 | install-sh
24 | autom4te.cache/
25 | *.user
26 | *.tar.gz
27 | tarballs/
28 | test-results/
29 | Thumbs.db
30 | .vs/
31 |
32 | # Mac bundle stuff
33 | *.dmg
34 | *.app
35 |
36 | # resharper
37 | *_Resharper.*
38 | *.Resharper
39 |
40 | # dotCover
41 | *.dotCover
42 |
43 | GoogleService-Info.plist
44 | google-services.json
45 |
46 | .mfractor/
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.Android/Assets/AboutAssets.txt:
--------------------------------------------------------------------------------
1 | Any raw assets you want to be deployed with your application can be placed in
2 | this directory (and child directories) and given a Build Action of "AndroidAsset".
3 |
4 | These files will be deployed with you package and will be accessible using Android's
5 | AssetManager, like this:
6 |
7 | public class ReadAsset : Activity
8 | {
9 | protected override void OnCreate (Bundle bundle)
10 | {
11 | base.OnCreate (bundle);
12 |
13 | InputStream input = Assets.Open ("my_asset.txt");
14 | }
15 | }
16 |
17 | Additionally, some Android functions will automatically load asset files:
18 |
19 | Typeface tf = Typeface.CreateFromAsset (Context.Assets, "fonts/samplefont.ttf");
20 |
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics/Shared/IFirebaseAnalytics.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Threading.Tasks;
3 | using System.Collections.Generic;
4 | namespace Plugin.FirebaseAnalytics
5 | {
6 | public interface IFirebaseAnalytics
7 | {
8 | Task GetAppInstanceIdAsync();
9 | void LogEvent(string name, params Parameter[] parameters);
10 | void LogEvent(string name, IDictionary? parameters);
11 | void SetCurrentScreen(string? screenName, string? screenClass);
12 | void SetUserId(string? userId);
13 | void SetUserProperty(string name, string? value);
14 | void ResetAnalyticsData();
15 | void SetSessionTimeoutDuration(long milliseconds);
16 | void SetAnalyticsCollectionEnabled(bool enabled);
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics/Shared/Parameter.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 |
4 | namespace Plugin.FirebaseAnalytics
5 | {
6 | public class Parameter
7 | {
8 | internal string Name { get; }
9 | internal object Value { get; }
10 |
11 | public Parameter(string name, string value)
12 | {
13 | Name = name;
14 | Value = value;
15 | }
16 |
17 | public Parameter(string name, long value)
18 | {
19 | Name = name;
20 | Value = value;
21 | }
22 |
23 | public Parameter(string name, double value)
24 | {
25 | Name = name;
26 | Value = value;
27 | }
28 |
29 | public Parameter(string name, IEnumerable> value)
30 | {
31 | Name = name;
32 | Value = value;
33 | }
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics/Android/FirebaseAnalytics.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | namespace Plugin.FirebaseAnalytics
4 | {
5 | public static class FirebaseAnalytics
6 | {
7 | [Obsolete("Use IFirebaseAnalytics#SetAnalyticsCollectionEnabled(bool)instead.")]
8 | public static void SetAnalyticsCollectionEnabled(bool enabled)
9 | {
10 | AnalyticsProvider.GetAnalytics().SetAnalyticsCollectionEnabled(enabled);
11 | }
12 |
13 | [Obsolete("deprecated")]
14 | public static void SetMinimumSessionDuration(long milliseconds)
15 | {
16 | AnalyticsProvider.GetAnalytics().SetMinimumSessionDuration(milliseconds);
17 | }
18 |
19 | [Obsolete("Use IFirebaseAnalytics#SetSessionTimeoutDuration(long)instead.")]
20 | public static void SetSessionTimeoutDuration(long milliseconds)
21 | {
22 | AnalyticsProvider.GetAnalytics().SetSessionTimeoutDuration(milliseconds);
23 | }
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2018 f-miyu
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.
22 |
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample/ViewModels/SecondPageViewModel.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Threading.Tasks;
5 | using Prism.Commands;
6 | using Prism.Navigation;
7 | using Prism.Services;
8 | using System.Windows.Input;
9 |
10 | namespace Plugin.FirebaseAnalytics.Sample.ViewModels
11 | {
12 | public class SecondPageViewModel : ViewModelBase
13 | {
14 | public ICommand SendUserPropertyCommand { get; }
15 |
16 | private string _name;
17 | public string Name
18 | {
19 | get => _name;
20 | set => SetProperty(ref _name, value);
21 | }
22 |
23 | public SecondPageViewModel(INavigationService navigationService) : base(navigationService)
24 | {
25 | Title = "Second Page";
26 |
27 | SendUserPropertyCommand = new DelegateCommand(() =>
28 | {
29 | CrossFirebaseAnalytics.Current.SetUserProperty("name", Name);
30 | });
31 | }
32 |
33 | public override void OnAppearing()
34 | {
35 | CrossFirebaseAnalytics.Current.SetCurrentScreen(Title, nameof(SecondPageViewModel));
36 | }
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.Android/MainActivity.cs:
--------------------------------------------------------------------------------
1 | using Android.App;
2 | using Android.Content.PM;
3 | using Android.OS;
4 | using Prism;
5 | using Prism.Ioc;
6 | using Plugin.CurrentActivity;
7 |
8 | namespace Plugin.FirebaseAnalytics.Sample.Droid
9 | {
10 | [Activity(Label = "Plugin.FirebaseAnalytics.Sample", Icon = "@mipmap/ic_launcher", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
11 | public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
12 | {
13 | protected override void OnCreate(Bundle bundle)
14 | {
15 | TabLayoutResource = Resource.Layout.Tabbar;
16 | ToolbarResource = Resource.Layout.Toolbar;
17 |
18 | base.OnCreate(bundle);
19 |
20 | CrossCurrentActivity.Current.Init(this, bundle);
21 |
22 | global::Xamarin.Forms.Forms.Init(this, bundle);
23 | LoadApplication(new App(new AndroidInitializer()));
24 | }
25 | }
26 |
27 | public class AndroidInitializer : IPlatformInitializer
28 | {
29 | public void RegisterTypes(IContainerRegistry containerRegistry)
30 | {
31 | // Register any platform specific implementations
32 | }
33 | }
34 | }
35 |
36 |
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample/ViewModels/MainPageViewModel.cs:
--------------------------------------------------------------------------------
1 | using Prism.Commands;
2 | using Prism.Mvvm;
3 | using Prism.Navigation;
4 | using System;
5 | using System.Collections.Generic;
6 | using System.Linq;
7 | using System.Text;
8 | using System.Windows.Input;
9 |
10 | namespace Plugin.FirebaseAnalytics.Sample.ViewModels
11 | {
12 | public class MainPageViewModel : ViewModelBase
13 | {
14 | public ICommand SendEventCommand { get; }
15 | public ICommand GoToSecondPageCommand { get; }
16 |
17 | public MainPageViewModel(INavigationService navigationService)
18 | : base(navigationService)
19 | {
20 | Title = "Main Page";
21 |
22 | SendEventCommand = new DelegateCommand(() =>
23 | {
24 | CrossFirebaseAnalytics.Current.LogEvent(EventName.SelectContent,
25 | new Parameter(ParameterName.ItemId, 1),
26 | new Parameter(ParameterName.ItemName, "test"));
27 | });
28 |
29 | GoToSecondPageCommand = new DelegateCommand(() => NavigationService.NavigateAsync("SecondPage"));
30 | }
31 |
32 | public override void OnAppearing()
33 | {
34 | CrossFirebaseAnalytics.Current.SetCurrentScreen(Title, nameof(MainPageViewModel));
35 | }
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample/App.xaml.cs:
--------------------------------------------------------------------------------
1 | using Prism;
2 | using Prism.Ioc;
3 | using Plugin.FirebaseAnalytics.Sample.ViewModels;
4 | using Plugin.FirebaseAnalytics.Sample.Views;
5 | using Xamarin.Forms;
6 | using Xamarin.Forms.Xaml;
7 |
8 | [assembly: XamlCompilation(XamlCompilationOptions.Compile)]
9 | namespace Plugin.FirebaseAnalytics.Sample
10 | {
11 | public partial class App
12 | {
13 | /*
14 | * The Xamarin Forms XAML Previewer in Visual Studio uses System.Activator.CreateInstance.
15 | * This imposes a limitation in which the App class must have a default constructor.
16 | * App(IPlatformInitializer initializer = null) cannot be handled by the Activator.
17 | */
18 | public App() : this(null) { }
19 |
20 | public App(IPlatformInitializer initializer) : base(initializer) { }
21 |
22 | protected override async void OnInitialized()
23 | {
24 | InitializeComponent();
25 |
26 | await NavigationService.NavigateAsync("NavigationPage/MainPage");
27 | }
28 |
29 | protected override void RegisterTypes(IContainerRegistry containerRegistry)
30 | {
31 | containerRegistry.RegisterForNavigation();
32 | containerRegistry.RegisterForNavigation();
33 | containerRegistry.RegisterForNavigation();
34 | }
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample/ViewModels/ViewModelBase.cs:
--------------------------------------------------------------------------------
1 | using Prism.Commands;
2 | using Prism.Mvvm;
3 | using Prism.Navigation;
4 | using System;
5 | using System.Collections.Generic;
6 | using System.Text;
7 | using Prism.AppModel;
8 |
9 | namespace Plugin.FirebaseAnalytics.Sample.ViewModels
10 | {
11 | public class ViewModelBase : BindableBase, INavigationAware, IInitialize, IDestructible, IPageLifecycleAware
12 | {
13 | protected INavigationService NavigationService { get; private set; }
14 |
15 | private string _title;
16 | public string Title
17 | {
18 | get { return _title; }
19 | set { SetProperty(ref _title, value); }
20 | }
21 |
22 | public ViewModelBase(INavigationService navigationService)
23 | {
24 | NavigationService = navigationService;
25 | }
26 |
27 | public virtual void OnNavigatedFrom(INavigationParameters parameters)
28 | {
29 |
30 | }
31 |
32 | public virtual void OnNavigatedTo(INavigationParameters parameters)
33 | {
34 |
35 | }
36 |
37 | public virtual void Initialize(INavigationParameters parameters)
38 | {
39 |
40 | }
41 |
42 | public virtual void Destroy()
43 | {
44 |
45 | }
46 |
47 | public virtual void OnAppearing()
48 | {
49 |
50 | }
51 |
52 | public virtual void OnDisappearing()
53 | {
54 |
55 | }
56 | }
57 | }
58 |
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.Android/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection;
2 | using System.Runtime.CompilerServices;
3 | using System.Runtime.InteropServices;
4 | using Android.App;
5 |
6 | // General Information about an assembly is controlled through the following
7 | // set of attributes. Change these attribute values to modify the information
8 | // associated with an assembly.
9 | [assembly: AssemblyTitle("Plugin.FirebaseAnalytics.Sample.Android")]
10 | [assembly: AssemblyDescription("")]
11 | [assembly: AssemblyConfiguration("")]
12 | [assembly: AssemblyCompany("")]
13 | [assembly: AssemblyProduct("Plugin.FirebaseAnalytics.Sample.Android")]
14 | [assembly: AssemblyCopyright("Copyright © 2014")]
15 | [assembly: AssemblyTrademark("")]
16 | [assembly: AssemblyCulture("")]
17 | [assembly: ComVisible(false)]
18 |
19 | // Version information for an assembly consists of the following four values:
20 | //
21 | // Major Version
22 | // Minor Version
23 | // Build Number
24 | // Revision
25 | //
26 | // You can specify all the values or you can default the Build and Revision Numbers
27 | // by using the '*' as shown below:
28 | // [assembly: AssemblyVersion("1.0.*")]
29 | [assembly: AssemblyVersion("1.0.0.0")]
30 | [assembly: AssemblyFileVersion("1.0.0.0")]
31 |
32 | // Add some common permissions, these can be removed if not needed
33 | [assembly: UsesPermission(Android.Manifest.Permission.Internet)]
34 | [assembly: UsesPermission(Android.Manifest.Permission.WriteExternalStorage)]
35 |
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/AppDelegate.cs:
--------------------------------------------------------------------------------
1 | using Foundation;
2 | using Prism;
3 | using Prism.Ioc;
4 | using UIKit;
5 |
6 |
7 | namespace Plugin.FirebaseAnalytics.Sample.iOS
8 | {
9 | // The UIApplicationDelegate for the application. This class is responsible for launching the
10 | // User Interface of the application, as well as listening (and optionally responding) to
11 | // application events from iOS.
12 | [Register("AppDelegate")]
13 | public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate
14 | {
15 | //
16 | // This method is invoked when the application has loaded and is ready to run. In this
17 | // method you should instantiate the window, load the UI into it and then make the window
18 | // visible.
19 | //
20 | // You have 17 seconds to return from this method, or iOS will terminate your application.
21 | //
22 | public override bool FinishedLaunching(UIApplication app, NSDictionary options)
23 | {
24 | Firebase.Core.App.Configure();
25 |
26 | global::Xamarin.Forms.Forms.Init();
27 | LoadApplication(new App(new iOSInitializer()));
28 |
29 | return base.FinishedLaunching(app, options);
30 | }
31 | }
32 |
33 | public class iOSInitializer : IPlatformInitializer
34 | {
35 | public void RegisterTypes(IContainerRegistry containerRegistry)
36 | {
37 | // Register any platform specific implementations
38 | }
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.Android/Resources/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
5 |
6 |
24 |
27 |
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection;
2 | using System.Runtime.CompilerServices;
3 | using System.Runtime.InteropServices;
4 |
5 | // General Information about an assembly is controlled through the following
6 | // set of attributes. Change these attribute values to modify the information
7 | // associated with an assembly.
8 | [assembly: AssemblyTitle("Plugin.FirebaseAnalytics.Sample.iOS")]
9 | [assembly: AssemblyDescription("")]
10 | [assembly: AssemblyConfiguration("")]
11 | [assembly: AssemblyCompany("")]
12 | [assembly: AssemblyProduct("Plugin.FirebaseAnalytics.Sample.iOS")]
13 | [assembly: AssemblyCopyright("Copyright © 2014")]
14 | [assembly: AssemblyTrademark("")]
15 | [assembly: AssemblyCulture("")]
16 |
17 | // Setting ComVisible to false makes the types in this assembly not visible
18 | // to COM components. If you need to access a type in this assembly from
19 | // COM, set the ComVisible attribute to true on that type.
20 | [assembly: ComVisible(false)]
21 |
22 | // The following GUID is for the ID of the typelib if this project is exposed to COM
23 | [assembly: Guid("72bdc44f-c588-44f3-b6df-9aace7daafdd")]
24 |
25 | // Version information for an assembly consists of the following four values:
26 | //
27 | // Major Version
28 | // Minor Version
29 | // Build Number
30 | // Revision
31 | //
32 | // You can specify all the values or you can default the Build and Revision Numbers
33 | // by using the '*' as shown below:
34 | // [assembly: AssemblyVersion("1.0.*")]
35 | [assembly: AssemblyVersion("1.0.0.0")]
36 | [assembly: AssemblyFileVersion("1.0.0.0")]
37 |
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics/Shared/CrossFirebaseAnalytics.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | namespace Plugin.FirebaseAnalytics
4 | {
5 | ///
6 | /// Cross FirebaseAnalytics
7 | ///
8 | public class CrossFirebaseAnalytics
9 | {
10 | static Lazy implementation = new Lazy(() => CreateFirebaseAnalytics(), System.Threading.LazyThreadSafetyMode.PublicationOnly);
11 |
12 | ///
13 | /// Gets if the plugin is supported on the current platform.
14 | ///
15 | public static bool IsSupported => implementation.Value == null ? false : true;
16 |
17 | ///
18 | /// Current plugin implementation to use
19 | ///
20 | public static IFirebaseAnalytics Current
21 | {
22 | get
23 | {
24 | IFirebaseAnalytics? ret = implementation.Value;
25 | if (ret == null)
26 | {
27 | throw NotImplementedInReferenceAssembly();
28 | }
29 | return ret;
30 | }
31 | }
32 |
33 | static IFirebaseAnalytics? CreateFirebaseAnalytics()
34 | {
35 | #if NETSTANDARD
36 | return null;
37 | #else
38 | #pragma warning disable IDE0022 // Use expression body for methods
39 | return new FirebaseAnalyticsImplementation();
40 | #pragma warning restore IDE0022 // Use expression body for methods
41 | #endif
42 | }
43 |
44 | internal static Exception NotImplementedInReferenceAssembly() =>
45 | new NotImplementedException("This functionality is not implemented in the portable version of this assembly. You should reference the NuGet package from your main application project in order to reference the platform-specific implementation.");
46 |
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | UIDeviceFamily
6 |
7 | 1
8 | 2
9 |
10 | UISupportedInterfaceOrientations
11 |
12 | UIInterfaceOrientationPortrait
13 | UIInterfaceOrientationLandscapeLeft
14 | UIInterfaceOrientationLandscapeRight
15 |
16 | UISupportedInterfaceOrientations~ipad
17 |
18 | UIInterfaceOrientationPortrait
19 | UIInterfaceOrientationPortraitUpsideDown
20 | UIInterfaceOrientationLandscapeLeft
21 | UIInterfaceOrientationLandscapeRight
22 |
23 | MinimumOSVersion
24 | 10.0
25 | CFBundleDisplayName
26 | Plugin.FirebaseAnalytics.Sample
27 | CFBundleIdentifier
28 | com.plugin.firebaseanalytics.sample
29 | CFBundleVersion
30 | 1.0
31 | CFBundleIconFiles
32 |
33 | Icon-60@2x
34 | Icon-60@3x
35 | Icon-76
36 | Icon-76@2x
37 | Default
38 | Default@2x
39 | Default-568h@2x
40 | Default-Portrait
41 | Default-Portrait@2x
42 | Icon-Small-40
43 | Icon-Small-40@2x
44 | Icon-Small-40@3x
45 | Icon-Small
46 | Icon-Small@2x
47 | Icon-Small@3x
48 |
49 | UILaunchStoryboardName
50 | LaunchScreen
51 | CFBundleName
52 | Plugin.FirebaseAnalytics.Sample
53 |
54 |
55 |
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.Android/Resources/AboutResources.txt:
--------------------------------------------------------------------------------
1 | Images, layout descriptions, binary blobs and string dictionaries can be included
2 | in your application as resource files. Various Android APIs are designed to
3 | operate on the resource IDs instead of dealing with images, strings or binary blobs
4 | directly.
5 |
6 | For example, a sample Android app that contains a user interface layout (main.xml),
7 | an internationalization string table (strings.xml) and some icons (drawable-XXX/icon.png)
8 | would keep its resources in the "Resources" directory of the application:
9 |
10 | Resources/
11 | drawable-hdpi/
12 | icon.png
13 |
14 | drawable-ldpi/
15 | icon.png
16 |
17 | drawable-mdpi/
18 | icon.png
19 |
20 | layout/
21 | main.xml
22 |
23 | values/
24 | strings.xml
25 |
26 | In order to get the build system to recognize Android resources, set the build action to
27 | "AndroidResource". The native Android APIs do not operate directly with filenames, but
28 | instead operate on resource IDs. When you compile an Android application that uses resources,
29 | the build system will package the resources for distribution and generate a class called
30 | "Resource" that contains the tokens for each one of the resources included. For example,
31 | for the above Resources layout, this is what the Resource class would expose:
32 |
33 | public class Resource {
34 | public class drawable {
35 | public const int icon = 0x123;
36 | }
37 |
38 | public class layout {
39 | public const int main = 0x456;
40 | }
41 |
42 | public class strings {
43 | public const int first_string = 0xabc;
44 | public const int second_string = 0xbcd;
45 | }
46 | }
47 |
48 | You would then use R.drawable.icon to reference the drawable/icon.png file, or Resource.layout.main
49 | to reference the layout/main.xml file, or Resource.strings.first_string to reference the first
50 | string in the dictionary file values/strings.xml.
51 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Plugin.FirebaseAnalytics
2 |
3 | A cross platform plugin for Firebase Analytics.
4 | A wrapper for [Xamarin.Firebase.iOS.Analytics](https://www.nuget.org/packages/Xamarin.Firebase.iOS.Analytics/)
5 | and [Xamarin.Firebase.Analytics](https://www.nuget.org/packages/Xamarin.Firebase.Analytics).
6 |
7 |
8 | ## Setup
9 | Install Nuget package to each projects.
10 |
11 | [Plugin.FirebaseAnalytics](https://www.nuget.org/packages/Plugin.FirebaseAnalytics/) [](https://www.nuget.org/packages/Plugin.FirebaseAnalytics/)
12 |
13 | ### iOS
14 | * Add GoogleService-Info.plist to iOS project. Select BundleResource as build action.
15 | * Initialize as follows in AppDelegate.
16 | ```C#
17 | Firebase.Core.App.Configure();
18 | ```
19 |
20 | ### Android
21 | * Add google-services.json to Android project. Select GoogleServicesJson as build action. (If you can't select GoogleServicesJson, reload this android project.)
22 | * Target framework version needs to be Android 10.0.
23 | * This Plugin uses [Plugin.CurrentActivity](https://github.com/jamesmontemagno/CurrentActivityPlugin). Setup as follows in MainActivity.
24 | ```C#
25 | Plugin.CurrentActivity.CrossCurrentActivity.Current.Init(this, bundle);
26 | ```
27 |
28 | ## Usage
29 | ### Log events
30 | ```C#
31 | CrossFirebaseAnalytics.Current.LogEvent(EventName.SelectContent,
32 | new Parameter(ParameterName.ItemId, itemId),
33 | new Parameter(ParameterName.ItemName, itemName));
34 |
35 | var parameters = new Dictionary
36 | {
37 | [ParameterName.ItemId] = 1,
38 | [ParameterName.ItemName] = "test"
39 | };
40 | CrossFirebaseAnalytics.Current.LogEvent(EventName.SelectContent, parameters);
41 | ```
42 |
43 | ### Set user properties
44 | ```C#
45 | CrossFirebaseAnalytics.Current.SetUserProperty("name", userName);
46 | ```
47 |
48 | ### Set user id
49 | ```C#
50 | CrossFirebaseAnalytics.Current.SetUserId(userId);
51 | ```
52 |
53 | ### Set screen name
54 | ```C#
55 | CrossFirebaseAnalytics.Current.SetCurrentScreen(screenName, screenClass));
56 | ```
57 |
58 | ### Get app instance id
59 | ```C#
60 | var id = await CrossFirebaseAnalytics.Current.GetAppInstanceIdAsync();
61 | ```
62 |
63 | ### Reset analytics data
64 | ```C#
65 | CrossFirebaseAnalytics.Current.ResetAnalyticsData();
66 | ```
67 |
68 | ### Set parameters
69 | ```C#
70 | CrossFirebaseAnalytics.Current.SetAnalyticsCollectionEnabled(enabled);
71 |
72 | CrossFirebaseAnalytics.Current.SetSessionTimeoutDuration(sessionTimeoutDuration);
73 | ```
74 |
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics/Plugin.FirebaseAnalytics.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | netstandard2.0;Xamarin.iOS10;MonoAndroid90;MonoAndroid10.0
5 | Plugin.FirebaseAnalytics
6 | Plugin.FirebaseAnalytics
7 | Plugin.FirebaseAnalytics
8 | $(AssemblyName) ($(TargetFramework))
9 | 4.1.0
10 | 4.1.0
11 | true
12 | en
13 | $(DefineConstants);
14 | false
15 | false
16 | latest
17 | portable
18 | MIT
19 | https://github.com/f-miyu/Plugin.FirebaseAnalytics
20 | https://github.com/f-miyu/Plugin.FirebaseAnalytics
21 | xamarin, ios, android, xamarin.forms, plugin, firebase, analytics
22 | Firebase Analytics Plugin for Xamarin
23 | Cross platform plugin for Firebase Analytics
24 | f-miyu
25 | f-miyu
26 | Copyright (c) 2018 f-miyu
27 | true
28 | enable
29 |
30 |
31 | true
32 | false
33 |
34 |
35 | true
36 | true
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/Resources/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 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics/Shared/EventName.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | namespace Plugin.FirebaseAnalytics
3 | {
4 | public static class EventName
5 | {
6 | public static readonly string AddPaymentInfo = "add_payment_info";
7 | public static readonly string AddShippingInfo = "add_shipping_info";
8 | public static readonly string AddToCart = "add_to_cart";
9 | public static readonly string AddToWishlist = "add_to_wishlist";
10 | public static readonly string AppOpen = "app_open";
11 | public static readonly string BeginCheckout = "begin_checkout";
12 | public static readonly string CampaignDetails = "campaign_details";
13 | public static readonly string CheckoutProgress = "checkout_progress";
14 | public static readonly string EarnVirtualCurrency = "earn_virtual_currency";
15 | [Obsolete("Use Purchase instead.")]
16 | public static readonly string EcommercePurchase = "ecommerce_purchase";
17 | public static readonly string GenerateLead = "generate_lead";
18 | public static readonly string JoinGroup = "join_group";
19 | public static readonly string LevelEnd = "level_end";
20 | public static readonly string LevelStart = "level_start";
21 | public static readonly string LevelUp = "level_up";
22 | public static readonly string Login = "login";
23 | public static readonly string PostScore = "post_score";
24 | [Obsolete("Use ViewPromotion instead.")]
25 | public static readonly string PresentOffer = "present_offer";
26 | public static readonly string Purchase = "purchase";
27 | [Obsolete("Use Refund instead.")]
28 | public static readonly string PurchaseRefund = "purchase_refund";
29 | public static readonly string Refund = "refund";
30 | public static readonly string RemoveFromCart = "remove_from_cart";
31 | public static readonly string Search = "search";
32 | public static readonly string SelectContent = "select_content";
33 | public static readonly string SelectItem = "select_item";
34 | public static readonly string SelectPromotion = "select_promotion";
35 | [Obsolete("deprecated")]
36 | public static readonly string SetCheckoutOption = "set_checkout_option";
37 | public static readonly string Share = "share";
38 | public static readonly string SignUp = "sign_up";
39 | public static readonly string SpendVirtualCurrency = "spend_virtual_currency";
40 | public static readonly string TutorialBegin = "tutorial_begin";
41 | public static readonly string TutorialComplete = "tutorial_complete";
42 | public static readonly string UnlockAchievement = "unlock_achievement";
43 | public static readonly string ViewCart = "view_cart";
44 | public static readonly string ViewItem = "view_item";
45 | public static readonly string ViewItemList = "view_item_list";
46 | public static readonly string ViewPromotion = "view_promotion";
47 | public static readonly string ViewSearchResults = "view_search_results";
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics/Shared/ParameterName.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | namespace Plugin.FirebaseAnalytics
3 | {
4 | public static class ParameterName
5 | {
6 | public static readonly string AchievementId = "achievement_id";
7 | public static readonly string AdNetworkClickId = "aclid";
8 | public static readonly string Affiliation = "affiliation";
9 | public static readonly string Campaign = "campaign";
10 | public static readonly string Character = "character";
11 | public static readonly string CheckoutOption = "checkout_option";
12 | public static readonly string CheckoutStep = "checkout_step";
13 | public static readonly string Content = "content";
14 | public static readonly string ContentType = "content_type";
15 | public static readonly string Coupon = "coupon";
16 | public static readonly string Cp1 = "cp1";
17 | public static readonly string CreativeName = "creative_name";
18 | public static readonly string CreativeSlot = "creative_slot";
19 | public static readonly string Currency = "currency";
20 | public static readonly string Destination = "destination";
21 | public static readonly string Discount = "discount";
22 | public static readonly string EndDate = "end_date";
23 | public static readonly string ExtendSession = "extend_session";
24 | public static readonly string FlightNumber = "flight_number";
25 | public static readonly string GroupId = "group_id";
26 | public static readonly string Index = "index";
27 | public static readonly string Items = "items";
28 | public static readonly string ItemBrand = "item_brand";
29 | public static readonly string ItemCategory = "item_category";
30 | public static readonly string ItemCategory2 = "item_category2";
31 | public static readonly string ItemCategory3 = "item_category3";
32 | public static readonly string ItemCategory4 = "item_category4";
33 | public static readonly string ItemCategory5 = "item_category5";
34 | public static readonly string ItemId = "item_id";
35 | [Obsolete("Use ItemListName instead.")]
36 | public static readonly string ItemList = "item_list";
37 | public static readonly string ItemListId = "item_list_id";
38 | public static readonly string ItemListName = "item_list_name";
39 | [Obsolete("Use LocationId instead.")]
40 | public static readonly string ItemLocationId = "item_location_id";
41 | public static readonly string ItemName = "item_name";
42 | public static readonly string ItemVariant = "item_variant";
43 | public static readonly string Level = "level";
44 | public static readonly string LevelName = "level_name";
45 | public static readonly string Location = "location";
46 | public static readonly string LocationId = "location_id";
47 | public static readonly string Medium = "medium";
48 | public static readonly string Method = "method";
49 | public static readonly string NumberOfNights = "number_of_nights";
50 | public static readonly string NumberOfPassengers = "number_of_passengers";
51 | public static readonly string NumberOfRooms = "number_of_rooms";
52 | public static readonly string Origin = "origin";
53 | public static readonly string PaymentType = "payment_type";
54 | public static readonly string Price = "price";
55 | public static readonly string PromotionId = "promotion_id";
56 | public static readonly string PromotionName = "promotion_name";
57 | public static readonly string Quantity = "quantity";
58 | public static readonly string Score = "score";
59 | public static readonly string SearchTerm = "search_term";
60 | public static readonly string Shipping = "shipping";
61 | public static readonly string ShippingTier = "shipping_tier";
62 | public static readonly string SignUpMethod = "sign_up_method";
63 | public static readonly string Source = "source";
64 | public static readonly string StartDate = "start_date";
65 | public static readonly string Success = "success";
66 | public static readonly string Tax = "tax";
67 | public static readonly string Term = "term";
68 | public static readonly string TransactionId = "transaction_id";
69 | public static readonly string TravelClass = "travel_class";
70 | public static readonly string Value = "value";
71 | public static readonly string VirtualCurrencyName = "virtual_currency_name";
72 | }
73 | }
74 |
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images": [
3 | {
4 | "idiom": "iphone",
5 | "size": "20x20",
6 | "scale": "2x",
7 | "filename": "Icon-App-20x20@2x.png"
8 | },
9 | {
10 | "idiom": "iphone",
11 | "size": "20x20",
12 | "scale": "3x",
13 | "filename": "Icon-App-20x20@3x.png"
14 | },
15 | {
16 | "idiom": "iphone",
17 | "size": "29x29",
18 | "scale": "1x",
19 | "filename": "Icon-App-29x29@1x.png"
20 | },
21 | {
22 | "idiom": "iphone",
23 | "size": "29x29",
24 | "scale": "2x",
25 | "filename": "Icon-App-29x29@2x.png"
26 | },
27 | {
28 | "idiom": "iphone",
29 | "size": "29x29",
30 | "scale": "3x",
31 | "filename": "Icon-App-29x29@3x.png"
32 | },
33 | {
34 | "idiom": "iphone",
35 | "size": "40x40",
36 | "scale": "1x",
37 | "filename": "Icon-App-40x40@1x.png"
38 | },
39 | {
40 | "idiom": "iphone",
41 | "size": "40x40",
42 | "scale": "2x",
43 | "filename": "Icon-App-40x40@2x.png"
44 | },
45 | {
46 | "idiom": "iphone",
47 | "size": "40x40",
48 | "scale": "3x",
49 | "filename": "Icon-App-40x40@3x.png"
50 | },
51 | {
52 | "idiom": "iphone",
53 | "size": "57x57",
54 | "scale": "1x",
55 | "filename": "Icon-App-57x57@1x.png"
56 | },
57 | {
58 | "idiom": "iphone",
59 | "size": "57x57",
60 | "scale": "2x",
61 | "filename": "Icon-App-57x57@2x.png"
62 | },
63 | {
64 | "idiom": "iphone",
65 | "size": "60x60",
66 | "scale": "1x",
67 | "filename": "Icon-App-60x60@1x.png"
68 | },
69 | {
70 | "idiom": "iphone",
71 | "size": "60x60",
72 | "scale": "2x",
73 | "filename": "Icon-App-60x60@2x.png"
74 | },
75 | {
76 | "idiom": "iphone",
77 | "size": "60x60",
78 | "scale": "3x",
79 | "filename": "Icon-App-60x60@3x.png"
80 | },
81 | {
82 | "idiom": "iphone",
83 | "size": "76x76",
84 | "scale": "1x",
85 | "filename": "Icon-App-76x76@1x.png"
86 | },
87 | {
88 | "idiom": "ipad",
89 | "size": "20x20",
90 | "scale": "1x",
91 | "filename": "Icon-App-20x20@1x.png"
92 | },
93 | {
94 | "idiom": "ipad",
95 | "size": "20x20",
96 | "scale": "2x",
97 | "filename": "Icon-App-20x20@2x.png"
98 | },
99 | {
100 | "idiom": "ipad",
101 | "size": "29x29",
102 | "scale": "1x",
103 | "filename": "Icon-App-29x29@1x.png"
104 | },
105 | {
106 | "idiom": "ipad",
107 | "size": "29x29",
108 | "scale": "2x",
109 | "filename": "Icon-App-29x29@2x.png"
110 | },
111 | {
112 | "idiom": "ipad",
113 | "size": "40x40",
114 | "scale": "1x",
115 | "filename": "Icon-App-40x40@1x.png"
116 | },
117 | {
118 | "idiom": "ipad",
119 | "size": "40x40",
120 | "scale": "2x",
121 | "filename": "Icon-App-40x40@2x.png"
122 | },
123 | {
124 | "size": "50x50",
125 | "idiom": "ipad",
126 | "filename": "Icon-Small-50x50@1x.png",
127 | "scale": "1x"
128 | },
129 | {
130 | "size": "50x50",
131 | "idiom": "ipad",
132 | "filename": "Icon-Small-50x50@2x.png",
133 | "scale": "2x"
134 | },
135 | {
136 | "idiom": "ipad",
137 | "size": "72x72",
138 | "scale": "1x",
139 | "filename": "Icon-App-72x72@1x.png"
140 | },
141 | {
142 | "idiom": "ipad",
143 | "size": "72x72",
144 | "scale": "2x",
145 | "filename": "Icon-App-72x72@2x.png"
146 | },
147 | {
148 | "idiom": "ipad",
149 | "size": "76x76",
150 | "scale": "1x",
151 | "filename": "Icon-App-76x76@1x.png"
152 | },
153 | {
154 | "idiom": "ipad",
155 | "size": "76x76",
156 | "scale": "2x",
157 | "filename": "Icon-App-76x76@2x.png"
158 | },
159 | {
160 | "idiom": "ipad",
161 | "size": "76x76",
162 | "scale": "3x",
163 | "filename": "Icon-App-76x76@3x.png"
164 | },
165 | {
166 | "idiom": "ipad",
167 | "size": "83.5x83.5",
168 | "scale": "2x",
169 | "filename": "Icon-App-83.5x83.5@2x.png"
170 | },
171 | {
172 | "size": "1024x1024",
173 | "idiom": "ios-marketing",
174 | "filename": "ItunesArtwork@2x.png",
175 | "scale": "1x"
176 | }
177 | ],
178 | "info": {
179 | "version": 1,
180 | "author": "makeappicon"
181 | }
182 | }
183 |
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics/iOS/FirebaseAnalyticsImplementation.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Threading.Tasks;
4 | using Firebase.Analytics;
5 | using System.Linq;
6 | using Foundation;
7 |
8 | namespace Plugin.FirebaseAnalytics
9 | {
10 | public class FirebaseAnalyticsImplementation : IFirebaseAnalytics
11 | {
12 | public Task GetAppInstanceIdAsync()
13 | {
14 | return Task.FromResult(Analytics.AppInstanceId);
15 | }
16 |
17 | public void LogEvent(string name, params Parameter[] parameters)
18 | {
19 | NSDictionary? dict = null;
20 | if (parameters != null)
21 | {
22 | dict = new NSDictionary(
23 | parameters.Select(p => new NSString(p.Name)).ToArray(),
24 | parameters.Select(p => Convert(p.Value)).ToArray());
25 | }
26 |
27 | Analytics.LogEvent(name, dict);
28 | }
29 |
30 | public void LogEvent(string name, IDictionary? parameters)
31 | {
32 | NSDictionary? dict = null;
33 |
34 | if (parameters != null)
35 | {
36 | dict = new NSDictionary(
37 | parameters.Keys.Select(key => new NSString(key)).ToArray(),
38 | parameters.Values.Select(value => Convert(value)).ToArray());
39 | }
40 |
41 | Analytics.LogEvent(name, dict);
42 | }
43 |
44 | public void SetCurrentScreen(string? screenName, string? screenClass)
45 | {
46 | Analytics.SetScreenNameAndClass(screenName, screenClass);
47 | }
48 |
49 | public void SetUserId(string? userId)
50 | {
51 | Analytics.SetUserId(userId);
52 | }
53 |
54 | public void SetUserProperty(string name, string? value)
55 | {
56 | Analytics.SetUserProperty(value, name);
57 | }
58 |
59 | public void ResetAnalyticsData()
60 | {
61 | Analytics.ResetAnalyticsData();
62 | }
63 |
64 | public void SetSessionTimeoutDuration(long milliseconds)
65 | {
66 | Analytics.SetSessionTimeoutInterval(milliseconds / 1000.0);
67 | }
68 |
69 | public void SetAnalyticsCollectionEnabled(bool enabled)
70 | {
71 | Analytics.SetAnalyticsCollectionEnabled(enabled);
72 | }
73 |
74 | private NSObject Convert(object? value)
75 | {
76 | switch (value)
77 | {
78 | case bool @bool:
79 | return new NSNumber(@bool);
80 | case byte @byte:
81 | return new NSNumber(@byte);
82 | case sbyte @sbyte:
83 | return new NSNumber(@sbyte);
84 | case short @short:
85 | return new NSNumber(@short);
86 | case ushort @ushort:
87 | return new NSNumber(@ushort);
88 | case int @int:
89 | return new NSNumber(@int);
90 | case uint @uint:
91 | return new NSNumber(@uint);
92 | case long @long:
93 | return new NSNumber(@long);
94 | case ulong @ulong:
95 | if (@ulong > long.MaxValue)
96 | {
97 | throw new OverflowException();
98 | }
99 | return new NSNumber(@ulong);
100 | case float @float:
101 | return new NSNumber(@float);
102 | case double @double:
103 | return new NSNumber(@double);
104 | case decimal @decimal:
105 | return new NSNumber(decimal.ToDouble(@decimal));
106 | case string @string:
107 | return new NSString(@string);
108 | case IEnumerable> dictionaries:
109 | {
110 | var ret = new NSMutableArray();
111 | foreach (var dictionary in dictionaries)
112 | {
113 | var nsDictionary = new NSMutableDictionary();
114 | foreach (var (key, val) in dictionary)
115 | {
116 | nsDictionary[new NSString(key)] = Convert(val);
117 | }
118 | ret.Add(nsDictionary);
119 | }
120 | return ret;
121 | }
122 | default:
123 | throw new ArgumentOutOfRangeException(nameof(value), $"{value?.GetType().FullName ?? "null"} is not supported");
124 | }
125 | }
126 | }
127 | }
128 |
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.Android/Plugin.FirebaseAnalytics.Sample.Android.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Debug
5 | AnyCPU
6 | 8.0.30703
7 | 2.0
8 | {1BE43291-4B56-4022-B477-8D29E1E51A67}
9 | {EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
10 | Library
11 | Properties
12 | Plugin.FirebaseAnalytics.Sample.Droid
13 | Plugin.FirebaseAnalytics.Sample.Android
14 | 512
15 | v10.0
16 | True
17 | Resources\Resource.designer.cs
18 | Off
19 | Resource
20 | Properties\AndroidManifest.xml
21 | Resources
22 | Assets
23 |
24 |
25 |
26 |
27 |
28 | true
29 |
30 |
31 | true
32 | full
33 | false
34 | bin\Debug
35 | DEBUG;
36 | prompt
37 | 4
38 | None
39 | false
40 |
41 |
42 | true
43 | pdbonly
44 | true
45 | bin\Release
46 | prompt
47 | 4
48 | true
49 | false
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 | 2.1.0.4
63 |
64 |
65 | 117.4.1
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 | Designer
92 |
93 |
94 |
95 |
96 | {A56935B1-CDA2-4B51-922D-D47B5F38ABAD}
97 | Plugin.FirebaseAnalytics.Sample
98 |
99 |
100 | {B143E94D-2EA0-47F3-83F8-FF193DF8855B}
101 | Plugin.FirebaseAnalytics
102 |
103 |
104 |
105 |
106 |
107 |
108 |
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics/Android/FirebaseAnalyticsImplementation.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Threading.Tasks;
4 | using Android.OS;
5 | using Android.Runtime;
6 | using Plugin.CurrentActivity;
7 |
8 | namespace Plugin.FirebaseAnalytics
9 | {
10 | public class FirebaseAnalyticsImplementation : IFirebaseAnalytics
11 | {
12 | public Task GetAppInstanceIdAsync()
13 | {
14 | var tcs = new TaskCompletionSource();
15 |
16 | AnalyticsProvider.GetAnalytics().GetAppInstanceId().AddOnCompleteListener(new OnCompleteHandlerListener(task =>
17 | {
18 | if (task.IsSuccessful)
19 | {
20 | tcs.SetResult(task.Result.ToString()!);
21 | }
22 | else
23 | {
24 | tcs.SetException(task.Exception);
25 | }
26 | }));
27 |
28 | return tcs.Task;
29 | }
30 |
31 | public void LogEvent(string name, params Parameter[] parameters)
32 | {
33 | Bundle? bundle = null;
34 | if (parameters != null)
35 | {
36 | bundle = new Bundle();
37 | foreach (var parameter in parameters)
38 | {
39 | PutToBundle(bundle, parameter.Name, parameter.Value);
40 | }
41 | }
42 |
43 | AnalyticsProvider.GetAnalytics().LogEvent(name, bundle);
44 | }
45 |
46 | public void LogEvent(string name, IDictionary? parameters)
47 | {
48 | Bundle? bundle = null;
49 | if (parameters != null)
50 | {
51 | bundle = new Bundle();
52 | foreach (var (key, value) in parameters)
53 | {
54 | PutToBundle(bundle, key, value);
55 | }
56 | }
57 |
58 | AnalyticsProvider.GetAnalytics().LogEvent(name, bundle);
59 | }
60 |
61 | public void SetCurrentScreen(string? screenName, string? screenClass)
62 | {
63 | AnalyticsProvider.GetAnalytics().SetCurrentScreen(CrossCurrentActivity.Current.Activity, screenName, screenClass);
64 | }
65 |
66 | public void SetUserId(string? userId)
67 | {
68 | AnalyticsProvider.GetAnalytics().SetUserId(userId);
69 | }
70 |
71 | public void SetUserProperty(string name, string? value)
72 | {
73 | AnalyticsProvider.GetAnalytics().SetUserProperty(name, value);
74 | }
75 |
76 | public void ResetAnalyticsData()
77 | {
78 | AnalyticsProvider.GetAnalytics().ResetAnalyticsData();
79 | }
80 |
81 | public void SetSessionTimeoutDuration(long milliseconds)
82 | {
83 | AnalyticsProvider.GetAnalytics().SetSessionTimeoutDuration(milliseconds);
84 | }
85 |
86 | public void SetAnalyticsCollectionEnabled(bool enabled)
87 | {
88 | AnalyticsProvider.GetAnalytics().SetAnalyticsCollectionEnabled(enabled);
89 | }
90 |
91 | private void PutToBundle(Bundle bundle, string name, object? value)
92 | {
93 | switch (value)
94 | {
95 | case bool @bool:
96 | bundle.PutBoolean(name, @bool);
97 | break;
98 | case byte @byte:
99 | bundle.PutShort(name, @byte);
100 | break;
101 | case sbyte @sbyte:
102 | bundle.PutByte(name, @sbyte);
103 | break;
104 | case short @short:
105 | bundle.PutShort(name, @short);
106 | break;
107 | case ushort @ushort:
108 | bundle.PutInt(name, @ushort);
109 | break;
110 | case int @int:
111 | bundle.PutInt(name, @int);
112 | break;
113 | case uint @uint:
114 | bundle.PutLong(name, @uint);
115 | break;
116 | case long @long:
117 | bundle.PutLong(name, @long);
118 | break;
119 | case ulong @ulong:
120 | if (@ulong > long.MaxValue)
121 | {
122 | throw new OverflowException();
123 | }
124 | bundle.PutLong(name, (long)@ulong);
125 | break;
126 | case float @float:
127 | bundle.PutFloat(name, @float);
128 | break;
129 | case double @double:
130 | bundle.PutDouble(name, @double);
131 | break;
132 | case decimal @decimal:
133 | bundle.PutDouble(name, decimal.ToDouble(@decimal));
134 | break;
135 | case string @string:
136 | bundle.PutString(name, @string);
137 | break;
138 | case IEnumerable> dictionaries:
139 | {
140 | var bundles = new List();
141 | foreach (var dictionary in dictionaries)
142 | {
143 | var newBundle = new Bundle();
144 | foreach (var (key, val) in dictionary)
145 | {
146 | PutToBundle(newBundle, key, val);
147 | }
148 | bundles.Add(newBundle);
149 | }
150 | bundle.PutParcelableArray(name, bundles.ToArray());
151 | break;
152 | }
153 | default:
154 | throw new ArgumentOutOfRangeException(nameof(value), $"{value?.GetType().FullName ?? "null"} is not supported");
155 | }
156 | }
157 | }
158 | }
159 |
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 12.00
3 | # Visual Studio 15
4 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Plugin.FirebaseAnalytics", "Plugin.FirebaseAnalytics\Plugin.FirebaseAnalytics.csproj", "{B143E94D-2EA0-47F3-83F8-FF193DF8855B}"
5 | EndProject
6 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Sample", "Sample", "{6C24E49B-7213-4145-A695-F69DACC5AD6D}"
7 | EndProject
8 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Plugin.FirebaseAnalytics.Sample", "Plugin.FirebaseAnalytics.Sample\Plugin.FirebaseAnalytics.Sample\Plugin.FirebaseAnalytics.Sample.csproj", "{A56935B1-CDA2-4B51-922D-D47B5F38ABAD}"
9 | EndProject
10 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Plugin.FirebaseAnalytics.Sample.Android", "Plugin.FirebaseAnalytics.Sample\Plugin.FirebaseAnalytics.Sample.Android\Plugin.FirebaseAnalytics.Sample.Android.csproj", "{1BE43291-4B56-4022-B477-8D29E1E51A67}"
11 | EndProject
12 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Plugin.FirebaseAnalytics.Sample.iOS", "Plugin.FirebaseAnalytics.Sample\Plugin.FirebaseAnalytics.Sample.iOS\Plugin.FirebaseAnalytics.Sample.iOS.csproj", "{277531AF-DC3A-4374-A659-AD4DA1006524}"
13 | EndProject
14 | Global
15 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
16 | Debug|Any CPU = Debug|Any CPU
17 | Release|Any CPU = Release|Any CPU
18 | Debug|iPhoneSimulator = Debug|iPhoneSimulator
19 | Release|iPhoneSimulator = Release|iPhoneSimulator
20 | Debug|iPhone = Debug|iPhone
21 | Release|iPhone = Release|iPhone
22 | Ad-Hoc|iPhone = Ad-Hoc|iPhone
23 | AppStore|iPhone = AppStore|iPhone
24 | EndGlobalSection
25 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
26 | {B143E94D-2EA0-47F3-83F8-FF193DF8855B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
27 | {B143E94D-2EA0-47F3-83F8-FF193DF8855B}.Debug|Any CPU.Build.0 = Debug|Any CPU
28 | {B143E94D-2EA0-47F3-83F8-FF193DF8855B}.Release|Any CPU.ActiveCfg = Release|Any CPU
29 | {B143E94D-2EA0-47F3-83F8-FF193DF8855B}.Release|Any CPU.Build.0 = Release|Any CPU
30 | {B143E94D-2EA0-47F3-83F8-FF193DF8855B}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
31 | {B143E94D-2EA0-47F3-83F8-FF193DF8855B}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
32 | {B143E94D-2EA0-47F3-83F8-FF193DF8855B}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
33 | {B143E94D-2EA0-47F3-83F8-FF193DF8855B}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
34 | {B143E94D-2EA0-47F3-83F8-FF193DF8855B}.Debug|iPhone.ActiveCfg = Debug|Any CPU
35 | {B143E94D-2EA0-47F3-83F8-FF193DF8855B}.Debug|iPhone.Build.0 = Debug|Any CPU
36 | {B143E94D-2EA0-47F3-83F8-FF193DF8855B}.Release|iPhone.ActiveCfg = Release|Any CPU
37 | {B143E94D-2EA0-47F3-83F8-FF193DF8855B}.Release|iPhone.Build.0 = Release|Any CPU
38 | {B143E94D-2EA0-47F3-83F8-FF193DF8855B}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU
39 | {B143E94D-2EA0-47F3-83F8-FF193DF8855B}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU
40 | {B143E94D-2EA0-47F3-83F8-FF193DF8855B}.AppStore|iPhone.ActiveCfg = Release|Any CPU
41 | {B143E94D-2EA0-47F3-83F8-FF193DF8855B}.AppStore|iPhone.Build.0 = Release|Any CPU
42 | {A56935B1-CDA2-4B51-922D-D47B5F38ABAD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
43 | {A56935B1-CDA2-4B51-922D-D47B5F38ABAD}.Debug|Any CPU.Build.0 = Debug|Any CPU
44 | {A56935B1-CDA2-4B51-922D-D47B5F38ABAD}.Release|Any CPU.ActiveCfg = Release|Any CPU
45 | {A56935B1-CDA2-4B51-922D-D47B5F38ABAD}.Release|Any CPU.Build.0 = Release|Any CPU
46 | {A56935B1-CDA2-4B51-922D-D47B5F38ABAD}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
47 | {A56935B1-CDA2-4B51-922D-D47B5F38ABAD}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
48 | {A56935B1-CDA2-4B51-922D-D47B5F38ABAD}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
49 | {A56935B1-CDA2-4B51-922D-D47B5F38ABAD}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
50 | {A56935B1-CDA2-4B51-922D-D47B5F38ABAD}.Debug|iPhone.ActiveCfg = Debug|Any CPU
51 | {A56935B1-CDA2-4B51-922D-D47B5F38ABAD}.Debug|iPhone.Build.0 = Debug|Any CPU
52 | {A56935B1-CDA2-4B51-922D-D47B5F38ABAD}.Release|iPhone.ActiveCfg = Release|Any CPU
53 | {A56935B1-CDA2-4B51-922D-D47B5F38ABAD}.Release|iPhone.Build.0 = Release|Any CPU
54 | {A56935B1-CDA2-4B51-922D-D47B5F38ABAD}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU
55 | {A56935B1-CDA2-4B51-922D-D47B5F38ABAD}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU
56 | {A56935B1-CDA2-4B51-922D-D47B5F38ABAD}.AppStore|iPhone.ActiveCfg = Debug|Any CPU
57 | {A56935B1-CDA2-4B51-922D-D47B5F38ABAD}.AppStore|iPhone.Build.0 = Debug|Any CPU
58 | {1BE43291-4B56-4022-B477-8D29E1E51A67}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
59 | {1BE43291-4B56-4022-B477-8D29E1E51A67}.Debug|Any CPU.Build.0 = Debug|Any CPU
60 | {1BE43291-4B56-4022-B477-8D29E1E51A67}.Release|Any CPU.ActiveCfg = Release|Any CPU
61 | {1BE43291-4B56-4022-B477-8D29E1E51A67}.Release|Any CPU.Build.0 = Release|Any CPU
62 | {1BE43291-4B56-4022-B477-8D29E1E51A67}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
63 | {1BE43291-4B56-4022-B477-8D29E1E51A67}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
64 | {1BE43291-4B56-4022-B477-8D29E1E51A67}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
65 | {1BE43291-4B56-4022-B477-8D29E1E51A67}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
66 | {1BE43291-4B56-4022-B477-8D29E1E51A67}.Debug|iPhone.ActiveCfg = Debug|Any CPU
67 | {1BE43291-4B56-4022-B477-8D29E1E51A67}.Debug|iPhone.Build.0 = Debug|Any CPU
68 | {1BE43291-4B56-4022-B477-8D29E1E51A67}.Release|iPhone.ActiveCfg = Release|Any CPU
69 | {1BE43291-4B56-4022-B477-8D29E1E51A67}.Release|iPhone.Build.0 = Release|Any CPU
70 | {1BE43291-4B56-4022-B477-8D29E1E51A67}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU
71 | {1BE43291-4B56-4022-B477-8D29E1E51A67}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU
72 | {1BE43291-4B56-4022-B477-8D29E1E51A67}.AppStore|iPhone.ActiveCfg = Debug|Any CPU
73 | {1BE43291-4B56-4022-B477-8D29E1E51A67}.AppStore|iPhone.Build.0 = Debug|Any CPU
74 | {277531AF-DC3A-4374-A659-AD4DA1006524}.Debug|Any CPU.ActiveCfg = Debug|iPhoneSimulator
75 | {277531AF-DC3A-4374-A659-AD4DA1006524}.Debug|Any CPU.Build.0 = Debug|iPhoneSimulator
76 | {277531AF-DC3A-4374-A659-AD4DA1006524}.Release|Any CPU.ActiveCfg = Release|iPhoneSimulator
77 | {277531AF-DC3A-4374-A659-AD4DA1006524}.Release|Any CPU.Build.0 = Release|iPhoneSimulator
78 | {277531AF-DC3A-4374-A659-AD4DA1006524}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator
79 | {277531AF-DC3A-4374-A659-AD4DA1006524}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator
80 | {277531AF-DC3A-4374-A659-AD4DA1006524}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
81 | {277531AF-DC3A-4374-A659-AD4DA1006524}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
82 | {277531AF-DC3A-4374-A659-AD4DA1006524}.Debug|iPhone.ActiveCfg = Debug|iPhone
83 | {277531AF-DC3A-4374-A659-AD4DA1006524}.Debug|iPhone.Build.0 = Debug|iPhone
84 | {277531AF-DC3A-4374-A659-AD4DA1006524}.Release|iPhone.ActiveCfg = Release|iPhone
85 | {277531AF-DC3A-4374-A659-AD4DA1006524}.Release|iPhone.Build.0 = Release|iPhone
86 | {277531AF-DC3A-4374-A659-AD4DA1006524}.Ad-Hoc|iPhone.ActiveCfg = Ad-Hoc|iPhone
87 | {277531AF-DC3A-4374-A659-AD4DA1006524}.Ad-Hoc|iPhone.Build.0 = Ad-Hoc|iPhone
88 | {277531AF-DC3A-4374-A659-AD4DA1006524}.AppStore|iPhone.ActiveCfg = AppStore|iPhone
89 | {277531AF-DC3A-4374-A659-AD4DA1006524}.AppStore|iPhone.Build.0 = AppStore|iPhone
90 | EndGlobalSection
91 | GlobalSection(NestedProjects) = preSolution
92 | {A56935B1-CDA2-4B51-922D-D47B5F38ABAD} = {6C24E49B-7213-4145-A695-F69DACC5AD6D}
93 | {1BE43291-4B56-4022-B477-8D29E1E51A67} = {6C24E49B-7213-4145-A695-F69DACC5AD6D}
94 | {277531AF-DC3A-4374-A659-AD4DA1006524} = {6C24E49B-7213-4145-A695-F69DACC5AD6D}
95 | EndGlobalSection
96 | EndGlobal
97 |
--------------------------------------------------------------------------------
/Plugin.FirebaseAnalytics.Sample/Plugin.FirebaseAnalytics.Sample.iOS/Plugin.FirebaseAnalytics.Sample.iOS.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Debug
5 | iPhoneSimulator
6 | 8.0.30703
7 | 2.0
8 | {277531AF-DC3A-4374-A659-AD4DA1006524}
9 | {FEACFBD2-3405-455C-9665-78FE426C6842};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
10 | Exe
11 | Plugin.FirebaseAnalytics.Sample.iOS
12 | Resources
13 | Plugin.FirebaseAnalytics.Sample.iOS
14 |
15 |
16 |
17 |
18 | true
19 | full
20 | false
21 | bin\iPhoneSimulator\Debug
22 | DEBUG
23 | prompt
24 | 4
25 | false
26 | i386, x86_64
27 | None
28 | true
29 | iPhone Developer
30 |
31 |
32 | none
33 | true
34 | bin\iPhoneSimulator\Release
35 | prompt
36 | 4
37 | None
38 | i386, x86_64
39 | false
40 |
41 |
42 | true
43 | full
44 | false
45 | bin\iPhone\Debug
46 | DEBUG
47 | prompt
48 | 4
49 | false
50 | ARM64
51 | iPhone Developer
52 | true
53 | Entitlements.plist
54 |
55 |
56 | none
57 | true
58 | bin\iPhone\Release
59 | prompt
60 | 4
61 | ARM64
62 | false
63 | iPhone Developer
64 | Entitlements.plist
65 |
66 |
67 | none
68 | True
69 | bin\iPhone\Ad-Hoc
70 | prompt
71 | 4
72 | False
73 | ARM64
74 | True
75 | Automatic:AdHoc
76 | iPhone Distribution
77 | Entitlements.plist
78 |
79 |
80 | none
81 | True
82 | bin\iPhone\AppStore
83 | prompt
84 | 4
85 | False
86 | ARM64
87 | Automatic:AppStore
88 | iPhone Distribution
89 | Entitlements.plist
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 | false
103 |
104 |
105 | false
106 |
107 |
108 | false
109 |
110 |
111 | false
112 |
113 |
114 | false
115 |
116 |
117 | false
118 |
119 |
120 | false
121 |
122 |
123 | false
124 |
125 |
126 | false
127 |
128 |
129 | false
130 |
131 |
132 | false
133 |
134 |
135 | false
136 |
137 |
138 | false
139 |
140 |
141 | false
142 |
143 |
144 | false
145 |
146 |
147 | false
148 |
149 |
150 | false
151 |
152 |
153 | false
154 |
155 |
156 | false
157 |
158 |
159 | false
160 |
161 |
162 | false
163 |
164 |
165 | false
166 |
167 |
168 | false
169 |
170 |
171 | false
172 |
173 |
174 | false
175 |
176 |
177 |
178 |
179 |
180 |
181 |
182 |
183 |
184 |
185 |
186 |
187 |
188 |
189 |
190 |
191 |
192 |
193 |
194 |
195 |
196 | 6.9.0
197 |
198 |
199 |
200 |
201 | {A56935B1-CDA2-4B51-922D-D47B5F38ABAD}
202 | Plugin.FirebaseAnalytics.Sample
203 |
204 |
205 | {B143E94D-2EA0-47F3-83F8-FF193DF8855B}
206 | Plugin.FirebaseAnalytics
207 |
208 |
209 |
210 |
--------------------------------------------------------------------------------