From 01de93127250c9d5ac94bf3bca2ed2594855938a Mon Sep 17 00:00:00 2001 From: Mohsen Date: Wed, 24 Jun 2026 20:25:57 +0330 Subject: [PATCH 1/9] Add importFile API to PlatformUtilities --- src/core/platforms/platformutilities.cpp | 5 +++++ src/core/platforms/platformutilities.h | 2 ++ 2 files changed, 7 insertions(+) diff --git a/src/core/platforms/platformutilities.cpp b/src/core/platforms/platformutilities.cpp index 56e00cda01..35e3c9af3f 100644 --- a/src/core/platforms/platformutilities.cpp +++ b/src/core/platforms/platformutilities.cpp @@ -279,6 +279,11 @@ void PlatformUtilities::importProjectArchive() const void PlatformUtilities::importDatasets() const {} +void PlatformUtilities::importFile( const QString &path ) const +{ + Q_UNUSED( path ) +} + void PlatformUtilities::updateProjectFromArchive( const QString &projectPath ) const { const QString zipFilePath = QFileDialog::getOpenFileName( nullptr, diff --git a/src/core/platforms/platformutilities.h b/src/core/platforms/platformutilities.h index fb40e25e42..5d40b1da78 100644 --- a/src/core/platforms/platformutilities.h +++ b/src/core/platforms/platformutilities.h @@ -146,6 +146,8 @@ class QFIELD_CORE_EXPORT PlatformUtilities : public QObject Q_INVOKABLE virtual void importProjectArchive() const; //! Requests and imports one or more datasets into QField's application directory action Q_INVOKABLE virtual void importDatasets() const; + //! Imports a file shared with QField by the operating system into its application directory and opens it + Q_INVOKABLE virtual void importFile( const QString &path ) const; /** * Update a local project content from a user-picked archive file action From e79806220acda2b4b2494fc5b41cce4f550bb7a7 Mon Sep 17 00:00:00 2001 From: Mohsen Date: Wed, 24 Jun 2026 20:25:57 +0330 Subject: [PATCH 2/9] Implement importFile for iOS platform utilities --- src/core/platforms/ios/iosplatformutilities.h | 1 + .../platforms/ios/iosplatformutilities.mm | 85 +++++++++++++++++++ 2 files changed, 86 insertions(+) diff --git a/src/core/platforms/ios/iosplatformutilities.h b/src/core/platforms/ios/iosplatformutilities.h index f3f8306b86..f9b4863bc3 100644 --- a/src/core/platforms/ios/iosplatformutilities.h +++ b/src/core/platforms/ios/iosplatformutilities.h @@ -39,6 +39,7 @@ class IosPlatformUtilities : public PlatformUtilities void importProjectFolder() const override; void importProjectArchive() const override; void importDatasets() const override; + void importFile( const QString &path ) const override; void exportDatasetTo( const QString &path ) const override; void exportFolderTo( const QString &path ) const override; void sendDatasetTo( const QString &path ) const override; diff --git a/src/core/platforms/ios/iosplatformutilities.mm b/src/core/platforms/ios/iosplatformutilities.mm index f98d9020e7..7d66a70201 100644 --- a/src/core/platforms/ios/iosplatformutilities.mm +++ b/src/core/platforms/ios/iosplatformutilities.mm @@ -513,6 +513,91 @@ - (void)documentPickerWasCancelled: [root presentViewController:picker animated:YES completion:nil]; } +static void removeInboxFile(const QString &path, const QString &appDir) { + const QString inboxDir = appDir + QStringLiteral("/Inbox/"); + if (path.startsWith(inboxDir)) { + QFile::remove(path); + } +} + +void IosPlatformUtilities::importFile(const QString &path) const { + QFileInfo fileInfo(path); + if (!fileInfo.exists() || !fileInfo.isFile() || !AppInterface::instance()) { + return; + } + + const QString appDir = applicationDirectory(); + const QString suffix = fileInfo.suffix().toLower(); + const bool isProjectFile = + suffix == QLatin1String("qgs") || suffix == QLatin1String("qgz"); + const bool isArchive = suffix == QLatin1String("zip"); + + if (isArchive) { + const QString importBase = appDir + QStringLiteral("/Imported Projects/"); + QDir().mkpath(importBase); + + QString destinationDir = importBase + fileInfo.completeBaseName(); + int index = 1; + while (QFileInfo::exists(destinationDir)) { + destinationDir = importBase + fileInfo.completeBaseName() + + QStringLiteral("_%1").arg(index); + ++index; + } + QDir().mkpath(destinationDir); + + QStringList extractedFiles; + if (!FileUtils::unzip(path, destinationDir, extractedFiles, false)) { + return; + } + removeInboxFile(path, appDir); + + // Open the project bundled within the archive, or reveal its content + QString projectFile; + for (const QString &extractedFile : extractedFiles) { + const QString extractedSuffix = + QFileInfo(extractedFile).suffix().toLower(); + if (extractedSuffix == QLatin1String("qgs") || + extractedSuffix == QLatin1String("qgz")) { + projectFile = extractedFile; + break; + } + } + + if (!projectFile.isEmpty()) { + AppInterface::instance()->loadFile(projectFile); + } else { + emit AppInterface::instance()->openPath(destinationDir); + } + return; + } + + // Project files go to "Imported Projects", other datasets to "Imported Datasets" + const QString importBase = + isProjectFile ? appDir + QStringLiteral("/Imported Projects/") + : appDir + QStringLiteral("/Imported Datasets/"); + QDir().mkpath(importBase); + + const QString suffixPart = + suffix.isEmpty() ? QString() : QStringLiteral(".") + suffix; + QString destinationFile = importBase + fileInfo.fileName(); + int index = 1; + while (QFileInfo::exists(destinationFile)) { + destinationFile = importBase + fileInfo.completeBaseName() + + QStringLiteral("_%1").arg(index) + suffixPart; + ++index; + } + + if (!QFile::copy(path, destinationFile)) { + return; + } + removeInboxFile(path, appDir); + + // Open the dataset when supported, otherwise reveal it in the local files browser + if (!AppInterface::instance()->loadFile(destinationFile)) { + emit AppInterface::instance()->openPath(importBase); + } +} + void IosPlatformUtilities::sendDatasetTo(const QString &path) const { NSMutableArray *items = [NSMutableArray array]; [items addObject:[NSURL fileURLWithPath:path.toNSString()]]; From a88f0517cd7b39a87f8373ed911cf83a70c9656f Mon Sep 17 00:00:00 2001 From: Mohsen Date: Wed, 24 Jun 2026 20:25:57 +0330 Subject: [PATCH 3/9] Handle incoming file URLs and register file URL handler on iOS --- src/core/qfieldurlhandler.cpp | 8 ++++++++ src/core/qgismobileapp.cpp | 4 ++++ 2 files changed, 12 insertions(+) diff --git a/src/core/qfieldurlhandler.cpp b/src/core/qfieldurlhandler.cpp index 88bcf77550..9bf038f106 100644 --- a/src/core/qfieldurlhandler.cpp +++ b/src/core/qfieldurlhandler.cpp @@ -16,6 +16,7 @@ ***************************************************************************/ #include "appinterface.h" +#include "platformutilities.h" #include "qfieldurlhandler.h" QFieldUrlHandler::QFieldUrlHandler( AppInterface *iface, QObject *parent ) @@ -25,6 +26,13 @@ QFieldUrlHandler::QFieldUrlHandler( AppInterface *iface, QObject *parent ) void QFieldUrlHandler::handleUrl( const QUrl &url ) { + // A file shared with QField is imported, while a qfield:// URL is an action to execute + if ( url.isLocalFile() ) + { + PlatformUtilities::instance()->importFile( url.toLocalFile() ); + return; + } + if ( mIface ) { mIface->executeAction( url.toString() ); diff --git a/src/core/qgismobileapp.cpp b/src/core/qgismobileapp.cpp index 416f6a9f7e..3ec5c977da 100644 --- a/src/core/qgismobileapp.cpp +++ b/src/core/qgismobileapp.cpp @@ -237,6 +237,10 @@ QgisMobileapp::QgisMobileapp( QgsApplication *app, QObject *parent ) mUrlHandler.reset( new QFieldUrlHandler( mIface, this ) ); QDesktopServices::setUrlHandler( QStringLiteral( "qfield" ), mUrlHandler.get(), "handleUrl" ); +#if defined( Q_OS_IOS ) + // iOS delivers files opened from other apps through the "file" URL scheme + QDesktopServices::setUrlHandler( QStringLiteral( "file" ), mUrlHandler.get(), "handleUrl" ); +#endif mMessageLogModel = new MessageLogModel( this ); From 4ee5ab7fa49128fcb77959d2b81382d4eec31398 Mon Sep 17 00:00:00 2001 From: Mohsen Date: Wed, 24 Jun 2026 20:25:57 +0330 Subject: [PATCH 4/9] Declare document types and UTType definitions in iOS Info.plist --- platform/ios/Info.plist.in | 194 +++++++++++++++++++++++++++++++++++++ 1 file changed, 194 insertions(+) diff --git a/platform/ios/Info.plist.in b/platform/ios/Info.plist.in index 960877c135..fec72540de 100644 --- a/platform/ios/Info.plist.in +++ b/platform/ios/Info.plist.in @@ -148,5 +148,199 @@ + + + CFBundleDocumentTypes + + + CFBundleTypeName + QGIS project + CFBundleTypeRole + Editor + LSHandlerRank + Owner + LSItemContentTypes + + org.qgis.qgs + org.qgis.qgz + + + + CFBundleTypeName + Geospatial dataset + CFBundleTypeRole + Editor + LSHandlerRank + Owner + LSItemContentTypes + + org.qgis.gpkg + org.qgis.mbtiles + org.geojson.geojson + com.google.earth.kml + com.google.earth.kmz + com.topografix.gpx + + + + CFBundleTypeName + Supported document + CFBundleTypeRole + Editor + LSHandlerRank + Alternate + LSItemContentTypes + + com.adobe.pdf + public.zip-archive + public.json + public.tiff + public.jpeg-2000 + + + + + + UTImportedTypeDeclarations + + + UTTypeIdentifier + org.qgis.qgs + UTTypeDescription + QGIS project + UTTypeConformsTo + + public.xml + + UTTypeTagSpecification + + public.filename-extension + + qgs + + + + + UTTypeIdentifier + org.qgis.qgz + UTTypeDescription + QGIS compressed project + UTTypeConformsTo + + public.zip-archive + + UTTypeTagSpecification + + public.filename-extension + + qgz + + + + + UTTypeIdentifier + org.qgis.gpkg + UTTypeDescription + GeoPackage + UTTypeConformsTo + + public.database + public.data + + UTTypeTagSpecification + + public.filename-extension + + gpkg + + + + + UTTypeIdentifier + org.qgis.mbtiles + UTTypeDescription + MBTiles + UTTypeConformsTo + + public.database + public.data + + UTTypeTagSpecification + + public.filename-extension + + mbtiles + + + + + UTTypeIdentifier + org.geojson.geojson + UTTypeDescription + GeoJSON + UTTypeConformsTo + + public.json + + UTTypeTagSpecification + + public.filename-extension + + geojson + + + + + UTTypeIdentifier + com.google.earth.kml + UTTypeDescription + KML + UTTypeConformsTo + + public.xml + + UTTypeTagSpecification + + public.filename-extension + + kml + + + + + UTTypeIdentifier + com.google.earth.kmz + UTTypeDescription + KMZ + UTTypeConformsTo + + public.zip-archive + + UTTypeTagSpecification + + public.filename-extension + + kmz + + + + + UTTypeIdentifier + com.topografix.gpx + UTTypeDescription + GPX + UTTypeConformsTo + + public.xml + + UTTypeTagSpecification + + public.filename-extension + + gpx + + + + From 9fc6c77a7c86dfa939981e623bd0f36d0fd6506f Mon Sep 17 00:00:00 2001 From: Mohsen Date: Mon, 29 Jun 2026 10:58:18 +0330 Subject: [PATCH 5/9] Address review. --- src/core/platforms/ios/iosplatformutilities.mm | 5 ++--- src/core/platforms/platformutilities.h | 1 + src/core/qgismobileapp.cpp | 9 +++++---- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/core/platforms/ios/iosplatformutilities.mm b/src/core/platforms/ios/iosplatformutilities.mm index 7d66a70201..2f0faabbf6 100644 --- a/src/core/platforms/ios/iosplatformutilities.mm +++ b/src/core/platforms/ios/iosplatformutilities.mm @@ -75,7 +75,8 @@ - (void)documentInteractionControllerDidEndPreview: PlatformUtilities::Capabilities IosPlatformUtilities::capabilities() const { PlatformUtilities::Capabilities capabilities = Capabilities() | NativeCamera | AdjustBrightness | FilePicker | - CustomImport | CustomSend | CustomExport | UpdateProjectFromArchive; + CustomImport | CustomSend | CustomExport | UpdateProjectFromArchive | + FileImport; #if WITH_SENTRY capabilities |= SentryFramework; #endif @@ -571,7 +572,6 @@ static void removeInboxFile(const QString &path, const QString &appDir) { return; } - // Project files go to "Imported Projects", other datasets to "Imported Datasets" const QString importBase = isProjectFile ? appDir + QStringLiteral("/Imported Projects/") : appDir + QStringLiteral("/Imported Datasets/"); @@ -592,7 +592,6 @@ static void removeInboxFile(const QString &path, const QString &appDir) { } removeInboxFile(path, appDir); - // Open the dataset when supported, otherwise reveal it in the local files browser if (!AppInterface::instance()->loadFile(destinationFile)) { emit AppInterface::instance()->openPath(importBase); } diff --git a/src/core/platforms/platformutilities.h b/src/core/platforms/platformutilities.h index 5d40b1da78..e0a137dc55 100644 --- a/src/core/platforms/platformutilities.h +++ b/src/core/platforms/platformutilities.h @@ -56,6 +56,7 @@ class QFIELD_CORE_EXPORT PlatformUtilities : public QObject Vibrate = 1 << 9, //!< Haptic feedback / vibration support UpdateProjectFromArchive = 1 << 10, //!< Update local project from a ZIP archive support PositioningService = 1 << 11, //!< Positioning service support + FileImport = 1 << 12, //!< Importing files shared with the app from other applications }; Q_DECLARE_FLAGS( Capabilities, Capability ) Q_FLAGS( Capabilities ) diff --git a/src/core/qgismobileapp.cpp b/src/core/qgismobileapp.cpp index 3ec5c977da..280be2efcd 100644 --- a/src/core/qgismobileapp.cpp +++ b/src/core/qgismobileapp.cpp @@ -237,10 +237,11 @@ QgisMobileapp::QgisMobileapp( QgsApplication *app, QObject *parent ) mUrlHandler.reset( new QFieldUrlHandler( mIface, this ) ); QDesktopServices::setUrlHandler( QStringLiteral( "qfield" ), mUrlHandler.get(), "handleUrl" ); -#if defined( Q_OS_IOS ) - // iOS delivers files opened from other apps through the "file" URL scheme - QDesktopServices::setUrlHandler( QStringLiteral( "file" ), mUrlHandler.get(), "handleUrl" ); -#endif + if ( PlatformUtilities::instance()->capabilities() & PlatformUtilities::FileImport ) + { + // Files opened from other apps are delivered through the "file" URL scheme + QDesktopServices::setUrlHandler( QStringLiteral( "file" ), mUrlHandler.get(), "handleUrl" ); + } mMessageLogModel = new MessageLogModel( this ); From 3b1cb6ae008903fbd45138de028bc642aa910803 Mon Sep 17 00:00:00 2001 From: Mohsen Date: Mon, 29 Jun 2026 11:32:09 +0330 Subject: [PATCH 6/9] Test and debug. --- .../platforms/ios/iosplatformutilities.mm | 29 +++++++++++++++++-- src/core/qfieldurlhandler.cpp | 4 +++ src/core/qgismobileapp.cpp | 2 ++ 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/src/core/platforms/ios/iosplatformutilities.mm b/src/core/platforms/ios/iosplatformutilities.mm index 2f0faabbf6..cb4178d318 100644 --- a/src/core/platforms/ios/iosplatformutilities.mm +++ b/src/core/platforms/ios/iosplatformutilities.mm @@ -522,8 +522,15 @@ static void removeInboxFile(const QString &path, const QString &appDir) { } void IosPlatformUtilities::importFile(const QString &path) const { + NSLog(@"QField[importFile] called with path: %@", path.toNSString()); + QFileInfo fileInfo(path); - if (!fileInfo.exists() || !fileInfo.isFile() || !AppInterface::instance()) { + if (!fileInfo.exists() || !fileInfo.isFile()) { + NSLog(@"QField[importFile] abort: not an existing regular file"); + return; + } + if (!AppInterface::instance()) { + NSLog(@"QField[importFile] abort: AppInterface instance is null"); return; } @@ -532,6 +539,8 @@ static void removeInboxFile(const QString &path, const QString &appDir) { const bool isProjectFile = suffix == QLatin1String("qgs") || suffix == QLatin1String("qgz"); const bool isArchive = suffix == QLatin1String("zip"); + NSLog(@"QField[importFile] suffix=%@ isProjectFile=%d isArchive=%d", + suffix.toNSString(), isProjectFile, isArchive); if (isArchive) { const QString importBase = appDir + QStringLiteral("/Imported Projects/"); @@ -548,8 +557,12 @@ static void removeInboxFile(const QString &path, const QString &appDir) { QStringList extractedFiles; if (!FileUtils::unzip(path, destinationDir, extractedFiles, false)) { + NSLog(@"QField[importFile] abort: unzip failed for %@", + path.toNSString()); return; } + NSLog(@"QField[importFile] extracted %lu files into %@", + (unsigned long)extractedFiles.size(), destinationDir.toNSString()); removeInboxFile(path, appDir); // Open the project bundled within the archive, or reveal its content @@ -565,8 +578,12 @@ static void removeInboxFile(const QString &path, const QString &appDir) { } if (!projectFile.isEmpty()) { + NSLog(@"QField[importFile] loading bundled project: %@", + projectFile.toNSString()); AppInterface::instance()->loadFile(projectFile); } else { + NSLog(@"QField[importFile] no project in archive, revealing: %@", + destinationDir.toNSString()); emit AppInterface::instance()->openPath(destinationDir); } return; @@ -588,11 +605,19 @@ static void removeInboxFile(const QString &path, const QString &appDir) { } if (!QFile::copy(path, destinationFile)) { + NSLog(@"QField[importFile] abort: copy failed %@ -> %@", path.toNSString(), + destinationFile.toNSString()); return; } + NSLog(@"QField[importFile] copied to %@", destinationFile.toNSString()); removeInboxFile(path, appDir); - if (!AppInterface::instance()->loadFile(destinationFile)) { + const bool loaded = AppInterface::instance()->loadFile(destinationFile); + NSLog(@"QField[importFile] loadFile(%@) returned %d", + destinationFile.toNSString(), loaded); + if (!loaded) { + NSLog(@"QField[importFile] revealing in browser: %@", + importBase.toNSString()); emit AppInterface::instance()->openPath(importBase); } } diff --git a/src/core/qfieldurlhandler.cpp b/src/core/qfieldurlhandler.cpp index 9bf038f106..a675e748e1 100644 --- a/src/core/qfieldurlhandler.cpp +++ b/src/core/qfieldurlhandler.cpp @@ -19,6 +19,8 @@ #include "platformutilities.h" #include "qfieldurlhandler.h" +#include + QFieldUrlHandler::QFieldUrlHandler( AppInterface *iface, QObject *parent ) : QObject( parent ), mIface( iface ) { @@ -26,6 +28,8 @@ QFieldUrlHandler::QFieldUrlHandler( AppInterface *iface, QObject *parent ) void QFieldUrlHandler::handleUrl( const QUrl &url ) { + qInfo() << "QField[handleUrl] received url:" << url.toString() << "isLocalFile:" << url.isLocalFile(); + // A file shared with QField is imported, while a qfield:// URL is an action to execute if ( url.isLocalFile() ) { diff --git a/src/core/qgismobileapp.cpp b/src/core/qgismobileapp.cpp index 280be2efcd..98b00ace6a 100644 --- a/src/core/qgismobileapp.cpp +++ b/src/core/qgismobileapp.cpp @@ -241,6 +241,7 @@ QgisMobileapp::QgisMobileapp( QgsApplication *app, QObject *parent ) { // Files opened from other apps are delivered through the "file" URL scheme QDesktopServices::setUrlHandler( QStringLiteral( "file" ), mUrlHandler.get(), "handleUrl" ); + qInfo() << "QField[init] registered file URL handler"; } mMessageLogModel = new MessageLogModel( this ); @@ -718,6 +719,7 @@ void QgisMobileapp::onAfterFirstRendering() // disconnect( this, &QgisMobileapp::afterRendering, this, &QgisMobileapp::onAfterFirstRendering ); if ( mFirstRenderingFlag ) { + qInfo() << "QField[onAfterFirstRendering] running startup project load; current mProjectFilePath:" << mProjectFilePath; mPluginManager->restoreAppPlugins(); if ( PlatformUtilities::instance()->hasQfAction() ) { From f2300ab8e645580b94389369cb384b162f40e76b Mon Sep 17 00:00:00 2001 From: Mohsen Date: Mon, 29 Jun 2026 15:56:49 +0330 Subject: [PATCH 7/9] Disable Document Browser and opening documents in place --- platform/ios/Info.plist.in | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/ios/Info.plist.in b/platform/ios/Info.plist.in index fec72540de..e87a82462b 100644 --- a/platform/ios/Info.plist.in +++ b/platform/ios/Info.plist.in @@ -128,10 +128,10 @@ UISupportsDocumentBrowser - + LSSupportsOpeningDocumentsInPlace - + LSApplicationQueriesSchemes From facd7e6316ba9c87ae0fa245751911fcff8a5932 Mon Sep 17 00:00:00 2001 From: Mohsen Date: Tue, 30 Jun 2026 19:02:47 +0330 Subject: [PATCH 8/9] Update iOS file associations and defer file import to event loop --- platform/ios/Info.plist.in | 12 +++++------- src/core/qfieldurlhandler.cpp | 10 +++++----- src/core/qgismobileapp.cpp | 3 --- 3 files changed, 10 insertions(+), 15 deletions(-) diff --git a/platform/ios/Info.plist.in b/platform/ios/Info.plist.in index e87a82462b..17b6b62d0f 100644 --- a/platform/ios/Info.plist.in +++ b/platform/ios/Info.plist.in @@ -174,8 +174,8 @@ Owner LSItemContentTypes - org.qgis.gpkg - org.qgis.mbtiles + org.opengeospatial.geopackage + com.mapbox.mbtiles org.geojson.geojson com.google.earth.kml com.google.earth.kmz @@ -186,7 +186,7 @@ CFBundleTypeName Supported document CFBundleTypeRole - Editor + Viewer LSHandlerRank Alternate LSItemContentTypes @@ -239,12 +239,11 @@ UTTypeIdentifier - org.qgis.gpkg + org.opengeospatial.geopackage UTTypeDescription GeoPackage UTTypeConformsTo - public.database public.data UTTypeTagSpecification @@ -257,12 +256,11 @@ UTTypeIdentifier - org.qgis.mbtiles + com.mapbox.mbtiles UTTypeDescription MBTiles UTTypeConformsTo - public.database public.data UTTypeTagSpecification diff --git a/src/core/qfieldurlhandler.cpp b/src/core/qfieldurlhandler.cpp index a675e748e1..32a7f2568b 100644 --- a/src/core/qfieldurlhandler.cpp +++ b/src/core/qfieldurlhandler.cpp @@ -19,7 +19,7 @@ #include "platformutilities.h" #include "qfieldurlhandler.h" -#include +#include QFieldUrlHandler::QFieldUrlHandler( AppInterface *iface, QObject *parent ) : QObject( parent ), mIface( iface ) @@ -28,12 +28,12 @@ QFieldUrlHandler::QFieldUrlHandler( AppInterface *iface, QObject *parent ) void QFieldUrlHandler::handleUrl( const QUrl &url ) { - qInfo() << "QField[handleUrl] received url:" << url.toString() << "isLocalFile:" << url.isLocalFile(); - - // A file shared with QField is imported, while a qfield:// URL is an action to execute if ( url.isLocalFile() ) { - PlatformUtilities::instance()->importFile( url.toLocalFile() ); + // Import on the next event loop cycle so the potentially heavy work (e.g. + // unzipping an archive) does not block the incoming-URL handling + const QString path = url.toLocalFile(); + QTimer::singleShot( 0, [path]() { PlatformUtilities::instance()->importFile( path ); } ); return; } diff --git a/src/core/qgismobileapp.cpp b/src/core/qgismobileapp.cpp index 98b00ace6a..8bedac44c5 100644 --- a/src/core/qgismobileapp.cpp +++ b/src/core/qgismobileapp.cpp @@ -239,9 +239,7 @@ QgisMobileapp::QgisMobileapp( QgsApplication *app, QObject *parent ) QDesktopServices::setUrlHandler( QStringLiteral( "qfield" ), mUrlHandler.get(), "handleUrl" ); if ( PlatformUtilities::instance()->capabilities() & PlatformUtilities::FileImport ) { - // Files opened from other apps are delivered through the "file" URL scheme QDesktopServices::setUrlHandler( QStringLiteral( "file" ), mUrlHandler.get(), "handleUrl" ); - qInfo() << "QField[init] registered file URL handler"; } mMessageLogModel = new MessageLogModel( this ); @@ -719,7 +717,6 @@ void QgisMobileapp::onAfterFirstRendering() // disconnect( this, &QgisMobileapp::afterRendering, this, &QgisMobileapp::onAfterFirstRendering ); if ( mFirstRenderingFlag ) { - qInfo() << "QField[onAfterFirstRendering] running startup project load; current mProjectFilePath:" << mProjectFilePath; mPluginManager->restoreAppPlugins(); if ( PlatformUtilities::instance()->hasQfAction() ) { From a9fe7915e9f22dd8a15a1edf1103b06f7fc92ff2 Mon Sep 17 00:00:00 2001 From: Mohsen Date: Thu, 2 Jul 2026 19:37:29 +0330 Subject: [PATCH 9/9] Enable iOS Document Browser support --- platform/ios/Info.plist.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/ios/Info.plist.in b/platform/ios/Info.plist.in index 17b6b62d0f..4f9c60cb7a 100644 --- a/platform/ios/Info.plist.in +++ b/platform/ios/Info.plist.in @@ -128,7 +128,7 @@ UISupportsDocumentBrowser - + LSSupportsOpeningDocumentsInPlace