その後のその後

iOSエンジニア 堤 修一のブログ github.com/shu223

Parse SDK使用時にFacebook iOS SDKの利用を強要される件

Parse.frameworkの最新版(1.2.18)をとあるXcodeプロジェクトに追加し、公式ページにあるガイドに沿って依存フレームワークを追加してヘッダインポートしてビルドしてみると、

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)
  "_OBJC_CLASS_$_FBAppCall", referenced from:
      objc-class-ref in Parse(PFFacebookAuthenticationProvider.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)


こんな感じで Facebook iOS SDK を入れろと言わんばかりに Undefiend symbols エラーがたくさんでてきました。


確かFacebook SDKはオプショナルだったはず・・・ *1 とググってみると、

If you're not using a library which requires the -ObjC linker flag, you can remove -ObjC from your project:


Build Settings > Other Linker Flags > remove -ObjC


or if you are using a library which requires that flag, you can add the Facebook SDK.

parse.com - Parse for iOS: Errors when trying to run the app - Stack Overflow


[Other Linker Flags] に "-ObjC" フラグを立てているとFacebook iOS SDKが必要になるので、嫌ならフラグを外せばいい、とのこと。



確かに外すとビルドは通るようになりました。でも、必要だから "-ObjC" 立ててたわけで・・・でも Facebook iOS SDK は必要なければ入れたくない・・・

-ObjC フラグを立てつつも Facebook iOS SDK を使わない方法

"-ObjC"フラグは必要だけど Facebook iOS SDK は入れたくないので、どうにかする方法がないか探ってみました。

上記ページではなんかとんちんかんなやりとりがされていますが、そこで示されていた下記URL

こちらにもう少しまともそうなことが書いてありました。

An easy way to do this is to use the -force_load flag instead of the -ObjC flag on the static libraries that need the -ObjC flag. You can use:


-force_load $(BUILT_PRODUCTS_DIR)/


"-ObjC" が必要なライブラリに対して、"-ObjC" の代わりに "-force_load" を使用してライブラリに含まれるオブジェクトを全てロードさせる、という方法。


上記は $(BUILT_PRODUCTS_DIR) に .a ファイルが置いてある前提になってますが、.framework の場合は下記のような感じでフォルダ内の静的ライブラリのパスを指定することになります。

$(SRCROOT)/framework/xxxx.framework/Versions/A/xxxx


*1:Parse.hでもインポート文は #if __has_include() で囲まれています。