#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, но это, похоже, не заставляет его работать.
Ниже приведены скриншоты
Пожалуйста, мне нужна помощь в том, что сделать, чтобы платформа 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: это не мой код. Я копирую его здесь, чтобы, если исходное сообщение будет удалено, исходный код по-прежнему был доступен здесь. Все кредиты оригинальному автору.
Шаги для воспроизведения
- Зарегистрируйтесь для бесплатной тестовой учетной записи в изолированной среде в Plaid (для запуска webview в изолированной среде требуется public_key)
- Создайте новый проект и добавьте
plaid_screen.dart
в библиотеку - В
plaid_screen.dart
присваивании открытого ключа из Plaid ключу queryParameters «key» - Замените
main.dart
содержимое по умолчанию приведенной ниже настройкой - добавить
webview_flutter: ^0.3.19 5
в pubspec.yaml - добавить
<key>io.flutter.embedded_views_preview</key><true/>
в ios / Runner /info.plist - Запустите 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 если это работает, пожалуйста, поделитесь своим кодом. Спасибо