Xcode 10.2, macOS Mojave 10.14.4, iOS 12.1 und andere Betas



Neue Betas sind da und dies sind einige der wichtigsten Dinge, die ich über sie gelernt habe.

Swift 5 für Xcode 10.2 Beta


Schnell


Erstens wird die neueste Xcode-Beta mit der folgenden Swift-Version gebündelt:

Apple Swift version 5.0 (swiftlang-1001.0.45.7 clang-1001.0.37.7) Target: x86_64-apple-darwin18.2.0 ABI version: 0.6 

Beginnen wir mit den aufregendsten Neuigkeiten:
Swift-Apps enthalten keine dynamisch verknüpften Bibliotheken mehr für die Swift-Standardbibliothek und Swift SDK-Overlays in Build-Varianten für Geräte mit iOS 12.2, watchOS 5.2 und tvOS 12.2. Infolgedessen können Swift-Apps kleiner sein, wenn sie zum Testen mit TestFlight bereitgestellt werden oder wenn ein App-Archiv für die lokale Entwicklungsverteilung ausgedünnt wird.
Anwendung Die Stabilität der binären Schnittstelle kommt! Und das sind hervorragende Neuigkeiten. Ich denke, dies ist derzeit eines der wichtigsten Probleme bei Swift. Nicht wegen Nebenwirkungen, sondern weil Swift frühere Versprechen nicht eingehalten hat. Wie auch immer, ich kenne sogar Leute, die ihre Apple Watch-Erweiterungen auf Objective C umschreiben, um die Größe der Binärdatei zu reduzieren (etwa 15 MB gegenüber ~ 1 MB in Objective C). Wenn Sie mehr über den Status von ABI erfahren möchten, folgen Sie den Links: Swift - ABI Dashboard und Swift ABI Stability Manifesto .

Mit @dynamicCallable Attribut @dynamicCallable können Sie benannte Typen aufrufen, wie Sie Funktionen mit einem einfachen syntaktischen Zucker aufrufen. Der primäre Anwendungsfall ist die dynamische Sprachinteroperabilität. ( SE-0216 )

Beispiel:

 @dynamicCallable struct ToyCallable { func dynamicallyCall(withArguments: [Int]) {} func dynamicallyCall(withKeywordArguments: KeyValuePairs<String, Int>) {} } let x = ToyCallable() x(1, 2, 3) // Desugars to `x.dynamicallyCall(withArguments: [1, 2, 3])` x(label: 1, 2) // Desugars to `x.dynamicallyCall(withKeywordArguments: ["label": 1, "": 2]) 

Dies ist ein riesiges Thema und ich habe gemischte Gefühle in Bezug auf die Funktion. Lesen Sie also den Beitrag "Was ist neu in Swift 5.0?" Von Paul Hudson, wenn Sie mehr darüber erfahren möchten, was kommt.
Der Swift 3-Modus wurde entfernt. Unterstützte Werte für das -swift-version sind 4, 4.2 und 5.
Die Zeit ist gekommen. Die Quellkompatibilität mit Swift 3 ist nicht mehr gegeben. Es wurde mit Swift 5 Roadmap erwartet und angekündigt, aber immer noch. Ich empfehle Ihnen dringend, Ihren Speicher mit "Swift 5.0 Release Process" zu aktualisieren, da Swift 5 fast da ist. Mach dich bereit.
Im Swift 5-Modus müssen Umschaltungen, die in Objective-C deklariert sind oder aus Systemframeworks stammen, unbekannte Fälle behandeln - Fälle, die möglicherweise in Zukunft hinzugefügt oder privat in einer Objective-C-Implementierungsdatei definiert werden . Formal ermöglicht Objective-C das Speichern eines beliebigen Werts in einer Aufzählung, sofern dieser in den zugrunde liegenden Typ passt.
Diese unbekannten Fälle können mithilfe des neuen @unknown default werden, der weiterhin Warnungen @unknown default , wenn bekannte Fälle im Switch weggelassen werden. Sie können auch in einem normalen default werden.

Wenn Sie in Objective-C eine eigene Aufzählung definiert haben und keine Clients zur Behandlung unbekannter Fälle benötigen, können NS_CLOSED_ENUM anstelle von NS_ENUM das Makro NS_ENUM . Der Swift-Compiler erkennt dies und benötigt keine Switches, um einen Standardfall zu haben.

In den Modi Swift 4 und 4.2 können Sie weiterhin die @unknown default . Wenn Sie es weglassen und ein unbekannter Wert an den Switch übergeben wird, wird das Programm zur Laufzeit abgefangen, ebenso wie Swift 4.2 in Xcode 10.1. ( SE-0192 )
Es war und ist ein Schmerz, besonders wenn Sie innerhalb von Switches keinen Standardansatz verwenden . Ich erinnere mich an die hässlichen .provisional für die neue .provisional Option der UNAuthorizationOptions Eigenschaft, die in iOS 12 eingeführt wurde. In einem unbekannten Fall ist es jetzt viel einfacher, mit solchen Szenarien UNAuthorizationOptions .

Schneller Paketmanager


Pakete können jetzt die Mindesteinstellung für das Bereitstellungsziel für Apple-Plattformen anpassen, wenn sie die Tools-Version von Swift 5 Package.swift verwenden. Das Erstellen eines Pakets gibt einen Fehler aus, wenn eine der Paketabhängigkeiten des Pakets ein Mindestbereitstellungsziel angibt, das größer ist als das Mindestbereitstellungsziel des Pakets. ( SE-0236 )
Die wichtigste Neuigkeit für mich betrifft Swift Package Manager. Technisch gesehen kann diese Änderung viele Probleme lösen, die verhindern, dass SPM in der iOS-Welt nützlich ist. In meinem vorherigen Artikel " Swift Package Manager erstellt iOS-Frameworks " habe ich versucht, den aktuellen Status von SPM im Kontext der iOS-Entwicklung zu analysieren. Und jetzt scheint es, dass ich meine Gedanken und Schlussfolgerungen neu bewerten muss.

Es gibt auch einige schlechte Probleme:
Bei einigen Projekten kann es zu Regressionen der Kompilierungszeit aus früheren Versionen kommen.
Schnelle Befehlszeilenprojekte stürzen beim Start mit Fehlern "dyld: Bibliothek nicht geladen" ab.
Problemumgehung: Fügen Sie eine benutzerdefinierte Build-Einstellung hinzu

 SWIFT_FORCE_STATIC_LINK_STDLIB=YES 


Viele Probleme und andere Punkte im Änderungsprotokoll im Zusammenhang mit Swift 5 wurden behoben, aber sie sind spezifisch für Ihre Arbeit. Überprüfen Sie sie. Möglicherweise möchten Sie bestimmte erbte Initialisierer mit variablen Parametern erben, oder Sie wurden durch das Deadlock-Problem aufgrund komplexer rekursiver Typdefinitionen mit Klassen und Generika blockiert, oder Sie haben Probleme mit generischen @objc innerhalb einer @objc Methode.

Xcode 10.2 Beta


Apple Clang Compiler


Es gibt viele neue Warnungen für Apple Clang Compiler. Und die meisten von ihnen beziehen sich auf Frameworks und Module. Dies ist sehr interessant, da es mit der Swift Package Manager-Integration als Abhängigkeitstool verknüpft werden kann. Die wichtigsten sind meiner Meinung nach:
Eine neue Diagnose identifiziert Framework-Header, die Anführungszeichen anstelle von Framework-Stil-Includes verwenden. Die Warnung ist standardmäßig -Wquoted-include-in-framework-header Sie können sie jedoch aktivieren, indem Sie -Wquoted-include-in-framework-header an clang übergeben.
Öffentliche Header in einem Framework können fälschlicherweise #import oder #include
private Header, die zu Layering-Verstößen und potenziellen Modulzyklen führen. Es gibt eine neue Diagnose, die solche Verstöße meldet. In clang ist es standardmäßig deaktiviert und wird durch das -Wframework-include-private-from-public gesteuert.
Die Verwendung von @import in Framework-Headern verhindert, dass Header ohne Module verwendet werden. Eine neue Diagnose erkennt die Verwendung von @import in Framework-Headern, wenn Sie das Flag - fmodules . Die Diagnose ist in clang standardmäßig clang und wird mit dem Watimport-in-framework-header - Watimport-in-framework-header gesteuert.
Bisher hatte das Weglassen des framework Schlüsselworts beim Deklarieren eines Moduls für ein Framework keine Auswirkungen auf die Kompilierung, aber es hat im Stillen das Falsche getan. Eine neue Diagnose - Wincomplete-framework-module-declaration und ein neues Fix-It Wincomplete-framework-module-declaration vor, das entsprechende Schlüsselwort hinzuzufügen. Diese Warnung ist standardmäßig aktiviert, wenn Sie das Flag -fmodules an clang übergeben.
Erstens, wie Sie sie aktivieren: Gehen Sie zu Einstellungen für Ihr Anwendungsziel erstellen, suchen Sie "Apple Clang - Benutzerdefinierte Compiler-Flags" und setzen Sie das gewünschte Flag auf "Andere C-Flags" .



Ich habe versucht, eine alte, auf Objective C basierende Anwendung zu erstellen, und viele Probleme mit privaten Headern in öffentlichen Framework-Headern festgestellt:



Und einige Probleme mit doppelt zitierten Importen innerhalb von Frameworks:



Ich empfehle, dass Sie auch solche Diagnosen durchführen und zumindest Probleme für Ihren Rückstand verursachen. Eines Tages werden all diese Probleme Ihnen echte Kopfschmerzen bereiten.

System erstellen


Es gibt auch eine nette neue Build System-Funktion:
Implizite Abhängigkeiten unterstützen jetzt das Suchen von Abhängigkeiten in anderen Linker-Flags für verknüpfte Frameworks und Bibliotheken, die mit -framework , -weak_framework , -reexport_framework , -lazy_framework , -weak-l, -reexport-l , -lazy-l und -l .
Es ist auch sehr interessant. Im Allgemeinen bedeutet dies, dass Sie Ihre impliziten Abhängigkeiten über .xcconfig oder sogar mit xcodebuild Optionen definieren und diese Link / vermeiden können.
Phasen in Xcode einbetten.

Debuggen


Das Debuggen hat neue Funktionen:
UIStackView-Eigenschaften werden jetzt im View Debugger-Objektinspektor angezeigt.
Der View-Debugger bietet ein kompakteres 3D-Layout.


Xcode kann jetzt automatisch ein Speicherdiagramm erfassen, wenn beim Debuggen eine Speicherressourcenausnahme auftritt. Um die Erfassung von Speichergraphen zu aktivieren, wechseln Sie in den Laufeinstellungen des Schemas zur Registerkarte Diagnose.
Unter iOS und watchOS zeigt Xcode das Speicherlimit für die Ausführung von Apps im Speicherbericht an, wenn Sie sich dem Limit nähern.


Sehen Sie die rote Linie? Watchdog sendet applicationDidReceiveMemoryWarning(...)
wenn Sie den Rand erreichen. Aber ich dachte, es wäre nützlicher als es ist, um ehrlich zu sein. Im Moment sieht es nur nach einer kleinen, schönen Verbesserung aus.

LLDB-Debugger


Und LLDB Debugger hat auch etwas Liebe bekommen:

Sie können jetzt die Kurzform $0, $1, ... in der LLDB-Ausdrucksbewertung in Closures verwenden.
Der LLDB-Debugger verfügt über einen neuen Befehlsalias v für den Befehl "Rahmenvariable" zum Drucken von Variablen im aktuellen Stapelrahmen. Da es den Ausdrucksauswerter umgeht, kann v viel schneller sein und sollte p oder po vorgezogen werden.
Ich habe keine Leistungsverbesserungen bemerkt, aber v erzeugt in einigen Fällen eine bessere Ausgabe, obwohl es im Allgemeinen kein Ersatz für po , sondern nur für den aktuellen Stack-Frame mit einigen Einschränkungen. Siehe die folgenden Beispiele.



Spielplätze


Mein Lieblingsabschnitt? Spielplätze! Beginnen wir mit bekannten Problemen:
Spielplätze werden möglicherweise nicht ausgeführt!
Leider ist dies die einzige Neuigkeit in Bezug auf Spielplätze in der aktuellen Beta.

Simulator


Einige Hinweise zu Simulator:
Siri funktioniert nicht in watchOS- und iOS-Simulatoren.

Die Pasteboard-Synchronisation zwischen macOS und simulierten iOS-Geräten ist zuverlässiger.
Ich hoffe es wirklich.
Sie werden jetzt nur einmal aufgefordert, den Mikrofonzugriff auf alle Simulatorgeräte zu autorisieren.
Dies ist eine nette Verbesserung, da viele Leute aufgrund dieses Problems Probleme mit CI und Build-Agenten haben. Jetzt kann eine Problemumgehung automatisiert werden, oder wir können zumindest unsere Handbücher aktualisieren, um Build-Agenten mit dem Schritt "Simulator einmal ausführen" einzurichten.

Testen


xccov unterstützt das Zusammenführen mehrerer Berichterstattungsberichte - und der zugehörigen Archive - zu einem aggregierten Bericht und Archiv. Beim Zusammenführen von Berichten ist der aggregierte Bericht möglicherweise ungenau für Quelldateien, die sich seit der Erstellung der ursprünglichen Berichte geändert haben. Wenn keine Änderungen an der Quelle vorgenommen wurden, sind der aggregierte Bericht und das Archiv korrekt.
xccov unterstützt jetzt unterschiedliche Xcode-Abdeckungsberichte, mit denen Änderungen der Abdeckung im Laufe der Zeit berechnet werden können. Um beispielsweise die Abdeckungsberichte before.xccovreport und after.xccovreport , rufen Sie xccov wie folgt auf: xccov diff — json before.xccovreport after.xccovreport ;
Statische Bibliotheks- und Framework-Ziele werden jetzt im Abdeckungsbericht als Einträge der obersten Ebene mit Zeilenabdeckungswerten angezeigt, die über alle Ziele hinweg aggregiert werden, die die statische Bibliothek oder das statische Framework enthalten. Dies behebt auch ein Problem, bei dem die Quelldateien für eine statische Bibliothek oder ein Framework-Ziel in den Abdeckungsbericht aufgenommen werden, selbst wenn das Ziel selbst von der Codeabdeckung im Schema ausgeschlossen wurde.
Diese Änderungen sind hervorragende Neuigkeiten für die kontinuierliche Integration. Besonders unterschiedlich. Informieren Sie Ihr Release-Engineering-Team und alle anderen, die für solche Dinge verantwortlich sind.

Es gibt jedoch einige Einschränkungen beim Testen der Parallelisierung:
Die Aufnahme von Klonen funktioniert nicht, wenn die Parallelisierung aktiviert ist.
Profiling-Tests verhalten sich nicht richtig, wenn die Testparallelisierung aktiviert ist.
Es gibt auch einige vielversprechende Fehlerbehebungen:
Wenn der Test fehlschlägt, weil der Testläufer beim Start abstürzt, versucht Xcode, eine umfangreiche Fehlermeldung zu generieren, die den Fehler beschreibt. Dieser Fehler ist im xcodebuild vorhanden und wird in stdout xcodebuild wenn Sie xcodebuild . Der Fehler ist auch in den im Ergebnispaket enthaltenen strukturierten Protokollen vorhanden.
Wir bekommen viele solcher Probleme, und normalerweise ist überhaupt nicht klar, was passiert. Manchmal liegt es an einer falschen Verknüpfung, manchmal an einer Systemüberlastung. Es sollte helfen, Schuppenbildung zu reduzieren.
Während des Tests gesammelte Absturzberichte lassen wichtige Felder wie den Kündigungsgrund und die Beschreibung nicht mehr aus.
Kein Kommentar, nur Liebe.


Und der letzte Punkt zu Xcode, der für Unternehmen mit vielen Entwicklern nützlich ist, ist, dass Xcode jetzt den MacOS-Content-Caching-Service unterstützt . Dies bedeutet, dass Sie einen Caching-Server mit Xcode-Anwendung in Ihrem lokalen Netzwerk haben können.

Probleme


Ich habe einige Probleme mit der Beta festgestellt. Meistens mit Tools von Drittanbietern: Karthago zum Beispiel, was nicht funktioniert, mit folgendem Fehler:

 Could not find any available simulators for iOS 

Ich habe den verfügbaren Simulator überprüft und es scheint, dass in der aktuellen Beta etwas kaputt ist. Es ist auch unmöglich, andere Laufzeiten von Xcode herunterzuladen. Die Liste der verfügbaren Simulatoren ist nur leer (ein Radar ist gefüllt):

 $ xcrun simctl list devices --json | grep -A16 12.1 "com.apple.CoreSimulator.SimRuntime.iOS-12-1" : [ { "availability" : "(unavailable, runtime profile not found)", "state" : "Shutdown", "isAvailable" : false, "name" : "iPhone 5s", "udid" : "DDD36346-A76F-42E8-80F4-6F11E1EE4BEB", "availabilityError" : "runtime profile not found" }, { "availability" : "(unavailable, runtime profile not found)", "state" : "Shutdown", "isAvailable" : false, "name" : "iPhone 6", "udid" : "21794717-BC89-45E4-9F57-8CF9D14A87D1", "availabilityError" : "runtime profile not found" }, -- 

Es ist natürlich eine Beta. Und das Changelog ist enorm. Sei geduldig und vernünftig :)

PS Carthage hat bereits einen Fix ( # 2691 ).

iOS 12.2 Beta


Okay Es scheint, als würden sie ihre technischen Schulden aufpolieren und Sicherheitspatches anwenden. Zwei Dinge sind kaputt:
Möglicherweise können Sie sich nach Auswahl einer Karte nicht in Wallet authentifizieren.

Möglicherweise können Sie keinen Prepaid-Datentarif mit Mobilfunkdaten erwerben.
Und Apple News wird in Kanada erhältlich sein . Bleib dran.

macOS Mojave 10.14.4 Beta


Das einzig Neue hier ist ein potenzielles Problem mit Safari 12.1. Nach dem Upgrade von Safari 10.1.2:
Nach dem Update auf Safari 12.1 von Safari 10.1.2 werden Webseiten möglicherweise nicht angezeigt.
Problemumgehung: Führen Sie den folgenden Befehl in Terminal aus:

 defaults delete com.apple.Safari 
Mit folgenden Konsequenzen:
Warnung: Sie verlieren Ihre vorherigen Safari-Einstellungen, nachdem Sie den obigen Befehl ausgeführt haben.

Final Cut


Dieser Artikel war viel länger als ich dachte. Nun, ich habe Ihnen alle meine Gedanken zu allen obigen Abschnitten gegeben. Eine kurze Version des gesamten Artikels lautet einfach: "Swift 5 ist da!"

Bleiben Sie dran und hydratisiert! Und danke fürs Lesen.

Source: https://habr.com/ru/post/de437812/


All Articles