app_links 3.1.0 app_links: ^3.1.0 copied to clipboard
Android App Links, Deep Links, iOs Universal Links and Custom URL schemes handler for Flutter.
app_links #
Android App Links, Deep Links, iOs Universal Links and Custom URL schemes handler.
This plugin allows you to:
- catch HTTPS URLs to open your app instead of the browser (App Link / Universal Link).
- catch custom schemes to open your app (Deep Link / Custom URL scheme).
Getting Started #
Before using the plugin, you'll need to setup each platforms you target.
Android #
- App Links: Documentation
- Deep Links: Documentation
iOs #
- Universal Links: Documentation
- Custom URL schemes: Documentation
Windows #
Setup
Declare this method in <PROJECT_DIR>\windows\runner\win32_window.h
// Dispatches link if any.
// This method enables our app to be with a single instance too.
// This is optional but mandatory if you want to catch further links in same app.
bool SendAppLinkToInstance(const std::wstring& title);
Add this inclusion at the top of <PROJECT_DIR>\windows\runner\win32_window.cpp
#include <app_links_windows/app_links_windows_plugin.h>
Add this method in <PROJECT_DIR>\windows\runner\win32_window.cpp
bool Win32Window::SendAppLinkToInstance(const std::wstring& title) {
// Find our exact window
HWND hwnd = ::FindWindow(kWindowClassName, title.c_str());
if (hwnd) {
// Dispatch new link to current window
SendAppLink(hwnd);
// (Optional) Restore our window to front in same state
WINDOWPLACEMENT place = { sizeof(WINDOWPLACEMENT) };
GetWindowPlacement(hwnd, &place);
switch(place.showCmd) {
case SW_SHOWMAXIMIZED:
ShowWindow(hwnd, SW_SHOWMAXIMIZED);
break;
case SW_SHOWMINIMIZED:
ShowWindow(hwnd, SW_RESTORE);
break;
default:
ShowWindow(hwnd, SW_NORMAL);
break;
}
SetWindowPos(0, HWND_TOP, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE);
SetForegroundWindow(hwnd);
// END Restore
// Window has been found, don't create another one.
return true;
}
return false;
}
Add the call to the previous method in CreateAndShow
bool Win32Window::CreateAndShow(const std::wstring& title,
const Point& origin,
const Size& size) {
if (SendAppLinkToInstance(title)) {
return false;
}
...
Great!
Now you can register your own scheme.
This package can not do it for you.
You can make it with url_protocol inside you app.
But... The most relevant is to include those registry modifications into your installer to allow the unregistration.
AppLinks usage #
final _appLinks = AppLinks();
// Get the initial/first link.
// This is also useful when app was terminated (i.e. not started)
final uri = await _appLinks.getInitialAppLink();
// Do something (navigation, ...)
// Subscribe to further events when app is started.
// (Use stringLinkStream to get it as [String])
_linkSubscription = _appLinks.uriLinkStream.listen((uri) {
// Do something (navigation, ...)
});
...
// Maybe later. Get the latest link.
final uri = await _appLinks.getLatestAppLink();
Android notes:
-
Intent action is filtered by
Intent.ACTION_VIEW
. -
By default, flutter Activity is set with
android:launchMode="singleTop"
. This is perfectly fine and expected, but this launches another instance of your app, specifically for the requested view.
If you don't want this behaviour, you can setandroid:launchMode="singleInstance"
in yourAndroidManifest.xml
and avoid another flutter warmup.
Tests #
The following commands will help you to test links.
Android #
adb shell am start
-W -a android.intent.action.VIEW
-d "<URI>" <PACKAGE>
For App Links, you can also test it from Android Studio: Documentation.
iOs #
/usr/bin/xcrun simctl openurl booted "<URI>"