Slide 1

Slide 1 text

NBD04OBUJWFൃදࢿྉ MacΒ͍͠ΞϓϦέʔγϣϯΛ ࣮ݱ͢ΔͨΊʹ Š#BUIZ4DBQIFͰͷࣄྫ͔Š 2018೥12݄22೔ tsawada2 BathyScaphe ϓϩδΣΫτ؅ཧऀ PDF Edition

Slide 2

Slide 2 text

© 2018 tsawada2 macOS native ͜Μʹͪ͸ !2 tsawada2 झຯͰ.BDΞϓϦΛ։ൃ͍ͯ͠·͢ ʢ̑ͪΌΜͶΔؔ࿈͹͔Γʜʣ

Slide 3

Slide 3 text

© 2018 tsawada2 macOS native 4PSSZ UIJTTFTTJPOJT0CKFDUJWF$POMZ w 4XJGUͷ࣌୅ʹਃ͠༁͋Γ·ͤΜ w Ͱ΋ɺ͖ͬͱΠϝʔδ͸఻ΘΔ͸ͣ !3

Slide 4

Slide 4 text

© 2018 tsawada2 macOS native #BUIZ4DBQIFʹ͍ͭͯ !4

Slide 5

Slide 5 text

© 2018 tsawada2 macOS native #BUIZ4DBQIF !5

Slide 6

Slide 6 text

© 2018 tsawada2 macOS native #BUIZ4DBQIF w ೥͔Β։ൃ w ݩʑผͷϒϥ΢β͔Β೿ੜ w ݱࡏɺNBD04ઐ༻ͷϒϥ΢βͱͯ͠͸͓ͦΒ͘། Ұͷݱ໾બख !6

Slide 7

Slide 7 text

© 2018 tsawada2 macOS native ̑ͪΌΜͶΔͱ͸ w چ໊শʮ̎ͪΌΜͶΔʯ w ڊେܝࣔ൘ʜ࠷ۙ͸஌Βͳ͍ਓ΋ଟ͍ͷͩΖ͏͔ʁ !7 https://www.5ch.net/

Slide 8

Slide 8 text

© 2018 tsawada2 macOS native ̑ͪΌΜͶΔϒϥ΢βͱ͸ w ಈػɿ8FCϒϥ΢βΑΓ΋ޮ཰తʹɺڧྗʹӾཡ ͍ͨ͠ʢ༷ʑͳศརػೳɺϩάͷ஝ੵFUDʣ w ͔ͭͯ͸֤ϓϥοτϑΥʔϜ্ʹ༷ʑͳઐ༻ϒϥ΢ β͕ଘࡏ w ݱࡏ͸ॾࣄ৘ʹΑΓɺ͔ͳΓݮগ !8

Slide 9

Slide 9 text

© 2018 tsawada2 macOS native ̑ͪΌΜͶΔϒϥ΢βͬͯେม ٻΊΒΕΔཁૉٕज़ w ωοτϫʔΫ w ςΩετॲཧ w ը૾ॲཧ w σʔλͷ؅ཧ !9

Slide 10

Slide 10 text

© 2018 tsawada2 macOS native #BUIZ4DBQIF8FCαΠτΑΓ !10 https://bathyscaphe.bitbucket.io

Slide 11

Slide 11 text

© 2018 tsawada2 macOS native େݪଇ ̑ͪΌΜͶΔϒϥ΢βͰ͋ΔલʹɺmacOSΞϓϦ έʔγϣϯͰ͋Δ ˣ NBD04ͷྲّྀɺ͓࡞๏ʹै͏ʹ)*(४ڌ Designing Desktop Interactions macOS native #01 !11

Slide 12

Slide 12 text

© 2018 tsawada2 macOS native ౰ͨΓલͷ͜ͱͰ͕͢ w NBD04͕ͲΕ΄ͲັྗతͳςΫϊϩδʔΛඋ͑ͯ ΋ɺͦͷ্Ͱಈ࡞͢ΔΞϓϦέʔγϣϯ͕ରԠͯ͠ ͍ͳ͚Ε͹ͦΕΛ࣮ײ͢Δ͜ͱ͸Ͱ͖·ͤΜɻ w .BDΛ࢖͍ͬͯͯྑ͔ͬͨɺͱ̑ͪΌΜͶΔΛϒ ϥ΢ζ͠ͳ͕Βײͯ͡΋Β͑ΔΑ͏ʹ͢Δʂ !12

Slide 13

Slide 13 text

© 2018 tsawada2 macOS native NBD04ͷ৽ػೳΛऔΓೖΕΔϝϦοτ w ։ൃऀɿ࡞ָ͍͍ͬͯͯ͠ɺϫΫϫΫ͢Δ w Ϣʔβɿ৽͍͠04ʹͯ͠Α͔ͬͨͱ࣮ײͰ͖Δ w Ϣʔβɿ৽͍͠04ʹΞοϓσʔτͨ͘͠ͳΔ w ৽͍͠04ͷγΣΞ͕֦େ͢Δ w ։ൃऀɿݹ͍04Λಈ࡞ର৅͔Β֎ͤΔ w ։ൃऀɿ։ൃָ͕ʹͳΔɺָ͘͠ͳΔ !13

Slide 14

Slide 14 text

© 2018 tsawada2 macOS native ࠓճऔΓ্͛ΔNBD04ͷػೳ !14 macOS 10.14 10.8 OS X Mac OS X 10.0 ׽ࣈTalk 7 (7.1.1) (AppleScript) αʔϏε ௨஌ηϯλʔ ڞ༗ϝχϡʔ μʔΫϞʔυ

Slide 15

Slide 15 text

© 2018 tsawada2 macOS native μʔΫϞʔυ !15

Slide 16

Slide 16 text

© 2018 tsawada2 macOS native μʔΫϞʔυ΁ͷରԠ w جຊతʹ͸ɺࣗಈతʹରԠ͞ΕΔ͸ͣɺͩͬͨ Supporting Dark Mode in Your Interface Developer Documentation !16

Slide 17

Slide 17 text

© 2018 tsawada2 macOS native ਺೥དྷɺ४උ͖͔ͯͨ͠Βʜ !17 /47JTVBM&⒎FDU7JFXͷ ׆༻ 5FNQMBUF*NBHFTͷ ׆༻ ඪ४෦඼ʹΑΔαΠυόʔ

Slide 18

Slide 18 text

© 2018 tsawada2 macOS native Ͱ΋ɺ͜ΜͳՕॴɺ͋Γ·ͤΜ͔ʁ w ʮനΛࢦఆͯ͠ృͬͨʯഎܠͷՕॴ w ʮγεςϜΧϥʔʹແ͍৭ΛృͬͨʯՕॴ !18 ਖ਼௚ɺ๨Εͯ·ͨ͠

Slide 19

Slide 19 text

© 2018 tsawada2 macOS native ࣄྫന͍എܠ !19

Slide 20

Slide 20 text

© 2018 tsawada2 macOS native ࣄྫന͍എܠ !20 ςΩετ͸μʔΫϞʔυʹ ߹Θͤͯࣗಈతʹ৭͕มԽ ͕ͨ͠ɺഎܠ৭͕നͷ··

Slide 21

Slide 21 text

© 2018 tsawada2 macOS native ࣄྫന͍എܠ !21

Slide 22

Slide 22 text

© 2018 tsawada2 macOS native ࣄྫന͍എܠ !22 ςΩετ͸μʔΫϞʔυʹ ߹Θͤͯࣗಈతʹ৭͕มԽ ͕ͨ͠ɺഎܠ৭͕നͷ··

Slide 23

Slide 23 text

© 2018 tsawada2 macOS native ࣄྫ ݪҼͱରॲ๏ w ৭ΛʮനʯͰృ͍ͬͯΔ͔Βʂ ˣ w ৭ࢦఆͷݟ௚͠ʢγεςϜΧϥʔ΁ʣ w ·ͨ͸ɺݱࡏͷ֎؍ϞʔυΛݟͯృΔ৭Λ੾Γସ͑ !23

Slide 24

Slide 24 text

© 2018 tsawada2 macOS native ࣄྫରॲ !24 എܠ৭ΛʮനʯͰ͸ͳ͘ɺద੾ͳγεςϜΧϥʔʹࢦఆ͢Δ

Slide 25

Slide 25 text

© 2018 tsawada2 macOS native ࣄྫରॲ !25 // 手っ取り早く背景を白にする self.baseView.wantsLayer = YES; CGColorRef white = CGColorCreateGenericGray(1.0f, 1.0f); CGColorRef white = [[NSColor controlBackgroundColor] CGColor]; self.baseView.layer.backgroundColor = white; CGColorRelease(white); എܠ৭ΛʮനʯͰ͸ͳ͘ɺద੾ͳγεςϜΧϥʔͰඳը͢Δ

Slide 26

Slide 26 text

© 2018 tsawada2 macOS native ࣄྫղܾޙ !26

Slide 27

Slide 27 text

© 2018 tsawada2 macOS native ࣄྫղܾޙ !27

Slide 28

Slide 28 text

© 2018 tsawada2 macOS native ࣄྫಠࣗௐ߹৭ͷରԠ w γεςϜΧϥʔʹ͸ແ͍͚Ͳɺ04ඪ४ΞϓϦͰݟ ͔͚Δ৭Λਅࣅ͍ͯ͠ΔՕॴɺ͋Γ·ͤΜ͔ʁ !28

Slide 29

Slide 29 text

© 2018 tsawada2 macOS native ࣄྫ !29 ςΩετ͸μʔΫϞʔυʹ߹ Θͤͯࣗಈతʹ৭͕มԽ͠ ͕ͨɺഎܠ৭͕Ϛονͯ͠ ͍ͳ͍ͨΊݟͮΒ͍

Slide 30

Slide 30 text

© 2018 tsawada2 macOS native ࣄྫରॲ w μʔΫϞʔυ༻ͷ৭Λผʹબఆ w "TTFU$BUBMPHʹͦΕͧΕͷ৭Λొ࿥ !30

Slide 31

Slide 31 text

© 2018 tsawada2 macOS native $PMPS4FUΛ࡞੒ !31

Slide 32

Slide 32 text

© 2018 tsawada2 macOS native ࡞੒ͨ͠$PMPS4FUΛݺͼग़͢ !32 - (NSColor *)infoBackgroundColor { if (@available(macOS 10.13, *)) { return [NSColor colorNamed:@"ThreadTitleBarInfoBg"]; } else { return [NSColor colorWithCalibratedHue:(48/360.0f) saturation:0.19f brightness:1.0f alpha:1.0f]; } }

Slide 33

Slide 33 text

© 2018 tsawada2 macOS native ࣄྫղܾޙ !33

Slide 34

Slide 34 text

© 2018 tsawada2 macOS native εΫϩʔϧόʔͱμʔΫϞʔυ !34

Slide 35

Slide 35 text

© 2018 tsawada2 macOS native εΫϩʔϥʔͷ໌Δ͞ NSScroller class reference Developer Documentation !35 typedef NS_ENUM(NSInteger, NSScrollerKnobStyle) { NSScrollerKnobStyleDefault = 0, // dark with light border; good against any background NSScrollerKnobStyleDark = 1, // dark; good against a light background NSScrollerKnobStyleLight = 2 // light; good against a dark background } NS_ENUM_AVAILABLE_MAC(10_7); Default Dark Light

Slide 36

Slide 36 text

© 2018 tsawada2 macOS native ࣄྫ࠷ద੾Γସ͕͑ٲʹ w εΫϩʔϧϏϡʔͷഎܠ৭ʹ߹ΘͤͯεΫϩʔϥʔ ͷ໌Δ͞Λ੾Γସ͑ΔॲཧΛೖΕ͍ͯͨ !36 ໌Δ͍എܠͷ࣌͸…Default ҉͍എܠͷ࣌͸…Light

Slide 37

Slide 37 text

© 2018 tsawada2 macOS native ࣄྫ࠷ద੾Γସ͕͑ٲʹ w μʔΫϞʔυͰ͸ɺNSScrollerKnobStyleDefault ৭͕നͬΆ͘ͳΔˠݟͮΒ͘ͳͬͯ͠·ͬͨ !37 Default͕നͬΆ͘ͳΔ Light͸͋·ΓมԽͳ͠ എܠ৭͸Ϣʔβ͕ࢦఆ ͢Δʹ04ͷ֎؍Ϟʔυ ͱ͸ඇಉظʂ

Slide 38

Slide 38 text

© 2018 tsawada2 macOS native ࣄྫରॲ w ֎؍ϞʔυʹΑͬͯɺॲཧΛ੾Γସ͑ !38 CGFloat brightness = backgroundColor.brightnessComponent; if (ダークモードなら) { return (brightness < 0.5) ? NSScrollerKnobStyleDefault : NSScrollerKnobStyleDark; } else { // ライトモードなら return (brightness < 0.5) ? NSScrollerKnobStyleLight : NSScrollerKnobStyleDefault; }

Slide 39

Slide 39 text

© 2018 tsawada2 macOS native ݱࡏͷ֎؍ϞʔυΛ൑ผ͢Δίʔυ !39 NSAppearance *appearance = someView.effectiveAppearance; // or, someWindow… if (@available(macOS 10.14, *)) { NSAppearanceName bestMatchAppearanceName = [appearance bestMatchFromAppearancesWithNames: @[NSAppearanceNameAqua, NSAppearanceNameDarkAqua]]; if ([bestMatchAppearanceName isEqualToString:NSAppearanceNameDarkAqua]) { // ダークモード } else { // ライトモード } } else { // 10.13以前。常にライトモード }

Slide 40

Slide 40 text

© 2018 tsawada2 macOS native ࣄྫରॲޙ !40 w μʔΫϞʔυʴ໌Δ͍എܠ৭ͷ࣌Ͱ΋ɺεΫϩʔϥʔ ͕ݟ΍͘͢ͳͬͨ ໌Δ͍എܠͷ࣌͸…Dark ҉͍എܠͷ࣌͸…Default

Slide 41

Slide 41 text

© 2018 tsawada2 macOS native μʔΫϞʔυ·ͱΊ w ීஈ͔Βඪ४ͷ෦඼ɺγεςϜͷΧϥʔΛ࢖͍ͬͯ Ε͹͸ͦͷ··͍͚Δ w ͨͩ͠ɺࡉ͔͍ͱ͜ΖͰ΍͸ΓͲ͏ͯ͠΋ߟྀ࿙Ε ͯ͠ΔՄೳੑ͸͋ΔͱݟΔ΂͖ w ௚͢͜ͱ͸ͦΕ΄ͲखؒͰ͸ͳ͍ɻݟ͚ͭ࣍ୈɺ௚ ͠·͠ΐ͏ !41

Slide 42

Slide 42 text

© 2018 tsawada2 macOS native ௨஌ηϯλʔ !42

Slide 43

Slide 43 text

© 2018 tsawada2 macOS native ௨஌ηϯλʔʢͷόφʔʣ Notifications Human Interface Guidelines !43

Slide 44

Slide 44 text

© 2018 tsawada2 macOS native ௨஌ͷ஫ҙ఺ w σϑΥϧτͰ͸ɺ௨஌Λൃߦͨ͠ΞϓϦࣗ਎͕ΞΫ ςΟϒͳ৔߹͸௨஌όφʔ͕දࣔ͞Εͳ͍ ˠͦΕ͕ࠔΔ৔߹΋͋Δ !44

Slide 45

Slide 45 text

© 2018 tsawada2 macOS native ରࡦίʔυ NSUserNotificationCenterDelegate Protocol Developer Documentation !45 // どこかでデリゲートを設定しておく [[NSUserNotificationCenter defaultUserNotificationCenter] setDelegate: (CMRAppDelegate *)[NSApp delegate]]; @implementation CMRAppDelegate(NSUserNotificationCenterDelegateImpl) // このデリゲートメソッドで常にYESを返すようにする - (BOOL)userNotificationCenter:(NSUserNotificationCenter *)center shouldPresentNotification:(NSUserNotification *)notification { return YES; } @end

Slide 46

Slide 46 text

© 2018 tsawada2 macOS native ௨஌ͰԻΛ໐Β͢ʹ͸ʁ NSUserNotification class reference Developer Documentation !46 NSUserNotification *userNotification = [[NSUserNotification alloc] init]; userNotification.title = @“Hogeeeeee!!!”; userNotification.informativeText = @“User Notification Test”; userNotification.hasActionButton = NO; userNotification.soundName = NSUserNotificationDefaultSoundName; ʻϙϩϦϯ

Slide 47

Slide 47 text

© 2018 tsawada2 macOS native ڞ༗ϝχϡʔʢڞ༗Ϙλϯʣ !47

Slide 48

Slide 48 text

© 2018 tsawada2 macOS native ڞ༗Ϙλϯ !48

Slide 49

Slide 49 text

© 2018 tsawada2 macOS native ڞ༗Ϙλϯ w Ϙλϯܕͷπʔϧόʔ߲໨Λ ༻ҙ͢Δ w Ϛ΢εϘλϯΛԡ͢ͱɺϝ χϡʔ͕දࣔ͞ΕΔΑ͏ʹ࣮ ૷͢Δ ˠʮ཭͢ͱʯͰ͸͋Γ·ͤΜ πʔϧόʔΞΠίϯͱͦͷ࣮૷ macOS native #01 !49 /44IBSF5FNQMBUF

Slide 50

Slide 50 text

© 2018 tsawada2 macOS native ڞ༗Ϙλϯ w ίϯιʔϧʹܯࠂ͕ग़Δ΄Ͳେ੾ͳ͜ͱ w ίϯιʔϧʹઃఆํ๏·Ͱॻ͔Ε͍ͯΔ Warning: -[NSSharingServicePicker showRelativeToRect: ofView: preferredEdge:] should not be called on mouseUp Please configure the sender with -[NSControl sendActionOn:NSLeftMouseDownMask]; !50 ʮ཭͢ͱʯͰ͸͋Γ·ͤΜ

Slide 51

Slide 51 text

© 2018 tsawada2 macOS native ڞ༗ϘλϯͷηοτΞοϓ w ݴΘΕͨ௨Γʹ࣮૷͠·͠ΐ͏ ˠͨͩ͠ίʔυهड़͕ඞཁʢ*#͔Βग़དྷͳ͍ʁʣ !51 @property (nonatomic) IBOutlet NSButton *shareToolbarButtonItem; // どこかで最初にやっておく!(例えば -awakeFromNib とかでも…) [shareToolbarButtonItem sendActionOn:NSLeftMouseDownMask];

Slide 52

Slide 52 text

© 2018 tsawada2 macOS native ڞ༗ϘλϯͷηοτΞοϓ !52 // 共有ボタンに以下のようなIBActionをセット - (IBAction)share:(id)sender { if (![sender respondsToSelector:@selector(bounds)]) { return; // 「テキストのみ」ツールバー対策(手抜き) } NSArray *items = …; // 共有したいデータを用意 NSSharingServicePicker *picker; picker = [[NSSharingServicePicker alloc] initWithItems:items]; picker.delegate = …; [picker showRelativeToRect:[sender bounds] ofView:sender preferredEdge:NSMinYEdge]; }

Slide 53

Slide 53 text

© 2018 tsawada2 macOS native ΞχϝʔγϣϯޮՌʹ͍ͭͯ w ͍͔ͭ͘ɺσϦήʔτϝιουΛ࣮૷͢Δඞཁ͋Γ w ڞ༗͢Δσʔλ͕/463-͡Όͳ͍ͱμϝΈ͍ͨ !53

Slide 54

Slide 54 text

© 2018 tsawada2 macOS native ΞχϝʔγϣϯޮՌͷ࣮૷ྫ NSSharingServiceDelegate Protocol Developer Documentation !54 - (NSRect) sharingService:(id)sharingService sourceFrameOnScreenForShareItem:(id)item { NSRect imageViewBounds = self.imageView.bounds; return [self.window convertRectToScreen:imageViewBounds]; } - (NSImage *)sharingService:(id)sharingService transitionImageForShareItem:(id)item contentRect:(NSRect *)contentRect { return self.imageView.image; } - (NSWindow *)sharingService:(NSSharingService *)sharingService sourceWindowForShareItems:(NSArray *)items sharingContentScope:(NSSharingContentScope *)sharingContentScope { *sharingContentScope = NSSharingContentScopeFull; return self.window; }

Slide 55

Slide 55 text

© 2018 tsawada2 macOS native ϨδΣϯυʢαʔϏεɺ"QQMF4DSJQUʣ !55

Slide 56

Slide 56 text

© 2018 tsawada2 macOS native αʔϏεʢαʔϏεϝχϡʔʣ !56

Slide 57

Slide 57 text

© 2018 tsawada2 macOS native αʔϏε w .BD049ʢͱ͍͏͔ɺ/FYU45&1ͷࠒʣ͔Β͋Δ w ஍ຯͳͷʹແ͘ͳΒͳ͍ w ίϯςΩετϝχϡʔ͔Β΋࢖͑ͨΓɺ݁ߏศར w ͜͏͍͏஍ຯ͚ͩͲૉఢͳػೳͬͯɺਪͨ͘͠ͳΓ·͢ Services Implementation Guide Documentation Archive !57 Services Human Interface Guidelines

Slide 58

Slide 58 text

© 2018 tsawada2 macOS native αʔϏεʹରԠ͢Δ w αʔϏεΛڗड͢Δ w αʔϏεΛఏڙ͢Δ !58

Slide 59

Slide 59 text

© 2018 tsawada2 macOS native #BUIZ4DBQIFͷαʔϏεαϙʔτ w ςʔϒϧϏϡʔͷ߲໨ʹରͯ͠΋αʔϏε͕࢖͑Δ ͷ͕ɺͪΐͬͱࣗຫ !59

Slide 60

Slide 60 text

© 2018 tsawada2 macOS native #BUIZ4DBQIFͷαʔϏεαϙʔτ w #BUIZ4DBQIF΋ɺαʔϏεΛఏڙ͍ͯ͠·͢ !60

Slide 61

Slide 61 text

© 2018 tsawada2 macOS native "QQMF4DSJQU w ͪ͜Β͸ͳΜͱɺप೥Λܴ͑ͨػೳ w ͜Ε·ͨɺ஍ຯͳͷʹແ͘ͳΒͳ͍ w ͣͬͱੲ͔Β৮Ε߹͖ͬͯͨػೳ͔ͩΒɺਪͨ͘͠ ͳΓ·͢ʂ w ਪ͠ΛߦಈͰࣔ͢ʹࣗ࡞ΞϓϦͰରԠ͢Δʂ !61

Slide 62

Slide 62 text

© 2018 tsawada2 macOS native ΞϓϦέʔγϣϯͷ"QQMF4DSJQUରԠϨϕϧ w 4DSJQUBCMF w "UUBDIBCMF w 3FDPSEBCMF !62 ׽ࣈ5BMLͷࠒɺΑ͘ҎԼͷͭͷ୯ޠͰઆ໌͞Ε͍ͯͨ ͜Ε͸νϣοτେม͔΋

Slide 63

Slide 63 text

© 2018 tsawada2 macOS native 4DSJQUBCMF"QQMJDBUJPOʹͳΔʹ͸ w ༻ޠࣙॻΛॻ͘ɺ͜Εʹਚ͖Δ w ग़དྷΔ͚ͩ։ൃͷॳظஈ֊͔Βߟྀ͓ͯ͘͠ w ͓͢͢ΊɿӅ͠ઃఆ΁ͷΞΫηεखஈͱͯ͠׆༻ AppleScript Λαϙʔτ͢Δ macOS native #03 ʹظ଴ !63

Slide 64

Slide 64 text

© 2018 tsawada2 macOS native "UUBDIBCMF"QQMJDBUJPOʹͳΔʹ͸ w εΫϦϓτͷ࣮ߦ͸ɺઐ༻Ϋϥε͕͋ΔͷͰ؆୯ w ͓͢͢ΊɿεΫϦϓτϝχϡʔΛ͚ͭͯΈ·ͤΜ͔ w 4DSJQUBCMFͳͱ͖ɺ"UUBDIBCMF͕׆͖ͯ͘Δ NSUserAppleScriptTask class reference Developer Documentation !64

Slide 65

Slide 65 text

© 2018 tsawada2 macOS native #BUIZ4DBQIFͷ"QQMF4DSJQUαϙʔτ !65 Scriptable

Slide 66

Slide 66 text

© 2018 tsawada2 macOS native #BUIZ4DBQIFͷ"QQMF4DSJQUαϙʔτ !66 Attachable

Slide 67

Slide 67 text

© 2018 tsawada2 macOS native ͓·͚ɿ͋ͷԻΛ໐Β͢ͷ͸Ͳͳͨ !67

Slide 68

Slide 68 text

© 2018 tsawada2 macOS native ͍ͭͰ΋޷͖ͳ࣌ʹʮ͋ͷԻʯΛ໐Βͦ͏ System Sound Services Developer Documentation !68 @import AudioToolbox; AudioServicesPlaySystemSound(22); // Disc Burned AudioServicesPlaySystemSound(16); // Trash! AudioServicesPlaySystemSound(1); // Move etc. AudioServicesPlaySystemSound(15); // Boom!

Slide 69

Slide 69 text

https://macos-native.github.io