8Nov

Δοκιμή για OS X έναντι iOS

Χθες, έφτιαχνα κοινόχρηστο κώδικα NSLayoutConstraint για χρήση σε iOS και OS X. Έβαλα μερικές οδηγίες #if TARGET_OS_MAC, υποθέτοντας ότι απλώς θα λειτουργούσαν.

Δεν το έκαναν.

Αποδεικνύεται ότι πρέπει πάντα να ελέγχετε για TARGET_OS_IPHONE πρώτα, πριν από το TARGET_OS_MAC, επειδή το δεύτερο ισχύει στο iPhone, αλλά το πρώτο δεν είναι στο OS X.

Εδώ είναι μερικοί από τους πιο συνηθισμένους ελέγχους που μου πρότειναν χθες καθώς μπέρδεψα αυτό το δίλημμα.

  • #if TARGET_OS_MAC

  • #if TARGET_OS_IPHONE

  • #if TARGET_IPHONE_SIMULATOR

  • #if TARGET_OS_EMBEDDED

  • #αν ορίζεται (__MAC_OS_X_VERSION_MIN_REQUIRED)

  • #αν ορίζεται (__IPHONE_OS_MIN_VERSION_REQUIRED)

Και εδώ είναι τα αποτελέσματα της εκτέλεσης τους στον Προσομοιωτή, στη συσκευή iPhone και στο OS X:

ΠΡΟΣΟΜΟΙΩΤΗΣ
Στοχεύστε το λειτουργικό σύστημα Mac
Στοχεύστε το λειτουργικό σύστημα iPhone
Δεν υπάρχει ενσωματωμένο σύστημα προορισμού
Στοχεύστε τον προσομοιωτή iPhone
Το Απαιτούμενο Ελάχιστο Έκδοσης Mac OS X ΔΕΝ έχει οριστεί
Το Απαιτούμενο Ελάχιστο Έκδοσης iPhone OS X ΔΕΝ έχει οριστεί

ΤΗΛΕΦΩΝΟ
Στοχεύστε το λειτουργικό σύστημα Mac
Στοχεύστε το λειτουργικό σύστημα iPhone
Το Target OS Embedded
Δεν υπάρχει στόχος προσομοιωτής iPhone
Το Απαιτούμενο Ελάχιστο Έκδοσης Mac OS X ΔΕΝ έχει οριστεί
Το Απαιτούμενο Ελάχιστο Έκδοσης iPhone OS X ΔΕΝ έχει οριστεί

OS X
Στοχεύστε το λειτουργικό σύστημα Mac
Χωρίς σύστημα στόχου iPhone
Δεν υπάρχει ενσωματωμένο σύστημα προορισμού
Δεν υπάρχει στόχος προσομοιωτής iPhone
Ορίζεται το Απαιτούμενο Ελάχιστο Έκδοσης Mac OS X
Το Απαιτούμενο Ελάχιστο Έκδοσης iPhone OS X ΔΕΝ έχει οριστεί

Δεδομένου ότι με ενδιέφερε περισσότερο να αποφασίσω αν θα χρησιμοποιήσω το NSBox/NSView έναντι του UIView, η λύση μου κατέληξε να μοιάζει με αυτό:

#if TARGET_OS_IPHONE
#define VIEW_CLASS UIVView
#elif TARGET_OS_MAC
#define VIEW_CLASS NSView
#τέλος εαν

Αυτή η προσέγγιση εξασφάλισε ότι η πλατφόρμα iPhone ενεργοποιήθηκε πρώτα και στη συνέχεια ο δεύτερος έλεγχος επέβαλλε το OS X. Αυτό δημιούργησε ορισμούς που επέτρεψαν στον κώδικά μου να μεταγλωττίσει και να εκτελέσει με επιτυχία cross-platform.

Ευχαριστώ Γκουίν Ράσκινντ και όλοι οι άλλοι στο #iphonedev