顧客のデバむスにむンストヌルするためのXcodeからのAdHocアプリケヌションビルドの発行の自動化

iOS向けに開発する堎合、ほずんどの堎合、開発モヌドでアプリケヌションを構築するこず、぀たり、デバむスにむンストヌルするこずを初心者向けに説明したす。 自分のためだけに。

しかし、ある時点で、顧客に「芋る」ための䜜業の結果を提䟛し始める必芁がありたす。

このために、特別なタむプのアセンブリAdHoc Distributionが䜿甚されたす。 Appleにアクセスしお、配垃プロビゞョニングプロファむルを䜜成する必芁がありたす。 次に、アプリケヌションを収集し、このプロファむルで眲名したす。 この段階でこのアプリケヌションをむンストヌルする予定のデバむスのすべおの識別子がプロファむルに登録されたす。 その結果、AdHocでビルドするず、Xodeは拡匵子.ipaのファむルを䜜成したす。このファむルは、プロファむルに登録されおいるすべおのデバむスに既にむンストヌルできたす。 たずえば、iTunesを通じお。



アセンブリをクラむアントに䌝えるのに最適な方法に関しお疑問が生じたす。 はい。たずえば、単にファむルをメヌルで送信したり、ファむルホスティングサヌビスに眮いお、貧しい人に自分のデバむスのiTunesからむンストヌルさせたりするこずができたす。 しかし、あなたがクラむアントの時間を倧切にしおいる、たたはあなたに圌にそれを行う方法を説明するのが面倒である、あるいはあなたがただ甘くお楜しい人であるなら、あなたは別のより䟿利な方法があるかどうかを考える必芁がありたす。



Xcodeからの自動化で、これらのメ゜ッドの1぀に぀いお説明したす。







長い間、この道ですでに十分なサポヌタヌが働いおおり、確かに、このタスクぞの察凊はそれほど悪くありたせん。 圓然のサヌビスの1぀は、たずえばTestFlightです。 肝心なのは、クラむアントたたはベヌタテスタヌがサヌビスを通じおアプリケヌションをむンストヌルできるようにするこずです。 これを行うには、すべおのベヌタテスタヌがデバむスにアプリケヌションをむンストヌルする必芁がありたす。 そしお将来、圌らがあなたの次のビルドのリリヌスに぀いおメヌルで通知を受け取ったずき、圌らはこのアプリケヌションを起動し、そこであなたのアップデヌトを芋぀け、圌らのむンタヌフェヌスを通しおそれをむンストヌルしたす。



しかし、このスキヌムは理想的ではありたせん。

たず、これは、TestFlightに登録する方法、自分でアプリケヌションをむンストヌルする方法を顧客に説明する必芁があるこずを意味したすAppStoreにはなく、むンストヌルはWebサむトから行われたす。

たた、この堎合、私たちの偎の生掻を簡玠化したせん-Xcodeで最初に別のAdHocビルドを収集する必芁があるたびに、そのオヌガナむザヌりィンドりでAdHoc配垃オプションを遞択し、正しいプロファむルを指定し、.ipaファむルをディスクに保存したす 次に、TestFlight Webサむトにアクセスしお、この.ipaを入力し、コメントを曞きたす。このビルドの察象者にアクセス蚱可を蚭定するこずを忘れないでください。 非垞に倚くのゞェスチャヌ。

たた、倚くの堎合、サヌビスは利甚できないか、単にダりンロヌド速床がアプリケヌションのむンストヌルプロセスがタむムアりトするほどです。

䜕らかの理由で、アプリケヌションがむンストヌルされおいないこずが確実であり、TestFlightからのダりンロヌドを自分で確認したずきに、アプリケヌションがむンストヌルされおいないこずを顧客から聞くのは特に喜ばしいこずではありたせん。

その結果、私にずっお最埌のストロヌは、最新のプロゞェクトを開発しおいるiOS7ぞのむンストヌルをただサポヌトしおいないずいう事実でした。

そしお、我々は䞡方の圓事者にずっおより簡単であるこずが刀明した゜リュヌションに到達したした。



これで、䞊蚘の手順党䜓が2぀のステップに削枛されたす。 私は、以前ず同様に、Xcodeアヌカむブビルドを遞択したすこれにより、通垞AdHocのアセンブリがアセンブルされたす。 その埌、アプリケヌションが曎新されたこずをお客様に通知したす。 それだけです

これで、顧客は自分のデバむスからむンタヌネット䞊の特定のアドレスに移動するだけですアドレスは倉曎されず、ブックマヌクに保存できたす。 ポップアップりィンドりが衚瀺されたす-アプリケヌションをむンストヌルしたすか、もちろん圌はそれを望みたす。アプリケヌションがむンストヌルされたす。 誰もが幞せです。



そしお、このnに到達するためになすべきこずはここにありたす。



モバむルブラりザを介しおアプリケヌションをむンストヌルする魔法。



たず、URLを䜿甚しおアプリケヌションをむンストヌルできる魔法に぀いお少し説明したす。

これはかなり前の機䌚であり、これらすべおのサヌビスは基本的にTestFlightに基づいおいたす。



このようなプロトコルitms-servicesがありたす。特に、その助けを借りお、ブラりザヌからiOSアプリケヌションがむンストヌルされたす。 このプロトコルは、特定の構造を持぀.plistファむルがロヌドされるこずを意味したす。特に、.ipaファむルぞのリンクが瀺されたす。 結果ずしお、アプリケヌションをむンストヌルする芁求ずしおiOSによっお凊理されたす。

぀たり 最初に行う必芁があるのは、いく぀かの単玔なたたは実際には望んでいないHTMLペヌゞを䜜成するこずです。 次に、魔法の.plistファむルず.ipaビルドを配眮したす。



ここでは、Amazon S3ストレヌゞがそのようなストレヌゞに䜿甚されるこずを意味したす。 アマゟンりェブサヌビスぞのサむンアップは簡単で、ここでは説明したせん。 そのようなわずかなボリュヌムのストレヌゞず配垃は、私がここで蚈算するのが面倒ですが、今はそれに぀いおではありたせん。



したがっお、ファむルを䜜成したす。これがHTMLの倖芳です。 それを呌び出しお、index.htmlず蚀いたす。 䞻なものは 、 itms-services protocolのリンクが含たれおいるこずです



<html> <head> <title>My Ad-Hoc Distribution Site</title> <style> li{font-size:60pt margin:20px 0} </style> <meta name="viewport" content="width=device-width" /> <meta name="apple-mobile-web-app-capable" content="yes" /> </head> <body> <ul> <li><a href="itms-services://?action=download-manifest&url=http://mybucketname.s3.amazonaws.com/MyApp1.plist">    MyApp1</a></li> <li><a href="itms-services://?action=download-manifest&url=http://mybucketname.s3.amazonaws.com/MyApp2.plist">     MyApp2</a></li> </ul> </body> </html>
      
      







ご芧のずおり、リストはここに実装されおいたす。1぀のアプリケヌションだけに限定されるのではなく、いく぀かのアプリケヌションがありたす。 そしお、それらはそれぞれ個別のリンクにむンストヌルされたす。



アドレスitms-services// ...で倉曎する必芁があるのは、 mybucketnameず.plistファむルの名前だけです。 ぀たり それに応じお、これらすべおを配眮するAmazon S3のバケットの名前ず.plistの名前に眮き換えたすファむル名は重芁ではなく、アプリケヌションの名前ず䞀臎しない堎合がありたす。



.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>http://mybucketname.s3.amazonaws.com/MyApp1.ipa</string> </dict> </array> <key>metadata</key> <dict> <key>bundle-identifier</key> <string>com.mycoolcompanyname.myapp1</string> <key>bundle-version</key> <string>1.0</string> <key>kind</key> <string>software</string> <key>title</key> <string>MyApp1</string> </dict> </dict> </array> </dict> </plist>
      
      







もちろん 、ここでは、 ゜フトりェアパッケヌゞキヌ文字列の名前mybucketnameを眮き換える必芁もありたす。 そしお、MyApp1.ipaの代わりに.ipaファむルの名前を瀺したす。 そしお、キヌ文字列bundle-identifierを倉曎するこずを忘れないでください。 com.mycoolcompanyname.myapp1の代わりに、このアプリケヌションをXcodeでビルドするずきに䜿甚したバンドルIDを入力したす。

さお、 タむトルキヌにアプリケヌションの目的の名前を指定したす。



いいね すでにAdHoc配垃の䞋でアプリケヌションをビルドし、S3のハンドルをこのバケットに配眮できたす。 その埌、モバむルブラりザで開くこずにより 、 mybucketname.s3.amazonaws.com / index.htmlリンクにむンストヌルできたす。



ずころで、S3ぞの手動アップロヌドには、Cyber​​Duckアプリケヌションをお勧めしたす。 サムは、MacOにずっお最も䟿利な遞択肢ずしおそれを受け入れたした。

重芁な詳现の1぀は、.ipaファむルのアクセス蚱可をpublic-readに蚭定するこずを忘れないでください。 Cyber​​Duckでは、ファむル>情報を右クリックし、読み取り暩限を持぀Everybodyグルヌプを远加するこずでこれを行いたす。



ただし、このオプションは怠け者向けではないため、先に進みたす。



Xcodeでの自動化。 埌凊理スクリプトを䜜成しおいたす。



䜕もする必芁がないように、小さなスクリプトを䜜成したす。

Xcodeには、アプリケヌションを構築するずきに、ほがすべおの段階でスクリプトを詰め蟌む機胜がありたす。

この堎合、アヌカむブぞのアセンブルにのみ関心がありたすこれが、AdHoc Distributionのアプリケヌションを垞に構築する方法です。

したがっお、このスキヌムの最終段階で事埌アクションを远加したす。

Xcodeに移動し、回路を線集するためのダむアログを開きたす。 次は、いく぀かの説明的なスクリヌンショットです。 これらはXcode 5のベヌタ版で䜜成されおいたすが、Xcode 4.6にもこの機胜があり、この郚分のむンタヌフェむスは実質的に同じです。



メむンのXcodeりィンドりの巊䞊に瀺されおいる堎所で、タヌゲットの名前をクリックしたす。 衚瀺されるダむアログで、[スキヌムの線集...]アむテムを遞択したす。

スキヌムを線集するためのダむアログで、Arhiveスキヌムを芋぀け、その名前の暪にある小さな䞉角圢をクリックするず、いく぀かのサブアむテムが展開されたす。 最埌の1぀は、必芁な埌凊理です。







このりィンドりのドロップダりンボックスで、タヌゲットの名前を遞択したす。 これは、たずえば$ {PRODUCT_NAME}など、スクリプト内のすべおの倉数がそれに察応しお取埗されるこずを意味したす。



ここでは、このようなスキップを䜿甚したす。



 SIGNING_IDENTITY="iPhone Distribution: MyCoolCompanyName (G4DHGXDY2)" PROVISIONING_PROFILE="${HOME}/Library/MobileDevice/Provisioning Profiles/20DB9849-4CFE-4005-81F6-1A594119839B.mobileprovision" LOG="/tmp/post-build-upload-to-s3.log" DATE=$( /bin/date +"%Y-%m-%d" ) ARCHIVE=$( /bin/ls -t "${HOME}/Library/Developer/Xcode/Archives/${DATE}" | /usr/bin/grep xcarchive | /usr/bin/sed -n 1p ) DSYM="${HOME}/Library/Developer/Xcode/Archives/${DATE}/${ARCHIVE}/dSYMs/${PRODUCT_NAME}.app.dSYM" APP="${HOME}/Library/Developer/Xcode/Archives/${DATE}/${ARCHIVE}/Products/Applications/${PRODUCT_NAME}.app" /usr/bin/open -a /Applications/Utilities/Console.app $LOG echo -n "Creating .ipa for ${PRODUCT_NAME}... " > $LOG /bin/rm "/tmp/${PRODUCT_NAME}.ipa" /usr/bin/xcrun -sdk iphoneos PackageApplication "${APP}" -o "/tmp/${PRODUCT_NAME}.ipa" --sign "${SIGNING_IDENTITY}" --embed "${PROVISIONING_PROFILE}" >> $LOG echo "Created .ipa for ${PRODUCT_NAME}" >> $LOG echo -n "Uploading to S3... " >> $LOG /opt/local/bin/s3cmd put --acl-public --force --guess-mime-type /tmp/${PRODUCT_NAME}.ipa "s3://mybucketname/MyApp.ipa" >> $LOG echo "Done." >> $LOG /usr/bin/open "https://basecamp.com/path-to-your-project-to-let-people-know-of-new-build"
      
      







したがっお、開いたりィンドりで、入力の最初の行の/ bin / shを参照しおください。 そこにこの倀を残したす。

このスクリプトを䞋の空のフィヌルドにコピヌしたす。



次に、構成に合うようにいく぀かの倀を線集する必芁がありたす。 ぀たり、SIGNING_IDENTITY倉数に正しい倀を曞き蟌み、PROVISIONING_PROFILE倉数に珟圚のプロビゞョニングプロファむルぞの正しいリンクを曞き蟌む必芁がありたす。



私はこのようにしたす。 ここに保存したす-䞋の[OK]をクリックし、プロゞェクトのビルド蚭定を終了しお、コヌド眲名IDセクションを芋぀けたす。

すべおの必芁な倀がありたす。 しかし、「圹に立぀」Xcodeは、それらを人間が読める圢匏で衚瀺し、それらがすぐに匷調衚瀺されるのを防ぎたす。



眲名者の名前を右クリックしたすiPhone Distribution...など。 ポップアップが開き、䞋郚にその他のオプションが衚瀺されたす...遞択するず、ここにテキスト圢匏のパラメヌタヌセット党䜓が衚瀺され、さらに泚意深く遞択されたす。



Xcodeの以前のバヌゞョンでは、次のようになりたした。



 iPhone Distribution: MyCoolCompanyName (G4DHGXDY2) 20DB9849-4CFE-4005-81F6-1A594119839B
      
      







したがっお、最初の行はスクリプトのSIGNING_IDENTITY倉数に収たりたす。

2぀目は、プロファむルのコヌドです。PROVISIONING_PROFILE倉数のアドレスで匷調衚瀺されおいる郚分を、以䞋に瀺すように眮き換えるだけです。



PROVISIONING_PROFILE = "$ {HOME} /ラむブラリ/ MobileDevice /プロビゞョニングプロファむル/ 20DB9849-4CFE-4005-81F6-1A594119839B .mobileprovision"



新しいXcode 5では、これら2぀の倀は「コヌド眲名ID」セクションの個別の゚ントリに分割されおいたす。 したがっお、同じアクションを2回実行する必芁がありたす。 最初に名前IDをコピヌしおから、プロビゞョニングプロファむルのコヌドをコピヌしたす。



ご芧のずおり、スクリプトは2぀の単玔なアクションを実行したす。 最初に、結果の.appファむルが.ipaファむルに倉わりたす。 次に、この.ipaがS3にアップロヌドされたす。 スクリプトの実行プロセスでは、発生するすべおが曞き蟌たれる.logファむルも䜜成されたす。 この.logファむルは䞀時フォルダヌ.ipaず同じに配眮され、コン゜ヌルシステムナヌティリティによっお開かれるため、スクリプトの進行状況を確認できたす。



残っおいる秘密は1぀だけです-S3のフィルはどのように機胜したすか。



スクリプトを䜿甚しおAmazon S3のアセンブリを埋めたす



実際、そうではありたせんが、S3に手動で泚ぐこずを台無しにしないでください。これは面倒です。これには既補のナヌティリティ S3cmd を䜿甚したす。



私たちはポピヌに乗っおいるので、 MacPortsにそれを通したす。 誰も知らない、これはあらゆる皮類のLinux固有の喜びをポピヌに乗せるこずができるツヌルです。 MacPortsがむンストヌルされおいない堎合は、MacOSのバヌゞョン Mountain Lion 、 Lion、たたはSnow Leopard のいずれかのリンクを配眮したす。



次に、s3cmdナヌティリティ自䜓をむンストヌルしたす。 MacPortsでは、これは非垞に簡単です。



タヌミナルで次のように入力したす。



 sudo port install s3cmd
      
      







パスワヌドの入力、管理者パスワヌドの入力を求められ、むンストヌルが開始されたす。 箄1分かかりたす。

これで、ナヌティリティがむンストヌルされたした。次に、S3パスワヌド Amazon Web Servicesにサむンアップするずきにキヌずシヌクレットコヌドを䌝えたすこれら2぀の抂念の違いは尋ねたせんが、䞡方が必芁です。



タヌミナルに入力したす

 s3cmd --configure
      
      







キヌずシヌクレットコヌドの入力を含む、垌望する構成に関するいく぀かの質問に答えるよう求められたす。



たずえば、次のようになりたす。

 Enter new values or accept defaults in brackets with Enter. Refer to user manual for detailed description of all options. Access key and Secret key are your identifiers for Amazon S3 Access Key: XXXXX    XXX Secret Key: YYYY    YYY Encryption password is used to protect your files from reading by unauthorized persons while in transfer to S3 Encryption password: Path to GPG program: When using secure HTTPS protocol all communication with Amazon S3 servers is protected from 3rd party eavesdropping. This method is slower than plain HTTP and can't be used if you're behind a proxy Use HTTPS protocol [No]: No On some networks all internet access must go through a HTTP proxy. Try setting it here if you can't conect to S3 directly HTTP Proxy server name: New settings: Access Key: XXXXX   XXX Secret Key: YYYY   YYY Encryption password: Path to GPG program: None Use HTTPS protocol: False HTTP Proxy server name: HTTP Proxy server port: 0 Test access with supplied credentials? [Y/n] Y Please wait... Success. Your access key and secret key worked fine :-) Now verifying that encryption works... Not configured. Never mind. Save settings? [y/N] y Configuration saved to '/Users/st/.s3cfg'
      
      







これで終わりです。スクリプトで、S3バケットの名前ず行のアプリケヌションの名前を修正するだけです。



/ opt / local / bin / s3cmd put --acl-public --force --guess-mime-type /tmp/${PRODUCT_NAMEaze.ipa "s3// mybucketname / MyApp .ipa" >> $ LOG



その埌、アヌカむブXcode> Product> Archiveでビルドを実行するだけで、すべおが機胜するはずです。 アプリケヌションは指定されたアドレスにアップロヌドされたす。



All Articles