1. 플러그인 설치

$ flutter pub add url_launcher
$ flutter pub add webview_flutter

2. 플랫폼별 설정

외부 앱을 실행하려면 플랫폼별로 해당하는 파일에 앱 실행 허용 목록을 설정해야 합니다.
또한 외부 앱 실행 후 다시 기존 서비스 앱으로 돌아오고싶다면 서비스하는 앱 스킴 또한 등록해주어야 합니다.

kakao developers | 커스텀 URL 스킴 설정 방법 참고
url_launcher | Flutter Package

Android 설정 (AndroidManifest.xml)

<!-- Provide required visibility configuration for API level 30 and above -->
<queries>
  <!-- If your app checks for SMS support -->
  <intent>
    <action android:name="android.intent.action.VIEW" />
    <data android:scheme="sms" />
  </intent>
  <!-- If your app checks for call support -->
  <intent>
    <action android:name="android.intent.action.VIEW" />
    <data android:scheme="tel" />
  </intent>
</queries>

iOS 설정 (info.plist)

<key>LSApplicationQueriesSchemes</key>
<array>
  <string>sms</string>
  <string>tel</string>
</array>

3. 웹뷰에서 외부 앱 실행

// WebViewController
WebViewController()
      ..setJavaScriptMode(JavaScriptMode.unrestricted)
      ..setNavigationDelegate(
        NavigationDelegate(
          onProgress: (int progress) {
            debugPrint('WebView is loading (progress : $progress%)');
          },
          onPageStarted: (String url) {
            debugPrint('Page started loading: $url');
          },
          onPageFinished: (String url) {
            debugPrint('Page finished loading: $url');
          },
          onWebResourceError: (error) {
            debugPrint('''
Page resource error:
  code: ${error.errorCode}
  description: ${error.description}
  errorType: ${error.errorType}
  isForMainFrame: ${error.isForMainFrame}
          ''');
          },
          onNavigationRequest: (request) {
            if (request.url.startsWith('http:') ||
                request.url.startsWith('https:')) {
              debugPrint('allowing navigation to ${request.url}');
              return NavigationDecision.navigate;
            }
            debugPrint('blocking navigation to ${request.url}');
            _launchUrl(request.url);
            return NavigationDecision.prevent;
          },
          onUrlChange: (UrlChange change) {
            debugPrint('url change to ${change.url}');
          },
        ),
      )

...

Future<void> _launchUrl(String url) async {
  if (!await launchUrl(
    Uri.parse(url),
    // mode: LaunchMode.externalApplication,
  )) {
    throw Exception('Could not launch $url');
  }
}
open ~/Library/flutter/packages/flutter_tools/gradle/flutter.gradle

 

 

/** For apps only. Provides the flutter extension used in app/build.gradle. */
class FlutterExtension {
    /** Sets the compileSdkVersion used by default in Flutter app projects. */
    static int compileSdkVersion = 33

    /** Sets the minSdkVersion used by default in Flutter app projects. */
    static int minSdkVersion = 16

    /** Sets the targetSdkVersion used by default in Flutter app projects. */
    static int targetSdkVersion = 33
    
    // ...
}

 

'Flutter' 카테고리의 다른 글

웹뷰에서 외부 앱 실행하는 방법 (URL Scheme)  (0) 2023.07.20

+ Recent posts