SlideShare ist ein Scribd-Unternehmen logo
1 von 80
Downloaden Sie, um offline zu lesen
Aaron Bockover
Xamarin
abock@xamarin.com
@abock
Writing Native Mac Apps
in C# with Xamarin.Mac
2.6 Billion Devices
MacOSX
The world’s most advanced
desktop operating system
C#
It’s all about sharing code
Shared C# Code
Xamarin.Mobile
Business Logic
Cloud Access
Database Access
DesktopDesktop MobileMobileMobile
Windows iOS
Windows
Phone
Android
It’s all about sharing code
Shared C# Code
Xamarin.Mobile
Business Logic
Cloud Access
Database Access
DesktopDesktop MobileMobileMobile
Windows iOS
Windows
Phone
AndroidMac
TouchDraw runs on iPad,
Android, and Mac, achieving
over 70% code reuse across
the platforms.
39%
61%
TouchDraw
for iPad
24%
76%
TouchDraw
for Mac
28%
72%
TouchDraw
for Android
Shared Code
Platform Specific
Xamarin.Mac at a glance
• Write native Mac applications in C#
• Access Mac OS X APIs for rich integration
• Leverage the full power of C# and .NET
• Integrated with the Xamarin experience
• Deploy directly to the Mac AppStore
Xamarin.Mac at a glance
Xamarin.Mac
Frameworks
Xamarin Tools
and SDK
• Binder
• Bundler
• Linker
• Packager Mono Runtime
.NET Base Class Libraries System Libraries
Darwin OS
Cocoa Frameworks
Xcode
(UI designer)
Xamarin Studio IDE
Xamarin.Mac at a glance
Xamarin.Mac
Frameworks
Xamarin Tools
and SDK
• Binder
• Bundler
• Linker
• Packager Mono Runtime
.NET Base Class Libraries System Libraries
Darwin OS
Cocoa Frameworks
Xcode
(UI designer)
Xamarin Studio IDE
Xamarin.Mac Frameworks
GraphicsGraphics
CoreGraphics ImageKit
CoreImage ImageIO
CoreText OpenGL
CoreVideo PDFKit
User InterfaceUser Interface
AppKit QuickLook
CoreAnima?on SceneKit
QCComposer WebKit
Audio and VideoAudio and Video
AVFounda?on CoreMidi
AudioToolbox CoreMedia
AudioUnit OpenAL
System ServicesSystem Services
AddressBook CoreWLAN
Bluetooth Scrip?ngBridge
CoreLoca?on StoreKit
CoreServices
InfrastructureInfrastructure
CoreData Founda?on
CoreFounda?on ObjCRun?me
Darwin Security
Many are shared with Xamarin.iOS
GraphicsGraphics
CoreGraphics ImageKit
CoreImage ImageIO
CoreText OpenGL
CoreVideo PDFKit
User InterfaceUser Interface
AppKit QuickLook
CoreAnima?on SceneKit
QCComposer WebKit
Audio and VideoAudio and Video
AVFounda?on CoreMidi
AudioToolbox CoreMedia
AudioUnit OpenAL
System ServicesSystem Services
AddressBook CoreWLAN
Bluetooth Scrip?ngBridge
CoreLoca?on StoreKit
CoreServices
InfrastructureInfrastructure
CoreData Founda?on
CoreFounda?on ObjCRun?me
Darwin Security
The Basics
GraphicsGraphics
CoreGraphics ImageKit
CoreImage ImageIO
CoreText OpenGL
CoreVideo PDFKit
User InterfaceUser Interface
AppKit QuickLook
CoreAnima?on SceneKit
QCComposer WebKit
Audio and VideoAudio and Video
AVFounda?on CoreMidi
AudioToolbox CoreMedia
AudioUnit OpenAL
System ServicesSystem Services
AddressBook CoreWLAN
Bluetooth Scrip?ngBridge
CoreLoca?on StoreKit
CoreServices
InfrastructureInfrastructure
CoreData Founda5on
CoreFounda?on ObjCRun?me
Darwin Security
How does Xamarin.Mac work?
How does Xamarin.Mac work?
• OS X APIs are projected into C#
1:1 mapping for full platform coverage
How does Xamarin.Mac work?
• OS X APIs are projected into C#
1:1 mapping for full platform coverage
• 80% are Objective-C
Full object system is mapped
Subclassing and overriding supported
How does Xamarin.Mac work?
• OS X APIs are projected into C#
1:1 mapping for full platform coverage
• 80% are Objective-C
Full object system is mapped
Subclassing and overriding supported
• 20% are C
Exposed as C# structs/classes/methods
No support for subclassing or overriding
How does Xamarin.Mac work?
• OS X APIs are projected into C#
1:1 mapping for full platform coverage
Check out “Binding
Objective-C Libraries” for a
deep dive at 1:30!
• 80% are Objective-C
Full object system is mapped
Subclassing and overriding supported
• 20% are C
Exposed as C# structs/classes/methods
No support for subclassing or overriding
DIVE IN
Anatomy of a Xamarin.Mac application
Anatomy of a Xamarin.Mac application
Info.plist
Application metadata, used by Mac OS
(app name, version, publisher, etc.)
Anatomy of a Xamarin.Mac application
Info.plist
Application metadata, used by Mac OS
(app name, version, publisher, etc.)
Resources Folder
Place any resources (images, icons,
static data) to be bundled with the app
Anatomy of a Xamarin.Mac application
Application Delegate
Called with application events such as
FinishedLaunching or OpenFiles
Info.plist
Application metadata, used by Mac OS
(app name, version, publisher, etc.)
Resources Folder
Place any resources (images, icons,
static data) to be bundled with the app
Anatomy of a Xamarin.Mac application
Application Delegate
Called with application events such as
FinishedLaunching or OpenFiles
Info.plist
Application metadata, used by Mac OS
(app name, version, publisher, etc.)
Application Main Menu
Interface definition pre-populated with
many common defaults
Resources Folder
Place any resources (images, icons,
static data) to be bundled with the app
Anatomy of a Xamarin.Mac application
Application Delegate
Called with application events such as
FinishedLaunching or OpenFiles
Info.plist
Application metadata, used by Mac OS
(app name, version, publisher, etc.)
Application Main Menu
Interface definition pre-populated with
many common defaults
Main Window User Interface
The primary window definition
editable in the Xcode UI Builder
Resources Folder
Place any resources (images, icons,
static data) to be bundled with the app
Anatomy of a Xamarin.Mac application
Application Delegate
Called with application events such as
FinishedLaunching or OpenFiles
Info.plist
Application metadata, used by Mac OS
(app name, version, publisher, etc.)
Application Main Menu
Interface definition pre-populated with
many common defaults
Main Window User Interface
The primary window definition
editable in the Xcode UI Builder
Main Window Implementation
Class for implementing the features of
your Main Window
Resources Folder
Place any resources (images, icons,
static data) to be bundled with the app
First Run
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
Building out our NSWindow
public	
  override	
  void	
  WindowControllerDidLoadNib	
  (NSWindowController	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  windowController)
{
	
  	
  	
  	
  base.WindowControllerDidLoadNib	
  (windowController);
	
  	
  	
  	
  var	
  button	
  =	
  new	
  NSButton	
  (new	
  RectangleF	
  (10,	
  10,	
  200,	
  32))	
  {
	
  	
  	
  	
  	
  	
  	
  	
  Title	
  =	
  "Hello	
  Mac"
	
  	
  	
  	
  	
  	
  	
  	
  BezelStyle	
  =	
  NSBezelStyle.Rounded
	
  	
  	
  	
  };
	
  	
  	
  	
  
	
  	
  	
  	
  button.Activated	
  +=	
  (sender,	
  e)	
  =>
	
  	
  	
  	
  	
  	
  	
  	
  new	
  NSAlert	
  {	
  MessageText	
  =	
  "You	
  clicked	
  me!"	
  }
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  .BeginSheet	
  (windowController.Window);
	
  	
  	
  	
  
	
  	
  	
  	
  windowController.Window.ContentView.AddSubview	
  (button);
}
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
Building out our NSWindow
public	
  override	
  void	
  WindowControllerDidLoadNib	
  (NSWindowController	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  windowController)
{
	
  	
  	
  	
  base.WindowControllerDidLoadNib	
  (windowController);
	
  	
  	
  	
  var	
  button	
  =	
  new	
  NSButton	
  (new	
  RectangleF	
  (10,	
  10,	
  200,	
  32))	
  {
	
  	
  	
  	
  	
  	
  	
  	
  Title	
  =	
  "Hello	
  Mac"
	
  	
  	
  	
  	
  	
  	
  	
  BezelStyle	
  =	
  NSBezelStyle.Rounded
	
  	
  	
  	
  };
	
  	
  	
  	
  
	
  	
  	
  	
  button.Activated	
  +=	
  (sender,	
  e)	
  =>
	
  	
  	
  	
  	
  	
  	
  	
  new	
  NSAlert	
  {	
  MessageText	
  =	
  "You	
  clicked	
  me!"	
  }
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  .BeginSheet	
  (windowController.Window);
	
  	
  	
  	
  
	
  	
  	
  	
  windowController.Window.ContentView.AddSubview	
  (button);
}
Call the base class’ version
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
Building out our NSWindow
public	
  override	
  void	
  WindowControllerDidLoadNib	
  (NSWindowController	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  windowController)
{
	
  	
  	
  	
  base.WindowControllerDidLoadNib	
  (windowController);
	
  	
  	
  	
  var	
  button	
  =	
  new	
  NSButton	
  (new	
  RectangleF	
  (10,	
  10,	
  200,	
  32))	
  {
	
  	
  	
  	
  	
  	
  	
  	
  Title	
  =	
  "Hello	
  Mac"
	
  	
  	
  	
  	
  	
  	
  	
  BezelStyle	
  =	
  NSBezelStyle.Rounded
	
  	
  	
  	
  };
	
  	
  	
  	
  
	
  	
  	
  	
  button.Activated	
  +=	
  (sender,	
  e)	
  =>
	
  	
  	
  	
  	
  	
  	
  	
  new	
  NSAlert	
  {	
  MessageText	
  =	
  "You	
  clicked	
  me!"	
  }
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  .BeginSheet	
  (windowController.Window);
	
  	
  	
  	
  
	
  	
  	
  	
  windowController.Window.ContentView.AddSubview	
  (button);
}
Call the base class’ version
Allocate and
configure a button
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
Building out our NSWindow
public	
  override	
  void	
  WindowControllerDidLoadNib	
  (NSWindowController	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  windowController)
{
	
  	
  	
  	
  base.WindowControllerDidLoadNib	
  (windowController);
	
  	
  	
  	
  var	
  button	
  =	
  new	
  NSButton	
  (new	
  RectangleF	
  (10,	
  10,	
  200,	
  32))	
  {
	
  	
  	
  	
  	
  	
  	
  	
  Title	
  =	
  "Hello	
  Mac"
	
  	
  	
  	
  	
  	
  	
  	
  BezelStyle	
  =	
  NSBezelStyle.Rounded
	
  	
  	
  	
  };
	
  	
  	
  	
  
	
  	
  	
  	
  button.Activated	
  +=	
  (sender,	
  e)	
  =>
	
  	
  	
  	
  	
  	
  	
  	
  new	
  NSAlert	
  {	
  MessageText	
  =	
  "You	
  clicked	
  me!"	
  }
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  .BeginSheet	
  (windowController.Window);
	
  	
  	
  	
  
	
  	
  	
  	
  windowController.Window.ContentView.AddSubview	
  (button);
}
Call the base class’ version
Allocate and
configure a button
Connect a lambda
to run when
activated (clicked)
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
Building out our NSWindow
public	
  override	
  void	
  WindowControllerDidLoadNib	
  (NSWindowController	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  windowController)
{
	
  	
  	
  	
  base.WindowControllerDidLoadNib	
  (windowController);
	
  	
  	
  	
  var	
  button	
  =	
  new	
  NSButton	
  (new	
  RectangleF	
  (10,	
  10,	
  200,	
  32))	
  {
	
  	
  	
  	
  	
  	
  	
  	
  Title	
  =	
  "Hello	
  Mac"
	
  	
  	
  	
  	
  	
  	
  	
  BezelStyle	
  =	
  NSBezelStyle.Rounded
	
  	
  	
  	
  };
	
  	
  	
  	
  
	
  	
  	
  	
  button.Activated	
  +=	
  (sender,	
  e)	
  =>
	
  	
  	
  	
  	
  	
  	
  	
  new	
  NSAlert	
  {	
  MessageText	
  =	
  "You	
  clicked	
  me!"	
  }
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  .BeginSheet	
  (windowController.Window);
	
  	
  	
  	
  
	
  	
  	
  	
  windowController.Window.ContentView.AddSubview	
  (button);
}
Call the base class’ version
Allocate and
configure a button
Connect a lambda
to run when
activated (clicked)
Add the button to the
document window
Hello Mac!
Hello Mac!
Hello Mac!
Designing the UI: Xcode Interface Builder
Double click .xib
files to open in
Xcode
Designing the UI: Xcode Interface Builder
Designing the UI: Xcode Interface Builder
Inspectors
Applies to the selected control:
• Properties
• Sizing
• Connections
Designing the UI: Xcode Interface Builder
Inspectors
Applies to the selected control:
• Properties
• Sizing
• Connections
Object Library
Drag controls to
your window
Connecting the UI
• UI built in Interface Builder connects to code in two ways
Actions
Outlets
Connecting the UI: Actions
• Methods defined in C#; invoked directly by controls
• Partial methods and always have the same signature
Connecting the UI: Actions
• Methods defined in C#; invoked directly by controls
• Partial methods and always have the same signature
-­‐	
  (IBAction)IncreaseButtonActivated:(id)sender;
partial	
  void	
  IncreaseButtonActivated	
  (NSObject	
  sender);
Objective-C
C#
Connecting the UI: Outlets
• Surface controls from Interface Builder to C# properties
• The property type is that of the connected control
Connecting the UI: Outlets
• Surface controls from Interface Builder to C# properties
• The property type is that of the connected control
@property	
  (assign)	
  IBOutlet	
  NSButton	
  *IncreaseButton;
[Outlet]	
  NSButton	
  IncreaseButton	
  {	
  get;	
  set;	
  }
Objective-C
C#
Connecting the UI
Switch to the
Assistant editor
(aka Butler mode)
Connecting the UI
Switch to the
Assistant editor
(aka Butler mode)
Connecting the UI
Control-Drag from the selected control into the @interface	
  
inside the header file to create an outlet or action
Connecting the UI
Control-Drag from the selected control into the @interface	
  
inside the header file to create an outlet or action
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
Connecting the UI
@interface	
  MyDocument	
  :	
  NSDocument	
  {
	
  	
  	
  	
  NSTextField	
  *CounterLabel;
}
@property	
  (assign)	
  IBOutlet	
  NSTextField	
  *CounterLabel;
-­‐	
  (IBAction)IncreaseButtonActivated:(id)sender;
@end
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
Behind the Scenes in Xamarin.Mac
[Register	
  ("MyDocument")]
partial	
  class	
  MyDocument
{
	
  	
  	
  	
  [Outlet]
	
  	
  	
  	
  TextField	
  CounterLabel	
  {	
  get;	
  set;	
  }
	
  	
  	
  	
  [Action	
  ("IncreaseButtonActivated:")]
	
  	
  	
  	
  partial	
  void	
  IncreaseButtonActivated	
  (NSObject	
  sender);
}
Events and Callbacks
• In C#, events are a very common communication pattern:
var	
  window	
  =	
  new	
  NSWindow	
  ();
window.DidBecomeKey	
  +=	
  HandleDidBecomeKey;
window.DidResignKey	
  +=	
  HandleDidResignKey;
NSWindow
HandleDidBecomeKey
HandleDidResignKey
Events and Callbacks
• With Apple’s pattern however, objects send interesting events,
or messages, to a delegate:
new	
  NSWindow	
  {
	
  	
  	
  	
  Delegate	
  =	
  new	
  MyWindowDelegate	
  ()
};
NSWindow
MyWindowDelegate
class	
  MyWindowDelegate	
  :	
  NSWindowDelegate
{
	
  	
  	
  	
  override	
  void	
  DidBecomeKey	
  (...)
	
  	
  	
  	
  override	
  void	
  DidResignKey	
  (...)
}
Events and Callbacks
Events and Callbacks
• Xamarin.Mac supports both models
You are free to choose on a per-instance basis
Events and Callbacks
• Xamarin.Mac supports both models
You are free to choose on a per-instance basis
• The Apple Delegate pattern maps to C# events
Internally we create the Delegate class and map it to
subscribed event handlers
Events and Callbacks
• Xamarin.Mac supports both models
You are free to choose on a per-instance basis
• The Apple Delegate pattern maps to C# events
Internally we create the Delegate class and map it to
subscribed event handlers
• One pattern replaces the other
AppKit
AppKit
• Pervasive use of Model-View-Controller
All logic goes in the controller class
Unless writing a custom control (NSView)
Controller orchestrates the work of views
AppKit
• Pervasive use of Model-View-Controller
All logic goes in the controller class
Unless writing a custom control (NSView)
Controller orchestrates the work of views
• Goes well beyond the basics of UI
High-level NSDocument does the heavy li!ing
Full menus, saving, loading, window restoration, multi-
window support: all for free
NSDocument
override	
  void	
  WindowControllerDidLoadNib	
  (NSWindowController	
  windowController)
NSDocument
override	
  void	
  WindowControllerDidLoadNib	
  (NSWindowController	
  windowController)
override	
  bool	
  ReadFromUrl	
  (NSUrl	
  url,
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  string	
  typeName,
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  out	
  NSError	
  outError)
NSDocument
override	
  void	
  WindowControllerDidLoadNib	
  (NSWindowController	
  windowController)
override	
  bool	
  ReadFromUrl	
  (NSUrl	
  url,
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  string	
  typeName,
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  out	
  NSError	
  outError)
override	
  bool	
  SaveToUrl	
  (NSUrl	
  url,
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  string	
  typeName,
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  NSSaveOperationType	
  saveOperation,
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  out	
  NSError	
  outError)
NSDocument
Structure of the UI
• NSWindow
Top-level window
• NSWindow.ContentView
An NSView that contains controls for the application
• NSView is a class from which most controls derive
Can contain any number of children (NSView.Subviews)
Structure of the UI
• Some controls have many faces and roles
NSTextField implements both “label” and “entry” roles
Instead of being discrete controls, properties are modified
to fit the desired role
Xcode provides pre-set properties for controls
NSView: a powerful container
• Can contain (and perform layout of) subviews
• Handles events
• Paints itself
• Can be backed by a CALayer
CALayers are GPU accelerated
• Its properties can be animated
SHIP IT
Ship Your App: by yourself
• The app is unrestricted and has full access to the system
• Shipped as a “bundle”
Typically a zipped up .app folder
Fully self-contained
Xamarin Studio generates this by default
Gatekeeper
• Apple recently turned on Gatekeeper which prevents unsigned
apps from running by default
☹
Gatekeeper
• Apple recently turned on Gatekeeper which prevents unsigned
apps from running by default
☹
BADText
Gatekeeper
• Code sign your app for the best user experience
• Xamarin Studio supports this for Xamarin.Mac
☺
Gatekeeper
• Code sign your app for the best user experience
• Xamarin Studio supports this for Xamarin.Mac
Project Options → Mac OS X Packaging
☺
Ship Your App: in the App Store
Ship Your App: in the App Store
• Must apply for the Mac developer program through Apple
• Must sign app
• App is submitted for review
Ship Your App: in the App Store
• Must apply for the Mac developer program through Apple
• Must sign app
• App is submitted for review
• The app will be sandboxed
Ship Your App: in the App Store
• Must apply for the Mac developer program through Apple
• Must sign app
• App is submitted for review
• The app will be sandboxed
• Xamarin Studio signs, packages, and submits the app
• Shipping to the App Store is the best end-user experience
Mac OS X Sandbox
• Kernel-enforced sandbox
• Limits access to the system
Limitations on filesystem access
Use of special open/save panels
Limits access to some services and APIs
Mac OS X Sandbox
• Edit Sandbox entitlements in Info.plist in Xamarin Studio
?
Xamarin makes for Happy Devices
Learn more:
xamarin.com/mac
docs.xamarin.com/mac
github.com/xamarin/mac-samples
Aaron Bockover
@abock
abock@xamarin.com

Weitere ähnliche Inhalte

Ähnlich wie Writing native Mac apps in C# with Xamarin.Mac - Aaron Bockover

20150728 100분만에 배우는 windows 10 앱 개발
20150728 100분만에 배우는 windows 10 앱 개발20150728 100분만에 배우는 windows 10 앱 개발
20150728 100분만에 배우는 windows 10 앱 개발영욱 김
 
20150812 4시간만에 따라해보는 windows 10 앱 개발
20150812  4시간만에 따라해보는 windows 10 앱 개발20150812  4시간만에 따라해보는 windows 10 앱 개발
20150812 4시간만에 따라해보는 windows 10 앱 개발영욱 김
 
WPF - the future of GUI is near
WPF - the future of GUI is nearWPF - the future of GUI is near
WPF - the future of GUI is nearBartlomiej Filipek
 
Cross platform mobile development with visual studio and xamarin
Cross platform mobile development with visual studio and xamarinCross platform mobile development with visual studio and xamarin
Cross platform mobile development with visual studio and xamarinIbon Landa
 
Titanium Appcelerator - Beginners
Titanium Appcelerator - BeginnersTitanium Appcelerator - Beginners
Titanium Appcelerator - BeginnersAmbarish Hazarnis
 
360 Flex Atlanta
360 Flex Atlanta360 Flex Atlanta
360 Flex Atlantartretola
 
Android tutorial
Android tutorialAndroid tutorial
Android tutorialAbid Khan
 
APAC Webinar: Say Hello To Xamarin.Forms
APAC Webinar: Say Hello To Xamarin.FormsAPAC Webinar: Say Hello To Xamarin.Forms
APAC Webinar: Say Hello To Xamarin.FormsNish Anil
 
Xamarin.iOS introduction
Xamarin.iOS introductionXamarin.iOS introduction
Xamarin.iOS introductionGuido Magrin
 
제 4회 DGMIT R&D 컨퍼런스 : Making a JavaScript based Application in Mac OS X
제 4회 DGMIT R&D 컨퍼런스 : Making a JavaScript based Application in Mac OS X제 4회 DGMIT R&D 컨퍼런스 : Making a JavaScript based Application in Mac OS X
제 4회 DGMIT R&D 컨퍼런스 : Making a JavaScript based Application in Mac OS Xdgmit2009
 
Tips & tricks for sharing C# code on iOS, Android and Windows Phone by Jaime ...
Tips & tricks for sharing C# code on iOS, Android and Windows Phone by Jaime ...Tips & tricks for sharing C# code on iOS, Android and Windows Phone by Jaime ...
Tips & tricks for sharing C# code on iOS, Android and Windows Phone by Jaime ....NET Conf UY
 
The Ring programming language version 1.5.1 book - Part 67 of 180
The Ring programming language version 1.5.1 book - Part 67 of 180The Ring programming language version 1.5.1 book - Part 67 of 180
The Ring programming language version 1.5.1 book - Part 67 of 180Mahmoud Samir Fayed
 
Introduction to Palm's Mojo SDK
Introduction to Palm's Mojo SDKIntroduction to Palm's Mojo SDK
Introduction to Palm's Mojo SDKBrendan Lim
 
Going Desktop with Electron
Going Desktop with ElectronGoing Desktop with Electron
Going Desktop with ElectronLeo Lindhorst
 
06 win forms
06 win forms06 win forms
06 win formsmrjw
 
OpenWhisk Lab
OpenWhisk Lab OpenWhisk Lab
OpenWhisk Lab Dev_Events
 

Ähnlich wie Writing native Mac apps in C# with Xamarin.Mac - Aaron Bockover (20)

20150728 100분만에 배우는 windows 10 앱 개발
20150728 100분만에 배우는 windows 10 앱 개발20150728 100분만에 배우는 windows 10 앱 개발
20150728 100분만에 배우는 windows 10 앱 개발
 
20150812 4시간만에 따라해보는 windows 10 앱 개발
20150812  4시간만에 따라해보는 windows 10 앱 개발20150812  4시간만에 따라해보는 windows 10 앱 개발
20150812 4시간만에 따라해보는 windows 10 앱 개발
 
WPF - the future of GUI is near
WPF - the future of GUI is nearWPF - the future of GUI is near
WPF - the future of GUI is near
 
JavaScript on the Desktop
JavaScript on the DesktopJavaScript on the Desktop
JavaScript on the Desktop
 
Cross platform mobile development with visual studio and xamarin
Cross platform mobile development with visual studio and xamarinCross platform mobile development with visual studio and xamarin
Cross platform mobile development with visual studio and xamarin
 
Titanium Appcelerator - Beginners
Titanium Appcelerator - BeginnersTitanium Appcelerator - Beginners
Titanium Appcelerator - Beginners
 
360 Flex Atlanta
360 Flex Atlanta360 Flex Atlanta
360 Flex Atlanta
 
Android
AndroidAndroid
Android
 
Android tutorial
Android tutorialAndroid tutorial
Android tutorial
 
unit 4.docx
unit 4.docxunit 4.docx
unit 4.docx
 
APAC Webinar: Say Hello To Xamarin.Forms
APAC Webinar: Say Hello To Xamarin.FormsAPAC Webinar: Say Hello To Xamarin.Forms
APAC Webinar: Say Hello To Xamarin.Forms
 
Xamarin.iOS introduction
Xamarin.iOS introductionXamarin.iOS introduction
Xamarin.iOS introduction
 
제 4회 DGMIT R&D 컨퍼런스 : Making a JavaScript based Application in Mac OS X
제 4회 DGMIT R&D 컨퍼런스 : Making a JavaScript based Application in Mac OS X제 4회 DGMIT R&D 컨퍼런스 : Making a JavaScript based Application in Mac OS X
제 4회 DGMIT R&D 컨퍼런스 : Making a JavaScript based Application in Mac OS X
 
Tips & tricks for sharing C# code on iOS, Android and Windows Phone by Jaime ...
Tips & tricks for sharing C# code on iOS, Android and Windows Phone by Jaime ...Tips & tricks for sharing C# code on iOS, Android and Windows Phone by Jaime ...
Tips & tricks for sharing C# code on iOS, Android and Windows Phone by Jaime ...
 
Hello world ios v1
Hello world ios v1Hello world ios v1
Hello world ios v1
 
The Ring programming language version 1.5.1 book - Part 67 of 180
The Ring programming language version 1.5.1 book - Part 67 of 180The Ring programming language version 1.5.1 book - Part 67 of 180
The Ring programming language version 1.5.1 book - Part 67 of 180
 
Introduction to Palm's Mojo SDK
Introduction to Palm's Mojo SDKIntroduction to Palm's Mojo SDK
Introduction to Palm's Mojo SDK
 
Going Desktop with Electron
Going Desktop with ElectronGoing Desktop with Electron
Going Desktop with Electron
 
06 win forms
06 win forms06 win forms
06 win forms
 
OpenWhisk Lab
OpenWhisk Lab OpenWhisk Lab
OpenWhisk Lab
 

Mehr von Xamarin

Xamarin University Presents: Building Your First Intelligent App with Xamarin...
Xamarin University Presents: Building Your First Intelligent App with Xamarin...Xamarin University Presents: Building Your First Intelligent App with Xamarin...
Xamarin University Presents: Building Your First Intelligent App with Xamarin...Xamarin
 
Xamarin University Presents: Ship Better Apps with Visual Studio App Center
Xamarin University Presents: Ship Better Apps with Visual Studio App CenterXamarin University Presents: Ship Better Apps with Visual Studio App Center
Xamarin University Presents: Ship Better Apps with Visual Studio App CenterXamarin
 
Get the Most Out of iOS 11 with Visual Studio Tools for Xamarin
Get the Most Out of iOS 11 with Visual Studio Tools for XamarinGet the Most Out of iOS 11 with Visual Studio Tools for Xamarin
Get the Most Out of iOS 11 with Visual Studio Tools for XamarinXamarin
 
Get the Most out of Android 8 Oreo with Visual Studio Tools for Xamarin
Get the Most out of Android 8 Oreo with Visual Studio Tools for XamarinGet the Most out of Android 8 Oreo with Visual Studio Tools for Xamarin
Get the Most out of Android 8 Oreo with Visual Studio Tools for XamarinXamarin
 
Creative Hacking: Delivering React Native App A/B Testing Using CodePush
Creative Hacking: Delivering React Native App A/B Testing Using CodePushCreative Hacking: Delivering React Native App A/B Testing Using CodePush
Creative Hacking: Delivering React Native App A/B Testing Using CodePushXamarin
 
Build Better Games with Unity and Microsoft Azure
Build Better Games with Unity and Microsoft AzureBuild Better Games with Unity and Microsoft Azure
Build Better Games with Unity and Microsoft AzureXamarin
 
Exploring UrhoSharp 3D with Xamarin Workbooks
Exploring UrhoSharp 3D with Xamarin WorkbooksExploring UrhoSharp 3D with Xamarin Workbooks
Exploring UrhoSharp 3D with Xamarin WorkbooksXamarin
 
Desktop Developer’s Guide to Mobile with Visual Studio Tools for Xamarin
Desktop Developer’s Guide to Mobile with Visual Studio Tools for XamarinDesktop Developer’s Guide to Mobile with Visual Studio Tools for Xamarin
Desktop Developer’s Guide to Mobile with Visual Studio Tools for XamarinXamarin
 
Developer’s Intro to Azure Machine Learning
Developer’s Intro to Azure Machine LearningDeveloper’s Intro to Azure Machine Learning
Developer’s Intro to Azure Machine LearningXamarin
 
Customizing Xamarin.Forms UI
Customizing Xamarin.Forms UICustomizing Xamarin.Forms UI
Customizing Xamarin.Forms UIXamarin
 
Session 4 - Xamarin Partner Program, Events and Resources
Session 4 - Xamarin Partner Program, Events and ResourcesSession 4 - Xamarin Partner Program, Events and Resources
Session 4 - Xamarin Partner Program, Events and ResourcesXamarin
 
Session 3 - Driving Mobile Growth and Profitability
Session 3 - Driving Mobile Growth and ProfitabilitySession 3 - Driving Mobile Growth and Profitability
Session 3 - Driving Mobile Growth and ProfitabilityXamarin
 
Session 2 - Emerging Technologies in your Mobile Practice
Session 2 - Emerging Technologies in your Mobile PracticeSession 2 - Emerging Technologies in your Mobile Practice
Session 2 - Emerging Technologies in your Mobile PracticeXamarin
 
Session 1 - Transformative Opportunities in Mobile and Cloud
Session 1 - Transformative Opportunities in Mobile and Cloud Session 1 - Transformative Opportunities in Mobile and Cloud
Session 1 - Transformative Opportunities in Mobile and Cloud Xamarin
 
SkiaSharp Graphics for Xamarin.Forms
SkiaSharp Graphics for Xamarin.FormsSkiaSharp Graphics for Xamarin.Forms
SkiaSharp Graphics for Xamarin.FormsXamarin
 
Building Games for iOS, macOS, and tvOS with Visual Studio and Azure
Building Games for iOS, macOS, and tvOS with Visual Studio and AzureBuilding Games for iOS, macOS, and tvOS with Visual Studio and Azure
Building Games for iOS, macOS, and tvOS with Visual Studio and AzureXamarin
 
Intro to Xamarin.Forms for Visual Studio 2017
Intro to Xamarin.Forms for Visual Studio 2017Intro to Xamarin.Forms for Visual Studio 2017
Intro to Xamarin.Forms for Visual Studio 2017Xamarin
 
Connected Mobile Apps with Microsoft Azure
Connected Mobile Apps with Microsoft AzureConnected Mobile Apps with Microsoft Azure
Connected Mobile Apps with Microsoft AzureXamarin
 
Introduction to Xamarin for Visual Studio 2017
Introduction to Xamarin for Visual Studio 2017Introduction to Xamarin for Visual Studio 2017
Introduction to Xamarin for Visual Studio 2017Xamarin
 
Building Your First iOS App with Xamarin for Visual Studio
Building Your First iOS App with Xamarin for Visual StudioBuilding Your First iOS App with Xamarin for Visual Studio
Building Your First iOS App with Xamarin for Visual StudioXamarin
 

Mehr von Xamarin (20)

Xamarin University Presents: Building Your First Intelligent App with Xamarin...
Xamarin University Presents: Building Your First Intelligent App with Xamarin...Xamarin University Presents: Building Your First Intelligent App with Xamarin...
Xamarin University Presents: Building Your First Intelligent App with Xamarin...
 
Xamarin University Presents: Ship Better Apps with Visual Studio App Center
Xamarin University Presents: Ship Better Apps with Visual Studio App CenterXamarin University Presents: Ship Better Apps with Visual Studio App Center
Xamarin University Presents: Ship Better Apps with Visual Studio App Center
 
Get the Most Out of iOS 11 with Visual Studio Tools for Xamarin
Get the Most Out of iOS 11 with Visual Studio Tools for XamarinGet the Most Out of iOS 11 with Visual Studio Tools for Xamarin
Get the Most Out of iOS 11 with Visual Studio Tools for Xamarin
 
Get the Most out of Android 8 Oreo with Visual Studio Tools for Xamarin
Get the Most out of Android 8 Oreo with Visual Studio Tools for XamarinGet the Most out of Android 8 Oreo with Visual Studio Tools for Xamarin
Get the Most out of Android 8 Oreo with Visual Studio Tools for Xamarin
 
Creative Hacking: Delivering React Native App A/B Testing Using CodePush
Creative Hacking: Delivering React Native App A/B Testing Using CodePushCreative Hacking: Delivering React Native App A/B Testing Using CodePush
Creative Hacking: Delivering React Native App A/B Testing Using CodePush
 
Build Better Games with Unity and Microsoft Azure
Build Better Games with Unity and Microsoft AzureBuild Better Games with Unity and Microsoft Azure
Build Better Games with Unity and Microsoft Azure
 
Exploring UrhoSharp 3D with Xamarin Workbooks
Exploring UrhoSharp 3D with Xamarin WorkbooksExploring UrhoSharp 3D with Xamarin Workbooks
Exploring UrhoSharp 3D with Xamarin Workbooks
 
Desktop Developer’s Guide to Mobile with Visual Studio Tools for Xamarin
Desktop Developer’s Guide to Mobile with Visual Studio Tools for XamarinDesktop Developer’s Guide to Mobile with Visual Studio Tools for Xamarin
Desktop Developer’s Guide to Mobile with Visual Studio Tools for Xamarin
 
Developer’s Intro to Azure Machine Learning
Developer’s Intro to Azure Machine LearningDeveloper’s Intro to Azure Machine Learning
Developer’s Intro to Azure Machine Learning
 
Customizing Xamarin.Forms UI
Customizing Xamarin.Forms UICustomizing Xamarin.Forms UI
Customizing Xamarin.Forms UI
 
Session 4 - Xamarin Partner Program, Events and Resources
Session 4 - Xamarin Partner Program, Events and ResourcesSession 4 - Xamarin Partner Program, Events and Resources
Session 4 - Xamarin Partner Program, Events and Resources
 
Session 3 - Driving Mobile Growth and Profitability
Session 3 - Driving Mobile Growth and ProfitabilitySession 3 - Driving Mobile Growth and Profitability
Session 3 - Driving Mobile Growth and Profitability
 
Session 2 - Emerging Technologies in your Mobile Practice
Session 2 - Emerging Technologies in your Mobile PracticeSession 2 - Emerging Technologies in your Mobile Practice
Session 2 - Emerging Technologies in your Mobile Practice
 
Session 1 - Transformative Opportunities in Mobile and Cloud
Session 1 - Transformative Opportunities in Mobile and Cloud Session 1 - Transformative Opportunities in Mobile and Cloud
Session 1 - Transformative Opportunities in Mobile and Cloud
 
SkiaSharp Graphics for Xamarin.Forms
SkiaSharp Graphics for Xamarin.FormsSkiaSharp Graphics for Xamarin.Forms
SkiaSharp Graphics for Xamarin.Forms
 
Building Games for iOS, macOS, and tvOS with Visual Studio and Azure
Building Games for iOS, macOS, and tvOS with Visual Studio and AzureBuilding Games for iOS, macOS, and tvOS with Visual Studio and Azure
Building Games for iOS, macOS, and tvOS with Visual Studio and Azure
 
Intro to Xamarin.Forms for Visual Studio 2017
Intro to Xamarin.Forms for Visual Studio 2017Intro to Xamarin.Forms for Visual Studio 2017
Intro to Xamarin.Forms for Visual Studio 2017
 
Connected Mobile Apps with Microsoft Azure
Connected Mobile Apps with Microsoft AzureConnected Mobile Apps with Microsoft Azure
Connected Mobile Apps with Microsoft Azure
 
Introduction to Xamarin for Visual Studio 2017
Introduction to Xamarin for Visual Studio 2017Introduction to Xamarin for Visual Studio 2017
Introduction to Xamarin for Visual Studio 2017
 
Building Your First iOS App with Xamarin for Visual Studio
Building Your First iOS App with Xamarin for Visual StudioBuilding Your First iOS App with Xamarin for Visual Studio
Building Your First iOS App with Xamarin for Visual Studio
 

Kürzlich hochgeladen

Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 3652toLead Limited
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Drew Madelung
 
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersEnhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersThousandEyes
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘RTylerCroy
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Allon Mureinik
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Servicegiselly40
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Paola De la Torre
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Miguel Araújo
 
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...gurkirankumar98700
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking MenDelhi Call girls
 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...HostedbyConfluent
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesSinan KOZAK
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsEnterprise Knowledge
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdfhans926745
 

Kürzlich hochgeladen (20)

Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersEnhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen Frames
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 

Writing native Mac apps in C# with Xamarin.Mac - Aaron Bockover

  • 3. MacOSX The world’s most advanced desktop operating system C#
  • 4. It’s all about sharing code Shared C# Code Xamarin.Mobile Business Logic Cloud Access Database Access DesktopDesktop MobileMobileMobile Windows iOS Windows Phone Android
  • 5. It’s all about sharing code Shared C# Code Xamarin.Mobile Business Logic Cloud Access Database Access DesktopDesktop MobileMobileMobile Windows iOS Windows Phone AndroidMac
  • 6. TouchDraw runs on iPad, Android, and Mac, achieving over 70% code reuse across the platforms. 39% 61% TouchDraw for iPad 24% 76% TouchDraw for Mac 28% 72% TouchDraw for Android Shared Code Platform Specific
  • 7. Xamarin.Mac at a glance • Write native Mac applications in C# • Access Mac OS X APIs for rich integration • Leverage the full power of C# and .NET • Integrated with the Xamarin experience • Deploy directly to the Mac AppStore
  • 8. Xamarin.Mac at a glance Xamarin.Mac Frameworks Xamarin Tools and SDK • Binder • Bundler • Linker • Packager Mono Runtime .NET Base Class Libraries System Libraries Darwin OS Cocoa Frameworks Xcode (UI designer) Xamarin Studio IDE
  • 9. Xamarin.Mac at a glance Xamarin.Mac Frameworks Xamarin Tools and SDK • Binder • Bundler • Linker • Packager Mono Runtime .NET Base Class Libraries System Libraries Darwin OS Cocoa Frameworks Xcode (UI designer) Xamarin Studio IDE
  • 10. Xamarin.Mac Frameworks GraphicsGraphics CoreGraphics ImageKit CoreImage ImageIO CoreText OpenGL CoreVideo PDFKit User InterfaceUser Interface AppKit QuickLook CoreAnima?on SceneKit QCComposer WebKit Audio and VideoAudio and Video AVFounda?on CoreMidi AudioToolbox CoreMedia AudioUnit OpenAL System ServicesSystem Services AddressBook CoreWLAN Bluetooth Scrip?ngBridge CoreLoca?on StoreKit CoreServices InfrastructureInfrastructure CoreData Founda?on CoreFounda?on ObjCRun?me Darwin Security
  • 11. Many are shared with Xamarin.iOS GraphicsGraphics CoreGraphics ImageKit CoreImage ImageIO CoreText OpenGL CoreVideo PDFKit User InterfaceUser Interface AppKit QuickLook CoreAnima?on SceneKit QCComposer WebKit Audio and VideoAudio and Video AVFounda?on CoreMidi AudioToolbox CoreMedia AudioUnit OpenAL System ServicesSystem Services AddressBook CoreWLAN Bluetooth Scrip?ngBridge CoreLoca?on StoreKit CoreServices InfrastructureInfrastructure CoreData Founda?on CoreFounda?on ObjCRun?me Darwin Security
  • 12. The Basics GraphicsGraphics CoreGraphics ImageKit CoreImage ImageIO CoreText OpenGL CoreVideo PDFKit User InterfaceUser Interface AppKit QuickLook CoreAnima?on SceneKit QCComposer WebKit Audio and VideoAudio and Video AVFounda?on CoreMidi AudioToolbox CoreMedia AudioUnit OpenAL System ServicesSystem Services AddressBook CoreWLAN Bluetooth Scrip?ngBridge CoreLoca?on StoreKit CoreServices InfrastructureInfrastructure CoreData Founda5on CoreFounda?on ObjCRun?me Darwin Security
  • 14. How does Xamarin.Mac work? • OS X APIs are projected into C# 1:1 mapping for full platform coverage
  • 15. How does Xamarin.Mac work? • OS X APIs are projected into C# 1:1 mapping for full platform coverage • 80% are Objective-C Full object system is mapped Subclassing and overriding supported
  • 16. How does Xamarin.Mac work? • OS X APIs are projected into C# 1:1 mapping for full platform coverage • 80% are Objective-C Full object system is mapped Subclassing and overriding supported • 20% are C Exposed as C# structs/classes/methods No support for subclassing or overriding
  • 17. How does Xamarin.Mac work? • OS X APIs are projected into C# 1:1 mapping for full platform coverage Check out “Binding Objective-C Libraries” for a deep dive at 1:30! • 80% are Objective-C Full object system is mapped Subclassing and overriding supported • 20% are C Exposed as C# structs/classes/methods No support for subclassing or overriding
  • 19.
  • 20. Anatomy of a Xamarin.Mac application
  • 21. Anatomy of a Xamarin.Mac application Info.plist Application metadata, used by Mac OS (app name, version, publisher, etc.)
  • 22. Anatomy of a Xamarin.Mac application Info.plist Application metadata, used by Mac OS (app name, version, publisher, etc.) Resources Folder Place any resources (images, icons, static data) to be bundled with the app
  • 23. Anatomy of a Xamarin.Mac application Application Delegate Called with application events such as FinishedLaunching or OpenFiles Info.plist Application metadata, used by Mac OS (app name, version, publisher, etc.) Resources Folder Place any resources (images, icons, static data) to be bundled with the app
  • 24. Anatomy of a Xamarin.Mac application Application Delegate Called with application events such as FinishedLaunching or OpenFiles Info.plist Application metadata, used by Mac OS (app name, version, publisher, etc.) Application Main Menu Interface definition pre-populated with many common defaults Resources Folder Place any resources (images, icons, static data) to be bundled with the app
  • 25. Anatomy of a Xamarin.Mac application Application Delegate Called with application events such as FinishedLaunching or OpenFiles Info.plist Application metadata, used by Mac OS (app name, version, publisher, etc.) Application Main Menu Interface definition pre-populated with many common defaults Main Window User Interface The primary window definition editable in the Xcode UI Builder Resources Folder Place any resources (images, icons, static data) to be bundled with the app
  • 26. Anatomy of a Xamarin.Mac application Application Delegate Called with application events such as FinishedLaunching or OpenFiles Info.plist Application metadata, used by Mac OS (app name, version, publisher, etc.) Application Main Menu Interface definition pre-populated with many common defaults Main Window User Interface The primary window definition editable in the Xcode UI Builder Main Window Implementation Class for implementing the features of your Main Window Resources Folder Place any resources (images, icons, static data) to be bundled with the app
  • 28. 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 Building out our NSWindow public  override  void  WindowControllerDidLoadNib  (NSWindowController                                                                                                    windowController) {        base.WindowControllerDidLoadNib  (windowController);        var  button  =  new  NSButton  (new  RectangleF  (10,  10,  200,  32))  {                Title  =  "Hello  Mac"                BezelStyle  =  NSBezelStyle.Rounded        };                button.Activated  +=  (sender,  e)  =>                new  NSAlert  {  MessageText  =  "You  clicked  me!"  }                        .BeginSheet  (windowController.Window);                windowController.Window.ContentView.AddSubview  (button); }
  • 29. 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 Building out our NSWindow public  override  void  WindowControllerDidLoadNib  (NSWindowController                                                                                                    windowController) {        base.WindowControllerDidLoadNib  (windowController);        var  button  =  new  NSButton  (new  RectangleF  (10,  10,  200,  32))  {                Title  =  "Hello  Mac"                BezelStyle  =  NSBezelStyle.Rounded        };                button.Activated  +=  (sender,  e)  =>                new  NSAlert  {  MessageText  =  "You  clicked  me!"  }                        .BeginSheet  (windowController.Window);                windowController.Window.ContentView.AddSubview  (button); } Call the base class’ version
  • 30. 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 Building out our NSWindow public  override  void  WindowControllerDidLoadNib  (NSWindowController                                                                                                    windowController) {        base.WindowControllerDidLoadNib  (windowController);        var  button  =  new  NSButton  (new  RectangleF  (10,  10,  200,  32))  {                Title  =  "Hello  Mac"                BezelStyle  =  NSBezelStyle.Rounded        };                button.Activated  +=  (sender,  e)  =>                new  NSAlert  {  MessageText  =  "You  clicked  me!"  }                        .BeginSheet  (windowController.Window);                windowController.Window.ContentView.AddSubview  (button); } Call the base class’ version Allocate and configure a button
  • 31. 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 Building out our NSWindow public  override  void  WindowControllerDidLoadNib  (NSWindowController                                                                                                    windowController) {        base.WindowControllerDidLoadNib  (windowController);        var  button  =  new  NSButton  (new  RectangleF  (10,  10,  200,  32))  {                Title  =  "Hello  Mac"                BezelStyle  =  NSBezelStyle.Rounded        };                button.Activated  +=  (sender,  e)  =>                new  NSAlert  {  MessageText  =  "You  clicked  me!"  }                        .BeginSheet  (windowController.Window);                windowController.Window.ContentView.AddSubview  (button); } Call the base class’ version Allocate and configure a button Connect a lambda to run when activated (clicked)
  • 32. 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 Building out our NSWindow public  override  void  WindowControllerDidLoadNib  (NSWindowController                                                                                                    windowController) {        base.WindowControllerDidLoadNib  (windowController);        var  button  =  new  NSButton  (new  RectangleF  (10,  10,  200,  32))  {                Title  =  "Hello  Mac"                BezelStyle  =  NSBezelStyle.Rounded        };                button.Activated  +=  (sender,  e)  =>                new  NSAlert  {  MessageText  =  "You  clicked  me!"  }                        .BeginSheet  (windowController.Window);                windowController.Window.ContentView.AddSubview  (button); } Call the base class’ version Allocate and configure a button Connect a lambda to run when activated (clicked) Add the button to the document window
  • 36. Designing the UI: Xcode Interface Builder Double click .xib files to open in Xcode
  • 37. Designing the UI: Xcode Interface Builder
  • 38. Designing the UI: Xcode Interface Builder Inspectors Applies to the selected control: • Properties • Sizing • Connections
  • 39. Designing the UI: Xcode Interface Builder Inspectors Applies to the selected control: • Properties • Sizing • Connections Object Library Drag controls to your window
  • 40. Connecting the UI • UI built in Interface Builder connects to code in two ways Actions Outlets
  • 41. Connecting the UI: Actions • Methods defined in C#; invoked directly by controls • Partial methods and always have the same signature
  • 42. Connecting the UI: Actions • Methods defined in C#; invoked directly by controls • Partial methods and always have the same signature -­‐  (IBAction)IncreaseButtonActivated:(id)sender; partial  void  IncreaseButtonActivated  (NSObject  sender); Objective-C C#
  • 43. Connecting the UI: Outlets • Surface controls from Interface Builder to C# properties • The property type is that of the connected control
  • 44. Connecting the UI: Outlets • Surface controls from Interface Builder to C# properties • The property type is that of the connected control @property  (assign)  IBOutlet  NSButton  *IncreaseButton; [Outlet]  NSButton  IncreaseButton  {  get;  set;  } Objective-C C#
  • 45. Connecting the UI Switch to the Assistant editor (aka Butler mode)
  • 46. Connecting the UI Switch to the Assistant editor (aka Butler mode)
  • 47. Connecting the UI Control-Drag from the selected control into the @interface   inside the header file to create an outlet or action
  • 48. Connecting the UI Control-Drag from the selected control into the @interface   inside the header file to create an outlet or action
  • 49. 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 Connecting the UI @interface  MyDocument  :  NSDocument  {        NSTextField  *CounterLabel; } @property  (assign)  IBOutlet  NSTextField  *CounterLabel; -­‐  (IBAction)IncreaseButtonActivated:(id)sender; @end
  • 50. 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 Behind the Scenes in Xamarin.Mac [Register  ("MyDocument")] partial  class  MyDocument {        [Outlet]        TextField  CounterLabel  {  get;  set;  }        [Action  ("IncreaseButtonActivated:")]        partial  void  IncreaseButtonActivated  (NSObject  sender); }
  • 51. Events and Callbacks • In C#, events are a very common communication pattern: var  window  =  new  NSWindow  (); window.DidBecomeKey  +=  HandleDidBecomeKey; window.DidResignKey  +=  HandleDidResignKey; NSWindow HandleDidBecomeKey HandleDidResignKey
  • 52. Events and Callbacks • With Apple’s pattern however, objects send interesting events, or messages, to a delegate: new  NSWindow  {        Delegate  =  new  MyWindowDelegate  () }; NSWindow MyWindowDelegate class  MyWindowDelegate  :  NSWindowDelegate {        override  void  DidBecomeKey  (...)        override  void  DidResignKey  (...) }
  • 54. Events and Callbacks • Xamarin.Mac supports both models You are free to choose on a per-instance basis
  • 55. Events and Callbacks • Xamarin.Mac supports both models You are free to choose on a per-instance basis • The Apple Delegate pattern maps to C# events Internally we create the Delegate class and map it to subscribed event handlers
  • 56. Events and Callbacks • Xamarin.Mac supports both models You are free to choose on a per-instance basis • The Apple Delegate pattern maps to C# events Internally we create the Delegate class and map it to subscribed event handlers • One pattern replaces the other
  • 58. AppKit • Pervasive use of Model-View-Controller All logic goes in the controller class Unless writing a custom control (NSView) Controller orchestrates the work of views
  • 59. AppKit • Pervasive use of Model-View-Controller All logic goes in the controller class Unless writing a custom control (NSView) Controller orchestrates the work of views • Goes well beyond the basics of UI High-level NSDocument does the heavy li!ing Full menus, saving, loading, window restoration, multi- window support: all for free
  • 61. override  void  WindowControllerDidLoadNib  (NSWindowController  windowController) NSDocument
  • 62. override  void  WindowControllerDidLoadNib  (NSWindowController  windowController) override  bool  ReadFromUrl  (NSUrl  url,                                                      string  typeName,                                                      out  NSError  outError) NSDocument
  • 63. override  void  WindowControllerDidLoadNib  (NSWindowController  windowController) override  bool  ReadFromUrl  (NSUrl  url,                                                      string  typeName,                                                      out  NSError  outError) override  bool  SaveToUrl  (NSUrl  url,                                                  string  typeName,                                                  NSSaveOperationType  saveOperation,                                                  out  NSError  outError) NSDocument
  • 64. Structure of the UI • NSWindow Top-level window • NSWindow.ContentView An NSView that contains controls for the application • NSView is a class from which most controls derive Can contain any number of children (NSView.Subviews)
  • 65. Structure of the UI • Some controls have many faces and roles NSTextField implements both “label” and “entry” roles Instead of being discrete controls, properties are modified to fit the desired role Xcode provides pre-set properties for controls
  • 66. NSView: a powerful container • Can contain (and perform layout of) subviews • Handles events • Paints itself • Can be backed by a CALayer CALayers are GPU accelerated • Its properties can be animated
  • 68. Ship Your App: by yourself • The app is unrestricted and has full access to the system • Shipped as a “bundle” Typically a zipped up .app folder Fully self-contained Xamarin Studio generates this by default
  • 69. Gatekeeper • Apple recently turned on Gatekeeper which prevents unsigned apps from running by default ☹
  • 70. Gatekeeper • Apple recently turned on Gatekeeper which prevents unsigned apps from running by default ☹ BADText
  • 71. Gatekeeper • Code sign your app for the best user experience • Xamarin Studio supports this for Xamarin.Mac ☺
  • 72. Gatekeeper • Code sign your app for the best user experience • Xamarin Studio supports this for Xamarin.Mac Project Options → Mac OS X Packaging ☺
  • 73. Ship Your App: in the App Store
  • 74. Ship Your App: in the App Store • Must apply for the Mac developer program through Apple • Must sign app • App is submitted for review
  • 75. Ship Your App: in the App Store • Must apply for the Mac developer program through Apple • Must sign app • App is submitted for review • The app will be sandboxed
  • 76. Ship Your App: in the App Store • Must apply for the Mac developer program through Apple • Must sign app • App is submitted for review • The app will be sandboxed • Xamarin Studio signs, packages, and submits the app • Shipping to the App Store is the best end-user experience
  • 77. Mac OS X Sandbox • Kernel-enforced sandbox • Limits access to the system Limitations on filesystem access Use of special open/save panels Limits access to some services and APIs
  • 78. Mac OS X Sandbox • Edit Sandbox entitlements in Info.plist in Xamarin Studio
  • 79. ?
  • 80. Xamarin makes for Happy Devices Learn more: xamarin.com/mac docs.xamarin.com/mac github.com/xamarin/mac-samples Aaron Bockover @abock abock@xamarin.com