CatHand Blog

アプリ開発やMac弄り

Firebase入れたらクラス名が変わった

Tumbletail のクラッシュを収集するために Crashlytics を入れました。

apps.apple.com

そうしたら、

  • ブログ詳細画面が正常に表示されない

というバグ報告をいくつか頂きました。

いろいろ調べた結果、 NSStringFromClass() で取得しているクラス名が変わっている場合があることがわかりました。

HogeClassfir_{UUIDぽい文字列}_ HogeClass になる場合があります。全てのクラスではないのがまたわかりにくい…。

fir_ と prefix が付いているので、 Firebase かな?と思い Firebase を外してみたところ直ります。

まぁ Crashlytics は使いたいので、変更されていても元々のクラス名を取得できるようなユーティリティを書いて修正しました。

Firebase のソースを見ると、何か怪しいことをしていました。

- (instancetype)initWithObject:(id)object {
  self = [super init];
  if (self) {
    __strong id swizzledObject = object;
    if (swizzledObject) {
      _swizzledObject = swizzledObject;
      _originalClass = object_getClass(object);
      NSString *newClassName = [NSString stringWithFormat:@"fir_%@_%@", [[NSUUID UUID] UUIDString],
                                                          NSStringFromClass(_originalClass)];
      _generatedClass = objc_allocateClassPair(_originalClass, newClassName.UTF8String, 0);
      NSAssert(_generatedClass, @"Wasn't able to allocate the class pair.");
    } else {
      return nil;
    }
  }
  return self;
}