Olipa kerran ollut yritys, jolla oli kaikki parhaat työkalut, ja ohjelmiston kirjoittaminen heidän alustalleen oli mahtavaa. Mutta hitaasti heistä tuli välinpitämättömiä omiin ongelmiinsa. He eivät huolestuneet, kun heidän järjestelmänsä kaatui, vaan hyväksyivät tämän maailmankaikkeuden tilan elämän tosiasiana. He uskoivat, että heidän ohjelmansa olivat täydellisiä itsessään, rauhallinen ja tyylikäs, tarkoituksensa itsestään selvä.
Voi poika, jos he vain tietäisivät kuinka väärässä he olivat ...
Se oli jo myöhässä, kun he huomasivat virheensä ja heidän toimitusjohtajansa huusi tuo kaikki kehittäjät takaisin jotka lähtivät laituriltaan ja purjehtivat pois. Yritys oli Microsoft ja minä, toisaalta, olin vakuuttunut siitä, että heidän kohtalonsa oli sinetöity ja että he hukkuvat hitaasti mutta varmasti teknologia-alan eturintamassa.
Olen niin onnellinen, että olin väärässä!
Viime vuosina Microsoft on vetänyt muutaman ässän hihastaan. Kyllä, he sekoittivat Skypen (vihaan silti heitä siitä), epäonnistuivat älypuhelimilla ja melkein onnistuivat tableteilla. Mutta he tekivät myös todella upeita asioita. He luopuivat suljetusta imperiumi-lähestymistavastaan, he avasivat lähdekoodin .NET, liittyivät Linux Foundationiin, julkaisivat SQL Server for Linuxin ja loivat tämän upean uuden työkalun nimeltä Visual Studio Macille .
Aivan, a todellinen Microsoft IDE ei Windowsille, vaan Macille. Kuvittele sitä!
Voit luoda Visual Studio for Mac -ohjelmalla melkein minkä tahansa tyyppisen sovelluksen. Se voi olla iOS, tvOS, Android, Mac, .NET Core tai jopa ASP.NET. Koska kaikki hienot lapset kirjoittavat nyt mobiilisovelluksia, voimme nähdä, mitä Visual Studio for Maciin tarvitaan luomaan C # -sovellus, joka toimii Androidilla ja iOS: llä.
Ensimmäinen asia, joka sinun on tehtävä, on valita sovellusmalli. Aloitetaan yksinkertaisella 'Single View -sovelluksella'.
Kun paketin nimi on täytetty ja sovelluksesi käynnistetty uudelleen, Visual Studio luo ratkaisun, jossa on kolme projektia. Ensimmäinen projekti on jaettu kirjasto, jossa sinun tulisi pitää alustasta riippumaton koodi, ja kaksi muuta ovat Android- ja iOS-sovelluksia.
Voit käynnistää sovelluksen Käynnistä-valikon tai sovelluspalkin komentojen avulla.
Onnittelut! Olet nyt iOS- ja Android-kehittäjä riippumatta siitä, ettet ole koskaan kirjoittanut riviä Objective-C-, Swift- tai Java-koodia.
Emme kuitenkaan ole vielä saavuttaneet paljoa sovelluksellamme. Tehdään asioista mielenkiintoisempia ja sisällytetään karttoja ja sijaintipalveluja.
Muista, että VS for Mac on edelleen 'Esikatselu' -ohjelmassa, eikä sen käytöstä ole paljon apua ja ohjeita. Paras paikka viitteisiin asioiden tekemisestä on edelleen virallinen Xamarin-dokumentaatio.
Visual Studio for Mac ei käytä samaa ratkaisua ja sovellusrakennetta kuin Xamarin-työkalut, jotka olet ehkä nähnyt tietokoneella. Useimmissa tapauksissa sinun täytyy kokeilla ja kiertää muutamia esteitä saadaksesi heidän esimerkkinsä toimimaan. Toivotaan, että Microsoft pysyy pelinsä huipulla ja tarjoaa mahtavan kokoelman MSDN-resursseja, kun VS for Mac -versio on julkaistu.
Mobiililaitteen resurssien, kuten nykyisen sijainnin, käyttäminen edellyttää, että käyttäjät myöntävät sovelluksellesi käyttöoikeudet manuaalisesti näiden resurssien käyttämiseen. iOS käyttää tiedostoa info.plist
tallentaa nämä asetukset. VS for Mac tarjoaa visuaalisen käyttöliittymän tämän tiedoston muokkaamiseen. Ensinnäkin meidän on lisättävä arvo asetukselle nimeltä NSLocationWhenInUseUsageDescription
.
Huomautus: VS näyttää pitkän nimen 'NSLocationWhenInUseUsageDescription', kun määrität ominaisuuden nimen. Tämä on odotettavissa, älä huoli siitä.
Bootstrapped -sovelluksemme luotiin yksinkertaisella painikkeella, joka laski napsautuksia. Ensimmäinen asia, jonka haluat tehdä, on poistaa se ja korvata näytön sisältö kartalla. Voit tehdä tämän etsimällä Main.storyboard
tiedosto ratkaisuselaimessa ja kaksoisnapsauttamalla sitä avataksesi sen editorissa.
Kuvakäsikirjoituksia esittelee Apple ja myös Xamarin. Viitata Applen dokumentaatio tai Xamarin-dokumentaatio Lisätietoja.
Poista painike ja lisää karttanäkymäkomponentti sivulle.
Varmista, että nimeät 'mapView' -komponentin oikein.
Ainoa mitä on jäljellä on puhdistaa ViewController.cs
ja muokkaa ViewDidLoad()
menetelmä vastaamaan seuraavia:
using CoreLocation; public override void ViewDidLoad() { base.ViewDidLoad(); // Perform any additional setup after loading the view, typically from a nib. CLLocationManager locationManager = new CLLocationManager(); locationManager.RequestWhenInUseAuthorization(); mapView.ShowsUserLocation = true; }
Voit käyttää pikakorjaustoimintoa saadaksesi VS: n lisäämään viitteen automaattisesti CoreLocation-kirjastoon, tai voit lisätä sen manuaalisesti.
Kun olet suorittanut iOS-sovelluksen, sinun pitäisi nähdä pyyntö käyttää sijaintiasi. Kun lupa on myönnetty, kartta latautuu tavallisella sinisellä pisteellä, joka näyttää sijaintisi (tai missä olet väärentämässäsi käyttämällä iOS-simulaattoria :)).
Valitettavasti Google ja Microsoft päättivät tehdä tästä yksinkertaisesta tehtävästä hieman monimutkaisemman kuin se oli iOS: n kanssa. Jotta voit käyttää karttoja Android-sovelluksessa, sinun on luotava Google Maps -sovellusliittymäavain ja lisättävä se AndroidManifest.xml
tiedosto.
Xamarin-kaverit loivat melko suoraviivan oppaan Google Maps -sovellusliittymäavaimen hankkiminen . Noudata heidän oppaansa ohjeita ennen kuin jatkat. Kun olet valmis, AndroidManifest.xml
tulisi sisältää tällainen asetus:
Xamarin.Forms.Maps
Olet nyt valmis lisäämään kartan sovellukseesi.
VS for Macin hienoa on, että sen virtana toimii NuGet, aivan kuten isoveljensä. Koska karttakäsittelykirjastoja ei ole oletusarvoisesti, sinun on asennettava LinearLayout
paketti.
Ei ole kuitenkaan 'Karttanäkymä' -komponenttia, jonka voit vetää 'Aktiviteettisi' -kohtaan. Sen sijaan kartan lisääminen näyttöön vaatii Resurssit-> asettelu-> Main.axml-tiedoston manuaalisen muuttamisen. Suunnittelijanäkymän avulla voit poistaa aiemmin luodun painikkeen, mutta siirtyä sitten Koodinäkymään ja lisätä seuraava fragmenttikoodi AndroidManifest.xml
MainActivity.cs
Kuten iOS: ssä, joudut määrittämään sovelluksesi pyytämään oikeita käyttöoikeuksia. Voit tehdä tämän avaamalla using Android.Gms.Maps.Model; using Android.Gms.Maps; using Android.Locations; Make your MainActivity also a ILocationListener. public class MainActivity : Activity, ILocationListener Implement the ILocationListener methods within your MainActivity: public void OnProviderEnabled(string provider) {} public void OnProviderDisabled(string provider) {} public void OnStatusChanged(string provider, Availability status, Bundle extras) {} public void OnLocationChanged(Android.Locations.Location location) { LatLng latLng = new LatLng(location.Latitude, location.Longitude); CameraPosition.Builder builder = CameraPosition.InvokeBuilder(); builder.Target(latLng); builder.Zoom(15); builder.Bearing(155); builder.Tilt(10); CameraPosition cameraPosition = builder.Build(); CameraUpdate cameraUpdate = CameraUpdateFactory.NewCameraPosition(cameraPosition); MapFragment mapFrag = (MapFragment)FragmentManager.FindFragmentById(Resource.Id.map); GoogleMap map = mapFrag.Map; if (map != null) { map.MoveCamera(cameraUpdate); } }
muokkausta varten ja napsauta editorin vasemmassa alakulmassa olevaa ”Application” -painiketta. VS näyttää visuaalisen käyttöliittymän näiden arvojen asettamiseksi. Sinun on otettava käyttöön muutama niistä, kuten alla on esitetty.
Nyt on aika kirjoittaa oikea koodi. Etsi LocationManager locMgr; string locationProvider;
tiedosto, avaa se muokkausta varten ja tee seuraavat muutokset:
Lisää nimiavaruusviitteet:
OnCreate()
Lisää seuraavat kaksi muuttujaa luokan tason muuttujiksi:
protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); // Set our view from the 'main' layout resource SetContentView(Resource.Layout.Main); locMgr = GetSystemService(LocationService) as LocationManager; Criteria locationCriteria = new Criteria(); locationCriteria.Accuracy = Accuracy.Coarse; locationCriteria.PowerRequirement = Power.Medium; locationProvider = locMgr.GetBestProvider(locationCriteria, true); locMgr.RequestLocationUpdates(locationProvider, 2000, 1, this); }
Ja puhdista OnCreate()
tapa näyttää tältä:
MainActivity
Soittamalla GetSystemServicelle ILocationListener
-sivulta menetelmä, RestClient.cs
aktivoidaan muodossa using System; using System.Net; namespace testshared { public delegate void callback(string responseText); class ReqState { public ReqState(HttpWebRequest req, callback cb) { request = req; callback = cb; } public HttpWebRequest request { get; set; } public callback callback; } public class RestClient { public RestClient() {} public void FetchPage(string url, callback cb) { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.BeginGetResponse(new AsyncCallback(FinishWebRequest), new ReqState(request, cb)); } private void FinishWebRequest(IAsyncResult result) { ReqState reqState = (result.AsyncState as ReqState); HttpWebResponse response = reqState.request.EndGetResponse(result) as HttpWebResponse; using (var reader = new System.IO.StreamReader(response.GetResponseStream())) { string responseText = reader.ReadToEnd(); reqState.callback(responseText); } } } }
ja pystyy siten käsittelemään kaikkia yllä lueteltuja tapahtumia.
Suorita Android-sovelluksesi ja sinun tulisi saada kartta sijaintisi mukaiseksi, samanlainen kuin seuraava kuva.
Yksi VS for Macin suurimmista ominaisuuksista on mahdollisuus jakaa koodi iOS- ja Android-sovellusten välillä. Ihannetapauksessa meillä voisi olla koko sovelluksen liiketoimintalogiikka jaetussa kirjastossa, mikä rajoittaisi kaikki iOS- ja Android-koodit osaksi käyttöliittymää.
Luodaan jaettu luokka, joka suorittaa asynkronisesti HTTP-pyynnön ja näyttää sisällön Debug-konsolissa.
Luo uusi luokkatiedosto jaettuun kirjastoon nimeltä ViewController.cs
seuraavalla koodilla:
(Varmista, että käytät projektisi oikeaa nimiavaruutta)
using System; using UIKit; using System.Diagnostics; namespace testshared.iOS { public partial class ViewController : UIViewController { RestClient rest = new RestClient(); public ViewController(IntPtr handle) : base(handle) {} public override void ViewDidLoad() { base.ViewDidLoad(); // Perform any additional setup after loading the view, typically from a nib. Button.AccessibilityIdentifier = 'myButton'; Button.TouchUpInside += delegate { Button.SetTitle('Loading...', UIControlState.Normal); rest.FetchPage('http://www.google.com', doneCallback); }; } public void doneCallback(string content) { InvokeOnMainThread(() => { Debug.Write(content); Button.SetTitle('All Done', UIControlState.Normal); }); } public override void DidReceiveMemoryWarning() { base.DidReceiveMemoryWarning(); // Release any cached data, images, etc that aren't in use. } } }
Muokkaa MainActivity.cs
tiedosto iOS-projektissa vastaamaan seuraavaa koodia:
(Varmista, että käytät projektisi oikeaa nimiavaruutta)
using Android.App; using Android.Widget; using Android.OS; namespace testshared.Droid { [Activity(Label = 'testshared', MainLauncher = true, Icon = '@mipmap/icon')] public class MainActivity : Activity { RestClient rest = new RestClient(); protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); // Set our view from the 'main' layout resource SetContentView(Resource.Layout.Main); // Get our button from the layout resource, // and attach an event to it Button button = FindViewById(Resource.Id.myButton); button.Click += delegate { button.Text = $'Loading...'; rest.FetchPage('http://www.google.com', doneCallback); }; } public void doneCallback(string content) { RunOnUiThread(() => { Button button = FindViewById(Resource.Id.myButton); button.Text = 'All done'; System.Diagnostics.Debug.WriteLine(content); }); } } }
Suorita iOS-sovelluksesi, napsauta painiketta ja tarkista Visual Studion Sovelluksen ulostulo -välilehti. Sen pitäisi näyttää jotain tällaista:
Android-sovelluksessa tarvittavat muutokset ovat hyvin samanlaisia kuin iOS: ssä tarvittavat muutokset. Muokkaa RunOnUiThread
tiedosto vastaamaan seuraavia:
(Varmista, että käytät projektisi oikeaa nimiavaruutta)
InvokeOnMainThread
Huomautus: Molempien alustojen, Androidin ja iOS: n järjestelmäarkkitehtuuri edellyttää, että kaikki käyttöliittymän vuorovaikutukset tapahtuvat pääsovellusketjussa. Tämä tarkoittaa, että kaikkien käyttöliittymän elementtien muutosten tulisi tapahtua myös pääkehyksestä. Siellä doneCallback()
ja |_+_|
koska HTTP-pyynnöt suoritettiin erillisessä säikeessä ja kutsuttiin pääkierteen ulkopuolelle, meidän oli käytettävä näitä menetelmiä päästäksesi painikkeisiin ja vaihtamaan tarraa.
Visual Studion Mac-tietokoneella on vielä muutamia ryppyjä selvitettävissä, mutta ensimmäisestä tarkastelustani olen erittäin innoissani sen tulevaisuudesta. Mobiilisovellusten tarve kasvaa päivittäin, ja Visual Studio for Macin avulla Microsoft on mahdollistanut edelleen armeijan hienoja C # -kehittäjiä täyttämään tämän tarpeen.
Swiftillä ja Java / JVM: llä on nyt uusi ja erittäin vahva kilpailija taistelussa mobiililaitteiden kehitysympäristöistä. Liittyvät: .NET Core - villin ja avoimen lähdekoodin käyttö. Microsoft, mikä vei sinut niin kauan ?! Liittyvät: Dart-kieli: Kun Java ja C # eivät ole tarpeeksi teräviä