2015-03-03 25 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