The minCompileSdk (31) specified in a dependency's AAR metadata is greater than this module's compileSdkVersion (android-30) が出たので対処した

ReactNativeで開発しており、Androidでビルドを試みたときに

The minCompileSdk (31) specified in a dependency's AAR metadata (META-INF/com/android/build/gradle/aar-metadata.properties) is greater than this module's compileSdkVersion (android-30).

というエラーが出たので対処した時の備忘。

エラー文を読む限り 「minCompileSdk(31)を要求しているけどモジュールがcompileSdkVersion (android-30)ですよ」というエラーである。

compileSdkVersionとはコンパイル時に使用するAndroid SDKのバージョン。

これを30から31に上げれば解消しそう、、

android/app/build.gradle の

compileSdkVersion rootProject.ext.compileSdkVersion

defaultConfig {
  targetSdkVersion rootProject.ext.targetSdkVersion
  ...
}

この部分を

compileSdkVersion 31

defaultConfig {
  targetSdkVersion 31
  ...
}

こうすることで直った。

ただ rootProject.ext.compileSdkVersion は android/build.gradle を指しているらしくこのファイルの中の

 compileSdkVersion = 30
 targetSdkVersion = 30

を31に変えたほうが安全に動くようになるかも(未検証)

Apollo Clientでキャッシュをクリアする

ReactNativeでApollo Clientを使って開発していた。

ログアウト -> 別垢でログインというフローがあった時に前のアカウントで取得したキャッシュが残ってしまっており、適切でないデータを表示していた。なのでログアウト時にはキャッシュをクリアしたかった。

解決法

client.clearStore()を使う。

https://www.apollographql.com/docs/react/caching/advanced-topics/#resetting-the-cache

自分の場合はグローバルステートの loggedIn でログインを管理していたのでこんな感じにした。

useEffect(() => {
    (async function () {
      if (checkedLogin && !loggedIn) {
        await client.clearStore();
        console.log("🧹 clear cache");
      }
    })();
  }, [checkedLogin, loggedIn]);

error: filename "ExpoModulesProvider.swift" used twice: ~ エラーが出たので対処した

Expo bare workflowを使って開発していた。dev, stg, prodで分けて開発したくなったのでその設定をしてビルドしたら

Command CompileSwiftSources failed with a nonzero exit code

...

error: filename "ExpoModulesProvider.swift" used twice:

というエラーが出た。ExpoModulesProvider.swiftが被っているらしい。

TARGETS -> Build Phases -> Compile Sources をみてみたら2つあったので別のターゲットを参照している方を削除。これでビルドが通るようになった。

ExpoでreactDelegate' not found on object of type 'AppDelegate

Expoで開発をしていたら reactDelegate' not found on object of type 'AppDelegate' というエラーが出た。

ここにあるようにSDK44で対応しているものらしい。

そういえば自分は44でinitしたが、reanimatedがうまく動かなかったので43にダウンさせていた。おそらくこれが不整合を起こしていたと思う。

AppDelegate.mを修正して対応

before

RCTBridge *bridge = [self.reactDelegate createBridgeWithDelegate:self launchOptions:launchOptions];

RCTRootView *rootView = [self.reactDelegate createRootViewWithBridge:bridge moduleName:@"main" initialProperties:nil];

UIViewController *rootViewController = [self.reactDelegate createRootViewController];

after

RCTBridge *bridge = [[RCTBridge alloc] initWithDelegate:self launchOptions:launchOptions];

RCTRootView *rootView = [[RCTRootView alloc] initWithBridge:bridge
                                                   moduleName:@"main"
                                            initialProperties:nil];

UIViewController *rootViewController = [UIViewController new];

キャッシュクリアしてビルドしたら解決。

react-native-firebaseを使おうとしたらUse of undeclared identifier 'FIRApp' が出た。

ここにあるとおり、FB_SONARKIT_ENABLEDよりも上でimportしないといけない。

// before

#if defined(FB_SONARKIT_ENABLED) && __has_include(<FlipperKit/FlipperClient.h>)
...
#import <Firebase.h>
// after

#import <Firebase.h>
#if defined(FB_SONARKIT_ENABLED) && __has_include(<FlipperKit/FlipperClient.h>)
...