我是Qt和QML的新手,正在尝试为iOS构建我的第一个应用程序。我需要获得我在info.plist(myApp://)中定义的自定义URL方案的内容。URL方案有效,当我打开任何URL myApp://xyz时,应用程序都会打开。现在我需要获取URL(xyz)的内容。
在过去的几天里,我试图做到这一点,但没有成功,也没有找到一本关于如何做到最好的好手册,我在这里问。到目前为止,我所理解的是:有些人创建自己的应用程序委派。github上很少有使用旧Qt版本的例子(我使用5.4),但我没有设法将它们集成到我的应用程序中,这对于这个简单的事情来说似乎相当复杂。此外,正如我在这里看到的:https://github.com/qtproject/qtbase/blob/stable/src/plugins/platforms/ios/qiosapplicationdelegate.mm该URL不知何故已经由Qt处理。我不确定Qt桌面服务http://doc.qt.io/qt-5/QDesktopServices.html,处理它,但(似乎)QML无法提供它。
最好的方法是什么?非常感谢。
我最终使用QDesktopServices和QML的信号使其工作。
HandleURL.h
#include <QDesktopServices>
#ifndef HANDLEURL
#define HANDLEURL
class HandleURL : public QObject
{
Q_OBJECT
signals:
void incomingURL(QString path);
public slots:
void handleURL(const QUrl &url);
};
#endif
HandleURL.cpp发出信号
void HandleURL::handleURL(const QUrl &url)
{
emit incomingURL(url.toString());
}
在main.cpp中,设置URLHandler并创建QML上下文属性
HandleURL *URLHandler = new HandleURL();
QDesktopServices::setUrlHandler("myscheme", URLHandler, "handleURL");
engine.rootContext()->setContextProperty("URLHandler", URLHandler);
在QML中,收听信号
Connections{
target: URLHandler;
onIncomingURL: { console.log("Incoming Signal: "+path)
}
}
plist.info
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLName</key>
<string>com.myorg.mobile1</string>
<key>CFBundleURLSchemes</key>
<array>
<string>myscheme</string>
</array>
</dict>
</array>