🛠️

[Flutter] flutterアプリの購入がiOS18.2で失敗する不具合への対応

2024/12/18に公開

現象

flutter_inapp_purchase 5.6.1を利用しているときにiOS18.2でアプリ内購入を行おうとすると
以下のエラーが発生し、アプリがクラッシュする不具合が発生した。

Terminating app due to uncaught exception 'NSInvalidArgumentException',
 reason: '-[NSNull length]: unrecognized selector sent to instance xxxxxx

原因

flutter_inapp_purchaseの内部では以下のようなコードで実装がされているため
iOSの場合は(null許容なのに)obfuscatedAccountIdにnullが設定されているとStoreKit側でnullに対してlengthをリクエストしてしまう実装になっていたらしい。

if (_platform.isIOS) {
      return await _channel.invokeMethod('buyProduct', <String, dynamic>{
        'sku': productId,
        'forUser': obfuscatedAccountId,
      });
}

参考url : https://github.com/hyochan/flutter_inapp_purchase/issues/495

対策

FlutterInappPurchase.instance.requestPurchaseを実行する際にobfuscatedAccountIdのパラメータを設定してやれば良い。
これは基本的に購入したユーザーのユーザーIDを設定してあとから購入履歴との紐付けを容易にするためのものだが、nullだとエラーになるだけなので最悪 '' でも良い。

FlutterInappPurchase.instance.requestPurchase(
      productId,
      obfuscatedAccountId: '',
    );

Discussion