Próbuję więc użyć interfejsu API Shopify. Gdy zarchiwizuję aplikację i zweryfikuję ją, nie będzie żadnych problemów, ale kiedy prześlę ją do sklepu z aplikacjami, otrzymam następujące problemy.
- BŁĄD ITMS-90087: „Nieobsługiwana architektura. Plik wykonywalny zawiera nieobsługiwaną architekturę„ [x86_64, i386] ”.”
- BŁĄD ITMS-90209: „Nieprawidłowe wyrównanie segmentów. Aplikacja Binary w SJAPP.app/Frameworks/Buy.framework/Buy nie ma odpowiedniego wyrównania segmentów. Spróbuj odbudować aplikację z najnowszą wersją Xcode.” (Korzystam już z najnowszej wersji).
- BŁĄD ITMS-90125: „Plik binarny jest nieprawidłowy. Brakuje informacji o szyfrowaniu w poleceniu ładowania LC_ENCRYPTION_INFO lub jest on nieprawidłowy lub plik binarny jest już zaszyfrowany. Wygląda na to, że ten plik binarny nie został utworzony za pomocą narzędzia Apple Linker.”
- OSTRZEŻENIE ITMS-90080: „Ładunek wykonywalny /..../ Buy.framework nie jest plikiem wykonywalnym niezależnym od pozycji. Upewnij się, że ustawienia kompilacji ur są skonfigurowane do tworzenia plików wykonywalnych PIE”.
Odpowiedzi:
Problem polega na tym, że struktura Buy zawiera kompilację zarówno dla symulatora (x86_64), jak i rzeczywistych urządzeń (ARM).
Oczywiście nie można przesyłać do App Store pliku binarnego dla nieobsługiwanej architektury, więc rozwiązaniem jest „ręczne” usunięcie niepotrzebnych architektur z ostatecznego pliku binarnego przed przesłaniem go.
Daniel Kennett wymyślił fajne rozwiązanie i udostępnia ten skrypt, aby dodać go do fazy kompilacji:
Użyłem go i działało idealnie.
EDYCJA: upewnij się, że spojrzałeś na zmodyfikowany skrypt opublikowany przez Varrry, ponieważ ten ma kilka drobnych problemów.
źródło
Odpowiedź udzielona przez pAkY88 działa, ale napotkałem ten sam problem, co Mario A Guzman w https://stackoverflow.com/a/35240555/5272316 : po odcięciu nieużywanej architektury nie możemy już uruchomić skryptu, ponieważ próbuje on usunąć nieistniejące wycinki, ponieważ xcode nie za każdym razem ponownie osadza pliki binarne. Pomysł był taki: po prostu usuń plasterki i386 i x86_64 podczas budowania archiwum, więc zmodyfikowałem skrypt:
Ten skrypt po prostu usuwa plastry i386 i x86_64 z grubego pliku binarnego (jeśli istnieją), jeśli nie są uruchomione dla symulatora (co oznacza, że folder docelowy nie jest podobny do „Debug-iphonesimulator”).
Niestety, nie znam skryptów powłoki, więc być może ktoś mógłby napisać to w bardziej elegancki sposób. Ale to działa)
źródło
case "${TARGET_BUILD_DIR}" in *"iphonesimulator") echo "Skip simulator target"; continue ;; esac
i zadziałało to jak urok.TARGET -> Build Phases -> [CP] Embedded Pods Frameworks
Dodaję ten skrypt, ale nie działa i nadal przesyłam błędy do iTunesConnect. Jak uruchomić ten skrypt?Jeśli używasz Kartaginy , możesz napotkać ten problem, ponieważ projekt to:
carthage copy-frameworks
fazy kompilacji.Ta akcja filtruje ramy do listy poprawnych architektur (kodu) .
Konfigurowanie fazy kompilacji struktur kopiowania
Z budynku Kartaginy na iOS :
źródło
$(SRCROOT)/Carthage/Build/iOS/Marshal.framework
że wykonałem pracęRozwiązałem błąd ITMS-90080, usuwając platformę (doskonałe SVProgressHUD) z sekcji Osadzone pliki binarne (cel Xcode -> karta Ogólne).
źródło
Jeśli używasz,
Carthage
upewnij się, żeEmbed Frameworks
Build Step
jest przedCarthage
copy-frameworks
W niektórych nietypowych przypadkach (przykład: framework Lottie-iOS):
będziesz go mieć jak zwykle w „Link Library”.
Jednak trzeba też wyraźnie dodać go w „Wstaw Ram” (mimo, że wydaje się bezcelowe, ponieważ działa idealnie, gdy masz go tylko w „Embed Ram”)
i umieść to w ramach kopiowania
i upewnij się, że kopiowanie ram jest po „Embed Frameworks”
źródło
Usuń [x86_64, i386] ze struktury, wykonując poniższy krok. [x86_64, i386] jest używany w symulatorze.
otwarty
Terminal
otwórz ścieżkę przeciągania projektu odpowiedniej struktury do terminala
przykład:
cd /Users/MAC/Desktop/MyProject/Alamofire.framework
ustaw nazwę frameworku w poniższym poleceniu i uruchom
lipo -remove i386 Alamofire -o Alamofire && lipo -remove x86_64 Alamofire -o Alamofire
źródło
Dodam tutaj moje 2 centy (w mniej przerażający sposób :-). Zetknąłem się z wieloma grubymi bibliotekami od dostawców, które (z jakiegoś powodu) nie działają normalnie, dodając je do
Frameworks
katalogu udokumentowanego przez Apple. Jedynym sposobem, w jaki udało nam się sprawić, by działały, jest przeciągnięcie w.framekwork
prawo do katalogu projektu i połączenieEmbedded Frameworks
iLink Binary with Libraries
ręcznie w Ustawieniach kompilacji. Wydaje się, że działało to bez żadnych problemów, ponieważ w każdej grubej bibliotece są one dostarczane z zewnętrznymi architekturami symulatorówi386
ix86_64
wraz zarm
architekturami.Szybkim sposobem na sprawdzenie architektury biblioteki tłuszczu jest
Co powinno wypluć dane wyjściowe coś takiego
Potwierdza to, że będziesz musiał „przyciąć gruby” (a mianowicie
i386
&x86_64
) ze swojego środowiska przed przesłaniem archiwum iTunesConnect, co nie pozwala na te architektury (ponieważ nie są obsługiwane dla iOS).Teraz wszystkie odpowiedzi (lub przynajmniej niektóre z tych odpowiedzi) dostarczają tych wspaniałych skryptów Run, które na pewno działają naprawdę dobrze, ale tylko wtedy, gdy Twój Framework znajduje się w
Frameworks
katalogu. Teraz, chyba że jesteś ćpunem w skryptach powłoki, te skrypty bez modyfikacji nie będą działać w scenariuszu, który wyjaśnię powyżej. Istnieje jednak bardzo prosty sposób na pozbycie się architekturyi386
ix86_64
architektur z frameworka.Otwórz terminal w katalogu swojego projektu.
Zmień katalog bezpośrednio w
.framekwork
, jakcd YourProjectDir/YourProject/YourLibrary.framework
Uruchom serię poleceń, jak pokazano poniżej-
Należy zwrócić uwagę na kilka rzeczy -
lipo -remove
należy to zrobić raz dla każdej architektury do usunięcia.lipo
nie modyfikuje pliku wejściowego, tworzy tylko plik, więc musiszlipo -remove
raz uruchomić dlax86_64
ii386
. Powyższe polecenia po prostu robią to, najpierw zmieniając nazwę pliku wykonywalnego, a następnie usuwając pożądane archiwa, a następnie usuwając pozostałe pliki. I to jest to, powinieneś teraz zobaczyć zielony znacznik wyboru w przesyłaniu archiwum modułu ładującego aplikacje do iTunesConnect.Należy pamiętać : powyższe kroki należy wykonać tylko podczas kompilacji produkcyjnej, ponieważ
.framework
zostaną one usunięte z architektur symulatora, kompilacje na symulatorach przestaną działać (co jest oczekiwane). W środowisku programistycznym nie powinno być potrzeby usuwania architektur z.framework
pliku, ponieważ chcesz mieć możliwość testowania zarówno na Symulatorze, jak i na urządzeniu fizycznym. Jeśli Twoja gruba biblioteka znajduje się wFrameworks
folderze w projekcie, spójrz na zaakceptowaną odpowiedź.źródło
Miałem ten sam problem, nawet po kilkakrotnym dodaniu skryptu i aktualizacji frameworka.
Upewnij się, że w xCode skrypt jest dodawany na końcu, po osadzeniu. Myślę, że przypadkowo przesunąłem skrypt przed osadzoną platformą.
Uwaga: Mam xCode 9.1
źródło
Musisz tylko usunąć framework z osadzonych plików binarnych i po prostu dodać go do Linked Frameworks and Libraries.
Zobacz zrzut ekranu poniżej;
źródło
Dzięki wszystkim powyższym odpowiedziom. Oto skrypt działający z szybkimi wersjami 4.2 i 5 . Zastąp ciąg Your_Framework_Name oryginalną nazwą twojego Framework.
źródło
Ten problem został dla mnie rozwiązany poprzez nieznaczną modyfikację skryptu uruchamiania z odpowiedzi pAky88 i wykonanie po osadzeniu frameworków. Należy również odznaczyć pole „Uruchom skrypt tylko podczas instalacji”.
źródło
Usunąłem architektury i386 i x64_86 z Ustawień kompilacji - Prawidłowe architektury - wydanie i wszystko działało dobrze.
Teraz jedynym problemem byłoby to, że nie można uruchomić kompilacji RELEASE do celów testowych na symulatorze . Ale tak łatwo, jak usunąłeś archiwa, możesz je dodać z powrotem, jeśli chcesz.
źródło
proste rozwiązanie, które dla mnie zadziałało, to
Gotowe!
źródło
Ten błąd (ITMS-90240) może być również spowodowany przez bibliotekę statyczną (.a). Oto skrypt usuwający nadmiar architektury. W Xcode dodaj to do Target> BuildPhases> Kliknij + i wybierz Uruchom skrypt. Następnie wklej to w pole skryptu.
Skrypt wyszukuje pliki .a, sprawdza, czy zawiera szkodliwą architekturę, a następnie tworzy nowy plik .a bez tej architektury.
W systemie macOS:
Na iOS:
źródło
Miałem ten sam problem. Nawet to nie działało po dodaniu danego skryptu uruchamiania. To był problem związany z Xcode. Korzystałem z Xcode w wersji 9.0, ale najnowsza wersja to 9.2.
Więc zainstalowałem najnowszy Xcode (9.2) i zadziałało.
źródło
Twój framework zawiera zarówno kod, jak
ARM
ix86
kod, co pozwala używać go na urządzeniu lub w symulatorze. Jeśli zamierzasz przesłać aplikację do App Store, uruchom następujący skrypt, aby usunąć nieaktywny kod z pliku binarnego.1. Wybierz cel w Nawigatorze projektu i kliknij Fazy budowania u góry edytora projektu.
2. Z menu Edytor wybierz polecenie Dodaj fazę kompilacji, a następnie Dodaj fazę kompilacji skryptu uruchamiania (lub kliknij przycisk + w lewym górnym rogu edytora faz budowania).
3.Rozwiń trójkąt ujawnienia obok nowej fazy kompilacji Run Script, która właśnie została dodana. W polu edytora skryptów wklej następujące: bash
źródło
Oto skrypt, którego użyłem do specyficznego usunięcia tylko jednej architektury frameworka z pliku wykonywalnego.
Dodaj ten skrypt do swoich projektów „Fazy kompilacji” celu projektu. Pamiętaj, aby zaznaczyć pole: „Uruchom skrypt tylko podczas instalacji”
źródło