summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/plugins/platforms/ios/qiosapplicationdelegate.mm20
-rw-r--r--src/plugins/platforms/ios/qiosservices.h7
-rw-r--r--src/plugins/platforms/ios/qiosservices.mm19
3 files changed, 46 insertions, 0 deletions
diff --git a/src/plugins/platforms/ios/qiosapplicationdelegate.mm b/src/plugins/platforms/ios/qiosapplicationdelegate.mm
index cf702c82af..9cf1047a6b 100644
--- a/src/plugins/platforms/ios/qiosapplicationdelegate.mm
+++ b/src/plugins/platforms/ios/qiosapplicationdelegate.mm
@@ -41,9 +41,14 @@
#include "qiosapplicationdelegate.h"
+#include "qiosintegration.h"
+#include "qiosservices.h"
#include "qiosviewcontroller.h"
#include "qioswindow.h"
+#include <QtGui/private/qguiapplication_p.h>
+#include <qpa/qplatformintegration.h>
+
#include <QtCore/QtCore>
@implementation QIOSApplicationDelegate
@@ -82,6 +87,21 @@
return YES;
}
+- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
+{
+ Q_UNUSED(application);
+ Q_UNUSED(sourceApplication);
+ Q_UNUSED(annotation);
+
+ if (!QGuiApplication::instance())
+ return NO;
+
+ QIOSIntegration *iosIntegration = static_cast<QIOSIntegration *>(QGuiApplicationPrivate::platformIntegration());
+ QIOSServices *iosServices = static_cast<QIOSServices *>(iosIntegration->services());
+
+ return iosServices->handleUrl(QUrl::fromNSURL(url));
+}
+
- (void)dealloc
{
[window release];
diff --git a/src/plugins/platforms/ios/qiosservices.h b/src/plugins/platforms/ios/qiosservices.h
index 692b3a0b99..aa39fbbed4 100644
--- a/src/plugins/platforms/ios/qiosservices.h
+++ b/src/plugins/platforms/ios/qiosservices.h
@@ -41,6 +41,8 @@
#ifndef QIOSSERVICES_H
#define QIOSSERVICES_H
+
+#include <qurl.h>
#include <qpa/qplatformservices.h>
QT_BEGIN_NAMESPACE
@@ -50,6 +52,11 @@ class QIOSServices : public QPlatformServices
public:
bool openUrl(const QUrl &url);
bool openDocument(const QUrl &url);
+
+ bool handleUrl(const QUrl &url);
+
+private:
+ QUrl m_handlingUrl;
};
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/ios/qiosservices.mm b/src/plugins/platforms/ios/qiosservices.mm
index 32203aeb71..0ac6c590ca 100644
--- a/src/plugins/platforms/ios/qiosservices.mm
+++ b/src/plugins/platforms/ios/qiosservices.mm
@@ -42,6 +42,7 @@
#include "qiosservices.h"
#include <QtCore/qurl.h>
+#include <QtGui/qdesktopservices.h>
#import <UIKit/UIApplication.h>
@@ -49,6 +50,9 @@ QT_BEGIN_NAMESPACE
bool QIOSServices::openUrl(const QUrl &url)
{
+ if (url == m_handlingUrl)
+ return false;
+
if (url.scheme().isEmpty())
return openDocument(url);
@@ -66,4 +70,19 @@ bool QIOSServices::openDocument(const QUrl &url)
return QPlatformServices::openDocument(url);
}
+/* Callback from iOS that the application should handle a URL */
+bool QIOSServices::handleUrl(const QUrl &url)
+{
+ QUrl previouslyHandling = m_handlingUrl;
+ m_handlingUrl = url;
+
+ // FIXME: Add platform services callback from QDesktopServices::setUrlHandler
+ // so that we can warn the user if calling setUrlHandler without also setting
+ // up the matching keys in the Info.plist file (CFBundleURLTypes and friends).
+ bool couldHandle = QDesktopServices::openUrl(url);
+
+ m_handlingUrl = previouslyHandling;
+ return couldHandle;
+}
+
QT_END_NAMESPACE