Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork16
This plugin allows Flutter apps to register and handle custom protocols (i.e. deep linking).
License
leanflutter/protocol_handler
Folders and files
| Name | Name | Last commit message | Last commit date | |
|---|---|---|---|---|
Repository files navigation
🚀 Ship Your App Faster: TryFastforge - The simplest way to build, package and distribute your Flutter apps.
This plugin allows Flutter apps to register and handle custom protocols (i.e. deep linking).
English |简体中文
| Android | iOS | Linux | macOS | Windows |
|---|---|---|---|---|
| ✔️ | ✔️ | ➖ | ✔️ | ✔️ |
protocol_handler_windows.mp4
Add this to your package's pubspec.yaml file:
dependencies:protocol_handler:^0.2.0
Or
dependencies:protocol_handler:git:url:https://github.com/leanflutter/protocol_handler.gitref:main
Change the fileandroid/app/src/main/AndroidManifest.xml as follows:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="dev.leanflutter.plugins.protocol_handler_example"> <application android:name="${applicationName}" android:icon="@mipmap/ic_launcher" android:label="protocol_handler_example"> <activity android:name=".MainActivity" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode" android:exported="true" android:hardwareAccelerated="true" android:launchMode="singleTop" android:theme="@style/LaunchTheme" android:windowSoftInputMode="adjustResize"> <!-- Specifies an Android theme to apply to this Activity as soon as the Android process has started. This theme is visible to the user while the Flutter UI initializes. After that, this theme continues to determine the Window background behind the Flutter UI. --> <meta-data android:name="io.flutter.embedding.android.NormalTheme" android:resource="@style/NormalTheme" /> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter>+ <intent-filter>+ <action android:name="android.intent.action.VIEW" />++ <category android:name="android.intent.category.DEFAULT" />+ <category android:name="android.intent.category.BROWSABLE" />+ <!-- Accepts URIs that begin with YOUR_SCHEME://YOUR_HOST -->+ <data android:scheme="myprotocol" />+ </intent-filter> </activity> <!-- Don't delete the meta-data below. This is used by the Flutter tool to generate GeneratedPluginRegistrant.java --> <meta-data android:name="flutterEmbedding" android:value="2" /> </application></manifest>Change the fileios/Runner/Info.plist as follows:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plist version="1.0"><dict><key>CFBundleDevelopmentRegion</key><string>$(DEVELOPMENT_LANGUAGE)</string><key>CFBundleDisplayName</key><string>Protocol Handler</string><key>CFBundleExecutable</key><string>$(EXECUTABLE_NAME)</string><key>CFBundleIdentifier</key><string>$(PRODUCT_BUNDLE_IDENTIFIER)</string><key>CFBundleInfoDictionaryVersion</key><string>6.0</string><key>CFBundleName</key><string>protocol_handler_example</string><key>CFBundlePackageType</key><string>APPL</string><key>CFBundleShortVersionString</key><string>$(FLUTTER_BUILD_NAME)</string><key>CFBundleSignature</key><string>????</string><key>CFBundleVersion</key><string>$(FLUTTER_BUILD_NUMBER)</string><key>LSRequiresIPhoneOS</key><true/><key>UILaunchStoryboardName</key><string>LaunchScreen</string><key>UIMainStoryboardFile</key><string>Main</string>+<key>CFBundleURLTypes</key>+<array>+<dict>+<key>CFBundleTypeRole</key>+<string>Editor</string>+<key>CFBundleURLName</key>+<string></string>+<key>CFBundleURLSchemes</key>+<array>+<string>myprotocol</string>+</array>+</dict>+</array><key>UISupportedInterfaceOrientations</key><array><string>UIInterfaceOrientationPortrait</string><string>UIInterfaceOrientationLandscapeLeft</string><string>UIInterfaceOrientationLandscapeRight</string></array><key>UISupportedInterfaceOrientations~ipad</key><array><string>UIInterfaceOrientationPortrait</string><string>UIInterfaceOrientationPortraitUpsideDown</string><string>UIInterfaceOrientationLandscapeLeft</string><string>UIInterfaceOrientationLandscapeRight</string></array><key>UIViewControllerBasedStatusBarAppearance</key><false/></dict></plist>
Change the filemacos/Runner/Info.plist as follows:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plist version="1.0"><dict><key>CFBundleDevelopmentRegion</key><string>$(DEVELOPMENT_LANGUAGE)</string><key>CFBundleExecutable</key><string>$(EXECUTABLE_NAME)</string><key>CFBundleIconFile</key><string></string><key>CFBundleIdentifier</key><string>$(PRODUCT_BUNDLE_IDENTIFIER)</string><key>CFBundleInfoDictionaryVersion</key><string>6.0</string><key>CFBundleName</key><string>$(PRODUCT_NAME)</string><key>CFBundlePackageType</key><string>APPL</string><key>CFBundleShortVersionString</key><string>$(FLUTTER_BUILD_NAME)</string><key>CFBundleVersion</key><string>$(FLUTTER_BUILD_NUMBER)</string><key>LSMinimumSystemVersion</key><string>$(MACOSX_DEPLOYMENT_TARGET)</string><key>NSHumanReadableCopyright</key><string>$(PRODUCT_COPYRIGHT)</string><key>NSMainNibFile</key><string>MainMenu</string>+<key>CFBundleURLTypes</key>+<array>+<dict>+<key>CFBundleTypeRole</key>+<string>Editor</string>+<key>CFBundleURLName</key>+<string></string>+<key>CFBundleURLSchemes</key>+<array>+<string>myprotocol</string>+</array>+</dict>+</array><key>NSPrincipalClass</key><string>NSApplication</string></dict></plist>
Change the filewindows/runner/main.cpp as follows:
#include <flutter/dart_project.h>#include <flutter/flutter_view_controller.h>#include <windows.h>#include "flutter_window.h"#include "utils.h"+#include <protocol_handler_windows/protocol_handler_windows_plugin_c_api.h>int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, _In_ wchar_t *command_line, _In_ int show_command) {+ // Replace protocol_handler_example with your_window_title.+ HWND hwnd = ::FindWindow(L"FLUTTER_RUNNER_WIN32_WINDOW", L"protocol_handler_example");+ if (hwnd != NULL) {+ DispatchToProtocolHandler(hwnd);++ ::ShowWindow(hwnd, SW_NORMAL);+ ::SetForegroundWindow(hwnd);+ return EXIT_FAILURE;+ } // Attach to console when present (e.g., 'flutter run') or create a // new console when running with a debugger. if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) { CreateAndAttachConsole(); } // Initialize COM, so that it is available for use in the library and/or // plugins. ::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); flutter::DartProject project(L"data"); std::vector<std::string> command_line_arguments = GetCommandLineArguments(); project.set_dart_entrypoint_arguments(std::move(command_line_arguments)); FlutterWindow window(project); Win32Window::Point origin(10, 10); Win32Window::Size size(1280, 720); if (!window.CreateAndShow(L"protocol_handler_example", origin, size)) { return EXIT_FAILURE; } window.SetQuitOnClose(true); ::MSG msg; while (::GetMessage(&msg, nullptr, 0, 0)) { ::TranslateMessage(&msg); ::DispatchMessage(&msg); } ::CoUninitialize(); return EXIT_SUCCESS;}
If you useMSIX to package your application, you need to addprotocol_activation configuration inmsix_config:
msix_config:protocol_activation:myprotocol
See this issue for details:YehudaKremer/msix#187
import'package:protocol_handler/protocol_handler.dart';voidmain()async {// Must add this line.WidgetsFlutterBinding.ensureInitialized();// Register a custom protocol// For macOS platform needs to declare the scheme in ios/Runner/Info.plistawait protocolHandler.register('myprotocol');runApp(MyApp());}
classHomePageextendsStatefulWidget {constHomePage({Key? key}):super(key: key);@overrideState<HomePage>createState()=>_HomePageState();}class_HomePageStateextendsState<HomePage>withProtocolListener {@overridevoidinitState() { protocolHandler.addListener(this);super.initState(); }@overridevoiddispose() { protocolHandler.removeListener(this);super.dispose(); }@overrideWidgetbuild(BuildContext context) {// ... }@overridevoidonProtocolUrlReceived(String url) {String log='Url received: $url)';print(log); }}
Please see the example app of this plugin for a full example.
- Biyi - A convenient translation and dictionary app.
About
This plugin allows Flutter apps to register and handle custom protocols (i.e. deep linking).
Topics
Resources
License
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Sponsor this project
Uh oh!
There was an error while loading.Please reload this page.
Contributors2
Uh oh!
There was an error while loading.Please reload this page.