Permalink
Find file
175 lines (147 sloc) 5.03 KB
using System;
using System.ComponentModel;
using System.Globalization;
using CoreSpotlight;
using Foundation;
using UIKit;
namespace Xamarin.Forms.Platform.iOS
{
public class FormsApplicationDelegate : UIApplicationDelegate
{
Application _application;
bool _isSuspended;
UIWindow _window;
protected FormsApplicationDelegate()
{
}
public override bool ContinueUserActivity(UIApplication application, NSUserActivity userActivity, UIApplicationRestorationHandler completionHandler)
{
CheckForAppLink(userActivity);
return true;
}
// now in background
public override void DidEnterBackground(UIApplication uiApplication)
{
// applicationDidEnterBackground
}
// finish initialization before display to user
public override bool FinishedLaunching(UIApplication uiApplication, NSDictionary launchOptions)
{
// check contents of launch options and evaluate why the app was launched and respond
// initialize the important data structures
// prepare you apps window and views for display
// keep lightweight, anything long winded should be executed asynchronously on a secondary thread.
// application:didFinishLaunchingWithOptions
_window = new UIWindow(UIScreen.MainScreen.Bounds);
if (_application == null)
throw new InvalidOperationException("You MUST invoke LoadApplication () before calling base.FinishedLaunching ()");
SetMainPage();
_application.SendStart();
return true;
}
// about to become foreground, last minute preparatuin
public override void OnActivated(UIApplication uiApplication)
{
// applicationDidBecomeActive
// execute any OpenGL ES drawing calls
if (_application != null && _isSuspended)
{
_isSuspended = false;
CultureInfo.CurrentCulture.ClearCachedData();
TimeZoneInfo.ClearCachedData();
_application.SendResume();
}
}
// transitioning to background
public override async void OnResignActivation(UIApplication uiApplication)
{
// applicationWillResignActive
if (_application != null)
{
_isSuspended = true;
await _application.SendSleepAsync();
}
}
public override void UserActivityUpdated(UIApplication application, NSUserActivity userActivity)
{
CheckForAppLink(userActivity);
}
// from background to foreground, not yet active
public override void WillEnterForeground(UIApplication uiApplication)
{
// applicationWillEnterForeground
}
// TODO where to execute heavy code, storing state, sending to server, etc
// first chance to execute code at launch time
public override bool WillFinishLaunching(UIApplication uiApplication, NSDictionary launchOptions)
{
// check contents of launch options and evaluate why the app was launched and respond
// initialize the important data structures
// prepare you apps window and views for display
// keep lightweight, anything long winded should be executed asynchronously on a secondary thread.
// application:willFinishLaunchingWithOptions
// Restore ui state here
return true;
}
// app is being terminated, not called if you app is suspended
public override void WillTerminate(UIApplication uiApplication)
{
// applicationWillTerminate
//application.SendTerminate ();
}
protected override void Dispose(bool disposing)
{
if (disposing && _application != null)
_application.PropertyChanged -= ApplicationOnPropertyChanged;
base.Dispose(disposing);
}
protected void LoadApplication(Application application)
{
if (application == null)
throw new ArgumentNullException("application");
Application.Current = application;
_application = application;
(application as IApplicationController)?.SetAppIndexingProvider(new IOSAppIndexingProvider());
application.PropertyChanged += ApplicationOnPropertyChanged;
}
void ApplicationOnPropertyChanged(object sender, PropertyChangedEventArgs args)
{
if (args.PropertyName == "MainPage")
UpdateMainPage();
}
void CheckForAppLink(NSUserActivity userActivity)
{
var strLink = string.Empty;
switch (userActivity.ActivityType)
{
case "NSUserActivityTypeBrowsingWeb":
strLink = userActivity.WebPageUrl.AbsoluteString;
break;
case "com.apple.corespotlightitem":
if (userActivity.UserInfo.ContainsKey(CSSearchableItem.ActivityIdentifier))
strLink = userActivity.UserInfo.ObjectForKey(CSSearchableItem.ActivityIdentifier).ToString();
break;
default:
if (userActivity.UserInfo.ContainsKey(new NSString("link")))
strLink = userActivity.UserInfo[new NSString("link")].ToString();
break;
}
if (!string.IsNullOrEmpty(strLink))
_application.SendOnAppLinkRequestReceived(new Uri(strLink));
}
void SetMainPage()
{
UpdateMainPage();
_window.MakeKeyAndVisible();
}
void UpdateMainPage()
{
if (_application.MainPage == null)
return;
var platformRenderer = (PlatformRenderer)_window.RootViewController;
if (platformRenderer != null)
((IDisposable)platformRenderer.Platform).Dispose();
_window.RootViewController = _application.MainPage.CreateViewController();
}
}
}