App links

This commit is contained in:
2025-10-01 14:55:04 +08:00
parent 2bfd13d843
commit ac2951479b
5 changed files with 55 additions and 6 deletions

View File

@@ -51,6 +51,12 @@
<data android:scheme="http" android:host="solian.app" /> <data android:scheme="http" android:host="solian.app" />
<data android:scheme="https" /> <data android:scheme="https" />
</intent-filter> </intent-filter>
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="solian" />
</intent-filter>
<!-- Share Intent Filters --> <!-- Share Intent Filters -->
<intent-filter> <intent-filter>

View File

@@ -36,6 +36,14 @@
<string>ShareMedia-$(PRODUCT_BUNDLE_IDENTIFIER)</string> <string>ShareMedia-$(PRODUCT_BUNDLE_IDENTIFIER)</string>
</array> </array>
</dict> </dict>
<dict>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
<key>CFBundleURLSchemes</key>
<array>
<string>solian</string>
</array>
</dict>
</array> </array>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>$(FLUTTER_BUILD_NUMBER)</string> <string>$(FLUTTER_BUILD_NUMBER)</string>

View File

@@ -136,6 +136,7 @@ class ChatSubscribeNotifier extends _$ChatSubscribeNotifier {
WebSocketPacket( WebSocketPacket(
type: 'messages.unsubscribe', type: 'messages.unsubscribe',
data: {'chat_room_id': roomId}, data: {'chat_room_id': roomId},
endpoint: 'sphere',
), ),
), ),
); );

View File

@@ -256,4 +256,6 @@ msix_config:
identity_name: dev.solian.app identity_name: dev.solian.app
msix_version: 3.2.0.0 msix_version: 3.2.0.0
logo_path: .\assets\icons\icon.png logo_path: .\assets\icons\icon.png
protocol_activation: solian, https
app_uri_handler_hosts: solian.app
capabilities: internetClientServer, location, microphone, webcam capabilities: internetClientServer, location, microphone, webcam

View File

@@ -1,19 +1,51 @@
#include <flutter/dart_project.h> #include <flutter/dart_project.h>
#include <flutter/flutter_view_controller.h> #include <flutter/flutter_view_controller.h>
#include <windows.h> #include <windows.h>
#include "app_links/app_links_plugin_c_api.h"
#include "flutter_window.h" #include "flutter_window.h"
#include "utils.h" #include "utils.h"
bool SendAppLinkToInstance(const std::wstring& title) {
// Find our exact window
HWND hwnd = ::FindWindow(L"FLUTTER_RUNNER_WIN32_WINDOW", 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 (Optional) Restore
// Window has been found, don't create another one.
return true;
}
return false;
}
int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev,
_In_ wchar_t *command_line, _In_ int show_command) _In_ wchar_t *command_line, _In_ int show_command)
{ {
HWND hwnd = ::FindWindow(L"FLUTTER_RUNNER_WIN32_WINDOW", L"single_instance_example"); if (SendAppLinkToInstance(L"solian")) {
if (hwnd != NULL) return EXIT_SUCCESS;
{
::ShowWindow(hwnd, SW_NORMAL);
::SetForegroundWindow(hwnd);
return EXIT_FAILURE;
} }
// Attach to console when present (e.g., 'flutter run') or create a // Attach to console when present (e.g., 'flutter run') or create a