2015-03-03 96 views
1

我是Qt和QML的新手,并且正在尝试为iOS构建我的第一个应用程序。我需要获取我在info.plist(myApp://)中定义的自定义URL Scheme的内容。当我打开任何网址myApp:// xyz时,URL方案起作用并且应用程序将打开。现在我需要获取URL(xyz)的内容。在QML中获取自定义iOS方案的源URL的最佳方式

在过去的日子里试图做到这一点,并没有成功,也没有找到一个好的手册,如何做到最好,我问这里。到目前为止我的理解是:有些人创建自己的应用程序代表。在github上有很多使用旧版Qt的例子(我使用5.4),但是我没有设法将它们集成到我的应用程序中,这对于这个简单的事情似乎相当复杂。另外,正如我在这里看到的:https://github.com/qtproject/qtbase/blob/stable/src/plugins/platforms/ios/qiosapplicationdelegate.mm这个URL在某种程度上已经被Qt处理了。我不确定Qt Desktop Services http://doc.qt.io/qt-5/QDesktopServices.html是否处理它,但(似乎)它不能从QML获得。

这样做的最佳方法是什么?非常感谢。

回答

3

我终于使用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中,setURLHandler和创建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> 
+0

非常有用...感谢 – Indio 2016-02-29 09:20:10

+0

在该OS操作呢?似乎没有在我的OSX上工作 – psyched 2016-09-15 15:31:47

+0

我只在iOS上测试过(最后我们放弃了Qt并使用了Swift,所以我没有运行它)。但也许这有助于:http://superuser.com/questions/548119/how-do-i-configure-custom-url-handlers-on-os-x – ceed 2016-09-20 10:51:34