はじめに

Cordova で QR コードスキャナのプラグイン(bitpay/cordova-plugin-qrscanner)を追加すると、iOS, Android のビルドがエラーになる問題の対応方法。

TL;DR

この記事が参考になった方
ここここからチャージや購入してくれると嬉しいです(ブログ主へのプレゼントではなく、ご自身へのチャージ)
欲しいもの / Wish list

目次

  1. はじめに
  2. TL;DR
  3. 環境・条件
  4. 詳細
    1. iOS
      1. 発生事象
      2. 対応方法
    2. Android
      1. 発生事象
      2. 対応方法
  5. まとめ
  6. その他・メモ
  7. 参考文献

環境・条件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$ sw_vers
ProductName: macOS
ProductVersion: 11.2.3
BuildVersion: 20D91

$ node -v
v12.7.0

$ npm -v
6.14.5

$ cordova -v
10.0.0

$ cordova platforms
Installed platforms:
android 9.0.0
ios 6.2.0

$ cordova plugins
cordova-plugin-qrscanner 3.0.1 "QRScanner" # danielzen/cordova-plugin-qrscanner の方

詳細

iOS

発生事象

読み飛ばしてもOK

bitpay/cordova-plugin-qrscanner をインストール後、cordova build ios でビルドすると以下エラー。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
$ cordova plugin add cordova-plugin-qrscanner
$ cordova build ios
...
/Users/hoge/myapp/platforms/ios/Pollo/Plugins/cordova-plugin-qrscanner/QRScanner.swift:471:63: error: 'openSettingsURLString' has been renamed to 'UIApplicationOpenSettingsURLString'
guard let settingsUrl = URL(string: UIApplication.openSettingsURLString) else {
^~~~~~~~~~~~~~~~~~~~~
UIApplicationOpenSettingsURLString
UIKit.UIApplication:70:22: note: 'openSettingsURLString' was introduced in Swift 4.2
public class let openSettingsURLString: String
^
/Users/hoge/myapp/platforms/ios/Pollo/Plugins/cordova-plugin-qrscanner/QRScanner.swift:484:74: error: 'openSettingsURLString' has been renamed to 'UIApplicationOpenSettingsURLString'
UIApplication.shared.openURL(NSURL(string: UIApplication.openSettingsURLString)! as URL)
^~~~~~~~~~~~~~~~~~~~~
UIApplicationOpenSettingsURLString
UIKit.UIApplication:70:22: note: 'openSettingsURLString' was introduced in Swift 4.2
public class let openSettingsURLString: String
^

** BUILD FAILED **


The following build commands failed:
CompileSwift normal x86_64 /Users/hoge/myapp/platforms/ios/Pollo/Plugins/cordova-plugin-qrscanner/QRScanner.swift
CompileSwiftSources normal x86_64 com.apple.xcode.tools.swift.compiler
(2 failures)
xcodebuild: Command failed with exit code 65
error Command failed with exit code 65.

対応方法

参考: Cannot build iOS app - ‘openSettingsURLString’ has been renamed to ‘UIApplicationOpenSettingsURLString’ · Issue #301 · bitpay/cordova-plugin-qrscanner

上記リンク(とエラー内容)を見ると、メソッドが変わっていてエラーになっているとのこと。

Fork したリポジトリ(danielzen/cordova-plugin-qrscanner)を使うと大丈夫とのことで、リポジトリを指定してプラグインを入れ直す。ちなみに android - Adding plugins from specific revision Github project to the Cordova project - Stack Overflow によると cordova plugin add https://github.com/phonegap-build/PushPlugin#2345fd8fe48572eae3df631cf8fb262ef2804779 のようにインストールできる。

1
2
$ cordova plugin rm cordova-plugin-qrscanner
$ cordova plugin add https://github.com/danielzen/cordova-plugin-qrscanner#103bceff98427956f21a83222c1f699580031673

プラグイン再追加後 iOS をビルドすると正常に完了した。

1
2
3
$ cordova build ios
...
** BUILD SUCCEEDED **

Android

発生事象

読み飛ばしてもOK

iOS が解決したと思ったら、cordova build android を実行するとエラーになった。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
$ cordova build android
...
> Configure project :app
WARNING: Configuration 'compile' is obsolete and has been replaced with 'implementation' and 'api'.
It will be removed in version 5.0 of the Android Gradle plugin.
For more information, see http://d.android.com/r/tools/update-dependency-configurations.html.

> Task :app:compileReleaseJavaWithJavac FAILED
/Users/hoge/myapp/platforms/android/app/src/main/java/com/bitpay/cordova/qrscanner/QRScanner.java:27: エラー: シンボルを見つけられません
import android.support.v4.app.ActivityCompat;
^
シンボル: クラス ActivityCompat
場所: パッケージ android.support.v4.app
/Users/hoge/myapp/platforms/android/app/src/main/java/com/bitpay/cordova/qrscanner/QRScanner.java:356: エラー: シンボルを見つけられません
boolean showRationale = ActivityCompat.shouldShowRequestPermissionRationale(cordova.getActivity(), permission);
^
シンボル: 変数 ActivityCompat
場所: クラス QRScanner
注意:一部の入力ファイルは非推奨のAPIを使用またはオーバーライドしています。
注意:詳細は、-Xlint:deprecationオプションを指定して再コンパイルしてください。
注意:/Users/hoge/myapp/platforms/android/app/src/main/java/com/bitpay/cordova/qrscanner/QRScanner.javaの操作は、未チェックまたは安全ではありません。
注意:詳細は、-Xlint:uncheckedオプションを指定して再コンパイルしてください。
エラー2個

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:compileReleaseJavaWithJavac'.
> Compilation failed; see the compiler error output for details.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/6.5/userguide/command_line_interface.html#sec:command_line_warnings

BUILD FAILED in 2s
21 actionable tasks: 1 executed, 20 up-to-date
Command failed with exit code 1: /Users/hoge/myapp/platforms/android/gradlew cdvBuildRelease -b /Users/hoge/myapp/platforms/android/build.gradle
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
ERROR: "build-android-release" exited with 1.
error Command failed with exit code 1.

対応方法

参考: cannot find symbol / ActivityCompat · Issue #335 · bitpay/cordova-plugin-qrscanner

上記によるとライブラリのパスが変わっているとのこと。danielzen/cordova-plugin-qrscannerも修正されていないので、(やりたくはないが)プラグインを直接修正する。

platforms/android/app/src/main/java/com/bitpay/cordova/qrscanner/QRScanner.java の27行目あたりを修正。

1
2
3
4
 import android.provider.Settings;
-import android.support.v4.app.ActivityCompat;
+import androidx.core.app.ActivityCompat;
import android.view.ViewGroup;

これで cordova build android も問題なく成功するようになる。

まとめ

その他・メモ

Cordova もメンテされなくなっている感あるし、Flutter v2 で Web 対応とかも発表されたし Flutter 触ってみるかな。

参考文献

関連記事

この記事が参考になった方
ここここからチャージや購入してくれると嬉しいです(ブログ主へのプレゼントではなく、ご自身へのチャージ)
欲しいもの / Wish list