P that you could download MP3s too and
so now the word podcast is thrown around
nobody really knows in mainstream
culture what that where that comes from
but anyway so here it is we are on
episode
1861 so yeah I've been doing it a long
time and this website is running in uh
running on in Azure and I'm using a
Blazer server I'm using uh Blazer server
to write it I wrote it in Blazer server
with some CSS and um it's pretty simple
but I started thinking about a mobile
app um on the net show and I know it's a
little strange
it's supposed to be surreal with the
people talking uh animated but I started
um building a mobile podcast app right
here you can see in April
2021 and I've gotten part two part three
part four part five part six part seven
and you can see there's a lot of work
that has gone into it these are the
GitHub repos where I started
uh so I started by using it
um uh just by doing the basic
structure uh I have this cheat sheet
here that I'm going to use this is the
main
audio library that I use plugin. Maui
audio right here by Gerald vers Luise
and so this is great because it
abstracts away all of the audio for all
of the platforms but what's not great
about it is that on an
iPhone if you have it in vibrate mode
it's not you're not going to hear
anything whereas everywhere else you
know on Android devices doesn't matter
if you're in vibrate mode uh you'll
still hear it but that's just one little
nitpicky thing uh I'm sure hopefully
it'll get fixed in the
future so anyway as you can see I got uh
to version two
so and we're going to take
this uh all the way to the App
Store well in version three I started
with user stories I want to create a
playlist I want to give it a name I want
the app to automatically persist my
playlists this is after I've gotten the
basic stuff of you know showing all the
shows and the episodes and being able to
play them uh I want to be able to
retreat retrieve a playlist from mine
and exist uh delete an existing playlist
then I want to select one or more
episodes to add to a playlist I want to
remove episodes from the playlist
basically manage the playlist and I want
to play the
playlist so that was in version
three and in version four we uh add
modal dialogues uh I'm sorry we added um
a couple of things to it not modal modal
dialogues came later but we added a
couple of things to the to the
models and then uh I updated it to Net 7
and then here uh in uh
version six part six is when I really
made it I fixed a lot of bugs I had
published it to the App Store and I
asked people to beat on it and tell me
what they think there was actually a
hidden bug that I put in there as a sort
of a
a treasure hunt and you know for people
who had the right answer of this I think
was the most hus bug um I gave them uh
an
award so that actually happened and I'm
going to show it to you
now so here is the app running on
Windows it's easy to see it running on
Windows
obviously
how many people are using Maui right
now okay
so the there are two ways to build a
Maui app you can use zaml and you can
use Blazer I chose to use Blazer and
it's not because I like the web in fact
JavaScript and I have a long tumultuous
relationship um but but I really got
into blazer because of the the
programming model it was easy it was
powerful and Microsoft was putting a lot
of uh resources into it plus Steve
Sanderson is a freaking
genius so I'm going to show you how and
I think using blazer for Maui is the
best way to
go um so anyway let's take a look here
I'm showing the first 20
episodes because I don't want to show
all 1,00 of them
and if you click this more button it
goes and gets the next
20 but another thing you can do is
filter so I can say I want to see all
the shows that have the word Azure in it
and as I'm typing it goes and gets the
first 20 episodes that have Azure in the
title and if you click
more now you're getting the next 20 or
whatever episodes that that have Azure
in the title and if there's more than 20
you'll get more
again and this time I know there's not
20 so you won't oh yeah I guess you will
oh I think there's
42 so there you go now now we finally
get down to episode
403 published in 2008 that was the first
time the word Azure appeared in a title
but you see now the more button is not
there and uh just to show you this
running on different
formats I'm going to switch over to the
mac and this is the app running in a Mac
uh in an iPad simulator right
here which is kind of cool and if we go
back
to this
guy
Windows I've got my Galaxy here and link
to
Windows
whoops and I have it running here as
well so I wish I could make this bigger
for you but you know all the same
features are
here
right so what happens when we click one
of these guys is we get to a page that
has the you know the controls for
playing it's basically and these buttons
probably need to be clarified a little
bit but the leftmost button that's
grayed out is go back 10 seconds then
play pause stop and go forward 10
seconds so here I will
um let's just play
it now it
downloads we're going to get an ad
here I'm I'm
sure maybe
not oh that's awesome I love it when
things work you know let's let's go back
to Windows
here because it's just so so much easier
to
demo
what is my default audio set to
something else yeah that's it once a
month you get access to a private
R so I can skip
ahead hey guess what it's time for net
rocks I'm Carl Franklin and I'm Richard
C so there you go so that heinous bug
that I was telling you about happens
happened
because um I was putting all of the a
audio PR play you know programming and
stuff inside this page this Details page
and what would happen is you could have
in Blazer you can have two instances of
the same page running at the same time
um especially if you've got resources
like timers or something like that in
this case it was a timer but I would
start playing and and go back when it
was downloading I would go back and
select another thing to play and so now
we have two shows playing at the same
time so what I decided do to do is move
all of that goo for playing audio into a
Singleton into a single place and that
way we only have one show or episode
playing at a
time um we're getting the metadata from
an API uh it's a public API it's readon
there's no way that you can send updates
or ads to it uh so it's sort of like an
RSS feed but RSS doesn't have stuff for
like guests and links so I decided to
create an API with models for the guests
and the links and the uh the description
and all of that stuff and the file
obviously so this is the details page
and I can go back now to the homepage
and playlists are a really cool feature
as I was telling you before
I can add a playlist and let's just call
it Azure that's
fine this by the way is a modal dialogue
that I'm using Blazer modal does anybody
know what that is Blazer modal yeah so
there's this guy Chris sinty who's from
UK and when Blazer was first hitting the
scene he just got busy writing all these
tools for it and Blazer modal is one
that has become the de facto standard
for modal
dialogues it just wraps CSS and HTML and
does some
tricks right so if I click in the
background here it will go
away but you can also specify that you
want to disable that and you can disable
the x button if you want to and you
basically can use any HTML and CSS and
JavaScript you want in your modal
dialogues um you can pass data to them
you can bring data out
I also wrote this list box here and let
me switch back to this guy and I'll show
you why that's really
important um where am I linked to
Windows there I am all right so if I go
to playlists here and I add a
playlist
Azure if this was a regular select in
HTML I know if you've ever seen this but
they don't work well on phones I might
have a hundred items in a list box or
even three items and it shows as a as a
dropdown and you have to click on it to
expand it and then some other UI pops up
and it doesn't really work all that well
especially if there's only one in it you
can't select it so here I'll add
another
JavaScript
and now you can see I've got two items
in my list so I basically built a custom
list box in Blazer as a Blazer component
and that's what you're seeing
here uh so now if I've selected a
playlist which I have and you can see
there uh you know what I'm going to do
I'm going to do Zoom it
here if I have zoom
it I don't know if I have it all right
sorry about that so uh now that I have
you can see the zero right there because
there's zero items in the playlist so
I'll go back and now you can see my UI
has changed I've got some more buttons
here so now I can search all the shows
that I want to put in the playlist and I
can just search for Azure and I can add
all of those shows to the playlist right
here or I can go manually through and
and add them all what I'm going to do is
get all the shows that have Azure in the
title again with
more and just go through this process
until they're all on the
screen and there we go and now if I do
plus
all and I go back to my
playlists now I've got this other cool
UI thing and this works well on a mobile
device as well these are all the shows
that are in that
playlist and I can move them up and down
in the playlist with these arrow keys
and they're big enough so that you can
use your fat fingers to move them so
like if I want to move Azure API
management with Tom kirova to the top I
can just click this button right here
okay and now you can edit the name of
the playlist you can delete it and all
that stuff so if I go back here to the
main and I show the
playlist it crashes no that's not true
so now here they are I have 72 in the
playlist and I can start
playing and what's going to happen is
it'll play each one of them and when
it's done it'll go to the next
one and might might have some bandwidth
issues or something here I'm not sure
but anyway that's what's supposed to
happen
happen um let's take a look at
this
in in the uh CSR file you can see I've
got T my target Frameworks I'm targeting
everything uh Android net7 iOS net7 Mac
Catalyst and also
Windows I've
got uh some resources here some images
here's my blazer modal uh Newton soft
Json of course we wouldn't leave home
without it and plugin. Maui
audio so those are the things that I'm
using and again I'm going to go to my
cheat screen here and did the packages I
talked about plug-in Maui all right I
guess we can get into the
Code Media state so media state is this
enum that I have uh and the reason that
I have that is because the plug-in for
audio it just has an is playing uh
property so it really only gives you
whether it's stopped or playing or
paused or playing we don't really know
if it's paused or stopped um and I also
wanted to know if I was downloading so I
just created this little enum and I use
that
instead um here's something interesting
in app zaml if I'm on
Windows I want to
Center and eyes the window and this is
something that you really couldn't do
and you can't do it with zaml in a Maui
app the way you can say in WPF in WPF I
can just say position center width and
height or whatever no problem but in
Maui you don't have that control even in
zaml so what I have to do here is some
code I have to handle in create window I
override that and then I get that uh I
hook up the created event in the
destroying
event I do my clean up and destroying
but in created I have this pragma here
if I'm running on Windows then I grab
the window I set the default width and
height or I set the width and height of
the window and the X and
Y and um then I have to do this window
dox and window doy right here uh I think
I did this just to move it off the
screen I'm not sure why I don't think I
have to do that anymore but anyway this
is just code that I had to do in order
to get it to pop up in the right place
if I'm running on Windows but here's a
little tip for you
guys uh I don't think the
windows Maui has a
future I don't think the the the the
windows uh platform on Maui has a future
and uh I don't know this is something
that I've sort of inferred
from talking to various people but um I
I kind of yeah don't think that it's
going to be around much longer and the
problem is you know well which Windows
platform do we choose you know it's kind
of nice if you have if you just have a
mobile app and you want it to run in
Windows but if you're going to write a
Windows app it should be a WPF app um
I'm not even I don't even like uwp
anymore I think WPF is still the way to
go that said you could still write WPF
app with
blazer if you wanted to it just goes
everywhere and by the way if you guys
have any questions just blur them out I
don't you're not going to bug me by
interrupting me all right so the next
thing let's talk about is the service
API service so what this does is wraps
this
podcast uh
API and as I said before it's a readon
API it doesn't require any
authentication it's public
and you could go there right now and
grab all the metadata for all of our
episodes but this API service I use
because it does other things than just
going and fetching
shows um I have get online status here
which is interesting because I need to
know if I'm online or offline see one of
the cool features that I wanted to put
in this podcast app is if we're online
we can download particular songs we can
sort of pre-download them right and they
go in the cache and so when we're
offline if I've already downloaded them
they're I can listen to them so I can
download the shows I want to listen to
maybe in a whole playlist you can
download an entire playlist get on a
plane turn off the internet go into
airplane mode and I can pull this up and
then I can still listen to them that was
a very important feature for
me so then you see when I have like get
all shows for
example I'm looking for a file in my
cash directory and this is how you
access that cash directory in Maui fil
system. currentc directory because it's
different on every platform and I'm
looking for this Json
file so if we're online this is great we
have an internet connection I'm going to
download the shows as
usual and uh just with a you know HTTP
client getting my list of shows and I'm
writing them to that file if that file
exists I don't care this is the current
source of truth I'm going to write over
it but if I'm not online and the file
exists I'm going to load it up and
return all those items in the list so
there you go I can once I've downloaded
once I'm in airplane mode or whatever
I'm offline boom I just read them from
the file the last list that I
got
and if we're offline and the all shows
Json does not exist it's the first time
we've run it and we're offline Sorry
Charlie no
shows so now I have the filtered shows
right where with the show title which is
a partial title let's say it's Azure
because that's what I did and I have a a
start index and account well the start
index one of the first things I do is I
call get show numbers
and get show numbers will return just a
list of the show numbers from 1 to
1856 or whatever and that's kind of cool
because I need to know how many shows
there are in the database
right and so this is telling me okay my
start index and the maximum that I want
to return and again if we're
online then we uh call this get filtered
shows
API otherwise we're checking for the ex
existence of each Show's Json file right
so you can see the files are named show
Dash whatever if it's show 1800 show-1
1800
dojon so that will have all the details
for that particular
show and that's kind of
cool uh yeah get count how many shows
are out
there and get filtered account as
well offline online so here's getting
show with details
right so show-1
1800.jpg I should really call this
episode number but I started this
database way back in
2004 maybe 2004 2005 no it's around
2004 and that's just what I used and I
also used the table sponsors instead of
what I should have ADD was ads because I
was thinking well why would a you know a
sponsor would have why would a sponsor
have more than one ad that's crazy so
anyway you'll see the word sponsor in
the code it really means an ad and the
word show really means an episode sorry
about that I just never changed
it so this is all the same stuff right
if the file is offline we grab it we get
the guests we return the
show uh here's got show numbers all
right so you can see this is just your
basic rapper but I do have all the
online and offline stuff built into it
uh let's look at the models
yeah so I've got a models folder now
this folder has models for the you know
the database tables like
show and
guest and
file and
Link tag
sponsor which is really
ad show details which has the guests the
links the sponsors the tags the
files all of that in you know
one uh in one wrapper and then I also
have
playlist and so playlist is something
that I introduced for the app as as you
could say uh the name the date created
in the list of shows it's pretty pretty
simple and I implemented I clonable so
that um I could easily make copies of it
uh and then I have this enum playlist
edit action that's just for the UI if
I'm adding or editing I also have this
get by show Numbers request so in the
API uh if I want to get a list of shows
by their numbers like I'm so so let's
say I'm um you know I I load the app and
I get the first 20 episodes so now I
want show Numbers uh you know the the
next 20 episodes I know what those show
numbers are so I make this call here's
the show name here's my list of indexes
or show
numbers so that's models in Webroot I've
got you know all of my
graphics and uh the logo I have my my
little loading spinner GIF right there
um and these are just those stupid big
buttons right
there here's the thing in main layout so
main layout in a Blazer app is the the
layout for every it's sort of like the
master page right for every page that
you're going to see we want the nav menu
which goes across the top we want the
DNR
logo and this class right here uh is a
CSS class and get this this is the last
this is the last bug that I
fixed DNR logo it's down here I had a
height or Max height is 40% or something
like that and that was fine on Windows
and Mac Catalyst and Android but I
looked at it on and this is currently
the one in the App Store I looked at it
on iOS and it was all squished so that
fixed
that um so yeah main layout simple I
just show I don't show any nav menu on
the side the nav menu is actually across
the top and that's what this is right
here for home and playlists and you can
see
that you can see the same thing on uh
the website too right here across the
top um probably the most interesting
thing is the cascading App
State so anytime you want to have in
Blazer you want to have a component
that's sort of global to the application
and then certainly in Maui it's scoped
to the application in a website it's
scoped per user so it's a great place to
put uh State information for that
particular user if you've done web forms
in the past like the session object
right so this this is how you do it you
have a a cascading value and some child
content here and the child content is a
render
fragment and so now if I go down to my
main
razor I wrap the entire router which is
basically every page that you see in a
cascading App State and you can see
Blazer modal doeses the same thing and
what that allows us to do is access this
App State
uh this class right here which is the
code behind for it in any
page so if I go to my
pages index razor CS right
here now I can use the cascading
parameter attribute and I get access to
that App State and in the App State I is
where I'm doing everything I'm keeping
the state for the entire application the
EP episode filter right you can see show
playlist only show playlist only text
last show number all shows which is the
list of shows like everything that I
have pretty much in the app is going in
App State I'm injecting the API service
right here this I audio manager is the
plugin. ma. audio do uh I audio
manager and and you can see I've got an
i audio
player I got a file stream and this is
cool because there's only one it's it's
like uh you know there can only be one
what is that Highlander
right there's only one app state only
one thing can uh file can play at a time
only one file stream only one
timer I got my media State I've got an
episode or a show called this show
that's the current one that we're
looking at
the show number now I've got these uh
properties that when I change them I
want the UI to
update and so that's why I'm invoking
state has
changed and because cascading AB State
wraps
everything the values Cascade down to
whatever the page is so if I call uh
where am I if I call uh invoke async
state has changed after I set a value
right like audio message and that audio
message is bound to something on my
page it's going to update no matter
where I call it
from no matter where I call it from so
an audio message might be downloading
playing paused or an
error um here's a playing playlist and
I'm going to need that in the UI because
I I can use that to uh in index for
example example when I want to um play
something if uh let's go into the markup
for
index and search for playing
playlist app
State yeah so that's it so I'm looking
in appstate do this show if it's not
null and the media state is playing then
what I do is I play this I show this
button but it's pred ated on this app
State value and so if that value changes
state has changed updates it index says
oh this value has changed I'm going to
render this page and either show or hide
this button but take a look at what
happens when I do this this is the shut
up function and this was one of the
things that I uh learned
from
uh from a a listener how you like to
listen so if if I go back home nowy
there it is currently playing for Just5
a month and if I click it it calls the
shut up
function right so that was that button
right there but that's a really good
example of how um you can use a
combination of cascading app state or a
cascading parameter to store the state
of an application and uh state has
changed to do stuff that your UI can
respond to and you just do it with these
little a if uh
signs so yeah so now I have the search
shows and that's easy with an input
where I'm bound to episode
filter and if I'm loading then I show
that loading
GIF if my selected playlist is not null
then I show all the UI that has the the
play playlist goo the buttons for toggle
show the playlist only add all to
playlist remove all from playlist like
it's all pretty pretty easy to
do and I I don't know I find it much
easier than
zaml and there are just some things that
I can't really do in
zaml right so let's go to I'm back in
the App State here I'm looking at um
percentage of the audio played use to
set the progress BAR value the play
position is the current position it's
just a
string um I use these opacities to
control whether a button looks enabled
or
disabled so that's uh an easy way I can
take an image and just using opacity
show it like half half opacity for
disabled and so therefore I had
to I had to manually deal with the state
of those buttons based on whether uh
we're playing or not playing right and
so I have this set State what is it
Set
uh set
state so this changes the UI this
doesn't actually change the the the the
audio player or anything like that but I
look to see if my media state is playing
and I set my opacities and my audio m
message and I also am using these class
names right and this is a cool thing
that you can do with Blazer and CSS is
that I can dynamically change classes uh
CSS classes for a given element based on
a state and so that's what I'm doing
here pause button class stop button
class and then if we look in let's see
details which is where the player
is so here's image class equals app
state. rewind button
class right so I'm actually dynamically
changing the CSS class based on the
state and if you look
at the
CSS and we've got
now let's go oh it's
up uh okay it might not be in there it's
in details razor. CSS that's right we
can have scope CSS in
Blazer so you've got image
button and image button active and if
the class is image button that means um
I I have these CSS values set otherwise
I don't so that's how I do
that so back to this state if I'm paused
or stopped then I have these other uh
classes play button class so this image
button basically it's cool when you
press it it kind of depresses a little
bit and then comes back out it's
nice uh then I set some other values
okay so not much there so let's go to
play
audio play audio is what happens when
you press the button to
play so if we're paused I'm want to
continue playing from where I am right
if we're currently paused and you press
play I don't want it to go back to the
beginning I want it to currently to
continue where we are and then I call
set State media
playing so if there's no URL
specified right this show MP3 URL has to
have a URL right and I'm making sure
we're stopped by calling this cleanup
which I'll get to in a minute but it's
sort of like the end of life for that
player everything gets disposed timer
whatever so I get the
cacher uh the fully qualified path to
the local file right the MP3
URL and then um I get the local file
name and if it
exists if it doesn't exist I'm going to
let the user know we're trying to
download then I go get
it then I open the file for reading and
I create my play my audio
player from the stream right and then I
hook this playback ended
event that happens when it ends I create
the system timer to report the progress
50
millisecs and now I have this timer
elapsed Anonymous uh
method calculate the
percentage then I get some uh time spans
from the current position and the
duration and I create create this play
position string and that basically shows
where we are I start the timer I start
playing I set the media State and invoke
state has
changed so then cleanup let's talk about
cleanup not you you so cleanup happens
at the end of life I found that I had to
do this little await task delay 100 or
else weird things
happened you know programming used to be
I'm old programming used to be you were
a surgeon you know you you got control
of the machine you did exactly what you
told it to do exactly what you wanted it
did that and then you released control
now you're more like a
psychologist you know you have a
conversation with the machine you know
you you make some
suggestions you listen you make some
some suggestions You observe the
behavior you prescribe some medication
you know it's just it's just one of
those things it's like hm what's going
on here I don't really understand it but
I know that maybe if I give it a little
time to do what it needs to do because
we're in an async World here it'll work
so I wait for 100
milliseconds then I say stop well I set
the state to stop if the stream is not
null I dispose it if the timer's not
null I stop and dispose I probably don't
need that stop I can just dispose it I
unhook my events and dispose the player
and that's pretty much
it so uh I want to jump over to the Mac
here a uh for a
minute to talk about the joy that is
programming Maui and testing it in the
Mac um you can see here that I've got
this IP P ad right but what if I want to
run this and I'm doing this from the
command line what if I want to run it on
a particular device
simulator so what you have to do is if I
go to
xcode and apparently xcode isn't there
anymore I don't know
why okay well anyway if you go to xcode
and simulators
you can see from the list of simulators
there's a device
ID and you can put that device ID in a
uh in a
command such as
this so net build- T colon run- F net7
iOS and then P uh-
ponore device name equals colon V2 colon
udid equals and then that guid that is
the ID for that device simple
right and when you do
that everything's built and by the way
this is how I like to test on a Mac um I
basically clone the repo you know I push
my changes to the repo over here on the
PC I go and Pull and get the latest and
then uh I can use net run on the
particular device and as you can see it
runs
there so this is on an iPhone device now
I can
also going back here use a thing called
hot restart with my local iOS device and
when I do that and I'm sorry I don't
have the actual screen on the
screen okay well I don't know what that
is but anyway uh it would tell me okay
go run the app now on your phone and it
it is kind it is the app is but it's not
really it's it's running in a sort of a
shell that you can use to debug and it's
great but um and you can use the
application right like I can go download
stuff and play and uh because I have it
in vibrate mode it doesn't play but it's
downloading
and now you'll hear
it I don't know is that a condom ad I
don't I don't
know it's funny because
I um we using spreer which is uh iHeart
radio's Network for podcast and we went
to this thing where they basically
basically inject local ads before in the
middle and after the the podcast and it
could be anything and I was talking to
Bill Wagner do you know who he is he's a
Microsoft guy who writes documentation
he's been around a long time I was
visiting him in Maine and he goes I was
listening toet rocks and I get an ad for
like a local
supermarket like right here in my town I
was like yeah well geo geo targeting
it's weird but it's it's kind of strange
to hear those ads onet rocks but there
you
go um so we've shown it on
Android we've shown it on iOS oh Mac
Catalyst that was the other
one so Mac catalyst is a Mac
whoops is a Mac app
right right there if I use uh net 70 Mac
cataly list that will load as a DOT as a
Mac desktop
app
right Windows Mac
desktop iPad iOS iOS
Android so it's all running and believe
me that is a that is a a
chore a feet that I didn't really have a
lot of confidence up until you know
maybe three or four years ago that I'd
be able to do that in a demo uh using
zamarin it was just really hard whoops
really hard to get all of these things
working it's such a moving Target but I
found that on the Mac you have to not
only have the the current version of the
operating system installed but the
current version of xcode which I'm
really not sure why I can't see it but
uh the current version of xcode running
the current version of doet and the Maui
workloads and and all that stuff and it
changes and if there's a new version you
have to rein install
everything uh and on top of that you
have to if if the license agreement for
your Apple developer account changes you
before you can even use it your own your
own phone before you can use it you have
to go agree to their terms or else it
won't work and and you have to provision
a device for development on your own
machine your own device just so that you
can run run your app like this requires
that you pay a 100 bucks a year and you
register your device and all that
stuff okay so that's the end of my rant
against Apple we love apple right I
actually do and the reason is Apple is
secure I'm a security freak these days
and say what you want about Apple but
your iPhone is locked down this is one
of the ways in which it's locked down it
might not be as convenient but but it's
secure whereas Android that's kind of
the Wild West you
know uh you can do a lot more with
Android um oh okay here's here's one
thing that you need to know about
Android check this
out so you get a new Android device and
you want to use it for
debugging you have
to go to settings
go to about
phone uh and I'm sorry I can't make this
bigger can I do oh yeah I can look at
that go to about
phone go to um is it serial number
product
number uh software information the build
number where is it build number and you
tap seven times on the build number one
two 2 3 four five six 7even see how it
what it says developer mode has already
been turned
on and that's how you turn on developer
mode you have to tap on the build number
seven
times I swear to God and then you know
security through obscurity and then you
get in settings developer options right
down at the bottom and you have to turn
on uh
enable USB debugging where is it USB
deug plugging right
there right there you have to turn that
on and then when you connect you have to
install the Samsung driver this is what
I have a Samsung or whatever your phone
is if it's Google you have to download
the USB driver for Windows and then once
you connect it's going to ask you to do
you want to allow USB debugging now
you've already said you wanted to allow
USB debugging you have to trust the
computer and say I want to allow USB
debugging on this computer
so all of that has to happen before you
can
get Android local
devices you know in your in your list of
devices so it is a moving Target but um
I got to say though Blazer makes it easy
and
uh certainly Maui is a lot easier right
out of the gate than zamaron ever was
they really have put a lot of effort
into making the developer experience
excellent
[Music]
um any questions is there anything that
I haven't shown you that you want to
know the answer
to anybody don't be shy yes in the
back I
have you have a
what okay Zar
app
I'm sorry I can't hear you you want to
take the
mic here you
go today I have a a Samar app H and I
think very often I have to do something
special for iOS and yeah something other
special thing for Android to get things
to work how is it with the Maui platform
how how what what's the question yeah
how how often do we have to do something
special uh get ios to work and something
other special to to get Android to work
yeah I have a suggestion for you Google
and apple have to
merge who buys who though that's the
question no no it's it's very
frustrating because uh yeah they are two
different companies with two different
platforms and different requirements and
as I said before apple is a lot more
interested in security
right for their users and for their
platform they do a lot more to vet
applications that you submit to the App
Store yeah I went through uh one of the
things that I did in my
um in my my shows here on the net
show is I did a whole series of where is
it publishing apps right so I started
from creating an account on the Google
Play Store and the Apple Store and I did
videos of this and everything that you
have to do to publish an app and it's
very different for both platforms and
this gets to right to the heart of your
question and and really you're
outpouring a frustration of having to
develop on these two
platforms um the development part is
easy really um there are some things
that you're going to see a lot different
in in the zaml
versions but in when you're using Blazer
and
CSS those differences go away I I think
it's a lot easier to develop in Blazer
is what I'm saying and you get a more
consistent look uh and feel and you know
the way they behave the way the apps
behave if you're using blazer because
CSS is all and the browser is already
the platform crossplatform right and
it's been debugged and worked on by the
browser manufacturers already for years
and years and years whereas Microsoft
for zaml has to do implementations of
every little feature of their UI
differently for iOS and for Android and
they're always playing
catchup and stuff just doesn't work I'll
tell you right now um having uh what was
it I had a
um uh a a scrollable
container um list view or something like
that collection view that was it a
collection View and trying to do you
know fine grain positioning of items in
a collection view just doesn't work in
zaml whereas and it just took a lot of
work it took a lot of guess work I even
asked chat GPT and chat GPT is like I of
I know you know it said like this just
like the documentation said it should
work and it didn't work but in Blazer I
was able able to make it work very
quickly so yeah I I feel your
frustration I wish I had a better answer
but ultimately that's what's got to
happen Apple and Google have to be the
same
company anybody
else yeah right
here five
minutes do you want the oh you want the
microphone yes thank you
great hi thanks Carl you say really
really interesting things by example
what you think about the future of wwp
and the windows platform and apps I'm
just thinking people starting know to if
you are already working with blazer by
example is it at this time a great
moment to go to mobile with doni or
should we wait until the progressive B
apps will be completely installable who
are already there is it the time to
invest in learn learning Mari knowing
that PW are there already and can be
installed on your windows and whatever
yeah that's a great question Denny um
like I said I it's my been my experience
and I've lived through all of these
things I've lived through silver light
I've lived through um you know
uwp and the blade in Windows 8
applications Metro
applications and um there's always seems
to be some sort of UI that's specific
that we should code to I'm here to tell
you man Blazer is the new
42 it's the answer to
everything because it runs everywhere it
runs on mobile it runs on Windows it
runs on Mac desktop you can write a WPF
application with blazer you can write a
Windows forms application with
blazer what else is there you know and
you're going to have a consistent UI
experience for each one of those things
and uh and I wouldn't worry about
performance because the web view control
which is what makes this all possible is
sort of like that phone Gap you know
Cordova idea where you're running it in
a in a very um lightweight browser
container right and yes it's going to
use more memory because you have the
edge chromium engine running but the
amount of memory that it's using is
probably insignificant compared to your
application and you
know what can I say I don't
I I'm not a fan of wwp just because it
locks you into that particular way of
working and I know that there are
Frameworks that have come out for mobile
that use uwp and go
everywhere but you know the web is the
web and it's it's free and it's open and
every and all the browser manufacturers
support it and Blazer is not certainly
not going anywhere yeah not not just uh
for web assembly which we're not even
using blazer for web assembly we're just
using the Blazer uh component model
which has great binding it has great
Eventing and uh just I've been using it
for years now ever since it came out and
I just love it I hope that answers your
question no it doesn't no is now the
time to start looking at uwp is that
what your question is
my maybe I asked my question wrong my
question was should I look into Mari
with blazing mobile bindings like this
or should I just focus on complete
Blazer applications and knowing that
there will be pwa installed because you
can already installing appli should I I
pronounce it wrong maybe so should I
combine
just do Blazer is your goal to write a
mobile app or an app that goes
everywhere IG bag you want an app that
goes everywhere right the same yeah well
you can do it either way right um
obviously making a mobile app and
putting it in the app store has
requirements you have to update it it's
not as easy as just having a a
pwa problems with
PW are that uh well Safari is better now
but up until you know a few months
ago you couldn't do
notifications with pwas with Safari
right so there were limitations it's
getting better now and I I kind of like
the PW idea because it is just like a
it's sort of The Best of Both Worlds
right but it has its challenges also
yeah how do you get people conditioned
to the idea that they have to go with
their browser to something and then find
in Safari the you know install on
desktop right I mean that whole process
is isn't very
intuitive
yeah so I I don't know I don't know what
to tell you but that's the State of
Affairs right now all right one more
question hello yeah I have a question
like would you recommend that for
production like for big app I'm sorry
can you speak up in the mic could you
recommend that for production will you
recommend that for production for big
apps right that we release this ma right
would you recommend that what do I
recommend for in production for like big
apps yeah big Enterprise apps mobile
apps that we build Enterprise apps
what's like comparison in performance
regarding like react native for example
should should we go with that platform
instead right are you talking mobile
apps yeah yeah mobile apps yes um yeah
and last question like can you run a
blazer libraries inside of this for
example M Blazer uh you know can you run
Blazer libraries I'm sorry what like M
Blazer do you know M Blazer yes yes can
you round that inside yeah in fact
Blazer modal is a third party Library so
yeah any anybody's you know Dev Express
telic whatever you can a mud Blazer you
can run those inside your mobile apps if
you're using Blazer
absolutely um what would I recommend I
think that it depends on the culture of
the Enterprise right if you're going to
customers customers like apps that are
in the app store that's all there is to
it um if you're going if you're in the
Enterprise and you want to you know
support everybody all your employees you
know then maybe just a regular Blazer
application web application is a good
idea maybe with some pwa a pwa version
of it um I think that's obviously easier
right because you you only have one code
base and your employees just expect oh I
can just go to this web page um I have a
Blazer web assembly pwa that I wrote for
my family my
kids because I have this slideshow that
runs in a on a big screen in my kitchen
area on the mantle and it just it's a
WPF app but it's connected via signal R
to a server and I have a pwa app that I
that they all install and they can see
what the current um picture is they can
upload pictures and then everybody sees
it and all of that stuff and it works
just fine it's a web assembly pwa it's a
simple app but it works just fine so
that I would think is akin to the
Enterprise solution where you're
building an app for your employees right
whereas if it's for customers I think
they expect an app in the app store
all right good
happy thank you very much have a good
[Applause]
day