alex_lip
alex_lip14. Januar 2018 14:15

Entwicklung auf Qt für iOS

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.

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

BlinCT
  • 14. Januar 2018 14:28

Вот честно, на сколько же муторно под огрызок что то делать. Куча проблем)
А вод линь или под Андроид все просто и тривиально))

Kommentare

Nur autorisierte Benutzer können Kommentare posten.
Bitte Anmelden oder Registrieren
Letzte Kommentare
A
ALO1ZE19. Oktober 2024 08:19
Fb3-Dateileser auf Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь Максимов5. Oktober 2024 07:51
Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas55. Juli 2024 11:02
QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssr8. Februar 2024 18:43
Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
Jetzt im Forum diskutieren
J
JacobFib17. Oktober 2024 03:27
добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
JW
Jhon Wick1. Oktober 2024 15:52
Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
КГ
Кирилл Гусарев27. September 2024 09:09
Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
F
Fynjy22. Juli 2024 04:15
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

Folgen Sie uns in sozialen Netzwerken