αž›αž€αŸ’αžαžŽαŸˆαž–αž·αžŸαŸαžŸαž“αŸƒαž€αžΆαžšαž€αžŸαžΆαž„ αž“αž·αž„αž…αŸ‚αž€αž…αžΆαž™αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ iOS

αž“αŸ…αž€αŸ’αž“αž»αž„αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡ αž™αžΎαž„αž…αŸ‚αž€αžšαŸ†αž›αŸ‚αž€αž”αž‘αž–αž·αžŸαŸ„αž’αž“αŸαž“αŸƒαž€αžΆαžšαž•αŸ’αž‚αž»αŸ† αž“αž·αž„αž…αŸ‚αž€αž…αžΆαž™αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ iOS αžŠαž›αŸ‹αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ αžŠαŸ‚αž›αžŸαŸ’αž‘αžΌαžŒαžΈαž™αŸ„ Plarium Krasnodar αž”αžΆαž“αž”αŸ’αžšαž˜αžΌαž›αž•αŸ’αžαž»αŸ†αž“αŸ…αž€αŸ’αž“αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸƒαž€αžΆαžšαž”αŸ†αž”αžΆαžαŸ‹αž€αŸ†αž αž»αžŸ CI/CD αŸ”

αž›αž€αŸ’αžαžŽαŸˆαž–αž·αžŸαŸαžŸαž“αŸƒαž€αžΆαžšαž€αžŸαžΆαž„ αž“αž·αž„αž…αŸ‚αž€αž…αžΆαž™αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ iOS

αž€αžΆαžšαžšαŸ€αž”αž…αŸ†

αž˜αž“αž»αžŸαŸ’αžŸαž‚αŸ’αžšαž”αŸ‹αžšαžΌαž”αžŠαŸ‚αž›αžŸαŸ’αžαž·αžαž€αŸ’αž“αž»αž„αž˜αž’αŸ’αž™αŸ„αž”αžΆαž™αž˜αž½αž™ αž¬αž˜αž’αŸ’αž™αŸ„αž”αžΆαž™αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαžŠαŸ‚αž›αž–αžΆαž€αŸ‹αž–αŸαž“αŸ’αž’αž“αžΉαž„αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž§αž”αž€αžšαžŽαŸ Apple αž”αžΆαž“αž€αŸ„αžαžŸαžšαžŸαžΎαžšαžšαž½αž…αž αžΎαž™αž…αŸ†αž–αŸ„αŸ‡αž—αžΆαž–αž„αžΆαž™αžŸαŸ’αžšαž½αž›αžŠαŸαž…αž˜αŸ’αžšαžΌαž„αž…αž˜αŸ’αžšαžΆαžŸαž“αŸƒαž αŸαžŠαŸ’αž‹αžΆαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αŸ” αž—αžΆαž–αž›αŸ†αž”αžΆαž€αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž€αžƒαžΎαž‰αž“αŸ…αž‚αŸ’αžšαž”αŸ‹αž‘αžΈαž€αž“αŸ’αž›αŸ‚αž„αŸ– αž–αžΈαž˜αŸ‰αžΊαž“αž»αž™αž‘αž˜αŸ’αžšαž„αŸ‹αž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸ αžšαž αžΌαžαžŠαž›αŸ‹αž§αž”αž€αžšαžŽαŸαž”αŸ†αž”αžΆαžαŸ‹αž€αŸ†αž αž»αžŸ αž“αž·αž„αž”αž„αŸ’αž€αžΎαžαŸ”

αž˜αžΆαž“αž’αžαŸ’αžαž”αž‘αž‡αžΆαž…αŸ’αžšαžΎαž“αž’αŸ†αž–αžΈ "αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“" αž“αŸ…αž›αžΎαž’αŸŠαžΈαž“αž’αžΊαžŽαž·αž αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž™αžΎαž„αž“αžΉαž„αž–αŸ’αž™αžΆαž™αžΆαž˜αž”αž“αŸ’αž›αž·αž…αžšαžΏαž„αžŸαŸ†αžαžΆαž“αŸ‹αŸ” αž“αŸαŸ‡αž‡αžΆαž’αŸ’αžœαžΈαžŠαŸ‚αž›αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž”αž„αŸ’αž€αžΎαžαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αžŠαŸ„αž™αž‡αŸ„αž‚αž‡αŸαž™αŸ–

  • αž‚αžŽαž“αžΈαž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸ;
  • αž§αž”αž€αžšαžŽαŸαžŠαŸ‚αž›αž˜αžΆαž“αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž›αžΎ macOS αžŠαžΎαžšαžαž½αž‡αžΆαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž”αž„αŸ’αž€αžΎαžαŸ”
  • αž”αžΆαž“αž”αž„αŸ’αž€αžΎαž αžœαž·αž‰αŸ’αž‰αžΆαž”αž“αž”αžαŸ’αžšαž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸαžŠαŸ‚αž›αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ€αžαžŠαžΎαž˜αŸ’αž”αžΈαž…αž»αŸ‡αž αžαŸ’αžαž›αŸαžαžΆαž›αžΎαž–αžΆαž€αŸ’αž™αžŸαž»αŸ†αŸ”
  • αž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŠαŸ‚αž›αž˜αžΆαž“αžαŸ‚αž˜αž½αž™αž‚αžαŸ‹ ID (αžŸαžΆαžšαŸˆαžŸαŸ†αžαžΆαž“αŸ‹αž“αŸƒ Bundle Identifier αž‚αž½αžšαžαŸ‚αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αžαŸ‹αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹ αž–αžΈαž–αŸ’αžšαŸ„αŸ‡αž€αžΆαžšαž”αŸ’αžšαžΎαž›αŸαžαžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αžαž½αž’αž€αŸ’αžŸαžšαž‡αŸ†αž“αž½αžŸαž’αŸ’αžœαžΎαž±αŸ’αž™αžœαžΆαž˜αž·αž“αž’αžΆαž…αž”αŸ’αžšαžΎαž˜αž»αžαž„αžΆαžšαž‡αžΆαž…αŸ’αžšαžΎαž“αžšαž”αžŸαŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ αž§αž‘αžΆαž αžšαžŽαŸαŸ– Associated Domains, Push Notification, Apple Sign In αž“αž·αž„αž•αŸ’αžŸαŸαž„αž‘αŸ€αž);
  • αž”αŸ’αžšαžœαžαŸ’αžαž·αžšαžΌαž” αž αžαŸ’αžαž›αŸαžαžΆαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαŸ”

αžœαž·αž‰αŸ’αž‰αžΆαž”αž“αž”αžαŸ’αžšαž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸαžαŸ’αžšαžΌαžœαžαŸ‚αž”αž„αŸ’αž€αžΎαžαžαžΆαž˜αžšαž™αŸˆ Keychain αž“αŸ…αž›αžΎαž§αž”αž€αžšαžŽαŸ macOS αžŽαžΆαž˜αž½αž™αŸ” αž”αŸ’αžšαž—αŸαž‘αž“αŸƒαžœαž·αž‰αŸ’αž‰αžΆαž”αž“αž”αžαŸ’αžšαž˜αžΆαž“αžŸαžΆαžšαŸˆαžŸαŸ†αžαžΆαž“αŸ‹αžŽαžΆαžŸαŸ‹αŸ” αž’αžΆαžŸαŸ’αžšαŸαž™αž›αžΎαž”αžšαž·αž™αžΆαž€αžΆαžŸαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ (Dev, QA, Staging, Production) αžœαžΆαž“αžΉαž„αžαž»αžŸαž‚αŸ’αž“αžΆ (αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸ αž¬αž€αžΆαžšαž…αŸ‚αž€αž…αžΆαž™) αžŠαžΌαž…αž“αžΉαž„αž”αŸ’αžšαž—αŸαž‘αž“αŸƒαž‘αž˜αŸ’αžšαž„αŸ‹αž αžαŸ’αžαž›αŸαžαžΆαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŠαŸ‚αžšαŸ”

αž”αŸ’αžšαž—αŸαž‘αžŸαŸ†αžαžΆαž“αŸ‹αŸ—αž“αŸƒαž‘αž˜αŸ’αžšαž„αŸ‹αŸ–

  • αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸ - αž˜αžΆαž“αž”αŸ†αžŽαž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž…αž»αŸ‡αž αžαŸ’αžαž›αŸαžαžΆαž›αžΎαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž“αŸƒαž€αŸ’αžšαž»αž˜αž’αž—αž·αžœαžŒαŸ’αžαž“αŸ αžœαž·αž‰αŸ’αž‰αžΆαž”αž“αž”αžαŸ’αžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎ (αž”αŸ’αžšαž—αŸαž‘αžˆαŸ’αž˜αŸ„αŸ‡ iPhone Developer: XXXXX);
  • Ad Hoc - αž˜αžΆαž“αž”αŸ†αžŽαž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž…αž»αŸ‡αž αžαŸ’αžαž›αŸαžαžΆαž›αžΎαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŸαžΆαž€αž›αŸ’αž”αž„ αž“αž·αž„αž€αžΆαžšαž•αŸ’αž‘αŸ€αž„αž•αŸ’αž‘αžΆαžαŸ‹αž•αŸ’αž‘αŸƒαž€αŸ’αž“αž»αž„αžŠαŸ„αž™αž“αžΆαž™αž€αžŠαŸ’αž‹αžΆαž“ QA αžœαž·αž‰αŸ’αž‰αžΆαž”αž“αž”αžαŸ’αžšαž…αŸ‚αž€αž…αžΆαž™αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ (αž”αŸ’αžšαž—αŸαž‘αžˆαŸ’αž˜αŸ„αŸ‡ iPhone Distribution: XXXXX);
  • App Store - αž…αŸαž‰αž•αŸ’αžŸαžΆαž™αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαžαžΆαž„αž€αŸ’αžšαŸ…αžαžΆαž˜αžšαž™αŸˆ TestFlight αž“αž·αž„αž€αžΆαžšαž”αž„αŸ’αž αŸ„αŸ‡αž‘αŸ…αž€αžΆαž“αŸ‹ App Store αžœαž·αž‰αŸ’αž‰αžΆαž”αž“αž”αžαŸ’αžšαž…αŸ‚αž€αž…αžΆαž™αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αŸ”

αž“αŸ…αž–αŸαž›αž”αž„αŸ’αž€αžΎαžαž‘αž˜αŸ’αžšαž„αŸ‹ Development αž“αž·αž„ Ad Hoc αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αž„αŸ’αž’αž»αž›αž”αž„αŸ’αž αžΆαž‰αž•αž„αžŠαŸ‚αžšαŸ” αž”αž‰αŸ’αž‡αžΈαž§αž”αž€αžšαžŽαŸαžŠαŸ‚αž›αž’αŸ’αž“αž€αž’αžΆαž…αžŠαŸ†αž‘αžΎαž„ build αžŠαŸ‚αž›αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αžŠαžΆαž€αŸ‹αž€αž˜αŸ’αžšαž·αžαž€αžΆαžšαž…αžΌαž›αž”αŸ’αžšαžΎαž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ€αžαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αŸ” αž˜αž·αž“αž˜αžΆαž“αž”αž‰αŸ’αž‡αžΈαž§αž”αž€αžšαžŽαŸαž“αŸ…αž€αŸ’αž“αž»αž„αž‘αž˜αŸ’αžšαž„αŸ‹ App Store αž‘αŸ αžŠαŸ„αž™αžŸαžΆαžšαž€αžΆαžšαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž€αžΆαžšαž…αžΌαž›αž”αŸ’αžšαžΎαž’αŸ†αž‘αž»αž„αž–αŸαž›αžŸαžΆαž€αž›αŸ’αž”αž„αž”αž·αž‘αž‡αž·αžαžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αžŠαŸ„αž™ TestFlight αžŠαŸ‚αž›αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž–αž·αž—αžΆαž€αŸ’αžŸαžΆαž“αŸ…αž–αŸαž›αž€αŸ’αžšαŸ„αž™αŸ”

αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž—αžΆαž–αž…αŸ’αž”αžΆαžŸαŸ‹αž›αžΆαžŸαŸ‹ αž’αŸ’αž“αž€αž’αžΆαž…αž”αž„αŸ’αž αžΆαž‰αž‘αž˜αŸ’αžšαž„αŸ‹αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž€αŸ’αž“αž»αž„αž‘αž˜αŸ’αžšαž„αŸ‹αžαžΆαžšαžΆαž„αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ” αž“αŸαŸ‡αž’αŸ’αžœαžΎαž±αŸ’αž™αžœαžΆαž€αžΆαž“αŸ‹αžαŸ‚αž„αžΆαž™αžŸαŸ’αžšαž½αž›αž™αž›αŸ‹αžαžΆαžαžΎαž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαž’αŸ’αžœαžΈαžαŸ’αž›αŸ‡αžŠαŸ‚αž›αž™αžΎαž„αžαŸ’αžšαžΌαžœαž€αžΆαžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž‡αž½αž”αž”αŸ’αžšαž‡αž»αŸ†αž‚αŸ’αž“αžΆ αž“αž·αž„αž€αž“αŸ’αž›αŸ‚αž„αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž™αž€αž–αž½αž€αžœαžΆαž–αžΈαŸ”

αž›αž€αŸ’αžαžŽαŸˆαž–αž·αžŸαŸαžŸαž“αŸƒαž€αžΆαžšαž€αžŸαžΆαž„ αž“αž·αž„αž…αŸ‚αž€αž…αžΆαž™αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ iOS

αžŸαž“αŸ’αž“αž·αž”αžΆαž

αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαž±αŸ’αž™αžœαžΆαž€αžΆαž“αŸ‹αžαŸ‚αž„αžΆαž™αžŸαŸ’αžšαž½αž›αž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αŸ†αž”αŸ‚αž€αž€αžΆαžšαž‡αž½αž”αž”αŸ’αžšαž‡αž»αŸ†αž‚αŸ’αž“αžΆαžαžΆαž˜αž‚αž˜αŸ’αžšαŸ„αž„ αž“αž·αž„αž”αžšαž·αžŸαŸ’αžαžΆαž“ αž™αžΎαž„αž”αŸ’αžšαžΎαžˆαŸ’αž˜αŸ„αŸ‡αž‘αž˜αŸ’αžšαž„αŸ‹αžŠαžΌαž…αž‡αžΆ ${ProjectName}_${Instance}αž“αŸ„αŸ‡αž‚αžΊαžˆαŸ’αž˜αŸ„αŸ‡αž‚αž˜αŸ’αžšαŸ„αž„ + αž§αž‘αžΆαž αžšαžŽαŸ (αž’αžΆαžŸαŸ’αžšαŸαž™αž›αžΎαž”αžšαž·αž™αžΆαž€αžΆαžŸαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαŸ– Dev, QA, GD, Staging, Live αž“αž·αž„αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž“αŸ…αž›αžΎ) αŸ”

αž“αŸ…αž–αŸαž›αž“αžΆαŸ†αž…αžΌαž›αž‘αŸ…αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ αž‘αž˜αŸ’αžšαž„αŸ‹αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαžˆαŸ’αž˜αŸ„αŸ‡αžšαž”αžŸαŸ‹αžœαžΆαž‘αŸ…αž‡αžΆαž›αŸαžαžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αžαŸ‚αž˜αž½αž™αž‚αžαŸ‹ αž αžΎαž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αž›αžΆαžŸαŸ‹αž‘αžΈαž‘αŸ…αžαžαž―αž€αžŸαžΆαžš /Users/$Username/Library/MobileDevice/Provisioning Profiles (αž€αž“αŸ’αž›αŸ‚αž„αžŽαžΆ $Username αžαŸ’αžšαžΌαžœαž‚αŸ’αž“αžΆαž“αžΉαž„αžˆαŸ’αž˜αŸ„αŸ‡αž‚αžŽαž“αžΈαž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžšαž”αžŸαŸ‹ build server)αŸ”

αž˜αžΆαž“αžœαž·αž’αžΈαž–αžΈαžšαž™αŸ‰αžΆαž„αž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž―αž€αžŸαžΆαžš *.ipa - αž€αŸαžšαŸ’αžαž·αŸαžŠαŸ†αžŽαŸ‚αž› (PackageApplication) αž“αž·αž„αž‘αŸ†αž“αžΎαž” (αžαžΆαž˜αžšαž™αŸˆαž€αžΆαžšαž”αž„αŸ’αž€αžΎαž αž“αž·αž„αž“αžΆαŸ†αž…αŸαž‰ XcAchive)αŸ” αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžšαž‘αžΈαž˜αž½αž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αžΆαžαŸ‹αž‘αž»αž€αžαžΆαž›αŸ‚αž„αž”αŸ’αžšαžΎαž αžΎαž™ αž…αžΆαž”αŸ‹αžαžΆαŸ†αž„αž–αžΈαž€αŸ†αžŽαŸ‚ 8.3 αž˜αŸ‰αžΌαžŒαž»αž›αžœαŸαž…αžαŸ’αž…αž”αŸ‹αž―αž€αžŸαžΆαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαž€αž…αŸαž‰αž–αžΈαž€αžΆαžšαž…αŸ‚αž€αž…αžΆαž™ XcodeαŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž”αŸ’αžšαžΎαžœαžΆ αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž…αž˜αŸ’αž›αž„αž˜αŸ‰αžΌαžŒαž»αž›αž–αžΈ Xcode αž…αžΆαžŸαŸ‹ (αž€αŸ†αžŽαŸ‚ 8.2 αž“αž·αž„αž˜αž»αž“) αž‘αŸ…αžαžαž―αž€αžŸαžΆαžšαŸ–
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/

αž αžΎαž™αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαŸ–

chmod +x /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/*

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž”αŸ’αžšαž˜αžΌαž›αž―αž€αžŸαžΆαžš *.app αžšαž”αžŸαŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαŸ–

xcodebuild 
-workspace $ProjectDir/$ProjectName.xcworkspace 
-scheme $SchemeName 
-sdk iphoneos 
build 
-configuration Release 
-derivedDataPath build 
CODE_SIGN_IDENTITY=”$DevAccName”
PROVISIONING_PROFILE=”$ProfileId”
DEPLOYMENT_POSTPROCESSING=YES 
SKIP_INSTALL=YES 
ENABLE_BITCODE=NO

αž“αŸ…αž‘αžΈαžŽαžΆ:

-workspace - αž•αŸ’αž›αžΌαžœαž‘αŸ…αž€αžΆαž“αŸ‹αž―αž€αžŸαžΆαžšαž‚αž˜αŸ’αžšαŸ„αž„αŸ”

-scheme - αž‚αŸ’αžšαŸ„αž„αž€αžΆαžšαžŽαŸαžŠαŸ‚αž›αž”αžΆαž“αž”αŸ’αžšαžΎ αž”αžΆαž“αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž‚αž˜αŸ’αžšαŸ„αž„αŸ”

-derivedDataPath - αž•αŸ’αž›αžΌαžœαžŠαžΎαž˜αŸ’αž”αžΈαž‘αžΆαž‰αž™αž€αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŠαŸ‚αž›αž”αžΆαž“αž‡αž½αž”αž”αŸ’αžšαž‡αž»αŸ†αž‚αŸ’αž“αžΆ (*.app) αŸ”

CODE_SIGN_IDENTITY β€” αžˆαŸ’αž˜αŸ„αŸ‡β€‹αž‚αžŽαž“αžΈβ€‹αž’αŸ’αž“αž€β€‹αž’αž—αž·αžœαžŒαŸ’αžαž“αŸ αžŠαŸ‚αž›β€‹αž’αžΆαž…β€‹αžαŸ’αžšαžΌαžœβ€‹αž”αžΆαž“β€‹αž•αŸ’αž‘αŸ€αž„αž•αŸ’αž‘αžΆαžαŸ‹β€‹αž€αŸ’αž“αž»αž„ Keychain (iPhone Developer: XXXX XXXXXXX αžŠαŸ„αž™β€‹αž‚αŸ’αž˜αžΆαž“ TeamID αž€αŸ’αž“αž»αž„β€‹αžαž„αŸ’αž€αŸ€αž”)αŸ”

αž›αž€αŸ’αžαžŽαŸˆαž–αž·αžŸαŸαžŸαž“αŸƒαž€αžΆαžšαž€αžŸαžΆαž„ αž“αž·αž„αž…αŸ‚αž€αž…αžΆαž™αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ iOS

PROVISIONING_PROFILE - αž›αŸαžαžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αž‘αž˜αŸ’αžšαž„αŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž…αž»αŸ‡αž αžαŸ’αžαž›αŸαžαžΆαž›αžΎαž–αžΆαž€αŸ’αž™αžŸαž»αŸ† αžŠαŸ‚αž›αž’αžΆαž…αž‘αž‘αž½αž›αž”αžΆαž“αžŠαŸ„αž™αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαŸ–

cd "/Users/$Username/Library/MobileDevice/Provisioning Profiles/" && find *.mobileprovision -type f | xargs grep -li ">${ProjectName}_${Instance}<" | sed -e 's/.mobileprovision//'

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž”αŸ’αžšαžΎαž‘αž˜αŸ’αžšαž„αŸ‹αž”αž“αŸ’αžαŸ‚αž˜ (αž§αž‘αžΆαž αžšαžŽαŸαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž‡αžΌαž“αžŠαŸ†αžŽαžΉαž„αž’αŸ†αž–αžΈαž€αžΆαžšαž‡αŸ†αžšαž»αž‰) αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž‡αŸ†αž“αž½αžŸαžœαž·αž‰αŸ” PROVISIONING_PROFILE αž…αž„αŸ’αž’αž»αž›αž”αž„αŸ’αž αžΆαž‰αŸ–

APP_PROFILE=”$AppProfile” 
EXTENSION_PROFILE=”$ExtProfile” 

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€ αž―αž€αžŸαžΆαžš *.app αž›αž‘αŸ’αž’αž•αž›αž‚αž½αžšαžαŸ‚αžαŸ’αžšαžΌαžœαž”αžΆαž“αžαŸ’αž…αž”αŸ‹αž‘αŸ…αž€αŸ’αž“αž»αž„ *.ipa αŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαžŠαžΌαž…αž“αŸαŸ‡αž’αŸ’αž“αž€αž’αžΆαž…αž”αŸ’αžšαžΎαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžŠαžΌαž…αž‡αžΆαŸ–

/usr/bin/xcrun --sdk iphoneos PackageApplication 
-v $(find "$ProjectDir/build/Build/Products/Release-iphoneos" -name "*.app") 
-o "$ProjectDir/$ProjectName_$Instance.ipa"

αž‘αŸ„αŸ‡αž‡αžΆαž™αŸ‰αžΆαž„αžŽαžΆαž€αŸαžŠαŸ„αž™ αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αžΆαžαŸ‹αž‘αž»αž€αžαžΆαž›αŸ‚αž„αž”αŸ’αžšαžΎαž αžΎαž™αžαžΆαž˜αž‘αžŸαŸ’αžŸαž“αŸˆαžšαž”αžŸαŸ‹ Apple αŸ” αžœαžΆαž–αžΆαž€αŸ‹αž–αŸαž“αŸ’αž’αž€αŸ’αž“αž»αž„αž€αžΆαžšαž‘αž‘αž½αž›αž”αžΆαž“ *.ipa αžŠαŸ„αž™αž“αžΆαŸ†αž…αŸαž‰αž–αžΈαž”αŸαžŽαŸ’αžŽαžŸαžΆαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαŸ”

αžŠαŸ†αž”αžΌαž„αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž”αŸ’αžšαž˜αžΌαž›αž”αŸαžŽαŸ’αžŽαžŸαžΆαžšαžŠαŸ„αž™αž”αŸ’αžšαžΎαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαŸ–

xcodebuild 
-workspace $ProjectDir/$ProjectName.xcworkspace 
-scheme $SchemeName 
-sdk iphoneos 
-configuration Release 
archive 
-archivePath $ProjectDir/build/$ProjectName.xcarchive 
CODE_SIGN_IDENTITY=”$DevAccName” 
PROVISIONING_PROFILE=”$ProfileId”
ENABLE_BITCODE=NO 
SYNCHRONOUS_SYMBOL_PROCESSING=FALSE

αž—αžΆαž–αžαž»αžŸαž‚αŸ’αž“αžΆαžŸαŸ’αžαž·αžαž“αŸ…αž€αŸ’αž“αž»αž„αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αž αž“αž·αž„αž‡αž˜αŸ’αžšαžΎαžŸαž“αŸƒαž€αžΆαžšαž‡αž½αž”αž”αŸ’αžšαž‡αž»αŸ†αž‚αŸ’αž“αžΆαŸ” SYNCHRONOUS_SYMBOL_PROCESSINGαžŠαŸ‚αž›αž”αž·αž‘αž€αžΆαžšαžŠαž€αž“αž·αž˜αž·αžαŸ’αžαžŸαž‰αŸ’αž‰αžΆαž“αŸ…αž–αŸαž›αžŸαžΆαž„αžŸαž„αŸ‹αŸ”

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž™αžΎαž„αžαŸ’αžšαžΌαžœαž”αž„αŸ’αž€αžΎαžαž―αž€αžŸαžΆαžšαž‡αžΆαž˜αž½αž™αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž“αžΆαŸ†αž…αŸαž‰αŸ–

ExportSettings="$ProjectDir/exportOptions.plist"

cat << EOF > $ExportSettings
<?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>compileBitcode</key>
<false/>
<key>uploadBitcode</key>
<false/>
<key>uploadSymbols</key>
<false/>
<key>method</key>
<string>$Method</string>
<key>provisioningProfiles</key>
<dict>
<key>$BundleID</key>
<string>$ProfileId</string>
</dict>
<key>signingCertificate</key>
<string>$DevAccName</string>
<key>signingStyle</key>
<string>manual</string>
<key>stripSwiftSymbols</key>
<true/>
<key>teamID</key>
<string>$TeamID</string>
<key>thinning</key>
<string><none></string>
</dict>
</plist>
EOF

αž“αŸ…αž‘αžΈαžŽαžΆ:

$Method β€” αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαž…αŸ‚αž€αž…αžΆαž™ αžαŸ’αžšαžΌαžœαž‚αŸ’αž“αžΆαž‘αŸ…αž“αžΉαž„αž”αŸ’αžšαž—αŸαž‘αž‘αž˜αŸ’αžšαž„αŸ‹αž αžαŸ’αžαž›αŸαžαžΆαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ αž–αŸ„αž›αž‚αžΊαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸ αžαž˜αŸ’αž›αŸƒαž“αžΉαž„αž‡αžΆαž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸ αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ Ad Hoc - ad-hoc αž“αž·αž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ App Store - app-storeαŸ”

$BundleID - αž›αŸαžαžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαŸ” αž’αŸ’αž“αž€αž’αžΆαž…αž–αž·αž“αž·αžαŸ’αž™αžŠαŸ„αž™αž”αŸ’αžšαžΎαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαŸ–

defaults read $ProjectDir/Info CFBundleIdentifier

$DevAccName ΠΈ $ProfileId β€” αžˆαŸ’αž˜αŸ„αŸ‡αž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸ αž“αž·αž„αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž›αŸαžαžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αž‘αž˜αŸ’αžšαž„αŸ‹αž αžαŸ’αžαž›αŸαžαžΆαžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαž–αžΈαž˜αž»αž“ αž αžΎαž™αžαŸ’αžšαžΌαžœαžαŸ‚αž•αŸ’αž‚αžΌαž•αŸ’αž‚αž„αžαž˜αŸ’αž›αŸƒαž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž“αžΆαŸ†αž…αŸαž‰αŸ”

$TeamID β€” αž›αŸαžβ€‹αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹β€‹αžŠαž”αŸ‹β€‹αžαŸ’αž‘αž„αŸ‹β€‹αž“αŸ…β€‹αž€αŸ’αž“αž»αž„β€‹αžαž„αŸ’αž€αŸ€αž”β€‹αž”αž“αŸ’αž‘αžΆαž”αŸ‹β€‹αž–αžΈβ€‹αžˆαŸ’αž˜αŸ„αŸ‡β€‹αž’αŸ’αž“αž€β€‹αž’αž—αž·αžœαžŒαŸ’αžαž“αŸ αž§αž‘αžΆαž αžšαžŽαŸαŸ– iPhone DeveloperαŸ– …… (XXXXXXXXXX); αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž–αž·αž“αž·αžαŸ’αž™αž“αŸ…αž€αŸ’αž“αž»αž„ Keychain αŸ”

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€ αžŠαŸ„αž™αž”αŸ’αžšαžΎαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž“αžΆαŸ†αž…αŸαž‰ αž™αžΎαž„αž‘αž‘αž½αž›αž”αžΆαž“αž―αž€αžŸαžΆαžš *.ipa αž…αžΆαŸ†αž”αžΆαž…αŸ‹αŸ–

xcodebuild 
-exportArchive 
-archivePath $ProjectDir/build/$ProjectName.xcarchive 
-exportPath $ProjectDir 
-exportOptionsPlist $ExportSettings

αž–αŸαžαŸŒαž˜αžΆαž“αžŠαžΉαž€αž‡αž‰αŸ’αž‡αžΌαž“

αž₯αž‘αžΌαžœαž“αŸαŸ‡αž―αž€αžŸαžΆαžšαžŠαŸ‚αž›αž”αŸ’αžšαž˜αžΌαž›αž”αžΆαž“αžαŸ’αžšαžΌαžœαž”αž‰αŸ’αž‡αžΌαž“αž‘αŸ…αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž…αž»αž„αž€αŸ’αžšαŸ„αž™ αž–αŸ„αž›αž‚αžΊαž”αžΆαž“αžŠαŸ†αž‘αžΎαž„αž“αŸ…αž›αžΎαž§αž”αž€αžšαžŽαŸαŸ”

αž˜αžΆαž“αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž‡αžΆαž…αŸ’αžšαžΎαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž…αŸ‚αž€αž…αžΆαž™ Development αž“αž·αž„ Ad Hoc build αžŠαžΌαž…αž‡αžΆ HockeyApp, AppBlade αž“αž·αž„αž•αŸ’αžŸαŸαž„αŸ—αž‘αŸ€αž αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž“αŸ…αž€αŸ’αž“αž»αž„αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡ αž™αžΎαž„αž“αžΉαž„αž“αž·αž™αžΆαž™αž’αŸ†αž–αžΈ server standalone αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž…αŸ‚αž€αž…αžΆαž™αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαŸ”

αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŸαž˜αŸ’αžšαžΆαž”αŸ‹ iOS αž’αŸ’αžœαžΎαž‘αžΎαž„αž‡αžΆ 2 αžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž›αŸ–

  1. αž€αžΆαžšαž‘αž‘αž½αž›αž”αžΆαž“αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž”αž„αŸ’αž αžΆαž‰αžαžΆαž˜αžšαž™αŸˆαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž’αžΆαžαž»αŸ”
  2. αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„αž―αž€αžŸαžΆαžš *.ipa αž™αŸ„αž„αž‘αŸ…αžαžΆαž˜αž–αŸαžαŸŒαž˜αžΆαž“αžŠαŸ‚αž›αž”αžΆαž“αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„ manifest αžαžΆαž˜αžšαž™αŸˆ HTTPS αŸ”

αžŠαžΌαž…αŸ’αž“αŸαŸ‡αžŠαŸ†αž”αžΌαž„αž™αžΎαž„αžαŸ’αžšαžΌαžœαž”αž„αŸ’αž€αžΎαžαž€αžΆαžšαžŠαŸ†αž‘αžΎαž„ manifest (αž”αŸ’αžšαž—αŸαž‘αž―αž€αžŸαžΆαžš *.plist) αžŠαŸ„αž™αž”αŸ’αžšαžΎαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαŸ–

cat << EOF > $manifest
<?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>$ipaUrl</string>
</dict>
</array>
<key>metadata</key>
<dict>
<key>bundle-identifier</key>
<string>$BundleID</string>
<key>bundle-version</key>
<string>$AppVersion</string>
<key>kind</key>
<string>software</string>
<key>title</key>
<string>$ProjectName_$Instance</string>
<key>subtitle</key>
<string>$Instance</string>
</dict>
</dict>
</array>
</dict>
</plist>
EOF

αžŠαžΌαž…αžŠαŸ‚αž›αž’αŸ’αž“αž€αž’αžΆαž…αžƒαžΎαž‰ manifest αž˜αžΆαž“αž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαžŸαŸ’αž‘αžΎαžšαžαŸ‚αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžŠαŸ‚αž›αž–αžΆαž€αŸ‹αž–αŸαž“αŸ’αž’αž“αžΉαž„αž€αžΆαžšαž€αžŸαžΆαž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαŸ”

αž€αŸ†αžŽαŸ‚αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ ($AppVersion) αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž–αž·αž“αž·αžαŸ’αž™αžŠαŸ„αž™αž”αŸ’αžšαžΎαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆ:

defaults read $ProjectDir/Info CFBundleVersion

αž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžš $ipaUrl αž˜αžΆαž“αžαŸ†αžŽαž•αŸ’αž‘αžΆαž›αŸ‹αžŠαžΎαž˜αŸ’αž”αžΈαž‘αžΆαž‰αž™αž€αž―αž€αžŸαžΆαžš *.ipa αŸ” αž…αžΆαž”αŸ‹αž–αžΈαž€αŸ†αžŽαŸ‚αž‘αžΈαž”αŸ’αžšαžΆαŸ†αž–αžΈαžšαž“αŸƒαž”αŸ’αžšαž–αŸαž“αŸ’αž’αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžš iOS αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžαŸ’αžšαžΌαžœαžαŸ‚αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαŸ†αž‘αžΎαž„αžαžΆαž˜αžšαž™αŸˆ HTTPS αŸ” αž“αŸ…αž€αŸ’αž“αž»αž„αž€αŸ†αžŽαŸ‚αž‘αžΈαž”αŸ’αžšαžΆαŸ†αž”αžΈ αž‘αž˜αŸ’αžšαž„αŸ‹αž“αŸƒ manifest αž”αžΆαž“αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž”αž“αŸ’αžαž·αž…αŸ– αž”αŸ’αž›αž»αž€αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžšαžΌαž”αžαŸ†αžŽαžΆαž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŠαžΌαž…αž‡αžΆ

<images>
   <image>...</image>
</images>

αžŠαžΌαž…αŸ’αž“αŸαŸ‡ αžŠαžΎαž˜αŸ’αž”αžΈαžŠαŸ†αž‘αžΎαž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ αž‘αŸ†αž–αŸαžš HTML αžŸαžΆαž˜αž‰αŸ’αž‰αžŠαŸ‚αž›αž˜αžΆαž“αžαŸ†αžŽαž—αŸ’αž‡αžΆαž”αŸ‹αž”αŸ‚αž”αž“αŸαŸ‡αž‚αžΊαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαžΆαž“αŸ‹αž αžΎαž™αŸ–

itms-services://?action=download-manifest&url=https://$ServerUrl/$ProjectName/$Instance/iOS/$AppVersion/manifest.plist

αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžαž˜αŸ’αžšαžΌαžœαž€αžΆαžšαžšαž”αžŸαŸ‹αž“αžΆαž™αž€αžŠαŸ’αž‹αžΆαž“αž’αž—αž·αžœαžŒαŸ’αžαž“αŸ αž“αž·αž„αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αž Plarium αž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŠαŸ†αž‘αžΎαž„αžŸαŸ†αžŽαž„αŸ‹αž•αŸ’αž‘αžΆαž›αŸ‹αžαŸ’αž›αž½αž“ αžŠαŸ‚αž›αž•αŸ’αžαž›αŸ‹αž±αŸ’αž™αž™αžΎαž„αž“αžΌαžœαŸ–

  • αžŸαŸ’αžœαŸαž™αž—αžΆαž– αž“αž·αž„αž―αž€αžšαžΆαž‡αŸ’αž™αž—αžΆαž–
  • αž€αžΆαžšαž’αŸ’αžœαžΎαž˜αž‡αŸ’αžˆαž·αž˜αž“αŸƒαž€αžΆαžšαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž€αžΆαžšαž…αžΌαž›αž”αŸ’αžšαžΎ αž“αž·αž„αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž–αž“αŸƒαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžαžΆαž˜αžšαž™αŸˆ "αž”αžŽαŸ’αžαŸ„αŸ‡αž’αžΆαžŸαž“αŸ’αž“" αžαŸ†αžŽαž—αŸ’αž‡αžΆαž”αŸ‹αžŠαŸ‚αž›αž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαžαžΆαž˜αžœαž“αŸ’αž,
  • αž˜αž»αžαž„αžΆαžšαžŠαŸ‚αž›αž’αžΆαž…αž–αž„αŸ’αžšαžΈαž€αž”αžΆαž“ (αž“αŸ„αŸ‡αž‚αžΊαž€αŸ’αžšαž»αž˜αž’αž—αž·αžœαžŒαŸ’αžαž“αŸ αž”αžΎαž…αžΆαŸ†αž”αžΆαž…αŸ‹ αž’αžΆαž…αž”αž‰αŸ’αž…αžΌαž›αž˜αž»αžαž„αžΆαžšαžŠαŸ‚αž›αž”αžΆαžαŸ‹αž‘αŸ…αž€αŸ’αž“αž»αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŠαŸ‚αž›αž˜αžΆαž“αžŸαŸ’αžšαžΆαž”αŸ‹)αŸ”

αžŸαžΆαž€αž›αŸ’αž”αž„

αž₯αž‘αžΌαžœαž“αŸαŸ‡αž™αžΎαž„αž“αžΉαž„αž“αž·αž™αžΆαž™αž’αŸ†αž–αžΈαž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαž˜αž»αž“αž€αžΆαžšαž…αŸαž‰αž•αŸ’αžŸαžΆαž™αž“αŸƒαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŠαŸ„αž™αž”αŸ’αžšαžΎ TestFlight.

αž›αž€αŸ’αžαžαžŽαŸ’αžŒαž…αžΆαŸ†αž”αžΆαž…αŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž‘αžΆαž‰αž™αž€αž‚αžΊαž‡αžΆαž”αŸ’αžšαž—αŸαž‘αž“αŸƒαž‘αž˜αŸ’αžšαž„αŸ‹αž αžαŸ’αžαž›αŸαžαžΆαžšαž”αžŸαŸ‹ App Store αž“αž·αž„αžœαžαŸ’αžαž˜αžΆαž“αž“αŸƒαžŸαŸ„ API αžŠαŸ‚αž›αž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαŸ”

αž˜αžΆαž“αžœαž·αž’αžΈαž‡αžΆαž…αŸ’αžšαžΎαž“αžŠαžΎαž˜αŸ’αž”αžΈαž‘αžΆαž‰αž™αž€αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαŸ–

  • αžαžΆαž˜αžšαž™αŸˆ Xcode (αž’αŸ’αž“αž€αžšαŸ€αž”αž…αŸ†),
  • αžαžΆαž˜αžšαž™αŸˆ altool,
  • αžαžΆαž˜αžšαž™αŸˆαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ Loader αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αŸ†αžŽαŸ‚αž…αžΆαžŸαŸ‹αž“αŸƒ Xcode (αž₯αž‘αžΌαžœαž“αŸαŸ‡ Transporter) αŸ”

αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž‘αžΆαž‰αž™αž€αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž· altool αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎ αžŠαŸ‚αž›αž€αŸαž˜αžΆαž“αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαž’αž“αž»αž‰αŸ’αž‰αžΆαžαž–αžΈαžšαž•αž„αžŠαŸ‚αžšαŸ–

  • αž–αžΆαž€αŸ’αž™αžŸαž˜αŸ’αž„αžΆαžαŸ‹αž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αž“αŸƒαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ,
  • αžŸαŸ„ API αŸ”

αžœαžΆαž‡αžΆαž€αžΆαžšαž”αŸ’αžšαžŸαžΎαžšαž€αŸ’αž“αž»αž„αž€αžΆαžšαž‘αžΆαž‰αž™αž€αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŠαŸ„αž™αž”αŸ’αžšαžΎ API Key αŸ”

αžŠαžΎαž˜αŸ’αž”αžΈαž‘αž‘αž½αž›αž”αžΆαž“ API Key αžŸαžΌαž˜αž…αžΌαž›αž‘αŸ…αž€αžΆαž“αŸ‹ αžαŸ†αžŽαž—αŸ’αž‡αžΆαž”αŸ‹ αž“αž·αž„αž”αž„αŸ’αž€αžΎαžαžŸαŸ„αŸ” αž”αž“αŸ’αžαŸ‚αž˜αž–αžΈαž›αžΎαž‚αž“αŸ’αž›αžΉαŸ‡αžαŸ’αž›αž½αž“αžœαžΆαž€αŸ’αž“αž»αž„αž‘αž˜αŸ’αžšαž„αŸ‹ *.p8 αž™αžΎαž„αž“αžΉαž„αžαŸ’αžšαžΌαžœαž€αžΆαžšαž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαž–αžΈαžšαŸ– IssuerID αž“αž·αž„ KeyID αŸ”

αž›αž€αŸ’αžαžŽαŸˆαž–αž·αžŸαŸαžŸαž“αŸƒαž€αžΆαžšαž€αžŸαžΆαž„ αž“αž·αž„αž…αŸ‚αž€αž…αžΆαž™αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ iOS

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€ αž“αžΆαŸ†αž…αžΌαž›αž€αžΌαž“αžŸαŸ„αžŠαŸ‚αž›αž”αžΆαž“αž‘αžΆαž‰αž™αž€αž‘αŸ…αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž”αž„αŸ’αž€αžΎαžαŸ–

mkdir -p ~/.appstoreconnect/private_keys
mv ~/Downloads/AuthKey_${KeyID}.p8 ~/.appstoreconnect/private_keys/

αž˜αž»αž“αž–αŸαž›αž”αž‰αŸ’αž…αžΌαž›αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž‘αŸ… TestFlight αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž’αŸ’αžœαžΎαž±αŸ’αž™αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž˜αžΆαž“αžŸαž»αž–αž›αž—αžΆαž– αž™αžΎαž„αž’αŸ’αžœαžΎαžœαžΆαžŠαŸ„αž™αž”αŸ’αžšαžΎαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαŸ–

xcrun altool 
--validate-app 
-t ios 
-f $(find "$ProjectDir" -name "*.ipa") 
--apiKey β€œ$KeyID” 
--apiIssuer β€œ$IssuerID” 

αž€αž“αŸ’αž›αŸ‚αž„αžŽαžΆ apiKey ΠΈ apiIssuer αž˜αžΆαž“αžαž˜αŸ’αž›αŸƒαžœαžΆαž›αž–αžΈαž‘αŸ†αž–αŸαžšαž”αž„αŸ’αž€αžΎαžαž€αžΌαž“αžŸαŸ„ API αŸ”

αž”αž“αŸ’αž‘αžΆαž”αŸ‹β€‹αž˜αž€ αž“αŸ…β€‹αž–αŸαž›β€‹αž˜αžΆαž“β€‹αžŸαž»αž–αž›αž—αžΆαž–β€‹αž‡αŸ„αž‚αž‡αŸαž™ αž™αžΎαž„β€‹αž•αŸ’αž‘αž»αž€β€‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈβ€‹αžŠαŸ„αž™β€‹αž”αŸ’αžšαžΎβ€‹αž–αžΆαž€αŸ’αž™β€‹αž”αž‰αŸ’αž‡αžΆ --upload-app αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαžŠαžΌαž…αž‚αŸ’αž“αžΆαŸ”

αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαžΆαž€αž›αŸ’αž”αž„αžŠαŸ„αž™αž€αŸ’αžšαž»αž˜αž αŸŠαž»αž“ Apple αž€αŸ’αž“αž»αž„αžšαž™αŸˆαž–αŸαž›αž˜αž½αž™ αž¬αž–αžΈαžšαžαŸ’αž„αŸƒ αž αžΎαž™αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž“αžΉαž„αž˜αžΆαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αžŸαžΆαž€αž›αŸ’αž”αž„αžαžΆαž„αž€αŸ’αžšαŸ…αŸ– αž–αž½αž€αž‚αŸαž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αž‰αžΎαžαžΆαž˜αž’αŸŠαžΈαž˜αŸ‚αž›αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„αŸ”

αžœαž·αž’αžΈαž˜αž½αž™αž‘αŸ€αžαžŠαžΎαž˜αŸ’αž”αžΈαž‘αžΆαž‰αž™αž€αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžαžΆαž˜αžšαž™αŸˆ altool αž‚αžΊαžαŸ’αžšαžΌαžœαž”αŸ’αžšαžΎαž–αžΆαž€αŸ’αž™αžŸαž˜αŸ’αž„αžΆαžαŸ‹αž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αžšαž”αžŸαŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαŸ”

αžŠαžΎαž˜αŸ’αž”αžΈαž‘αž‘αž½αž›αž”αžΆαž“αž–αžΆαž€αŸ’αž™αžŸαž˜αŸ’αž„αžΆαžαŸ‹αž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αž“αŸƒαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž…αžΌαž›αž‘αŸ…αž€αžΆαž“αŸ‹ αžαŸ†αžŽαž—αŸ’αž‡αžΆαž”αŸ‹ αž αžΎαž™αž”αž„αŸ’αž€αžΎαžαžœαžΆαž“αŸ…αž€αŸ’αž“αž»αž„αž•αŸ’αž“αŸ‚αž€αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž–αŸ”

αž›αž€αŸ’αžαžŽαŸˆαž–αž·αžŸαŸαžŸαž“αŸƒαž€αžΆαžšαž€αžŸαžΆαž„ αž“αž·αž„αž…αŸ‚αž€αž…αžΆαž™αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ iOS

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€ αž’αŸ’αž“αž€αž‚αž½αžšαžαŸ‚αž”αž„αŸ’αž€αžΎαžαž€αŸ†αžŽαžαŸ‹αžαŸ’αžšαžΆαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž“αŸ…αž€αŸ’αž“αž»αž„ Keychain αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž–αžΆαž€αŸ’αž™αžŸαž˜αŸ’αž„αžΆαžαŸ‹αž“αŸαŸ‡αŸ” αž–αžΈαž€αŸ†αžŽαŸ‚ 11 αž“αŸƒ Xcode αž“αŸαŸ‡αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αŸ’αžœαžΎαžŠαŸ„αž™αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆ:

xcrun altool --store-password-in-keychain-item "Altool" -u "$DeveloperName" -p $AppPswd

αž“αŸ…αž‘αžΈαžŽαžΆ:

$DeveloperName - αžˆαŸ’αž˜αŸ„αŸ‡αž‚αžŽαž“αžΈαž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸ iOS αž”αŸ’αžšαžΎαžŠαžΎαž˜αŸ’αž”αžΈαž…αžΌαž›αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜ Apple αŸ”

$AppPswd - αž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž–αžΆαž€αŸ’αž™αžŸαž˜αŸ’αž„αžΆαžαŸ‹αž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αž“αŸƒαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαŸ”

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€ αž™αžΎαž„αž‘αž‘αž½αž›αž”αžΆαž“αžαž˜αŸ’αž›αŸƒαž“αŸƒαž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžš asc-provider αž αžΎαž™αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž—αžΆαž–αž‡αŸ„αž‚αž‡αŸαž™αž“αŸƒαž€αžΆαžšαž“αžΆαŸ†αž…αžΌαž›αž–αžΆαž€αŸ’αž™αžŸαž˜αŸ’αž„αžΆαžαŸ‹αžŠαŸ„αž™αž”αŸ’αžšαžΎαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαŸ–

xcrun altool --list-providers -u "$DeveloperName" -p "@keychain:Altool"

αž™αžΎαž„αž‘αž‘αž½αž›αž”αžΆαž“αž›αž‘αŸ’αž’αž•αž›αŸ–

Provider listing:
- Long Name - - Short Name -
XXXXXXX        XXXXXXXXX

αžŠαžΌαž…αžŠαŸ‚αž›αž’αŸ’αž“αž€αž’αžΆαž…αžƒαžΎαž‰ αžαž˜αŸ’αž›αŸƒ Short Name αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž€αžΆαžš (asc-provider) αžŸαŸ’αžšαž”αž‚αŸ’αž“αžΆαž‡αžΆαž˜αž½αž™αž“αžΉαž„αž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžš $TeamID αžŠαŸ‚αž›αž™αžΎαž„αž”αžΆαž“αž”αŸ’αžšαžΎαž“αŸ…αž–αŸαž›αž”αž„αŸ’αž€αžΎαžαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαŸ”

αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαžŸαž»αž–αž›αž—αžΆαž– αž“αž·αž„αž•αŸ’αž‘αž»αž€αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž‘αŸ…αž€αŸ’αž“αž»αž„ TestFlight αžŸαžΌαž˜αž”αŸ’αžšαžΎαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαŸ–

xcrun altool 
--(validate|upload)-app   
-f $(find "$ProjectDir" -name "*.ipa") 
-u "$DeveloperName" 
-p "@keychain:Altool" 

αž‡αžΆαžαž˜αŸ’αž›αŸƒαž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžš -p αž’αŸ’αž“αž€αž’αžΆαž…αž™αž€αžαž˜αŸ’αž›αŸƒ $AppPswd αž€αŸ’αž“αž»αž„αž‘αž˜αŸ’αžšαž„αŸ‹αž˜αž·αž“αž’αŸŠαž·αž“αž‚αŸ’αžšαžΈαž” (αž…αŸ’αž”αžΆαžŸαŸ‹αž›αžΆαžŸαŸ‹)αŸ”

αž‘αŸ„αŸ‡αž™αŸ‰αžΆαž„αžŽαžΆαž€αŸαžŠαŸ„αž™ αžŠαžΌαž…αžŠαŸ‚αž›αž”αžΆαž“αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αžšαž½αž…αž˜αž€αž αžΎαž™ αžαžΆαž˜αž‘αžŸαŸ’αžŸαž“αŸˆαž“αŸƒαž€αžΆαžšαž’αž“αž»αžœαžαŸ’αž αžœαžΆαž‡αžΆαž€αžΆαžšαž”αŸ’αžšαžŸαžΎαžšαž€αŸ’αž“αž»αž„αž€αžΆαžšαž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸ API Key αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž’αž“αž»αž‰αŸ’αž‰αžΆαž altool αž…αžΆαž”αŸ‹αžαžΆαŸ†αž„αž–αžΈαž€αŸ†αžŽαŸ‚αž•αŸ’αžŸαŸαž„αŸ—αž“αŸƒ Xcode αž˜αžΆαž“αž”αž‰αŸ’αž αžΆαž˜αž½αž™αž…αŸ†αž“αž½αž“ ("αž˜αž·αž“αžƒαžΎαž‰" Keychain αž€αŸ†αž αž»αžŸαž€αŸ’αž“αž»αž„αž€αžΆαžšαž’αž“αž»αž‰αŸ’αž‰αžΆαžαž’αŸ†αž‘αž»αž„αž–αŸαž›αž•αŸ’αž‘αž»αž€αž‘αžΎαž„αŸ”αž›αŸ”)αŸ”

αž“αŸ„αŸ‡αž αžΎαž™αž‡αžΆαž‘αžΆαŸ†αž„αž’αžŸαŸ‹ αžαžΆαž˜αž–αž·αžαŸ” αžαŸ’αž‰αž»αŸ†αžŸαžΌαž˜αž‡αžΌαž“αž–αžšαž±αŸ’αž™αž’αŸ’αž“αž€αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αž“αžΆαž–αžΆαž€αŸ‹αž–αŸαž“αŸ’αž’αž“αžΉαž„αž€αžΆαžšαžŸαŸ’αžαžΆαž”αž“αžΆαž”αŸ’αžšαž€αž”αžŠαŸ„αž™αž‡αŸ„αž‚αž‡αŸαž™ αž“αž·αž„αž€αžΆαžšαž…αŸαž‰αž•αŸ’αžŸαžΆαž™αžŠαŸ„αž™αž‚αŸ’αž˜αžΆαž“αž”αž‰αŸ’αž αžΆαž“αŸ…αž€αŸ’αž“αž»αž„ App Store αŸ”

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹