Analiza dla systemu iOS: błędy podczas próby uruchomienia aplikacji


80

Pracowałem z parse SDK i postępowałem zgodnie z przewodnikiem Szybki krok. Kiedy próbuję uruchomić, otrzymuję te 8 błędów. Jakieś pomysły, dlaczego? Wygląda na to, że ma to związek z częścią Parse dotyczącą Facebooka, której nie używam.

 Undefined symbols for architecture armv7:
"_FBTokenInformationTokenKey", referenced from:
  -[PFFacebookTokenCachingStrategy accessToken] in Parse(PFFacebookTokenCachingStrategy.o)
  -[PFFacebookTokenCachingStrategy setAccessToken:] in Parse(PFFacebookTokenCachingStrategy.o)
 "_FBTokenInformationExpirationDateKey", referenced from:
  -[PFFacebookTokenCachingStrategy cacheTokenInformation:] in     Parse(PFFacebookTokenCachingStrategy.o)
  -[PFFacebookTokenCachingStrategy expirationDate] in Parse(PFFacebookTokenCachingStrategy.o)
  -[PFFacebookTokenCachingStrategy setExpirationDate:] in Parse(PFFacebookTokenCachingStrategy.o)
 "_OBJC_METACLASS_$_FBSessionTokenCachingStrategy", referenced from:
  _OBJC_METACLASS_$_PFFacebookTokenCachingStrategy in Parse(PFFacebookTokenCachingStrategy.o)
"_OBJC_CLASS_$_FBSessionTokenCachingStrategy", referenced from:
  _OBJC_CLASS_$_PFFacebookTokenCachingStrategy in Parse(PFFacebookTokenCachingStrategy.o)
"_FBTokenInformationUserFBIDKey", referenced from:
  -[PFFacebookTokenCachingStrategy facebookId] in Parse(PFFacebookTokenCachingStrategy.o)
  -[PFFacebookTokenCachingStrategy setFacebookId:] in Parse(PFFacebookTokenCachingStrategy.o)
"_OBJC_CLASS_$_FBRequest", referenced from:
  objc-class-ref in Parse(PFFacebookAuthenticationProvider.o)
"_OBJC_CLASS_$_FBSession", referenced from:
  objc-class-ref in Parse(PFFacebookAuthenticationProvider.o)
 ld: symbol(s) not found for architecture armv7
 clang: error: linker command failed with exit code 1 (use -v to see invocation)

Wygląda na to, że musisz dodać pliki .m do celu: stackoverflow.com/a/5300901/620197
Mike D

2
brzmi tak, jakby jedna z tych 2 flag -ObjC i -all_load jest obecna, SDK Facebooka musi być obecny / zainstalowany ... lub możesz usunąć te flagi, jeśli ich naprawdę nie potrzebujesz, ale myślę, że restKit ich potrzebuje, stąd ich potrzebuję. parse.com/questions/ ...
topwik

po prostu dodaj bolt.framework i facebook.framework z flagą -objc. to działa dla mnie.
Shauket Sheikh

ld: Nie znaleziono ramy metalowe dla architektury ARMv7 brzękiem: error: komenda linker nie powiodło się z kodem wyjścia 1 (zastosowanie -v aby zobaczyć inwokację)
Sanjeev Sharma

Odpowiedzi:


137

Jest to jakiś błąd związany z wydaniem Parse iOS 1.1.33, ponieważ wiele osób widzi te same błędy - w tym ja.

Istnieje kilka obejść:

Jeśli nie używasz biblioteki, która wymaga flagi konsolidatora -ObjC, możesz usunąć -ObjC ze swojego projektu:

Ustawienia kompilacji> Inne flagi konsolidatora> usuń -ObjC

lub jeśli używasz biblioteki, która wymaga tej flagi, możesz dodać zestaw SDK Facebooka.

Obie opcje wyeliminują błędy. Mam nadzieję, że naprawią to, ponieważ nie potrzebuję zestawu SDK Facebooka w mojej aplikacji.

Śledź dyskusję tutaj:

https://parse.com/questions/cocoapods-incompatibility


Usunięcie -ObjC nie rozwiązało tego za mnie. Jednak odpowiedź dbquarrela poniżej.
shim

2
Usunąłem flagę linkera -all_load i to naprawiło to dla mnie, więc możesz zaktualizować odpowiedź, aby uwzględnić tę flagę C:
A'sa Dickens

1
W innych flagach linkera miałem wcześniej '-all_load', z 'pod install' sugerowano ustawienie 'innej flagi konsolidatora' na '$ (inherited)', działało bez żadnego problemu.
turbo

Czy możesz wskazać, gdzie znaleźć i jak dodać pakiet SDK Facebooka do Xcode 6.2 (iOS 8)? Mam developers.facebook.com/docs/ios gdzie po zainstalowaniu Facebook.pkg nie mogę znaleźć FacebookSDK.frameworkpliku i mam inne niepotrzebne pliki.
Incpetor

Po usunięciu przełącznika konsolidatora -ObjC występuje problem. Biblioteka libCordova.a określa niektóre kategorie w NSString, które nie zostaną załadowane, jeśli zostanie usunięte -ObjC. Obejściem jest usunięcie libCordova.a z połączonych frameworków i dodanie tego do ustawienia kompilacji Other Linker Flags: -force_load $ (BUILT_PRODUCTS_DIR) /libCordova.a
Nijil Nair

102

Oto potencjalnie prostsze obejście niż pobieranie, kompilowanie i instalowanie zestawu FB, który jest dość duży i nieporęczny. Zauważ, że oczywiście nie będziesz w stanie użyć żadnej funkcji typu FB w Parse i napotkasz poważne problemy, jeśli wyzwolisz dowolny z kodu Parse, który oczekuje użycia tych fikcyjnych symboli. Ale jeśli będziesz trzymać się z dala od nich, myślę, że wszystko będzie w porządku. Więc...

  1. Utwórz w swojej aplikacji obiekt o nazwie FBMissingSymbols

  2. Usuń plik .h, którego nie będziesz potrzebować

  3. Umieść to w .m:

NSString *FBTokenInformationExpirationDateKey = @"";
NSString *FBTokenInformationTokenKey = @"";
NSString *FBTokenInformationUserFBIDKey = @"";
@interface FBAppCall:NSObject
@end
@implementation FBAppCall
@end
@interface FBRequest:NSObject
@end
@implementation FBRequest
@end
@interface FBSession:NSObject
@end
@implementation FBSession
@end
@interface FBSessionTokenCaching:NSObject
@end
@implementation FBSessionTokenCaching
@end
@interface FBSessionTokenCachingStrategy:NSObject
@end
@implementation FBSessionTokenCachingStrategy
@end

6
Rozwiązał mój problem. Dzięki i +1
Ali Sufyan

2
Szybko i prosto! Dzięki. +1
David Da Silva Contín

1
Dzięki @dbquarrel, +1
iBhavik

2
To magiczne rozwiązanie… jeśli nie chcesz integracji FB w swojej aplikacji, zrób to.
Bharat

1
Najłatwiejsze rozwiązanie :-)
Muzammil

27

Musisz usunąć stare ParseFacebookUtils.frameworki zachować nowe, ParseFacebookUtilsV4.frameworkaby działało.


3
Hej, przewijasz ten wątek, to właściwa odpowiedź! / \
Raphael Oliveira

Właśnie to naprawiło to dla mnie! Żaden z komentarzy deweloperów na stronach Parse ani inne odpowiedzi tutaj nie zadziałały ... +9000, gdybym mógł!
WendiKidd

Łatwe i doskonałe. Dzięki!
Lapidus,

Tak… to jest to. Dlaczego ta stara zniszczona biblioteka jest nadal dostarczana z parse SDK? To nie powinno być takie skomplikowane.
thefaj

23

Uwielbiałem odpowiedź dbquarrela, ale już nie działa, ponieważ brakuje w niej kilku nowych klas społecznych.

Zrób więc to samo, ale zamiast tego dodaj to:

NSString *FBTokenInformationExpirationDateKey = @"";
NSString *FBTokenInformationTokenKey = @"";
NSString *FBTokenInformationUserFBIDKey = @"";
NSString *SLServiceTypeTwitter = @"";
NSString *ACAccountTypeIdentifierTwitter = @"";
@interface FBAppCall:NSObject
@end
@implementation FBAppCall
@end
@interface FBRequest:NSObject
@end
@implementation FBRequest
@end
@interface FBSession:NSObject
@end
@implementation FBSession
@end
@interface FBSessionTokenCaching:NSObject
@end
@implementation FBSessionTokenCaching
@end
@interface FBSessionTokenCachingStrategy:NSObject
@end
@implementation FBSessionTokenCachingStrategy
@end
@interface ACAccountStore:NSObject
@end
@implementation ACAccountStore
@end
@interface SLRequest:NSObject
@end
@implementation SLRequest
@end
@interface SLComposeViewController:NSObject
@end
@implementation SLComposeViewController
@end

3
Dzięki za aktualizację tego!
sridvijay

Utwórz w swojej aplikacji obiekt o nazwie FBMissingSymbolsUsuń plik .h (ponieważ go nie potrzebujesz), a następnie umieść powyższyFBMissingSymbols.m
Nate Lee

Czy ten nowy .mplik nie musi #import <Foundation/Foundation.h>znajdować się na górze?
AdamT

10

Sprawdź i upewnij się, że nie masz dodanych dwóch wersji frameworka „ParseFacebookUtils”:

ParseFacebookUtilsV4 i ParseFacebookUtils

Po usunięciu ParseFacebookUtils i zachowaniu ParseFacebookUtilsV4 działało dobrze.


To był właśnie problem. Po usunięciu wszystkie 9 błędów zniknęło! Dzięki
Nick89

7

Moje rozwiązanie na pewno zadziała i możesz użyć -ObjC w innych flagach konsolidatora.

  1. Dodaj „Social.framework”, „Account.framework”
  2. Dodaj „FacebookSDK.framework”

Pozdrawiam ... teraz to działa ..... i nie ma potrzeby usuwania -ObjC.


To naprawdę prosta i świetna odpowiedź. Ale jedyną rzeczą jest to, że w moim przypadku nie dodałem Facebook.framework i nadal zbudowałem aplikację bez błędów. W każdym razie +1 za proste rozwiązanie.
hp iOS Coder

Dla mnie było to po prostu dodanie „Social.framework”, „Account.framework”. Dzięki, działa jak marzenie :)
evya

3

Wygląda na to, że może być konieczne dodanie „Accounts.Framework” i / lub „Social.Framework”.


2

Uzupełnienie odpowiedzi @blueHula. Parse usunął Facebook SDK ze swojego frameworka, co oznacza, że ​​od niektórych wersji (być może 1.1.33) integracja parse.framework powinna być połączona z niezależną integracją FB SDK.

Proszę zapoznać się z tym linkiem używając parsowania zestawu SDK ios bez dołączania zestawu SDK Facebooka

Kluczową kwestią jest użycie -force_load $(SRCROOT)/path/libname.ado łączenia się z niezbędnymi bibliotekami stron trzecich, zamiast używania -all_loadi-ObjC


1

To jest błąd konsolidatora ... W swoim projekcie nie dołączasz potrzebnego frameworka, do którego odwołujesz się w jednym z plików nagłówkowych.

Na przykład, jeśli masz uwzględnienie w swoim kodzie:

#import <Parse/Parse.h>

Prawdopodobnie wymaga struktury wspierającej i musisz ją uwzględnić w swojej aplikacji. Czy parse.frameworkwłączyłeś plik z Xcode?

Struktury Xcode


1

Miałem to samo zastosowanie i jedyną stroną trzecią, jaką miałem, był pakiet PayPal SDK. Po usunięciu -ObjC wszystko działało dobrze. (zawsze wykonaj kopię zapasową projektu przed zmianą ustawień)


1

jest rok 2015 i właśnie miałem ten sam błąd. Niestety żadna z powyższych odpowiedzi nie zadziałała. Ale to zrobiło:

Cel> Fazy kompilacji> Połącz plik binarny z bibliotekami, a następnie dodaj libstdc ++. 6.dylib

To rozwiązało problem.


wydaje się, że rozwiązuje część problemów
SKYnine

0

Istnieje wiele frameworków, które muszą ustawić flagę -ObjC jako inną połączoną flagę, podczas gdy Parse nie pozwala na kontynuowanie, jeśli to zrobisz. Aby sobie z tym poradzić, możesz wykonać jedną z następujących czynności. Pokazałem przykład Google Maps SDK, który wymaga flagi -ObjC, ale ze względu na Parse w tym samym projekcie nie mogę go bezpośrednio użyć:

Rozwiązanie 1 - użycie flagi force_load

Zamiast ustawiać flagę -ObjC jako inną połączoną flagę, użyj flagi force_load, aby załadować określoną strukturę lub bibliotekę.

-force_load $(SRCROOT)/GoogleMaps.framework/Versions/A/GoogleMaps

Rozwiązanie 2 - Korzystanie z Facebook SDK

Po prostu dodaj Facebook SDK jako osobny framework, pozwoli to na użycie flagi -ObjC. Upewnij się również, że dodałeś Accounts.frameworki Social.framework. Jeśli dodałeś Bolt.framework i korzystasz z pustego projektu Parse, usuń zduplikowany symbol Bolt.framwork. Jeśli nadal ma kilka błędów, usuń Konta i ramy społecznościowe i dodaj je ponownie (stanie się tak, jeśli użyłeś domyślnego pustego projektu Parse).


-1

Ten problem męczył mnie przez wiele dni. Użyłem cocoapods do zarządzania całym trzecim SDK.

Oto, jak rozwiązałem ten problem. Przejdź do projektu pod i ustaw opcję „Tylko budowanie architektury” na NIE.

Odbuduj projekt poda, a następnie błędy linków zniknęły! pomoc to może pomóc komuś, kto używa cocoapods.wprowadź opis obrazu tutaj



-1

Można to usunąć z pliku projektu znajdującego się w <projectname>/cordova/<projectname>/platforms/ios/<projectname>.xcodeproj/project.pbxproji

Wyszukaj plik -ObjC, istnieje wiele lokalizacji. To wygląda tak:

OTHER_LDFLAGS = (
    "-weak_framework",
    CoreFoundation,
    "-weak_framework",
    UIKit,
    "-weak_framework",
    AVFoundation,
    "-weak_framework",
    CoreMedia,
    "-weak-lSystem",
    "-force_load",
    "\"$(BUILT_PRODUCTS_DIR)/libCordova.a\"",
    "-ObjC",
);

-1

Zainstaluj cocoaPods i dodaj to do swojego Podfile:

pod 'Facebook-iOS-SDK'
pod 'Parse'
pod 'ParseFacebookUtils'
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.