Präambel
Das demokratischste Land der Welt hat das totalitärste Betriebssystem geschaffen. Wenn Sie Ihre Software also auf einem iPad oder iPhone testen möchten, müssen Sie sich auf der Website registrieren. https://developer.apple.com/ Als ein Entwickler. In der ersten Phase müssen Sie kein Geld bezahlen. Good Onkel Jobs gibt Ihnen ein Zertifikat, um Ihr eigenes Gerät für einen Zeitraum von 7 (sieben) Tagen zum Testen zu verwenden. Am Ende des Zertifikats wird Ihre Software nicht ausgeführt und muss erneut vom Computer heruntergeladen werden. Wenn Sie Ihre Software auf dem Gerät einer anderen Person installieren möchten, muss deren Apple-ID auf die gleiche Weise wie Ihre in Xcode registriert werden.
Probleme
Um Qt zu lernen, habe ich mich entschlossen, für eine Testaufgabe einen mobilen Arbeitsplatz für den Workflow zu entwickeln. Denn Dokumente können in Form von Word, PDF, JPG usw. vorliegen. Ich muss sie natürlich mit etwas öffnen, nachdem ich sie vom Server heruntergeladen habe. Qt hat ein wunderbares Konstrukt
QDesktopServices :: openUrl ( QUrl :: fromLocalFile ( QStandardPaths :: writableLocation ( QStandardPaths :: GenericDataLocation ) + "/temp_esd/file." + file_ext )); // File _ ext я вытаскиваю в соответствии с MIME типом if ( head == "Content-Type" ) { if ( content_from_url == "image/jpeg" ) file_ext = "jpg"; else if ( content_from_url == "application/pdf" ) file_ext = "pdf"; else if ( content_from_url == "application/vnd.openxmlformats-officedocument.wordprocessingml.document" ) file_ext = "docx"; else if ( content_from_url == "application/msword" ) file_ext = "doc"; else if ( content_from_url == "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" ) file_ext = "xlsx"; else if ( content_from_url == "application/vnd.ms-excel" ) file_ext = "xls"; else if ( content_from_url == "application/vnd.oasis.opendocument.text" ) file_ext = "odt"; else if ( content_from_url == "application/vnd.oasis.opendocument.spreadsheet" ) file_ext = "ods"; else if ( content_from_url == "application/octet-stream" ) file_ext = "7z"; else if ( content_from_url == "video/x-msvideo" ) file_ext = "avi"; else if ( content_from_url == "image/bmp" ) file_ext = "bmp"; else if ( content_from_url == "application/cdr" ) file_ext = "cdr"; else if ( content_from_url == "image/gif" ) file_ext = "gif"; else if ( content_from_url == "video/quicktime" ) file_ext = "mov"; else if ( content_from_url == "audio/mpeg" ) file_ext = "mp3"; else if ( content_from_url == "image/png" ) file_ext = "png"; else if ( content_from_url == "application/vnd.ms-powerpoint" ) file_ext = "ppt"; else if ( content_from_url == "application/vnd.openxmlformats-officedocument.presentationml.presentation" ) file_ext = "pptx"; else if ( content_from_url == "application/x-rar-compressed" ) file_ext = "rar" ; else if ( content_from_url == "application/rtf" ) file_ext = "rtf"; else if ( content_from_url == "image/tiff" ) file_ext = "tif"; else if ( content_from_url == "text/plain" ) file_ext = "txt" ; else if ( content_from_url == "audio/x-ms-wma" ) file_ext = "wma"; else if ( content_from_url == "application/zip" ) file_ext = "zip"; }
Aber in IOS - in Übereinstimmung mit den kürzlich verabschiedeten Sicherheitsstandards ist es verboten, eine lokale URL in einer Anwendung zu öffnen, indem man eine andere startet. Daher führte die Verwendung dieses Konstrukts unter IOS zu einem Fehler
dieses Plugin wird nicht unterstützt
Ich bin zunächst in die Richtung gegangen, Info.plist zu verwenden - zumal es unter IOS noch benötigt wird. Registriert in der Sektion
<key>LSApplicationQueriesSchemes</key> <array> <string>ms-word</string> <string>ms-powerpoint</string> <string>ms-excel</string> </array>
Das funktioniert aber nur, wenn die Dateien NICHT lokal geöffnet werden – sondern über eine Internetverbindung. Nachdem ich das Problem weiter recherchiert hatte, stieß ich auf den Artikel https://code.tutsplus.com/tutorials/ios-sdk-previewing-and-opening-documents--mobile-15130 die beschreibt, wie man UIDocumentInteractionController verwendet, um Dateien in der Sandbox einer ios-Anwendung zu öffnen. Auch ein großes Dankeschön an Ekkehard Gentz für einen absolut wunderbaren Blog mit einem detaillierten Beispiel Verwenden Sie die obigen Funktionen in Qt.
Lösung
Und so haben wir einen MAC MINI zum Kompilieren von Quellen und ein IPAD zum Testen. Installieren Sie Qt auf dem MAC MINI. Während der Installation werden Sie aufgefordert, XCODE herunterzuladen - dem stimmen wir zu. Alles ist super eingerichtet. Fügen Sie als Nächstes in Xcode - Preferences - Accounts Ihr Apple-Konto hinzu und fordern Sie ein Zertifikat an (über Manage Certificates ). Natürlich müssen Sie sich zunächst auf der Apple-Website als Entwickler registrieren. Verbinden Sie als Nächstes Ihr IPAD und aktivieren Sie im Abschnitt Einstellungen – Entwickler – UI-AUTOMATION die Option UI-Automatisierung aktivieren. Daher versetzen wir das iPad in den aktivierten Debugging-Modus.
In Xcode - Window - Devices and Simulators können Sie Ihr verbundenes Gerät überprüfen. Natürlich werden Sie während des Verbindungsvorgangs einige Male gefragt, ob Sie dem Computer dem Gerät und dem Gerät dem Computer vertrauen möchten - sagen Sie JA.
Fügen Sie in QT in der Projektdatei den folgenden Abschnitt hinzu
ios { OBJECTIVE_SOURCES += ios/iosshareutils.mm \ ios/docviewcontroller.mm QMAKE_INFO_PLIST = ios/Info.plist LIBS += - framework UIKit }
In diesem Abschnitt geben wir den Speicherort von Info.plist an – dies ist eine Art textuelle Konfigurationsdatei, die manuell bearbeitet werden kann.
OBJECTIVE_SOURCES sind unsere OBJECTIVE-C-Dateien
Die LIBS-Richtlinie ist wahrscheinlich veraltet. Aber ich habe es nicht sauber gemacht.
In den Quellen selbst ist es sehr praktisch, die Direktive zu verwenden
#if defined( Q_OS_IOS ) QString temp_url= QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + "/temp_esd/file." +file_ext; qDebug() << "path_file " << temp_url; IosShareUtils ios; ios.viewFile(temp_url, "View File" , "application/pdf" , 21 ); #else QDesktopServices :: openUrl ( QUrl :: fromLocalFile ( QStandardPaths :: writableLocation ( QStandardPaths :: GenericDataLocation ) + "/temp_esd/file." + file_ext )); #endif
Die Quelltexte können Sie im Blog einsehen https://blog.qt.io/blog/2017/12/01/sharing-files-android-ios-qt-app/
Im Allgemeinen fahren wir mit der Bereitstellung fort, nachdem die Quelltexte fertig sind. Bitte beachten Sie, dass in Qt Creator bei der Veröffentlichung von Qt 5.10 für iOS unten rechts neben dem Telefonsymbol ein grüner Punkt mit einem Apfel aufleuchtete. Fahren Sie mit der Maus darüber und Sie sehen Informationen über das Gerät und ob dieses Gerät im Entwicklermodus läuft. Danach kompilieren wir die Quellen und versuchen, sie auf das Telefon herunterzuladen. Beim ersten Mal klappt es nicht. Wir gehen zum Release-Ordner und öffnen das Xcode-Projekt unserer Anwendung. Wählen Sie oben, wo der Name Ihres Schemas steht, das aktive Schema für das Gerät aus, das mit dem Computer verbunden ist. Klicken Sie dann auf das Symbol „Build and then run the current scheme“. Aber das ist noch nicht alles. Ihr App-Symbol wird auf Ihrem Gerät angezeigt, aber es wird nicht gestartet. Oder es wird starten, aber schnell schließen. Öffnen Sie das Ipad - gehen Sie zu Einstellungen - Basis - Geräteverwaltung - Entwicklersoftware - wählen Sie Ihre Apple-ID aus - dann sagen wir, dass wir diesem Entwickler vertrauen. Nach all diesen Vorgängen können Sie die Anwendung sicher direkt von Qt Creator aus bereitstellen.
Danke an alle im Internet, die geduldig meine dummen Fragen beantwortet haben. Und Gott wird denen vergeben, die versucht haben, Geld von mir abzuschütteln. Es scheint mir, dass jeder Profi etwas Altruismus haben sollte.
Eine kleine Ergänzung zum Kompilieren des Projekts für ältere Versionen von iOS (8-9)
Ich habe mein Projekt auf Qt 5.10 unter iOS 10 und arm64-Architektur (mit Xcode9) kompiliert - alles ist in Ordnung. Aber als ich versuchte, dasselbe Projekt für ein altes iPad mit iOS 9 und armv7-Architektur bereitzustellen, hatte ich viele Probleme, die ich nicht lösen konnte. Ich habe versucht, die Architektur in Xcode festzulegen - habe Fehler wie - Ignorieren der Datei LibQt5Core_debu.a, fehlende erforderliche Architektur armv7 in Datei LibQt5Core_debu.a, ausprobierte Anweisungen
QMAKE_IOS_DEVICE_ARCHS = armv7 CONFIG += armv7 QMAKE_IOS_DEPLOYMENT_TARGET = 9.0
Ich habe ein Rollback auf Xcode 7 durchgeführt - alles ohne Erfolg. Und endlich, nach mehreren Tagen erfolgloser Versuche, habe ich das hier gelesen
https://bugreports.qt.io/browse/QTBUG-65544
Beschreibung Jede App, die mit Qt 5.10 kompiliert wurde, benötigt mindestens iOS 10 und lässt sich nicht auf älteren Geräten (iPad 1, iPhone 5 usw.) bereitstellen.
Sogar in den AppStore hochgeladene Apps, die nicht auf Geräten mit iOS < 10 installiert werden.
Es gibt zu viele Geräte mit iOS 9, um die Unterstützung dafür einzustellen.
Dieselben Apps, die mit Qt 5.9.3 kompiliert wurden, funktionieren auf allen Geräten einwandfrei.
Eskil Abrahamsen Blomfeldt hat einen Kommentar hinzugefügt – 3. Januar 2018 10:43 Uhr Qt 5.9 ist eine langfristig unterstützte Version und wird dies auch weiterhin tun Unterstützung von iOS 9, wenn Ihre App Unterstützung für ältere Geräte erfordert.
Für Qt 5.10 ist die Mindestzielversion iOS 10, wie Sie sagen. Die vollständige Liste der unterstützten Plattformen finden Sie hier: http://doc.qt.io/qt-5/supported-platforms.html
Laut Zahlen von Apple laufen mittlerweile 92 % der aktiven Geräte auf iOS 10 oder iOS 11.
Wenn Sie also ältere iOS-Versionen unterstützen möchten – verwenden Sie Qt 5.9.3 –, wird alles sofort für die gewünschte Architektur kompiliert.
Вот честно, на сколько же муторно под огрызок что то делать. Куча проблем)
А вод линь или под Андроид все просто и тривиально))