Microsoftテクノロジースタックを使用して、エンタープライズ環境での参照によるiOSアプリの配布



最近、マイクロソフトによるXamarinの購入について知られるようになりました。 このニュースは、開発者コミュニティだけでなく、企業クライアントの間でも気付かれることはありませんでした。 この点で、Microsoftフルスタック環境にモバイルソリューションを統合する必要がある場合、ITホテルまたは会社全体の能力の劇的な拡大を必要としないストーリーがより重要になります。 このようなシナリオでは、SharePoint、ASP.NET MVC、WebAPIサービス、およびAzureで構成されるパズルにうまく適合するコンポーネントとしてXamarinを選択することが簡潔になります。
この記事では、リストされたマイクロソフトテクノロジスタックを使用して、主にプロトタイピング段階で企業内にモバイルアプリケーションを配布する方法について説明します。
この記事で説明されている方法は、.NET環境のバイアスにもかかわらず、Apache Cordovaでもクラシックネイティブでも、他の開発ツールを使用して記述されたiOSアプリケーションに適用できます。


はじめに



以前の記事では、例としてOS X Serverを使用して、MDMソリューションを介して企業のiOSアプリケーションを配布する方法を検討しました。 この記事では、Microsoftの技術スタックを使用して、参照によってアプリケーションを配布する方法に焦点を当てます。

この記事がマイクロソフトのツールに焦点を当てているのはなぜですか? 答えは表面にあります。 会社が大規模な場合、ほとんどの場合、SharePointを扱っています。つまり、.NETの開発経験のある従業員を意味します。 ただし、他のテクノロジー(PHPなど)でも同じことができます。

通常、リンク配布方法は、ユーザーの数が非常に限られており、アプリケーションを自動的に更新する必要がない場合、またはプロトタイプの開発中に社内にテスターまたはプロジェクトキュレーターのグループがいる場合に選択されます。

ご注意
Microsoftには、System Center Configuration ManagerおよびWindows Intuneの上に構築されたMDMソリューションもあります。 リンクを1回2 3 クリックすることで、それらに関する詳細情報を取得できます。


問題の声明



私たちの前に設定されているタスクと、それらの実装に必要なリソースを決めましょう。


選択した方法を使用する前に考慮する必要がある欠点をリストします。


新しいユーザー(iOSデバイス)を追加するときのアクションの簡単なシーケンスは次のとおりです。


iTunesまたはApple Configurator 2を使用して、デバイスのUDIDを取得できます。ただし、このプロセスを自動化するのが自然な望みです。 これは、拡張子* .mobileconfigを持ち、XML構造を持つファイルであるプロファイル( iOS Configuration Profile )の助けを借りて可能です。
要するに、それは次のように機能します:* .mobileconfigファイルで、iOSデバイスからリクエストするパラメーター(この場合はUDID)、およびフィールドが入力されたiOSデバイスが応答XMLファイルを送信する戻りURLを指定します。

直接リンクを介してアプリケーションをダウンロードおよびインストールする機能を提供することには、この記事で検討する多くの機能もあります。 その1つは、HTTPSを使用する必要があることです。


概念図と作業計画



このメソッドを使用するときにアクションの範囲を把握できるように、2つのスキームを用意しました。

Apple Developer Programアカウントを使用した参照によるアプリの配布


Apple Developer Enterprise Programアカウントを使用した参照によるアプリの配布



ご覧のとおり、標準のApple Developer Programアカウントを使用すると、多くのオーバーヘッドが発生します。 それでも、この特定のオプションを最も難しいものと考えます。

ストーリーを3つのセクションに分けたので、正しい順序で情報を把握するのに便利でした。 それらを「ステップ」と呼びます。 それでは、私たちがしなければならないことを簡単に見てみましょう。

ステップ1:ユーザーのiOSデバイスのUDIDを取得します。


ステップ2:リンクからアプリケーションをインストールします。


ステップ3: Windows Server 2012に基づく企業環境での展開(有効なSSL証明書を持つ外部サイトが利用できない場合、ステップ2への変更が含まれます):



ご注意
この分野の表面的な知識を持っている人でも、説明されたソリューションを設定するのが困難にならないように、すべての段階と中間ステップの詳細な説明を意図的に提供します。 したがって、寛大にしてください。 この記事は「教育資料」としてマークされています。 ありがとう


ステップ1:ユーザーのiOSデバイスのUDIDを取得する



iOSデバイスのUDIDを取得するには、ASP.NET WebAPI 2を使用します。これは、すぐに提供される便利なソリューションです。


WebAPIプロジェクトの作成



ステップ 1および2のサイトとして、Microsoft Azureを使用します。 デフォルトでは、有効なSSL証明書が* .azurewebsites.netサイトに提供されます。これはステップ 2で必要になります。もちろん、企業で使用する場合は、少なくとも最も単純な認証も提供する必要があります。 ただし、これはこの記事の範囲をはるかに超えています。

* .mobileconfigファイルを作成し、WebAPIプロジェクト「Downloads / corp-apps.mobileconfig」のディレクトリに配置します。
* .Mobileconfigファイルの内容
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>PayloadContent</key> <dict> <key>URL</key> <string>http://iphone-udid.azurewebsites.net/api/xml</string> <key>DeviceAttributes</key> <array> <string>UDID</string> <string>IMEI</string> <string>ICCID</string> <string>VERSION</string> <string>PRODUCT</string> </array> </dict> <key>PayloadOrganization</key> <string>Corp Apps</string> <key>PayloadDisplayName</key> <string>CorpApps</string> <key>PayloadVersion</key> <integer>1</integer> <key>PayloadUUID</key> <string>B43A078F-E0E2-4F52-B1E6-C03AD7032EDF</string> <key>PayloadIdentifier</key> <string>com.CorpApps.profile-service</string> <key>PayloadDescription</key> <string>This temporary profile will be used to find and display your current device's UDID.</string> <key>PayloadType</key> <string>Profile Service</string> </dict> </plist> 



このファイルでは、2つのフィールドに注意する必要があります。

URLは、iOSデバイスから送信されたXMLファイルを処理するAPIコントローラーのアドレスです。
私の場合、Azureでホストされているサイトへのリンクを提供します。/api/xmlはWebAPIコントローラーのPOSTメソッドです。
  http://iphone-udid.azurewebsites.net/api/xml 

PayloadUUID-このフィールドを記述する最も簡単な方法は一意のGUIDであり、同じiOSデバイス内で繰り返さないでください。
一意のUUID(PayloadUUID)は、uuidgenユーティリティを使用してOS Xで生成できます。

uuidgenユーティリティの使用
  os-x-server:~ zanael$ uuidgen -- generate a universally unique identifier usage: uuidgen [-hdr] -hdr emit result in form suitable for coping into a header os-x-server:~ zanael$ uuidgen B43A078F-E0E2-4F52-B1E6-C03AD7032EDF os-x-server:~ zanael$ 


uuidgenユーティリティの結果



登録済みのUDIDを保存するXMLファイルを作成します。 これをudids.xmlと呼び、WebAPIプロジェクト「App_Data / udids.xml」のディレクトリに配置します。
登録済みのUDIDを保存するためのXMLファイル構造
  <?xml version="1.0" encoding="utf-8"?> <udids> <iPhone> <TimeAdded></TimeAdded> <UDID></UDID> </iPhone> </udids> 



プロファイルファイルをWeb.configにダウンロードするためのアクセス許可を追加します。
Web.configに必要な変更
  <?xml version="1.0" encoding="utf-8"?> <configuration> <system.webServer> <staticContent> <mimeMap fileExtension=".mobileconfig" mimeType="application/x-apple-aspen-config" /> </staticContent> </system.webServer> </configuration> 



モデルを追加して、Modelsフォルダーに登録済みUDIDに関する情報を保存します。
ファイルiPhoneUDID.cs
  namespace iPhoneUDID.Models { public class iPhoneUDID { public string TimeAdded { get; set; } public string UDID { get; set; } } } 



ControllersフォルダーにHomeController(MVCコントローラー)を作成し、それにメソッドを追加して、XMLから登録されたUDIDのリストを表示します。
ファイルHomeController.cs
  using System; using System.Collections.Generic; using System.Web.Mvc; using System.Xml.Linq; namespace iPhoneUDID.Controllers { public class HomeController : Controller { [HttpGet] public ActionResult Index() { ViewBag.Title = "Home Page"; XDocument databaseXML; try { databaseXML = XDocument.Load(System.Web.Hosting.HostingEnvironment.MapPath("~/App_Data/udids.xml")); } catch (Exception exp) { databaseXML = new XDocument(new XElement("udids")); } List<Models.iPhoneUDID> UDIDs = new List<Models.iPhoneUDID>(); XElement iPhones = databaseXML.Element("udids"); foreach (XElement e in iPhones.Elements("iPhone")) { UDIDs.Add(new Models.iPhoneUDID { TimeAdded = e.Element("TimeAdded").Value, UDID = e.Element("UDID").Value }); } ViewBag.UDIDs = UDIDs; return View(); } } } 



HomeControllerのビュー(Index.cshtml)を追加します。これはユーザーを歓迎し、UDIDの登録を要求します。
Take UDIDボタンをクリックすると、ユーザーがプロファイルをダウンロードし、iOSデバイスは必要なパラメーターを理解し、XML形式の* .mobileconfigファイルで指定したURLにそれらを送信します。
ファイル/Views/Home/Index.cshtml
  <div class="jumbotron"> <h1>Get your UDID</h1> <p class="lead">Please, reach this page in Mobile Safari from your iPhone.</p> <p><a href="/downloads/corp-apps.mobileconfig" class="btn btn-primary btn-lg">Take UDID</a></p> </div> <div class="row"> <p> @{ foreach (iPhoneUDID.Models.iPhoneUDID item in ViewBag.UDIDs) { <h5>TimeAdded: @item.TimeAdded, UDID: @item.UDID</h5> } } </p> </div> <div class="row"> @Html.ActionLink("Clear UDIDs list", "ClearHistory", "Home", null, new { @class = "btn btn-primary btn-large" }) </div> 



ControllersフォルダーにXmlController(WebApi2コントローラー)を作成します。これにより、iOSデバイスからXMLファイルをキャッチし、そこから受信したUDIDをローカルXMLに保存します。
Windowsマシンを使用しているため、ファイルの2番目の部分は異なるエンコードになります。 これは、* .plist変換ライブラリを使用して修正できます。 これらはGitHubで見つけることができますが、UDIDのみが必要なので、行の特定の位置から基本要素を取得できます。 これにより、不必要な中毒をドラッグできなくなります。
XmlController.csファイル
  using System; using System.Net; using System.Net.Http; using System.Web.Http; using System.Xml.Linq; namespace iPhoneUDID.Controllers { public class XmlController : ApiController { [HttpPost] public HttpResponseMessage PostRawXMLMessage(HttpRequestMessage request) { string plist = request.Content.ReadAsStringAsync().Result; int begin = plist.IndexOf("UDID") + 20; int end = plist.IndexOf("<", begin); string UDID = plist.Substring(begin, end - begin); XDocument databaseXML; try { databaseXML = XDocument.Load(System.Web.Hosting.HostingEnvironment.MapPath("~/App_Data/udids.xml")); } catch (Exception exp) { databaseXML = new XDocument(new XElement("udids")); } databaseXML.Element("udids").Add( new XElement("iPhone", new XElement("TimeAdded", DateTime.Now.ToLongTimeString() + " - " + DateTime.Now.ToShortDateString()), new XElement("UDID", UDID))); databaseXML.Save(System.Web.Hosting.HostingEnvironment.MapPath("~/App_Data/udids.xml")); HttpResponseMessage response = request.CreateResponse(HttpStatusCode.MovedPermanently); response.Headers.Add("Location", "/Thanks"); return response; } } } 



ユーザーがUDIDを受信した後にリダイレクトされるThanksController(MVCコントローラー)を作成します。
ThanksController.csファイル
  using System.Web.Mvc; namespace iPhoneUDID.Controllers { public class ThanksController : Controller { [HttpGet] public ActionResult Index() { ViewBag.Title = "Thanks Page"; return View(); } } } 



ThanksControllerのビュー(Index.cshtml)を追加します。
ファイル/Views/Thanks/Index.cshtml
  <div class="jumbotron"> <h1>Thanks for Attending!</h1> </div> 



受信したUDIDでローカルXMLをクリアするには、ClearHistoryメソッドをHomeController(MVCコントローラー)に追加します。
ファイルHomeController.cs
  [HttpGet] public ActionResult ClearHistory() { ViewBag.Title = "Home Page"; XDocument databaseXML = new XDocument(new XElement("udids")); databaseXML.Save(Server.MapPath("/App_Data/udids.xml")); ViewBag.UDIDs = new List<Models.iPhoneUDID>(); return View("Index"); } 



これが一般的なレイアウト(_Layout.cshtml)の外観です-テンプレートの標準です。
_Layout.cshtmlファイル
  <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width" /> <title>@ViewBag.Title</title> @Styles.Render("~/Content/css") @Scripts.Render("~/bundles/modernizr") </head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <body> <div class="navbar navbar-inverse navbar-fixed-top"> <div class="container"> <div class="navbar-header"> <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse"> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> @Html.ActionLink(" ", "Index", "Home", new { area = "" }, new { @class = "navbar-brand" }) </div> <div class="navbar-collapse collapse"> <ul class="nav navbar-nav"> <li>@Html.ActionLink(" ", "Index", "Home", new { area = "" }, null)</li> <li>@Html.ActionLink("API", "Index", "Help", new { area = "" }, null)</li> </ul> </div> </div> </div> <div class="container body-content"> @RenderBody() <hr /> <footer> <p>© @DateTime.Now.Year –  ASP.NET</p> </footer> </div> @Scripts.Render("~/bundles/jquery") @Scripts.Render("~/bundles/bootstrap") @RenderSection("scripts", required: false) </body> </html> 



これで、ユーザーが必要とするのは、サイトにアクセスしていくつかのボタンを押すだけです。
ユーザーアクション




[詳細]をクリックした場合









その後、サイトにそのUDIDが表示されます。
登録済みUDIDのリスト



最後に、iOSデバイスのUDIDを手に入れました。これを開発者アカウントに登録する必要があります。
メンバーセンターセクションのApple開発者サイトにアクセスします。
詳細








iOSデバイスのUDIDを追加します。
詳細




App IDを作成していない場合は、作成します。
詳細




アプリケーションのプロビジョニングプロファイルを作成します。
詳細














これで、いつでもこの配布プロファイルにデバイスを追加できます。






ステップ2:リンク経由でアプリケーションをインストールする



iOSデバイスのUDIDを受け取って開発者アカウントに追加し、プロビジョニングプロファイルを変更した後、アプリケーションのインストールに必要なファイルが配置されるWebリソースをユーザーに提供する必要があります。 このようなリソースとして、Microsoft Azureを使用します。これは、デフォルトで* .azurewebsites.netサイトに有効なSSL証明書を提供します。 サイトの名前として、次を選択します。
  https://corp-apps.azurewebsites.net 

ご注意
参照によるアプリケーションのインストールは、有効なSSL証明書でHTTPSを使用する場合にのみ機能します。

Webサイトを作成するプロジェクトとして、コントローラーなしで最も単純なテンプレートを選択できます。 必要なのは、HTMLページといくつかの追加ファイルをダウンロードする機能だけです。
詳細



これで、必要なファイルの準備を開始できます。 これを行うには、Xcodeを使用してアプリケーションパッケージをエクスポートします。
詳細















アプリケーションの配布に必要な情報を入力します。 ファイル拡張子に注意してください。


詳細



エクスポートが完了すると、必要なリソースへのパスと、必要な形式とサイズの写真が含まれるmanifest.plistマニフェストが宛先フォルダーに表示されます。
Manifest.plistファイルの内容
  <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>items</key> <array> <dict> <key>assets</key> <array> <dict> <key>kind</key> <string>software-package</string> <key>url</key> <string>https://corp-apps.azurewebsites.net/app-files/myApp.ipa</string> </dict> <dict> <key>kind</key> <string>display-image</string> <key>url</key> <string>https://corp-apps.azurewebsites.net/app-files/image.57x57.png</string> </dict> <dict> <key>kind</key> <string>full-size-image</string> <key>url</key> <string>https://corp-apps.azurewebsites.net/app-files/image.512x512.jpg</string> </dict> </array> <key>metadata</key> <dict> <key>bundle-identifier</key> <string>com.habr.hellohabr001</string> <key>bundle-version</key> <string>0.0.1</string> <key>kind</key> <string>software</string> <key>title</key> <string>myApp</string> </dict> </dict> </array> </dict> </plist> 



次に、指定されたタイプのファイルをサーバーからダウンロードできるようにする必要があります。 これは、Web.configファイルに変更を加えることで実行できます。
Web.configファイルに必要な変更
  <?xml version="1.0" encoding="utf-8"?> <configuration> <system.webServer> <staticContent> <mimeMap fileExtension=".jpg" mimeType="image/jpg" /> <mimeMap fileExtension=".png" mimeType="image/png" /> <mimeMap fileExtension=".plist" mimeType="text/plain" /> <mimeMap fileExtension=".ipa" mimeType="application/octet-stream" /> </staticContent> </system.webServer> </configuration> 



そして最後に、アプリケーションをダウンロードするための特別なリンクを持つユーザー用のhtmlページを追加します。
Index.htmlファイル
  <!doctype html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title> </title> <link rel="stylesheet" href="dist/bootstrap.min.css"> </head> <body> <div class="container"> <br><br> <h1 class="text-center">Hello Apache Cordova</h1> <p class="text-center"> <a href="itms-services://?action=download-manifest&url=https://corp-apps.azurewebsites.net/app-files/manifest.plist" class="btn btn-info" type="button">Install App</a> </p> <br><br> </div> </body> </html> 



ユーザーが行う必要があるのは、いくつかのボタンをクリックするだけです。
開発ツールに関するメソッドの汎用性を強調するために、この例ではApache Cordovaで記述されたアプリケーションを使用しました。 Xamarinなどの他のツールについても同様です。
ユーザーアクション











手順3:Windows Server 2012エンタープライズ環境に展開する



そのため、外部プラットフォームが利用できない場合に最も困難なシナリオになります。 この場合、Windows Server 2012とIIS 8を使用します。

明確にするために、2つの個別のサイトを展開します。

ご注意
iphone-udid-zzzz.comにHTTPSをインストールする必要はありません。IISの構成を示すためにこのケースを使用してください。

指定されたドメイン名を使用してサイトにアクセスするには、構成済みのDNSサーバーが必要です(この例では、Active Directoryドメインコントローラー、DNSサーバー、およびサイト自体が同じマシンに展開されています)。

サイトの直接表示ゾーンの作成を始めましょう。 これを行うには、サーバーマネージャーを使用します。
詳細











iOSデバイスのUDIDを受信するためのサイトの直接表示ゾーンiphone-udid-zzzz.comを作成します。
詳細







アカデミックな目的のために、考慮すべき重要なネットワーク設定を提供します。
詳細
サーバーネットワークアダプターの設定(192.168.0.1はWiFiルーターのIPアドレス)



WiFiルーターのDNS設定。 D-Linkの場合、DNSサーバーの順序が重要です。



Windows Server 2012を実行している仮想マシンのネットワークアダプター設定。




ノード(AまたはAAAA)を作成します。
詳細


サーバーのIPアドレスを登録します



FQDN名を使用してサイトにアクセスできることを確認してください。 DNSキャッシュをクリアしましょう。





素晴らしい、すべてが機能していることがわかります。


アプリケーションのダウンロードサイトcorp-apps-zzzz.comに対して同じアクションチェーンを繰り返しましょう。
詳細







これで、IISのインストールと構成を開始できます。
詳細








[Webサーバー(IIS)]を選択します。



ここでは、すべてを変更しません。



このガイドの一部として、次の構成が使用されました。









バトルサーバーで「自動再起動」を選択する場合は注意してください。





インストールが完了しました。


サイトのスタブを作成します。
詳細









リンクを介してiOSデバイスにアプリケーションをインストールするには、HTTPSサポートが必要です-SSL証明書の作成を始めましょう。 残念ながら、IISによって生成されたSSL証明書は私たちには適していないため、OpenSSLユーティリティを使用します。
このガイドでは、 リンクからダウンロードできるWin32 OpenSSLコマンドラインユーティリティを使用します。
OpenSSLインストールの詳細
オペレーティングシステムのビット深度を選択します。 このWindows Server 2012では、 Win64 OpenSSL v1.0.2e (16MBインストーラー)が選択されました



インストール中に注意する点。






OpenSSLをインストールした後、ドライブCに OpenSSL-Certificatesフォルダーを作成します

コマンドラインを実行します。 iphone-udid-zzzz.comの証明書を作成します。
opensslユーティリティを使用して証明書を作成する
  C:\Users\devin> cd c:\OpenSSL-Certificates c:\OpenSSL-Certificates> set RANDFILE=c:\OpenSSL-Certificates\.rnd c:\OpenSSL-Certificates> set OPENSSL_CONF=C:\OpenSSL-Win64\bin\openssl.cfg c:\OpenSSL-Certificates> c:\OpenSSL-Win64\bin\openssl.exe OpenSSL> genrsa -out iphone-udid-zzzz.key 2048 OpenSSL> req -new -x509 -sha256 -key iphone-udid-zzzz.key -out iphone-udid-zzzz.cer -days 365 -subj /CN=iphone-udid-zzz.com OpenSSL> pkcs12 -export -out iphone-udid-zzzz.pfx -inkey iphone-udid-zzzz.key -in iphone-udid-zzzz.cer Enter Export Password: Verifying - Enter Export Password: OpenSSL> exit c:\OpenSSL-Certificates> 


実行結果





同様に、 corp-apps-zzzz.comの証明書を作成します。
opensslユーティリティを使用して証明書を作成する
  C:\Users\devin> cd c:\OpenSSL-Certificates c:\OpenSSL-Certificates> set RANDFILE=c:\OpenSSL-Certificates\.rnd c:\OpenSSL-Certificates> set OPENSSL_CONF=C:\OpenSSL-Win64\bin\openssl.cfg c:\OpenSSL-Certificates> c:\OpenSSL-Win64\bin\openssl.exe OpenSSL> genrsa -out corp-apps-zzzz.key 2048 OpenSSL> req -new -x509 -sha256 -key corp-apps-zzzz.key -out corp-apps-zzzz.cer -days 365 -subj /CN=corp-apps-zzzz.com OpenSSL> pkcs12 -export -out corp-apps-zzzz.pfx -inkey corp-apps-zzzz.key -in corp-apps-zzzz.cer Enter Export Password: Verifying - Enter Export Password: OpenSSL> exit c:\OpenSSL-Certificates> 


実行結果





次のステップは、作成された* .pfx証明書をIISにインポートすることです。
詳細









これで、HTTPS接続を提供するためにバインディング変更できます。

サイトの場合:iphone-udid-zzzz.com








サイトの場合:corp-apps-zzzz.com









さて、次のステップはiphone-udid-zzzz.comの WebAPIプロジェクトに変更を加えることです。

Web.configファイル、WebDAVおよび405エラーのセクションsystem.webServerを排除します
Web.configファイルに必要な変更
  <system.webServer> <validation validateIntegratedModeConfiguration="false" /> <modules runAllManagedModulesForAllRequests="true"> <remove name="WebDAVModule"/> </modules> <handlers> <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> <add name="ExtensionlessUrl-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> <remove name="OPTIONSVerbHandler" /> <remove name="TRACEVerbHandler" /> <remove name="WebDAV" /> </handlers> <staticContent> <mimeMap fileExtension=".mobileconfig" mimeType="application/x-apple-aspen-config" /> </staticContent> </system.webServer> 


証明書の場合、 Web.configに変更を追加する必要もあります。
詳細
  <system.webServer> <staticContent> <remove fileExtension=".mobileconfig" /> <mimeMap fileExtension=".mobileconfig" mimeType="application/x-apple-aspen-config" /> <remove fileExtension=".crt" /> <mimeMap fileExtension=".crt" mimeType="application/x-x509-ca-cert" /> </staticContent> </system.webServer> 


ファイル/Downloads/iphone-udid-zzzz.mobileconfig-URLが変更されました。
詳細
  <key>URL</key> <string>https://iphone-udid-zzzz.com:9001/api/xml</string> 


生成されたiphone-udid-zzzz.cer証明書が/ Downloads / フォルダーに追加されているため、拡張子を* .crtに変更する必要があります。 それ以外の場合、iOSデバイスでは、テキストファイルのようにブラウザで開きます。
詳細


ファイル/Views/Home/Index.cshtml-URL(href )が変更され、SSL証明書をダウンロードするためのリンクが追加されました。
Index.cshtmlファイルに必要な変更
  <div class="jumbotron"> <h1>Get your UDID</h1> <p><a href="/downloads/iphone-udid-zzzz.mobileconfig" class="btn btn-primary btn-lg">Take UDID</a></p> </div> <div class="row"> <a href="/downloads/iphone-udid-zzzz.crt" download class="btn btn-info">Install SSL-Certificate</a> <p> @{ foreach (iPhoneUDID.Models.iPhoneUDID item in ViewBag.UDIDs) { <h5>TimeAdded: @item.TimeAdded, UDID: @item.UDID</h5> } } </p> </div> <div class="row"> @Html.ActionLink("Clear UDIDs list", "ClearHistory", "Home", null, new { @class = "btn btn-primary btn-large" }) </div> 


ファイル/Controllers/XmlController.cs-try / catchコンストラクトを追加-plist (UDID)を解析する際のラッパー。
詳細
  using System; using System.Net; using System.Net.Http; using System.Web.Http; using System.Xml.Linq; namespace iPhoneUDID.Controllers { public class XmlController : ApiController { [HttpPost] public HttpResponseMessage PostRawXMLMessage(HttpRequestMessage request) { string plist = request.Content.ReadAsStringAsync().Result; string UDID = "Error"; try { int begin = plist.IndexOf("UDID") + 20; int end = plist.IndexOf("<", begin); UDID = plist.Substring(begin, end - begin); } catch (Exception exc) { // } XDocument databaseXML; try { databaseXML = XDocument.Load(System.Web.Hosting.HostingEnvironment.MapPath("~/App_Data/udids.xml")); } catch (Exception exp) { databaseXML = new XDocument(new XElement("udids")); } databaseXML.Element("udids").Add( new XElement("iPhone", new XElement("TimeAdded", DateTime.Now.ToLongTimeString() + " - " + DateTime.Now.ToShortDateString()), new XElement("UDID", UDID))); databaseXML.Save(System.Web.Hosting.HostingEnvironment.MapPath("~/App_Data/udids.xml")); HttpResponseMessage response = request.CreateResponse(HttpStatusCode.MovedPermanently); response.Headers.Add("Location", "/Thanks"); return response; } } } 



iphone-udid-zzzz.comのプロジェクトの構築を開始できます。
詳細










受信したファイルをサーバー上の適切なフォルダーにコピーします。
詳細




サイトをリロードすることをお勧めします。



また、サーバー上のディレクトリ内のudids.xmlファイルへの変更を許可する必要があります。
詳細







これ以降、ユーザーはサイトでiOSデバイスのUDIDを登録できます。
  https://iphone-udid-zzzz.com:9001 

ユーザーアクション
SSL証明書をインストールします。 これはオプションです。






[詳細]をクリックした場合








UDID iOSデバイスを登録します。




[詳細]をクリックした場合








iOSデバイスのUDIDを表示します。




UDIDを登録するためのPOSTリクエストをテストするには、Google Chrome- Postmanの無料の拡張機能を使用することをお勧めします。


詳細







corp-apps-zzzz.comのプロジェクトの構築を始めましょう。

Web.configファイル。
Web.configファイルのコンテンツ
  <?xml version="1.0" encoding="utf-8"?> <configuration> <system.webServer> <staticContent> <remove fileExtension=".jpg" /> <mimeMap fileExtension=".jpg" mimeType="image/jpg" /> <remove fileExtension=".png" /> <mimeMap fileExtension=".png" mimeType="image/png" /> <remove fileExtension=".plist" /> <mimeMap fileExtension=".plist" mimeType="text/plain" /> <remove fileExtension=".ipa" /> <mimeMap fileExtension=".ipa" mimeType="application/octet-stream" /> <remove fileExtension=".crt" /> <mimeMap fileExtension=".crt" mimeType="application/x-x509-ca-cert" /> </staticContent> </system.webServer> </configuration> 


Index.htmlファイル-URL (href)が変更され、SSL証明書をダウンロードするためのリンクが追加されました。
ユーザーは、アプリケーションをインストールする前にこの証明書をインストールする必要があります。 そうでない場合、証明書認証エラーを受け取ります。
index.htmlファイルに必要な変更
  <!doctype html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title> iOS </title> <link rel="stylesheet" href="dist/bootstrap.min.css"> <script src="dist/jquery-1.11.3.min.js"></script> <style> h4 {line-height: 25px;} </style> </head> <body> <div class="container"> <br><br> <h1 class="text-center">Hello Apache Cordova</h1> <p class="text-center"> <a href="itms-services://?action=download-manifest&url=https://corp-apps-zzzz.com:9002/app-files/manifest.plist" class="btn btn-info" type="button">Install App</a> <a href="/app-files/corp-apps-zzzz.crt" download class="btn btn-info">Install SSL-Certificate</a> </p> <br><br> </div> </body> </html> 


ファイルmanifest.plist -URLが変更されました(ポートが追加されました)。
manifest.plistに必要な変更
  <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>items</key> <array> <dict> <key>assets</key> <array> <dict> <key>kind</key> <string>software-package</string> <key>url</key> <string>https://corp-apps-zzzz.com:9002/app-files/myApp.ipa</string> </dict> <dict> <key>kind</key> <string>display-image</string> <key>url</key> <string>https://corp-apps-zzzz.com:9002/app-files/image.57x57.png</string> </dict> <dict> <key>kind</key> <string>full-size-image</string> <key>url</key> <string>https://corp-apps-zzzz.com:9002/app-files/image.512x512.jpg</string> </dict> </array> <key>metadata</key> <dict> <key>bundle-identifier</key> <string>com.habr.hellohabr001</string> <key>bundle-version</key> <string>0.0.1</string> <key>kind</key> <string>software</string> <key>title</key> <string>myApp</string> </dict> </dict> </array> </dict> </plist> 


生成された証明書corp-apps-zzzz.cerが / app-files / フォルダーに追加されているため、拡張子を* .crtに変更する必要があります。 それ以外の場合、iOSデバイスでは、テキストファイルのようにブラウザで開きます。
詳細



これで、アプリケーションをインストールするために、ユーザーはいくつかのボタンをクリックするだけでサイトにアクセスできます。
  https://corp-apps-zzzz.com:9002 

ユーザーアクション
SSL証明書をインストールします。







[詳細]をクリックした場合








アプリケーションをインストールします。








おわりに



この記事では、Microsoftテクノロジースタックを使用して、参照によってiOSアプリケーションを配布する方法を検討しました。

慣れるために、GitHubにデモプロジェクトを投稿しました。



この記事がこのトピックを理解し始めている人々に役立つことを願っています。

Source: https://habr.com/ru/post/J277765/


All Articles