2016-05-02 09:52:09 +03:00
|
|
|
|
using System;
|
|
|
|
|
using XLabs.Ioc;
|
|
|
|
|
using Foundation;
|
|
|
|
|
using UIKit;
|
|
|
|
|
using Bit.App.Abstractions;
|
|
|
|
|
using Bit.App.Services;
|
|
|
|
|
using Bit.iOS.Services;
|
2016-05-03 09:08:50 +03:00
|
|
|
|
using Plugin.Connectivity;
|
2016-05-06 07:17:38 +03:00
|
|
|
|
using Bit.App.Repositories;
|
2016-05-21 19:32:34 +03:00
|
|
|
|
using Plugin.Fingerprint;
|
|
|
|
|
using Plugin.Settings.Abstractions;
|
|
|
|
|
using System.Diagnostics;
|
|
|
|
|
using Xamarin.Forms;
|
2016-05-28 23:06:53 +03:00
|
|
|
|
using Bit.iOS.Core.Services;
|
2016-07-02 01:54:00 +03:00
|
|
|
|
using Plugin.Connectivity.Abstractions;
|
2016-07-05 06:11:44 +03:00
|
|
|
|
using Bit.App.Pages;
|
2016-07-22 07:04:05 +03:00
|
|
|
|
using HockeyApp.iOS;
|
2016-07-23 00:55:11 +03:00
|
|
|
|
using Bit.iOS.Core;
|
2016-08-05 02:35:56 +03:00
|
|
|
|
using Google.Analytics;
|
2017-02-16 05:56:02 +03:00
|
|
|
|
using FFImageLoading.Forms.Touch;
|
2017-06-01 21:49:48 +03:00
|
|
|
|
using SimpleInjector;
|
|
|
|
|
using XLabs.Ioc.SimpleInjectorContainer;
|
2016-05-02 09:52:09 +03:00
|
|
|
|
|
|
|
|
|
namespace Bit.iOS
|
|
|
|
|
{
|
|
|
|
|
[Register("AppDelegate")]
|
|
|
|
|
public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate
|
|
|
|
|
{
|
2016-08-05 02:35:56 +03:00
|
|
|
|
private GaiCompletionHandler _dispatchHandler = null;
|
2017-04-28 18:07:26 +03:00
|
|
|
|
private ILockService _lockService;
|
2017-12-22 07:26:46 +03:00
|
|
|
|
private iOSPushNotificationHandler _pushHandler = null;
|
2016-08-05 02:35:56 +03:00
|
|
|
|
|
2016-06-25 06:39:13 +03:00
|
|
|
|
public ISettings Settings { get; set; }
|
|
|
|
|
|
2016-05-02 09:52:09 +03:00
|
|
|
|
public override bool FinishedLaunching(UIApplication app, NSDictionary options)
|
|
|
|
|
{
|
2017-10-10 17:55:54 +03:00
|
|
|
|
Forms.Init();
|
2017-10-10 16:13:09 +03:00
|
|
|
|
|
2016-05-02 09:52:09 +03:00
|
|
|
|
if(!Resolver.IsSet)
|
|
|
|
|
{
|
|
|
|
|
SetIoc();
|
|
|
|
|
}
|
|
|
|
|
|
2017-04-28 18:07:26 +03:00
|
|
|
|
_lockService = Resolver.Resolve<ILockService>();
|
2017-12-22 07:26:46 +03:00
|
|
|
|
_pushHandler = new iOSPushNotificationHandler(Resolver.Resolve<IPushNotificationListener>());
|
2016-07-28 01:46:55 +03:00
|
|
|
|
var appIdService = Resolver.Resolve<IAppIdService>();
|
2017-12-22 07:26:46 +03:00
|
|
|
|
|
2016-07-28 01:46:55 +03:00
|
|
|
|
var crashManagerDelegate = new HockeyAppCrashManagerDelegate(
|
|
|
|
|
appIdService, Resolver.Resolve<IAuthService>());
|
2016-07-23 00:55:11 +03:00
|
|
|
|
var manager = BITHockeyManager.SharedHockeyManager;
|
|
|
|
|
manager.Configure("51f96ae568ba45f699a18ad9f63046c3", crashManagerDelegate);
|
2016-07-23 05:56:45 +03:00
|
|
|
|
manager.CrashManager.CrashManagerStatus = BITCrashManagerStatus.AutoSend;
|
2016-07-28 01:46:55 +03:00
|
|
|
|
manager.UserId = appIdService.AppId;
|
2016-07-23 00:55:11 +03:00
|
|
|
|
manager.StartManager();
|
|
|
|
|
manager.Authenticator.AuthenticateInstallation();
|
2016-08-14 07:15:47 +03:00
|
|
|
|
manager.DisableMetricsManager = manager.DisableFeedbackManager = manager.DisableUpdateManager = true;
|
2016-07-23 00:55:11 +03:00
|
|
|
|
|
2016-05-22 06:26:35 +03:00
|
|
|
|
LoadApplication(new App.App(
|
2017-01-28 07:13:28 +03:00
|
|
|
|
null,
|
2016-05-21 19:32:34 +03:00
|
|
|
|
Resolver.Resolve<IAuthService>(),
|
2016-07-02 01:54:00 +03:00
|
|
|
|
Resolver.Resolve<IConnectivity>(),
|
2016-05-21 19:32:34 +03:00
|
|
|
|
Resolver.Resolve<IDatabaseService>(),
|
2016-07-01 03:08:34 +03:00
|
|
|
|
Resolver.Resolve<ISyncService>(),
|
2016-07-20 01:46:39 +03:00
|
|
|
|
Resolver.Resolve<ISettings>(),
|
2017-04-28 18:07:26 +03:00
|
|
|
|
_lockService,
|
2017-02-06 07:55:46 +03:00
|
|
|
|
Resolver.Resolve<ILocalizeService>(),
|
2017-04-28 18:07:26 +03:00
|
|
|
|
Resolver.Resolve<IAppInfoService>(),
|
2017-07-13 17:51:45 +03:00
|
|
|
|
Resolver.Resolve<IAppSettingsService>(),
|
|
|
|
|
Resolver.Resolve<IDeviceActionService>()));
|
2016-05-02 09:52:09 +03:00
|
|
|
|
|
2016-07-12 06:55:16 +03:00
|
|
|
|
// Appearance stuff
|
|
|
|
|
|
|
|
|
|
var primaryColor = new UIColor(red: 0.24f, green: 0.55f, blue: 0.74f, alpha: 1.0f);
|
2016-07-13 01:59:09 +03:00
|
|
|
|
var grayLight = new UIColor(red: 0.47f, green: 0.47f, blue: 0.47f, alpha: 1.0f);
|
2016-07-12 06:55:16 +03:00
|
|
|
|
|
2016-06-14 07:19:18 +03:00
|
|
|
|
UINavigationBar.Appearance.ShadowImage = new UIImage();
|
|
|
|
|
UINavigationBar.Appearance.SetBackgroundImage(new UIImage(), UIBarMetrics.Default);
|
2016-07-12 06:55:16 +03:00
|
|
|
|
UIBarButtonItem.AppearanceWhenContainedIn(new Type[] { typeof(UISearchBar) }).TintColor = primaryColor;
|
2017-10-10 17:55:54 +03:00
|
|
|
|
UIButton.AppearanceWhenContainedIn(new Type[] { typeof(UISearchBar) }).SetTitleColor(primaryColor,
|
2017-10-10 06:45:23 +03:00
|
|
|
|
UIControlState.Normal);
|
2016-07-30 19:51:12 +03:00
|
|
|
|
UIButton.AppearanceWhenContainedIn(new Type[] { typeof(UISearchBar) }).TintColor = primaryColor;
|
2016-07-13 01:59:09 +03:00
|
|
|
|
UIStepper.Appearance.TintColor = grayLight;
|
|
|
|
|
UISlider.Appearance.TintColor = primaryColor;
|
2016-06-14 07:19:18 +03:00
|
|
|
|
|
2017-10-10 06:45:23 +03:00
|
|
|
|
MessagingCenter.Subscribe<Xamarin.Forms.Application, ToolsExtensionPage>(
|
|
|
|
|
Xamarin.Forms.Application.Current, "ShowAppExtension", (sender, page) =>
|
2016-07-02 22:20:06 +03:00
|
|
|
|
{
|
2017-10-10 06:45:23 +03:00
|
|
|
|
var itemProvider = new NSItemProvider(new NSDictionary(), Core.Constants.UTTypeAppExtensionSetup);
|
2016-07-02 22:20:06 +03:00
|
|
|
|
var extensionItem = new NSExtensionItem();
|
|
|
|
|
extensionItem.Attachments = new NSItemProvider[] { itemProvider };
|
|
|
|
|
var activityViewController = new UIActivityViewController(new NSExtensionItem[] { extensionItem }, null);
|
|
|
|
|
activityViewController.CompletionHandler = (activityType, completed) =>
|
|
|
|
|
{
|
2016-07-05 06:11:44 +03:00
|
|
|
|
page.EnabledExtension(completed && activityType == "com.8bit.bitwarden.find-login-action-extension");
|
2016-07-02 22:20:06 +03:00
|
|
|
|
};
|
|
|
|
|
|
2016-07-10 08:15:59 +03:00
|
|
|
|
var modal = UIApplication.SharedApplication.KeyWindow.RootViewController.ModalViewController;
|
|
|
|
|
if(activityViewController.PopoverPresentationController != null)
|
|
|
|
|
{
|
|
|
|
|
activityViewController.PopoverPresentationController.SourceView = modal.View;
|
|
|
|
|
var frame = UIScreen.MainScreen.Bounds;
|
|
|
|
|
frame.Height /= 2;
|
|
|
|
|
activityViewController.PopoverPresentationController.SourceRect = frame;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
modal.PresentViewController(activityViewController, true, null);
|
2016-07-02 22:20:06 +03:00
|
|
|
|
});
|
|
|
|
|
|
2016-07-23 22:32:11 +03:00
|
|
|
|
UIApplication.SharedApplication.StatusBarHidden = false;
|
|
|
|
|
UIApplication.SharedApplication.StatusBarStyle = UIStatusBarStyle.LightContent;
|
|
|
|
|
|
2017-10-10 17:55:54 +03:00
|
|
|
|
MessagingCenter.Subscribe<Xamarin.Forms.Application, bool>(Xamarin.Forms.Application.Current,
|
2017-10-10 06:45:23 +03:00
|
|
|
|
"ShowStatusBar", (sender, show) =>
|
2016-07-23 22:32:11 +03:00
|
|
|
|
{
|
|
|
|
|
UIApplication.SharedApplication.SetStatusBarHidden(!show, false);
|
|
|
|
|
});
|
|
|
|
|
|
2017-07-14 00:23:18 +03:00
|
|
|
|
ZXing.Net.Mobile.Forms.iOS.Platform.Init();
|
2016-05-02 09:52:09 +03:00
|
|
|
|
return base.FinishedLaunching(app, options);
|
|
|
|
|
}
|
|
|
|
|
|
2016-05-21 19:32:34 +03:00
|
|
|
|
public override void DidEnterBackground(UIApplication uiApplication)
|
|
|
|
|
{
|
2016-06-11 09:43:53 +03:00
|
|
|
|
var view = new UIView(UIApplication.SharedApplication.KeyWindow.Frame)
|
2016-05-21 19:32:34 +03:00
|
|
|
|
{
|
|
|
|
|
Tag = 4321
|
|
|
|
|
};
|
2016-06-11 09:43:53 +03:00
|
|
|
|
|
|
|
|
|
var backgroundView = new UIView(UIApplication.SharedApplication.KeyWindow.Frame)
|
|
|
|
|
{
|
2016-06-26 03:54:17 +03:00
|
|
|
|
BackgroundColor = new UIColor(red: 0.93f, green: 0.94f, blue: 0.96f, alpha: 1.0f)
|
2016-06-11 09:43:53 +03:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var imageView = new UIImageView(new UIImage("logo.png"))
|
|
|
|
|
{
|
2016-07-27 05:41:01 +03:00
|
|
|
|
Center = new CoreGraphics.CGPoint(view.Center.X, view.Center.Y - 30)
|
2016-06-11 09:43:53 +03:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
view.AddSubview(backgroundView);
|
|
|
|
|
view.AddSubview(imageView);
|
|
|
|
|
|
|
|
|
|
UIApplication.SharedApplication.KeyWindow.AddSubview(view);
|
|
|
|
|
UIApplication.SharedApplication.KeyWindow.BringSubviewToFront(view);
|
|
|
|
|
UIApplication.SharedApplication.KeyWindow.EndEditing(true);
|
2016-07-24 06:50:08 +03:00
|
|
|
|
UIApplication.SharedApplication.SetStatusBarHidden(true, false);
|
2016-05-22 05:50:15 +03:00
|
|
|
|
|
|
|
|
|
// Log the date/time we last backgrounded
|
2017-04-28 18:07:26 +03:00
|
|
|
|
_lockService.UpdateLastActivity();
|
2016-06-25 06:39:13 +03:00
|
|
|
|
|
2016-08-05 02:35:56 +03:00
|
|
|
|
// Dispatch Google Analytics
|
|
|
|
|
SendGoogleAnalyticsHitsInBackground();
|
2016-05-21 19:32:34 +03:00
|
|
|
|
|
|
|
|
|
base.DidEnterBackground(uiApplication);
|
|
|
|
|
Debug.WriteLine("DidEnterBackground");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override void OnResignActivation(UIApplication uiApplication)
|
|
|
|
|
{
|
|
|
|
|
base.OnResignActivation(uiApplication);
|
|
|
|
|
Debug.WriteLine("OnResignActivation");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override void WillTerminate(UIApplication uiApplication)
|
|
|
|
|
{
|
|
|
|
|
base.WillTerminate(uiApplication);
|
|
|
|
|
Debug.WriteLine("WillTerminate");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override void OnActivated(UIApplication uiApplication)
|
|
|
|
|
{
|
|
|
|
|
base.OnActivated(uiApplication);
|
|
|
|
|
Debug.WriteLine("OnActivated");
|
|
|
|
|
|
2016-07-23 22:09:00 +03:00
|
|
|
|
UIApplication.SharedApplication.ApplicationIconBadgeNumber = 0;
|
|
|
|
|
|
2016-05-21 19:32:34 +03:00
|
|
|
|
var view = UIApplication.SharedApplication.KeyWindow.ViewWithTag(4321);
|
|
|
|
|
if(view != null)
|
|
|
|
|
{
|
|
|
|
|
view.RemoveFromSuperview();
|
2016-07-24 06:50:08 +03:00
|
|
|
|
UIApplication.SharedApplication.SetStatusBarHidden(false, false);
|
2016-05-21 19:32:34 +03:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override void WillEnterForeground(UIApplication uiApplication)
|
|
|
|
|
{
|
2016-07-01 03:08:34 +03:00
|
|
|
|
SendResumedMessage();
|
2016-08-05 02:35:56 +03:00
|
|
|
|
|
|
|
|
|
// Restores the dispatch interval because dispatchWithCompletionHandler
|
|
|
|
|
// has disabled automatic dispatching.
|
|
|
|
|
Gai.SharedInstance.DispatchInterval = 10;
|
|
|
|
|
|
2016-05-21 19:32:34 +03:00
|
|
|
|
base.WillEnterForeground(uiApplication);
|
|
|
|
|
Debug.WriteLine("WillEnterForeground");
|
|
|
|
|
}
|
|
|
|
|
|
2017-10-10 17:55:54 +03:00
|
|
|
|
public override bool OpenUrl(UIApplication application, NSUrl url, string sourceApplication,
|
2017-10-10 06:45:23 +03:00
|
|
|
|
NSObject annotation)
|
2016-05-30 10:08:12 +03:00
|
|
|
|
{
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
2016-06-18 09:45:46 +03:00
|
|
|
|
public override void FailedToRegisterForRemoteNotifications(UIApplication application, NSError error)
|
|
|
|
|
{
|
2017-12-22 07:26:46 +03:00
|
|
|
|
_pushHandler?.OnErrorReceived(error);
|
2016-06-18 09:45:46 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override void RegisteredForRemoteNotifications(UIApplication application, NSData deviceToken)
|
|
|
|
|
{
|
2017-12-22 07:26:46 +03:00
|
|
|
|
_pushHandler?.OnRegisteredSuccess(deviceToken);
|
2016-06-18 09:45:46 +03:00
|
|
|
|
}
|
|
|
|
|
|
2017-10-10 17:55:54 +03:00
|
|
|
|
public override void DidRegisterUserNotificationSettings(UIApplication application,
|
2017-10-10 06:45:23 +03:00
|
|
|
|
UIUserNotificationSettings notificationSettings)
|
2016-06-18 09:45:46 +03:00
|
|
|
|
{
|
|
|
|
|
application.RegisterForRemoteNotifications();
|
|
|
|
|
}
|
|
|
|
|
|
2017-10-10 17:55:54 +03:00
|
|
|
|
public override void DidReceiveRemoteNotification(UIApplication application, NSDictionary userInfo,
|
2017-10-10 06:45:23 +03:00
|
|
|
|
Action<UIBackgroundFetchResult> completionHandler)
|
2016-06-18 09:45:46 +03:00
|
|
|
|
{
|
2017-12-22 07:26:46 +03:00
|
|
|
|
_pushHandler?.OnMessageReceived(userInfo);
|
2016-06-18 09:45:46 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override void ReceivedRemoteNotification(UIApplication application, NSDictionary userInfo)
|
|
|
|
|
{
|
2017-12-22 07:26:46 +03:00
|
|
|
|
_pushHandler?.OnMessageReceived(userInfo);
|
2016-06-18 09:45:46 +03:00
|
|
|
|
}
|
|
|
|
|
|
2016-07-01 03:08:34 +03:00
|
|
|
|
private void SendResumedMessage()
|
2016-05-21 19:32:34 +03:00
|
|
|
|
{
|
2016-07-01 03:08:34 +03:00
|
|
|
|
MessagingCenter.Send(Xamarin.Forms.Application.Current, "Resumed", false);
|
2016-05-21 19:32:34 +03:00
|
|
|
|
}
|
|
|
|
|
|
2016-05-02 09:52:09 +03:00
|
|
|
|
private void SetIoc()
|
|
|
|
|
{
|
2017-06-01 21:49:48 +03:00
|
|
|
|
var container = new Container();
|
|
|
|
|
|
|
|
|
|
// Services
|
|
|
|
|
container.RegisterSingleton<IDatabaseService, DatabaseService>();
|
|
|
|
|
container.RegisterSingleton<ISqlService, SqlService>();
|
|
|
|
|
container.RegisterSingleton<ISecureStorageService, KeyChainStorageService>();
|
|
|
|
|
container.RegisterSingleton<ICryptoService, CryptoService>();
|
|
|
|
|
container.RegisterSingleton<IKeyDerivationService, CommonCryptoKeyDerivationService>();
|
|
|
|
|
container.RegisterSingleton<IAuthService, AuthService>();
|
|
|
|
|
container.RegisterSingleton<IFolderService, FolderService>();
|
2017-11-25 07:15:25 +03:00
|
|
|
|
container.RegisterSingleton<ICollectionService, CollectionService>();
|
2017-10-19 03:55:33 +03:00
|
|
|
|
container.RegisterSingleton<ICipherService, CipherService>();
|
2017-06-01 21:49:48 +03:00
|
|
|
|
container.RegisterSingleton<ISyncService, SyncService>();
|
2017-07-13 06:09:44 +03:00
|
|
|
|
container.RegisterSingleton<IDeviceActionService, DeviceActionService>();
|
2017-06-01 21:49:48 +03:00
|
|
|
|
container.RegisterSingleton<IAppIdService, AppIdService>();
|
|
|
|
|
container.RegisterSingleton<IPasswordGenerationService, PasswordGenerationService>();
|
|
|
|
|
container.RegisterSingleton<ILockService, LockService>();
|
|
|
|
|
container.RegisterSingleton<IAppInfoService, AppInfoService>();
|
|
|
|
|
container.RegisterSingleton<IGoogleAnalyticsService, GoogleAnalyticsService>();
|
|
|
|
|
container.RegisterSingleton<IDeviceInfoService, DeviceInfoService>();
|
|
|
|
|
container.RegisterSingleton<ILocalizeService, LocalizeService>();
|
|
|
|
|
container.RegisterSingleton<ILogService, LogService>();
|
|
|
|
|
container.RegisterSingleton<IHttpService, HttpService>();
|
|
|
|
|
container.RegisterSingleton<ITokenService, TokenService>();
|
|
|
|
|
container.RegisterSingleton<ISettingsService, SettingsService>();
|
|
|
|
|
container.RegisterSingleton<IAppSettingsService, AppSettingsService>();
|
|
|
|
|
|
|
|
|
|
// Repositories
|
|
|
|
|
container.RegisterSingleton<IFolderRepository, FolderRepository>();
|
|
|
|
|
container.RegisterSingleton<IFolderApiRepository, FolderApiRepository>();
|
2017-10-19 03:55:33 +03:00
|
|
|
|
container.RegisterSingleton<ICipherRepository, CipherRepository>();
|
2017-07-12 23:23:24 +03:00
|
|
|
|
container.RegisterSingleton<IAttachmentRepository, AttachmentRepository>();
|
2017-06-01 21:49:48 +03:00
|
|
|
|
container.RegisterSingleton<IConnectApiRepository, ConnectApiRepository>();
|
|
|
|
|
container.RegisterSingleton<IDeviceApiRepository, DeviceApiRepository>();
|
|
|
|
|
container.RegisterSingleton<IAccountsApiRepository, AccountsApiRepository>();
|
|
|
|
|
container.RegisterSingleton<ICipherApiRepository, CipherApiRepository>();
|
|
|
|
|
container.RegisterSingleton<ISettingsRepository, SettingsRepository>();
|
|
|
|
|
container.RegisterSingleton<ISettingsApiRepository, SettingsApiRepository>();
|
2017-06-29 18:22:06 +03:00
|
|
|
|
container.RegisterSingleton<ITwoFactorApiRepository, TwoFactorApiRepository>();
|
2017-09-20 20:17:05 +03:00
|
|
|
|
container.RegisterSingleton<ISyncApiRepository, SyncApiRepository>();
|
2017-11-25 00:11:40 +03:00
|
|
|
|
container.RegisterSingleton<ICollectionRepository, CollectionRepository>();
|
|
|
|
|
container.RegisterSingleton<ICipherCollectionRepository, CipherCollectionRepository>();
|
2017-06-01 21:49:48 +03:00
|
|
|
|
|
|
|
|
|
// Other
|
|
|
|
|
container.RegisterSingleton(CrossConnectivity.Current);
|
|
|
|
|
container.RegisterSingleton(CrossFingerprint.Current);
|
2016-05-02 09:52:09 +03:00
|
|
|
|
|
2016-06-25 06:39:13 +03:00
|
|
|
|
Settings = new Settings("group.com.8bit.bitwarden");
|
2017-06-01 21:49:48 +03:00
|
|
|
|
container.RegisterSingleton(Settings);
|
2016-06-25 06:39:13 +03:00
|
|
|
|
|
2017-06-01 21:49:48 +03:00
|
|
|
|
// Push
|
2017-12-22 07:26:46 +03:00
|
|
|
|
container.RegisterSingleton<IPushNotificationListener, PushNotificationListener>();
|
|
|
|
|
container.RegisterSingleton<IPushNotificationService, iOSPushNotificationService>();
|
2016-06-18 09:45:46 +03:00
|
|
|
|
|
2018-01-04 20:46:14 +03:00
|
|
|
|
FFImageLoading.ImageService.Instance.Initialize(new FFImageLoading.Config.Configuration
|
|
|
|
|
{
|
|
|
|
|
AnimateGifs = false
|
|
|
|
|
});
|
2017-12-22 07:26:46 +03:00
|
|
|
|
CachedImageRenderer.Init();
|
2017-06-01 21:49:48 +03:00
|
|
|
|
Resolver.SetResolver(new SimpleInjectorResolver(container));
|
2016-05-02 09:52:09 +03:00
|
|
|
|
}
|
2016-08-05 02:35:56 +03:00
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// This method sends any queued hits when the app enters the background.
|
|
|
|
|
/// ref: https://developers.google.com/analytics/devguides/collection/ios/v3/dispatch
|
|
|
|
|
/// </summary>
|
|
|
|
|
private void SendGoogleAnalyticsHitsInBackground()
|
|
|
|
|
{
|
|
|
|
|
var taskExpired = false;
|
|
|
|
|
var taskId = UIApplication.SharedApplication.BeginBackgroundTask(() =>
|
|
|
|
|
{
|
|
|
|
|
taskExpired = true;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
if(taskId == UIApplication.BackgroundTaskInvalid)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_dispatchHandler = (result) =>
|
|
|
|
|
{
|
|
|
|
|
// Send hits until no hits are left, a dispatch error occurs, or the background task expires.
|
|
|
|
|
if(_dispatchHandler != null && result == DispatchResult.Good && !taskExpired)
|
|
|
|
|
{
|
|
|
|
|
Gai.SharedInstance.Dispatch(_dispatchHandler);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
UIApplication.SharedApplication.EndBackgroundTask(taskId);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
Gai.SharedInstance.Dispatch(_dispatchHandler);
|
|
|
|
|
}
|
2016-05-02 09:52:09 +03:00
|
|
|
|
}
|
|
|
|
|
}
|