Flutter
Flutter를 사용하는 경우, inappwebview를 사용하는 것이 권장됩니다.
거래를 생성하고 거래 링크를 얻은 후, 다음과 같은 구현이 권장됩니다:
- 비대면 카드 검증이 포함된 일반적인 흐름에서, API를 통해 생성된 링크로 inappwebview를 엽니다;
- 애플리케이션에 필요한 대로 이 열기 동작을 커스터마이징할 수 있습니다;
- URL이 변경되는지(redirectUrl로) 감지한 다음 inappwebview를 닫습니다.
inappwebview를 열고 URL 변경을 제어하려면 다음과 같이 하면 됩니다:
import 'package:flutter_inappwebview/flutter_inappwebview.dart';
import 'package:unico_poc_id_pay_inappwebview/RedirectScreen.dart';
import 'package:unico_poc_id_pay_inappwebview/service.dart';
Widget setWebView(String URL_TO_LOAD) {
InAppWebViewGroupOptions options = InAppWebViewGroupOptions(
crossPlatform: InAppWebViewOptions(
useShouldOverrideUrlLoading: true,
mediaPlaybackRequiresUserGesture: false,
),
android: AndroidInAppWebViewOptions(
useHybridComposition: true,
),
ios: IOSInAppWebViewOptions(
allowsInlineMediaPlayback: true,
));
return Expanded(
child: InAppWebView(
initialUrlRequest: URLRequest(
url: Uri.parse(URL_TO_LOAD),
),
initialOptions: options,
androidOnPermissionRequest: (controller, origin, resources) async {
return PermissionRequestResponse(
resources: resources,
action: PermissionRequestResponseAction.GRANT);
},
onWebViewCreated: (controller) {
setState(() {
_inAppWebViewController = controller;
});
},
onLoadStart: (controller, url) {
print('LOADING');
setState(() {
_link = url.toString();
});
},
onProgressChanged: (controller, progress) {
setState(() {
progress == 100 ? _isLoading = false : _isLoading = true;
});
},
onLoadStop: (controller, url) {
print('LOADED');
setState(() {
_link = url.toString();
});
},
shouldOverrideUrlLoading: (controller, navigationAction) async {
var uri = navigationAction.request.url;
if (uri == Uri.parse("<URL_TO_OBSERVER>")) {
setState(() {
_link = "";
});
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => const RedirectScreen(),
),
);
return NavigationActionPolicy.CANCEL;
}
return NavigationActionPolicy.ALLOW;
},
),
);
}
카메라 권한을 얻으려면 다음과 같이 하면 됩니다:
import 'package:permission_handler/permission_handler.dart';
void requestPermission() async {
var status = await Permission.camera.status;
if (status.isDenied) {
if (await Permission.camera.request().isGranted) {
print("ok");
}
}
}
참고
올바르게 작동하려면 다음과 같은 권한이 필요합니다:
- 카메라
- 위치 정보
자세한 내용은 공식 flutter_inappwebview 문서를 참고하는 것을 권장합니다.