昔々、最高のツールをすべて備えている会社があり、そのプラットフォーム用のソフトウェアを書くことは素晴らしかったです。しかし、ゆっくりと、彼らは自分たちの問題に無関心になりました。彼らのシステムがクラッシュしたとき、彼らは心配することはありませんでしたが、むしろこの宇宙の状態を人生の事実として受け入れました。彼らは、彼らのプログラムは彼ら自身の中で完璧であり、穏やかでエレガントであり、彼らの目的は自明であると信じていました。
ああ、彼らがどれほど間違っているかを知っているだけなら…
彼らが彼らの過ちに気づき、彼らのCEOが叫んだとき、それはかなり遅れていました すべての開発者を呼び戻す プラットフォームを離れて出航した人。会社は マイクロソフト そして私は、彼らの運命は封印されており、テクノロジー業界の最前線からゆっくりと、しかし確実に消滅するだろうと確信していました。
私は間違っていたのでとても幸せです!
過去数年間で、マイクロソフトは彼らの袖からいくつかのエースを引っ張ってきました。はい、彼らはSkypeを台無しにし(私はまだそれが嫌いです)、スマートフォンで失敗し、タブレットでほぼ成功しました。しかし、彼らはいくつかの本当に素晴らしいこともしました。彼らはクローズドエンパイアアプローチを放棄し、.NETをオープンソース化し、Linux Foundationに参加し、Linux用のSQL Serverをリリースし、この素晴らしい新しいツールを作成しました。 Visual Studio for Mac 。
そうです、 リアル Windows用ではなくMac用のMicrosoftIDE。想像してみろ!
Visual Studio for Macを使用して、ほぼすべての種類のアプリケーションを作成できます。 iOS、tvOS、Android、Mac、.NET Core、さらにはASP.NETでもかまいません。かっこいい子供たち全員がモバイルアプリを作成しているので、AndroidとiOSで実行されるC#アプリケーションを作成するためにVisual Studio forMacで何が必要かを見てみましょう。
最初に行う必要があるのは、アプリケーションテンプレートを選択することです。簡単な「シングルビューアプリ」から始めましょう。
パッケージ名を入力してアプリをブートストラップした後、VisualStudioは3つのプロジェクトでソリューションを作成します。最初のプロジェクトは、プラットフォームに依存しないコードを保持する必要がある共有ライブラリであり、他の2つはAndroidアプリとiOSアプリです。
「実行」メニューまたはアプリケーションバーのコマンドを使用して、アプリを起動できます。
おめでとう!これで、Objective-C、Swift、またはJavaコードの行を作成したことがないという事実に関係なく、iOSおよびAndroidの開発者になりました。
ただし、このアプリではまだあまり成果を上げていません。物事をもっと面白くして、地図と位置情報サービスを取り入れましょう。
クレジットカードハッカー100の新しい番号
VS for Macはまだ「プレビュー」にあり、それを使用する上で見つけるヘルプやドキュメントはあまりないことを覚えておいてください。物事を行う方法についての参照に最適な場所は、依然として公式のXamarinドキュメントです。
Visual Studio For Macは、PCで見た可能性のあるXamarinツールと同じソリューションとアプリケーション構造を使用していません。ほとんどの場合、例を機能させるには、いくつかのハードルを実験して回避する必要があります。 VS for Macの最終バージョンがリリースされたら、Microsoftがゲームのトップを維持し、MSDNリソースのすばらしいコレクションを提供することを期待しましょう。
現在地などのモバイルデバイスリソースにアクセスするには、ユーザーがそれらのリソースを使用するための権限をアプリに「手動で」付与する必要があります。 iOSはファイルを使用しますinfo.plist
これらの設定を保存します。 VS for Macは、このファイルを編集するためのビジュアルインターフェイスを提供します。最初に行う必要があるのは、NSLocationWhenInUseUsageDescription
という名前の設定に値を追加することです。
注意: プロパティ名を設定すると、VSは「NSLocationWhenInUseUsageDescription」の長い名前を表示します。これは予想されることであり、心配する必要はありません。
ブートストラップされたアプリケーションは、クリック数をカウントする単純なボタンで作成されました。最初にやりたいことは、それを削除して、画面のコンテンツを地図に置き換えることです。これを行うには、Main.storyboard
を探しますソリューションブラウザでファイルをダブルクリックし、エディタで開きます。
ストーリーボードはAppleによって導入され、Xamarinでも採用されています。参照する Appleドキュメント または Xamarinドキュメント 詳細については。
ボタンを削除し、マップビューコンポーネントをページに追加します。
「mapView」コンポーネントに適切な名前を付けてください。
今残っているのはあなたのViewController.cs
を片付けることだけですファイルを作成し、ViewDidLoad()
を変更します以下に一致する方法:
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; }
「クイック修正」機能を使用して、VSにCoreLocationライブラリへの参照を自動的に追加させるか、手動で追加することができます。
iOSアプリを実行すると、現在地にアクセスするためのリクエストが表示されます。許可が与えられると、マップはあなたがどこにいるのか(またはiOSシミュレーターを使用してどこにいるのかを示す標準の青い点でロードされます:))。
jsはタイムスタンプを日付に変換します
残念ながら、GoogleとMicrosoftは、この単純なタスクをiOSの場合よりも少し複雑にすることにしました。 Androidアプリケーションで地図を使用するには、Google Maps APIキーを作成し、それをAndroidManifest.xml
に追加する必要があります。ファイル。
Xamarinの連中は、 Google MapsAPIキーの取得 。続行する前に、ガイドの手順に従ってください。完了したら、AndroidManifest.xml
次のような設定が含まれている必要があります。
Xamarin.Forms.Maps
これで、アプリケーションにマップを追加する準備が整いました。
VS for Macの優れている点は、兄貴のようにNuGetを搭載していることです。マップ処理ライブラリはデフォルトで含まれていないため、LinearLayout
をインストールする必要がありますパッケージ。
ただし、「アクティビティ」にドラッグするだけの「マップビュー」コンポーネントはありません。代わりに、画面にマップを追加するには、Resources-> layout-> Main.axmlファイルを手動で変更する必要があります。デザイナビューを使用して、前に作成したボタンを削除できますが、「コードビュー」に切り替えて、次のフラグメントコードをAndroidManifest.xml
に追加します。
MainActivity.cs
iOSと同様に、適切な権限を要求するようにアプリを構成する必要があります。これを行うには、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); } }
を開きます編集するには、エディタの左下にある「アプリケーション」ボタンをクリックします。 VSは、これらの値を設定するための視覚的なインターフェイスを表示します。以下に示すように、有効にする必要があるものがいくつかあります。
今度は実際のコードを書く時です。 LocationManager locMgr; string locationProvider;
を見つけますファイルを開いて編集し、次の変更を加えます。
名前空間参照を追加します。
OnCreate()
次の2つの変数をクラスレベルの変数として追加します。
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); }
そして、OnCreate()
をクリーンアップしますこのように見える方法:
MainActivity
ILocationListener
内からGetSystemServiceを呼び出す。メソッド、あなたのRestClient.cs
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); } } } }
としてアクティブ化されますこれにより、上記のすべてのイベントを処理できるようになります。
Androidアプリケーションを実行すると、次の画像のように、地図が現在地に配置されます。
VS for Macの最大の機能の1つは、iOSアプリとAndroidアプリの間でコードを共有できることです。理想的には、アプリのすべてのビジネスロジックを共有ライブラリに入れて、iOSおよびAndroid固有のコードをUIの一部に制限することができます。
HTTPリクエストを非同期的に実行し、デバッグコンソールにコンテンツを表示する共有クラスを作成しましょう。
ViewController.cs
という名前の共有ライブラリに新しいクラスファイルを作成します次のコードで:
(プロジェクトの正しい名前空間を使用してください)
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. } } }
MainActivity.cs
を変更します次のコードに一致するiOSプロジェクトのファイル:
セキュリティコードでハッキングされたクレジットカード
(プロジェクトの正しい名前空間を使用してください)
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); }); } } }
iOSアプリを実行し、ボタンをクリックして、VisualStudioの[アプリケーション出力]タブを確認します。次のように表示されます。
Androidアプリで必要な変更は、iOSで必要な変更と非常によく似ています。 RunOnUiThread
を変更します以下に一致するファイル:
(プロジェクトの正しい名前空間を使用してください)
InvokeOnMainThread
注意: AndroidとiOSの両方のプラットフォームのシステムアーキテクチャでは、すべてのUI操作がメインアプリケーションスレッドで行われる必要があります。つまり、UI要素への変更は、メインスレッド内からも行う必要があります。ここでdoneCallback()
および|_+_|
HTTPリクエストは別のスレッドで実行されたためメインスレッドの外部で呼び出された場合、ボタンにアクセスしてラベルを変更できるようにするには、これらのメソッドを使用する必要がありました。
Visual Studio for Macにはまだ解決すべき問題がいくつかありますが、最初に見てから、その将来に非常に興奮しています。モバイルアプリケーションの必要性は日々高まっており、MicrosoftはVisual Studio for Macを使用して、 優れたC#開発者 この必要性を満たすために。
SwiftとJava / JVMは、モバイルデバイス開発環境をめぐる戦いにおいて、新しく、非常に強力な競争相手になりました。 関連: .NETCore-ワイルドでオープンソース化。マイクロソフト、どうしてそんなに時間がかかったの? 関連: Dart言語:JavaとC#が十分にシャープでない場合