Пакет Flutter Plaid показывает пустой экран на iOS

#android #ios #flutter #dart #plaid

#Android #iOS #flutter #dart #плед

Вопрос:

Добрый день,

У меня есть приложение flutter, в которое я интегрировал пакет Plaid flutter, он хорошо работает на Android, но показывает белый экран на iOS.

Я добавил

 <key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
        <key>NSAllowsArbitraryLoadsInWebContent</key>
        <true/>
    </dict>
 

в файле Info.plist, но это, похоже, не заставляет его работать.

Ниже приведены скриншоты

Эмулятор Android

Симулятор iOS

Пожалуйста, мне нужна помощь в том, что сделать, чтобы платформа iOS работала.

Вот моя конфигурация

 Configuration configuration = Configuration(
    plaidPublicKey: '$PLAID_PUBLIC_KEY',
    plaidBaseUrl: 'https://cdn.plaid.com/link/v2/stable/link.html',
    plaidEnvironment: '$PLAID_ENV',
    environmentPlaidPathAccessToken:
        'https://sandbox.plaid.com/item/public_token/exchange',
    environmentPlaidPathStripeToken:
        'https://sandbox.plaid.com/processor/stripe/bank_account_token/create',
    // plaidClientId: 'yourPlaidClientId',
    // secret: plaidSandbox ? 'yourSecret' : '',
    clientName: '$PLAID_CLIENT_NAME',
    // webhook: 'Webhook Url',
    products: 'auth, transactions',
    selectAccount: 'true',
    plaidClientId: null);


FlutterPlaidApi flutterPlaidApi = FlutterPlaidApi(configuration);

WidgetsBinding.instance.addPostFrameCallback((_) {
  // Add Your Code here.
});
flutterPlaidApi.launch(context, (Result result) async {
  // show loader screen when returning back to the app
  showLoadingScreen(context, message: 'Processing...');
  // send the data to the api
  var response = await BankService().linkUserAccountWithSila(
      accountName: result.accountName,
      publicToken: result.token,
      email: 'email@example.com');

  final responseJson = json.decode(response.body);
  if (response.statusCode >= 200 amp;amp; response.statusCode <= 299) {
    var token = await getToken();
    var client = new http.Client();

    List<String> urls = [
      'getDefaultAccount',
      'all',
    ];

    try {
      List<http.Response> list =
          await Future.wait(urls.map((urlId) => client.get(
                '$kBaseUrl/account/$urlId',
                headers: {HttpHeaders.authorizationHeader: "Bearer $token"},
              )));

      if (list[0].statusCode == 200 amp;amp; list[1].statusCode == 200) {
        var defaultAccount = jsonDecode(list[0].body);
        var plaidAccounts = jsonDecode(list[1].body);

        Provider.of<TransferProvider>(context, listen: false)
            .updatePlaidBankAccounts(
          plaidAccount:
              plaidAccounts['data'] != null ? plaidAccounts['data'] : [],
          account: defaultAccount['data'],
        );
      }
    } catch (e) {} finally {
      client.close();
    }

    Navigator.pop(context);

    Toast.show('Account linked successfully', context,
        duration: Toast.LENGTH_LONG, gravity: Toast.CENTER);
  } else {
    Toast.show('Something went wrong, please try again later', context,
        duration: Toast.LENGTH_LONG, gravity: Toast.CENTER);
    // error
  }
}, stripeToken: false);
 

}

Комментарии:

1. я не использовал этот пакет, но plaid_flutter ( pub.dev/packages/plaid_flutter ) хорошо работает для Android и ios

2. @Karen Я попробовал этот пакет перед публикацией этого вопроса, он сломал мое приложение для iOS, поэтому я вернулся к этому.

Ответ №1:

Попробуйте этот код: https://github.com/flutter/flutter/issues/49483 Diclaimer: это не мой код. Я копирую его здесь, чтобы, если исходное сообщение будет удалено, исходный код по-прежнему был доступен здесь. Все кредиты оригинальному автору.

Шаги для воспроизведения

  1. Зарегистрируйтесь для бесплатной тестовой учетной записи в изолированной среде в Plaid (для запуска webview в изолированной среде требуется public_key)
  2. Создайте новый проект и добавьте plaid_screen.dart в библиотеку
  3. В plaid_screen.dart присваивании открытого ключа из Plaid ключу queryParameters «key»
  4. Замените main.dart содержимое по умолчанию приведенной ниже настройкой
  5. добавить webview_flutter: ^0.3.19 5 в pubspec.yaml
  6. добавить <key>io.flutter.embedded_views_preview</key><true/> в ios / Runner /info.plist
  7. Запустите main.dart

main.dart:

 import 'package:bug/plaid_screen.dart';
import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      initialRoute: PlaidScreen.id,
      routes: {
        PlaidScreen.id: (context) => PlaidScreen(),
      },
    );
  }
}
 

plaid_screen.dart:
(Примечание: открытый ключ должен быть получен и вставлен ниже)

 import 'dart:async';
import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';

String authority = 'cdn.plaid.com';
String unencodedPath = '/link/v2/stable/link.html';
Map<String, String> queryParameters = {
  "key": "{{PASTE_PUBLIC_KEY}}",
  "product": "auth",
  "apiVersion": "v2", // set this to "v1" if using the legacy Plaid API
  "env": "sandbox",
  "clientName": "Test App",
  "selectAccount": "true",
};

// documentation:  https://plaid.com/docs/#webview-integration
class PlaidScreen extends StatefulWidget {
  static const id = 'plaid_screen_id';

  @override
  _PlaidScreenState createState() => _PlaidScreenState();
}

class _PlaidScreenState extends State<PlaidScreen> {
  Uri uri = Uri.https(authority, unencodedPath, queryParameters);

  Completer<WebViewController> _controller = Completer<WebViewController>();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Container(
        child: WebView(
          javascriptMode: JavascriptMode.unrestricted,
          initialUrl: uri.toString(),
          onWebViewCreated: (WebViewController webViewController) {
            _controller.complete(webViewController);
          },
          navigationDelegate: (NavigationRequest navRequest) {
            debugPrint("NavigationRequest URL: ${navRequest.url}");
            if (navRequest.url.contains('plaidlink://')) {
              return NavigationDecision.prevent;
            }
            debugPrint(navRequest.url.toString());
            return NavigationDecision.navigate;
          },
        ),
      ),
    );
  }
}
 

Комментарии:

1. @KelvinROLEX, не могли бы вы знать, как должен выглядеть открытый ключ (точный формат json): «key»: «{{PASTE_PUBLIC_KEY}}»,

2. @KelvinROLEX если это работает, пожалуйста, поделитесь своим кодом. Спасибо