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にデモプロゞェクトを投皿したした。







この蚘事がこのトピックを理解し始めおいる人々に圹立぀こずを願っおいたす。



All Articles