読者です 読者をやめる 読者になる 読者になる

shobylogy

叩けシンプルの杖

SwiftとObjective-C混在のプロジェクトで、BridingHeaderのビルドが低頻度で失敗する問題を修正する

SwiftとObjective-C混在のプロジェクトで、CI上でBridingHeaderのビルドが低頻度で失敗する現象に悩まされていました。(失敗した場合もRebuildすると成功します)

常に失敗するのではなく低頻度で失敗するケースの場合、Headerのimport周りが怪しいことが多いようです。*1

特にBridingHeaderでimportしているHeaderファイル上で、別のHeaderファイルを読み込んでいると、多重importになってしまい、ビルドが失敗します。

これを解決するには、Objective-C側を修正し、.hファイルでは他のHeaderをimportせず、.mファイルでimportするように書き換えると問題なく動作します。

エラーの例

このようなエラーが出ます。

/Users/UserName/RepositoryName/AppName/Classes/MYViewController.h:10:9: 'LibraryName.h' file not found

error: failed to import bridging header /Users/UserName/RepositoryName/AppName/Supporting Files/Fril-Bridging-Header.h

上記のエラーの場合、CocoaPods経由で読み込んでいるライブラリのヘッダーが多重importになっていました。

解決例

以下のような修正を加えることで問題を解決しました。 プロトコルを継承している場合でもInterface extensionを使うことで.hファイルに書かずに.mファイルにプロトコルの宣言を移すことができます

Before

MYViewController.h

#import <UIKit/UIKit.h>
#import "LibraryName.h"

@interface MYViewController : UIViewController <LibraryNameProtocol>
@end

After

MYViewController.h

#import <UIKit/UIKit.h>

@interface MYViewController : UIViewController
@end

MYViewController.m

#import "MYViewController.h"
#import <LibraryName/LibraryName.h>

@interface MYViewController () <LibraryNameProtocol>
@end

*1:仮説ですが、ビルドされるファイルの順序やキャッシュの有無により結果が不安定になるのかもしれません