Nowe ostrzeżenia w iOS 9: „cały kod bitowy zostanie usunięty”

387

Mam w tej aplikacji nowe ostrzeżenie dotyczące Google Framework:

(null): PILNE: cały kod bitowy zostanie usunięty, ponieważ „/ Users / myname / Library / Mobile Documents / com ~ apple ~ CloudDocs / foldername / appname / GoogleMobileAds.framework / GoogleMobileAds (GADSlot + AdEvents.o)” został zbudowany bez kodu bitowego . Musisz go odbudować z włączonym kodem bitowym (ustawienie Xcode ENABLE_BITCODE), uzyskać zaktualizowaną bibliotekę od dostawcy lub wyłączyć kod bitowy dla tego celu. Uwaga: w przyszłości będzie to błąd.

Xcode 7 daje mi około 204 ostrzeżeń na temat tej samej koncepcji i nie mogłem się z tym obejść. Mam również problem z dostępem do sieci z mojej aplikacji. To jest błąd z obszaru debugowania:

-canOpenURL: nie powiodło się dla adresu URL: „kindle: // home” - błąd: „Ta aplikacja nie może wysyłać zapytań o zapytanie typu kindle”

Wszystkie te problemy nie występowały w iOS 8.

C.Farrugia
źródło
Więc masz włączony kod bitowy w swoim celu Xcode?
Droppy,
Przepraszam, że jestem nowy w tym, czy możesz mi powiedzieć, jak proszę?
C.Farrugia
Nigdy tego nie robiłem, ale wygląda na to, że musisz to celowo ustawić. Wygląda na to, że to zrobiłeś.
Droppy
4
@Droppy AFAIK ustawienie jest domyślnie włączone, ale możesz je wyłączyć w dowolnym momencie w ustawieniach projektu.
MA
Wyłączyłem je i wszystkie ostrzeżenia zniknęły. Trochę przestudiowałem i Google musi zaktualizować swoje ramy, aby ten błąd był wyłączony, do tej pory po prostu wyłączenie będzie działać. Czy ktoś wie o parametrze -canOpenURL: nie powiodło się dla adresu URL: „kindle: // home” - błąd: „Ta aplikacja nie może wysyłać zapytań o rozniecenie schematu”? Nie mam pojęcia, o czym mówi Xcode
C.Farrugia,

Odpowiedzi:

1023

Twoja biblioteka została skompilowana bez kodu bitowego, ale opcja kodu bitowego jest włączona w ustawieniach projektu. Powiedz NOdoEnable Bitcode w swoich docelowych Ustawienia kompilacji i Biblioteki Ustawienia Build, aby usunąć ostrzeżenia.

Dla tych, którzy zastanawiają się, czy wymagane jest włączenie kodu bitowego:

W aplikacjach na iOS kod bitowy jest domyślny, ale opcjonalny. W przypadku aplikacji watchOS i tvOS wymagany jest kod bitowy. Jeśli podasz kod bitowy, wszystkie aplikacje i ramy w pakiecie aplikacji (wszystkie cele w projekcie) muszą zawierać kod bitowy.

https://help.apple.com/xcode/mac/current/#/devbbdc5ce4f

Zia
źródło
@Centurion poprzednia biblioteka google analytics jest przestarzała i nie można jej także skompilować z Xcode 7 / ios9
zonabi,
1
@goelv tak, powinieneś mieć możliwość przesyłania aplikacji z wyłączonym kodem bitowym. jest teraz opcjonalny. może być wymagane w przyszłości.
zonabi
2
NIE działało dla mnie przy archiwizacji. Projekt XCODE 7 wcześniej działał dobrze, teraz nie może ARCHIWUM, nawet jeśli opcja Włącz kod bitowy jest ustawiona na NIE. To jest dla biblioteki AWS.
ort 11
1
Nadal pojawia się błąd po wyłączeniu kodu bitowego we wszystkich obiektach docelowych.
datWooWoo,
110

Po Xcode 7 opcja kodu bitowego zostanie domyślnie włączona. Jeśli twoja biblioteka została skompilowana bez kodu bitowego, ale opcja kodu bitowego jest włączona w ustawieniach projektu, możesz:

  1. Zaktualizuj swoją bibliotekę za pomocą kodu bitowego,
  2. Powiedz NIE, aby włączyć kod bitowy w docelowych ustawieniach kompilacji

Wpisz opis zdjęcia tutaj

I Ustawienia kompilacji biblioteki, aby usunąć ostrzeżenia.

Aby uzyskać więcej informacji, przejdź do dokumentacji kodu bitowego w bibliotece programistów .

I sesja 102 WWDC 2015: „Platforms State of the Union”

Wpisz opis zdjęcia tutaj

ElonChan
źródło
42

W moim przypadku dla uniknięcia tego problemu:

  1. Upewnij się, że masz do czynienia z Xcode 7 , a NIE niższymi wersjami. W niższej wersji ta flaga nie istnieje.

  2. Konfiguracja: Projekt> Ustawienia kompilacji> Wszystkie> Opcje kompilacji> Włącz kod bitowy = NIE

wprowadź opis zdjęcia tutaj

Javier Calatrava Llavería
źródło
2
Będziesz musiał ponownie skompilować biblioteki zawarte w projekcie za pomocą XCode7 i EnableBitcode ustawionych na YES. Całkiem skomplikowane, jeśli pracujesz z bibliotekami .a innych firm.
Javier Calatrava Llavería
15

metoda canOpenUrl została zmieniona w iOS 9 (ze względu na prywatność) i nie można już z niej korzystać bezpłatnie. Twój dostawca banerów sprawdza zainstalowane aplikacje, aby nie wyświetlały banerów dla aplikacji, która jest już zainstalowana.

To daje wszystkie instrukcje dziennika jak

-canOpenURL: nie powiodło się dla adresu URL: „kindle: // home” - błąd: „Ta aplikacja nie może wysyłać zapytań o rozniecenie schematu”

Dostawcy powinni w tym celu zaktualizować swoją logikę.

Jeśli potrzebujesz zapytać o zainstalowane aplikacje / dostępne schematy, musisz dodać je do swojego info.plistpliku.

Dodaj klucz „LSApplicationQueriesSchemes” do swojej listy plist jako tablicę. Następnie dodaj ciągi w tej tablicy, takie jak „kindle”.

Oczywiście tak naprawdę nie jest to opcja dla banerów reklamowych (ponieważ są one dynamiczne), ale nadal możesz w ten sposób wyszukiwać własne aplikacje lub określone inne aplikacje, takie jak Twitter i Facebook.

Dokumentacja metody canOpenUrl: canOpenUrl:

Dokumentacja na temat klucza LSApplicationQueriesSchemes

Saren Inden
źródło
Zakładając, że biblioteka statyczna sprawdzi głębokie łącze aplikacji nadrzędnej, jak użyć wyjątku „LSApplicationQueriesSchemes” w bibliotece statycznej? Zwykle nie masz do tego Info.plist.
loretoparisi,
Nie jestem do końca pewien, czy jeśli biblioteka będzie musiała sprawdzić aplikacje spoza swojego rodzica, rodzic powinien zdefiniować adres URL na liście info.plist (więc udokumentuj to dla frameworka). Jeśli canOpenUrl również zwróci nie, aplikacja nadrzędna będzie w stanie to obsłużyć, niż należy (zakładam) również uwzględnić te w info.plist
Saren Inden
13

Jeśli używasz CocoaPods i chcesz wyłączyć kod bitowy dla wszystkich bibliotek, użyj następującego polecenia w Podfile

post_install do |installer|
    installer.pods_project.targets.each do |target|
        target.build_configurations.each do |config|
            config.build_settings['ENABLE_BITCODE'] = 'NO'
        end
    end
end
Eike
źródło
8

Oświadczenie: Jest to przeznaczone dla osób obsługujących przepływ pracy ciągłej integracji, które wymagają zautomatyzowanego procesu. Jeśli nie, użyj Xcode zgodnie z opisem w odpowiedzi Javiera .

To działało dla mnie, aby ustawić ENABLE_BITCODE = NOza pomocą wiersza polecenia:

find . -name *project.pbxproj | xargs sed -i -e 's/\(GCC_VERSION = "";\)/\1\ ENABLE_BITCODE = NO;/g'

Pamiętaj, że może to być niestabilne w różnych wersjach Xcode. Został przetestowany z Xcode 7.0.1 i jako część projektu Cordova 4.0.

miraculixx
źródło
-2

Ten problem został niedawno rozwiązany (listopad 2010 r.) Przez Google, patrz https://code.google.com/p/analytics-issues/issues/detail?id=671 . Ale pamiętaj, że jako dobra poprawka przynosi więcej błędów :)

Będziesz także musiał zastosować metodę inicjalizacji wymienioną tutaj: https://developers.google.com/analytics/devguides/collection/ios/v2 .

Najnowsze instrukcje sprawią ci ból głowy, ponieważ odnoszą się do narzędzi nie zawartych w kapsule. Poniżej zawiedzie z cocoapod

// Configure tracker from GoogleService-Info.plist.
NSError *configureError;
[[GGLContext sharedInstance] configureWithError:&configureError];
NSAssert(!configureError, @"Error configuring Google services: %@", configureError);
użytkownik1119517
źródło