Zdalnie dystrybuować aplikację iOS skompilowaną w Xcode 7 bez App Store, podprogramu programisty lub jailbreak?


10

W następstwie tych instrukcji (patrz także dokumentacja dla programistów Apple i odpowiedź BoltClock do testowania aplikacji na iOS na urządzeniu bez programu apple dewelopera lub jailbreak ), udało mi się skompilować aplikację na iOS (w tym przypadku pochodzenia , gry wideo emulatora konsoli aplikacji, która nie spełniają wytyczne Apple i nigdy nie będą dozwolone w Apple App Store) w Xcode 7, podpisz je moim osobistym kontem iCloud, sideload to my iPhone (podłączając go do mojego Maca przez USB i wybierając mojego iPhone'a w menu xcode -> Produkt -> Miejsce docelowe) i pozwól, aby mój telefon go uruchomił, „ufając” aplikacjom z tym podpisem w Ustawieniach -> Ogólne -> Profil, który instaluje certyfikat powiązany z moim kontem icloud na urządzeniu.

Chciałbym powtórzyć te kroki przy pobieraniu bezprzewodowym. Czy mogę poprosić Xcode o wykonanie pliku wykonywalnego, który mogę udostępnić mojemu bratu, który ma iPhone'a, ale nie ma dostępu do komputera Mac z Xcode?

Sieć StackExchange osiągnęła coś takiego najwyraźniej w swojej wersji beta aplikacji na iOS, wykorzystując korporacyjną dystrybucję Apple za pośrednictwem Mobile Device Management, jak wspomniano w tym pytaniu . Istnieje również BuildStore ( http://builds.io/ ), który za 10 USD rocznie zapewnia również tę funkcjonalność, najwyraźniej poprzez dodanie użytkowników do „zespołu programistów” powiązanego z płatnym kontem Programu dla programistów Apple (patrz dokumenty programistów Apple ) . Czy w Xcode 7 można to zrobić bez konta firmowego, a nawet zwykłego płatnego konta programisty?

aktualizacja: Dzięki pomocy Stackszy poczyniłem pewne postępy, które tu streszczę.

  1. XCode utworzy archiwum (Produkt -> Archiwum), ale nie pozwala eksportować archiwum do pliku .ipa w celu dystrybucji ad hoc bez subskrybowania warstwy płatnego konta ADP.
  2. Nie ma problemu, chociaż, ponieważ narzędzie linii poleceń Xcode robi utworzyć plik wykonywalny .ipa, nawet bez płatnego konta ADP. Użyj polecenia podobnego xcodebuild -exportArchive -archivePath Provenance-Release\ 11-20-15\,\ 22.24.xcarchive/ -exportOptionsPlist ~/manifest.plist -exportPath ~/Provenance(patrz odpowiedź Khawara na stronie Jak utworzyć ipa w xcode 6 bez konta Apple Developer? )
  3. Ale to polecenie wymaga podania pliku manifestu .plist. Odpowiedź Razvana z Over The Air (OTA) iOS IPA File Distribution For Public? zawiera przykładowy manifest.plist, a także instrukcje dotyczące formatu hiperłącza niezbędnego do udostępnienia łącza pobierania, które musi być hostowane na stronie SSL. Być może adres URL SSL musi być zgodny z identyfikatorem pakietu aplikacji, nie jestem pewien.
  4. Ale powyższe działa tylko wtedy, gdy aplikacja jest przystosowana do urządzenia, które ją pobiera, a urządzenie ma już zainstalowany certyfikat programisty. Na przykład urządzenie, które wcześniej było podłączone przez USB do mojego Xcode, może teraz pobrać aplikację bezprzewodowo, co jest świetne. To jest postęp. Ale w przypadku czystych urządzeń pojawia się błąd Could not install embedded profile: 0xe8008012 (This provisioning profile cannot be installed on this device.)(wyświetlany w konsoli urządzenia, którą można wyświetlić w Xcode -> Okno -> Urządzenia lub w aplikacji Apple Configurator).
  5. Aby aplikacja mogła zostać udostępniona dla urządzenia, musi zawierać UDID urządzenia w embedded.mobileprovisionpliku, zobacz Jak osadzić profil obsługi administracyjnej w aplikacji na system iOS , Jak zautomatyzować sprawdzanie pola w empa.mobileprovision? , Jak dowiedzieć się, jakiego profilu użyto do zbudowania pliku * .ipa? i Czy istnieje sposób, aby zobaczyć, jaki UDID jest zawarty w kompilacji? . Nie można jednak po prostu edytować tego pliku, aby dodać identyfikator UDID, ponieważ wówczas CODESIGNATURE aplikacji nie pasuje, a urządzenie zgłosi błądFailed to verify code signature of /private/var/mobile/Library/Caches/com.apple.mobile.installd.staging/temp.7jBjpk‌​/extracted/Payload/Provenance.app : 0xe8008017 (A signed resource has been added, modified, or deleted.)}
  6. Ok, więc musimy zrezygnować z aplikacji. Xcode zapewnia narzędzie wiersza polecenia o nazwie, codesignktóre może to zrobić. Instrukcje znajdują się na stronie Jak ponownie podpisać plik IPA? i ponownie podpisz IPA (iPhone) i zrezygnuj z aplikacji na iPhone'a, wstaw nowy identyfikator pakietu i wyślij do Xcode Organizer w celu przesłania oraz sposobu ręcznego ponownego podpisania IPA za pomocą nowego profilu udostępniania . Musiałem określić mój certyfikat programisty, którego dokładną nazwę można znaleźć w Keychain Access, na karcie Certyfikaty i wygląda jak „Twórca iPhone: nazwa_użytkownika@mac.com (ABCDEFGHIJ)”. Zatem polecenie jest jak codesign -f -s "iPhone Developer: username@mac.com (ABCDEFGHIJ)" Payload/Provenance.app. Przykładowe polecenia w powyższych instrukcjach zawierały flagę o nazwie--resource-rules, ale nie znalazłem takiego pliku w mojej skompilowanej aplikacji, więc usunąłem tę flagę. Zastanawiam się, co robi i czy jest to konieczne. Edycja: Znakomity post na blogu Inside Code Signing autorstwa Thomasa Kollbacha wyjaśnia, że --resource-rulesflaga służyła do określania, które części aplikacji muszą być podpisane, ale ponieważ iOS8 jest przestarzałe, a cała aplikacja musi być podpisana.
  7. Teraz, gdy aplikacja ma dodany identyfikator UDID i jest podpisana, pobranie go na nowe urządzenie powoduje błędy Could not install embedded profile: 0xe8008003 (This provisioning profile is malformedi A valid provisioning profile for this executable was not found. Domyślam się, że teraz problemem jest to, że urządzenie nadal nie zainstalowało certyfikatu programisty. Podczas ładowania bocznego przez Xcode, zanim aplikacja się uruchomi, musisz znaleźć zainstalowany certyfikat w Ustawieniach -> Ogólne -> Profil, wybierz swój certyfikat i dotknij „zaufaj”. Jednak ta opcja nie pojawia się po bezprzewodowym pobraniu aplikacji ad hoc, więc nie jestem pewien, jak postępować. Myślę, że potrzebuję sposobu na zainstalowanie certyfikatu programisty na urządzeniu. Zgodnie z instalacją profilu informacyjnego na iOS 8.0.2, było to możliwe po prostu wysyłając certyfikat do urządzenia pocztą e-mail, ale to już nie działa od iOS 8. Nie próbowałem tego potwierdzać. Jak mogę zdalnie zainstalować mój certyfikat programisty na urządzeniu z systemem iOS?
  8. Próbowałem wyeksportować certyfikat programisty iPhone'a z Keychain Access i wysłać go pocztą e-mail na urządzenie. Urządzenie było w stanie zainstalować certyfikat, ale wyświetlało się z czerwonym ostrzeżeniem, że nie jest podpisane, podczas gdy certyfikat był instalowany przez Xcode / USB, nie miał takiego ostrzeżenia. Czy według Rhythmic Fistman można ponownie zaszyfrować plik embedded.mobileprovision? , aby działał, profil musi być podpisany przez Apple. Może to być punkt zaczepienia. Apple podpisze Twój certyfikat tylko wtedy, gdy masz płatne konto ADP.
  9. Ten post na blogu o zaopatrzeniu autorstwa Seana Hebera był bardzo pouczający na temat ogólnej teorii certyfikatów deweloperskich i profili obsługi administracyjnej (wraz z Kollbacha powinny być wymagane przeczytanie ich obu). Zawiera ten akapit:

    Wszystko to działa i jest bezpieczne, ponieważ Apple generuje profile udostępniania w portalu, a następnie podpisuje je własnymi kluczami prywatnymi przed dostarczeniem ich do Ciebie. Podpisywanie profili udostępniania jest czymś, co może zrobić tylko Apple. Pobranego pliku nie można zatem sfałszować bez unieważnienia go. Nieprawidłowy profil udostępniania nie zostanie zaakceptowany przez iOS, a zatem Apple może kontrolować dokładnie to, co może, a czego nie może zapewnić programista, po prostu ograniczając dostęp do podpisywania profilu udostępniania do rzeczy, które portal programisty daje użytkownikowi do skonfigurowania w pierwszej kolejności miejsce - nawet jeśli profile udostępniania mogą obsługiwać dowolną liczbę innych niesamowitych opcji, których nie można użyć bez jailbreaka. Dlatego musisz zarejestrować urządzenia testowe w portalu, dodaj swoje certyfikaty do portalu itp. - w wygenerowanym i odpowiednio podpisanym profilu informacyjnym można uwzględnić tylko elementy w portalu (a tym samym ich liczbę można kontrolować i ograniczać dowolnie przez Apple). Portal jest miejscem egzekwowania zasad i ograniczeń Apple dotyczących udostępniania.

To wydaje się definitywnie odpowiedzieć na moje pytanie (czy mogę uruchomić aplikację bez płatnego konta ADP) z „nie”. Chociaż ten artykuł poprzedza Xcode 7. Najwyraźniej Xcode 7 wyśle ​​identyfikator UDID urządzenia do portalu Apple i otrzyma w odpowiedzi profil informacyjny podpisany przez Apple, zawierający ten UDID. Xcode 7 robi to tylko wtedy, gdy urządzenie jest podłączone przez USB i rozpoznane przez Xcode, ale zastanawia się, czy można spreparować ręczne żądanie Xcode do Apple? To zagłębia się w inżynierię wsteczną w rzeczy Apple, z którymi nie czuję się komfortowo i prawdopodobnie narusza ToS lub cokolwiek, więc myślę, że jestem zadowolony z odpowiedzi „nie”.

Według strony about BuildStore , zarządzają czymś podobnym przez e-mail, więc może to być możliwe.

Xcode „Build and Archive” z wiersza poleceń jest dość stary (około xcode 3), ale sugeruje użycie xcrunzamiast tego, xcodebuildktórego używałem.


1
Proszę rozważyć podzielenie tego. Pytanie powinno być krótkie, proste i łatwe do zrozumienia. Cała odpowiedź / proces dotarcia do odpowiedzi i posta na blogu powinny znajdować się w sekcji odpowiedzi.
bmike

Odpowiedzi:


2

Odpowiedź jest prawie TAK!

Udało mi się zainstalować nowe wersje tej samej aplikacji na urządzeniach za pośrednictwem Fabric.io bez abonamentu Apple Dev. (Wydaje mi się, że można je również rozpowszechniać za pomocą iTunes. Wyślij ipa do testera, a powinien być w stanie zainstalować go za pośrednictwem iTunes.)

Jedyną wadą jest to, że musisz podłączyć urządzenie do Xcode przynajmniej raz . Następnie możesz zdalnie zainstalować nowe wersje. (Nie znalazłem sposobu, aby to zrobić ręcznie, znając udid)

Kiedy podłączysz „nieznane” urządzenie do xcode 7, pojawi się fix issueprzycisk Target general settings. Napraw problem, a Xcode wygeneruje nowy profil obsługi administracyjnej z tym urządzeniem. (możesz to znaleźć w ~/Library/MobileDevice/Provisioning Profiles)

Możesz użyć tego profilu udostępniania do dystrybucji aplikacji za pośrednictwem Fabric.io

  1. Zarejestruj się na Fabric.io
  2. Skonfiguruj sieć szkieletową dla swojego projektu (istnieje przewodnik krok po kroku)
  3. Upewnij się, że xcode używa właściwego prov. profil do podpisania. Automaticpracował dla mnie.
  4. Xcode> projekt> archiwum
  5. pomocnik tkaniny wykryje kompilację i będziesz mógł ją rozpowszechniać.

Niestety, chłopaki, którzy nie są wystarczająco biegli w Xcode, nie mam dużo czasu, aby dodać mniej podatnego na błędy przewodnika, ale mam nadzieję, że ta odpowiedź pomoże komuś z pomysłami.

WSKAZÓWKA: użyj tej wtyczki szybkiego podglądu, aby zobaczyć wewnątrz iPas i prov. profile!


1
Tak, ta odpowiedź jest zgodna z tym, co odkryłem podczas moich testów. Nadal zastanawiam się, czy można obejść ten problem, „łącząc urządzenie z
kodem x

2

W przypadku niektórych wersji iOS 9.x wydanych, ponieważ moja odpowiedź została pierwotnie opublikowana, nie jest to już nawet możliwe. Apple ogranicza teraz pobieranie OTA do kont niewolnych, co pokazują błędy w logach urządzenia w przypadku niepowodzenia instalacji.

Przetestowałem to szeroko, ponieważ byłoby to niesamowite również dla moich aplikacji.

Czy mogę rozpowszechniać swoje aplikacje OTA bez członkostwa w Programie dla programistów (kosztuje)?

Możesz utworzyć i podpisać IPA oraz utworzyć dla niego plik manifestu, ale instalacja nie powiedzie się na urządzeniu. Powodem tego jest to, że Xcode musi skonfigurować IPA dla tego urządzenia (podobno podpisując go poprawnie za pomocą UDID). Możesz nawet zobaczyć, jak to się dzieje, jeśli spróbujesz podłączyć nowe urządzenie do komputera Mac i uruchomić na nim aplikację za pomocą Xcode. Krótka odpowiedź brzmi: nie.

Co mogę zrobić, aby to zadziałało?

Możesz zarejestrować się w Programie dla programistów z Apple (kosztuje) i dodać UDID swojego urządzenia do swojego profilu, a następnie utworzyć plik IPA i plik manifestu, przesłać je na serwer internetowy i wysłać mu adres URL.

To naprawdę jest dla bezpieczeństwa, ponieważ bariera cenowa zwykle powstrzymuje rozprzestrzenianie się złośliwych aplikacji w Internecie. Nie wspominając o zachowaniu większości pobrań aplikacji w App Store.

Zarejestrowałem się w programie dla programistów? Jak mam to teraz dystrybuować?

Musisz mieć serwer internetowy HTTPS (i certyfikat SSL, dla którego możesz utworzyć własny root). Musisz także dodać ich UDID do swojego profilu programisty (nie jestem pewien, jak to zrobić). Musisz użyć Xcode, aby utworzyć IPA (Produkt> Archiwum> Eksportuj> Zapisz w celu wdrożenia Ad-hoc> Zaloguj się przy użyciu Apple ID> Postępuj zgodnie z instrukcjami), a otrzymasz plik Plist i plik IPA. Umieść oba na serwerze i zmień wartości w pliku Plist, aby pasowały do ​​adresów URL HTTPS na serwerze. Następnie użyjesz specjalnego linku do linku do manifestu Plist, który wyskoczy z prośbą o zainstalowanie aplikacji. Jeśli wszystko pójdzie dobrze, użytkownik będzie miał twoją aplikację. Jeśli chcesz, musisz także zakodować własną metodę aktualizacji.

Jeśli jest to aplikacja, którą chcesz rozpowszechniać w tym momencie, sensowniejsze może być umieszczenie jej w App Store lub jeśli jest to wersja beta, użyj TestFlight. Jeśli masz konto programisty, możesz użyć TestFlight i pominąć wszystkie te rzeczy do testowania aplikacji. Wszystko czego potrzebujesz to ich e-mail i aby zmusić ich do zainstalowania aplikacji TestFlight ze sklepu App Store. TestFlight może być zarządzany z iTunes Connect.


A kiedy już zarejestrujesz się w Deweloperze, jak rozpowszechnisz aplikację?
zyggurizm

Zaktualizowałem mój post z instrukcjami.
AppleBetas,

Dziękuję, tego właśnie szukałem. Wiem, że powiedziałeś, że konieczne jest posiadanie płatnego konta programisty i przydzielanie identyfikatorów UDID, ale chciałbym wypróbować tę metodę bez wcześniejszego. Przekażę wyniki.
zyggurizm

Postępując zgodnie z instrukcjami dotyczącymi tworzenia archiwum, ale przyciski „Prześlij do sklepu z aplikacjami”, „Sprawdź” i „Eksportuj” były wyszarzone, a poniższy link brzmiał: „Dystrybucja wymaga rejestracji w programie dla programistów Apple” Przejdź do strony internetowej, aby zarejestrować się w ADP. Z jednej strony jest tak, jak obiecałeś: wydaje się, że wymagana jest subskrypcja 99 USD na program dla programistów Apple, nawet jeśli chcesz tylko rozprowadzać bezprzewodowo (OTA) aplikację ad hoc. GUI XCode nie utworzy IPA i profilu udostępniania.
zyggurizm

Z drugiej strony, na stackoverflow.com/questions/26928721/... użytkownik Khawar twierdzi, że można to zrobić bez podrzędnego ADP przy użyciu xcodebuildwiersza polecenia, który utworzy archiwum .ipa, a także podpisze i udostępni aplikację, jeśli użyjesz -exportProvisioningProfileflagi (patrz komentarz Pankaj Rathor).
zyggurizm

1

Zasadniczo ktoś musi podpisać aplikację. Możesz pobrać plik IPA, ale nie będzie on działał na dowolnych urządzeniach. Skoncentruj się na tym, a szybko zdecydujesz, czy chcesz znosić problemy każdej osoby korzystającej z Xcode, czy też płacenie za podpisywanie aplikacji przez Apple ma sens.

Jeśli korzystasz z systemu iOS 9, który nie jest programistą, podpisywany przy użyciu dowolnego starego identyfikatora Apple ID, wszyscy testerzy muszą zalogować się przy użyciu identyfikatora Apple ID, aby uruchomić aplikację.

Możesz zapłacić Apple za obsługę kont i podpisywanie kont, płacąc za rok kont programistów. Następnie możesz wysyłać wiadomości e-mail, otwierać aplikacje na dowolnym serwerze, korzystać z TestFlight lub na wiele innych sposobów, niż przekazywanie identyfikatora Apple ID testerom / użytkownikom aplikacji.

Zawsze możesz wysłać kod źródłowy do swojego brata, jeśli ma on Xcode, ale wspomniałeś, że to dlatego, że ktoś nie miał komputera Mac do zainstalowania i podpisania aplikacji.

Łamanie więzień jest łatwiejsze niż fałszowanie łańcucha certyfikatów Apple, ale nie polecam tego.


Gdzie testerzy musieliby się zalogować przy użyciu mojego Apple ID, aby uruchomić aplikacje nie podpisane przez programistów?
zyggurizm

W Xcode korzystanie z komputera Mac jest najłatwiejsze. Musiałbym je wysłać swój telefon, aby załadować aplikację, jeśli nie może dostać się do Xcode ...
bmike

Tak, instalacja z Xcode przez USB działa świetnie. Moje pytanie dotyczyło możliwości zdalnej dystrybucji / instalacji. StackExchange zrobił to dla swojej wersji beta. Też chcę to zrobić.
zyggurizm

@ziggurism SE zapłacił za certyfikat przedsiębiorstwa. Aby tak się stało, będziesz potrzebować trochę legalnej dokumentacji. Plus kilkaset $ rocznie. TestFlight to tańsza opcja i mniej szara strefa. To, co zrobiła SE, nie jest prawdopodobne „według książki” zgodnie z licencją na certyfikaty, których używali, ale nie jestem prawnikiem ...
bmike
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.