Πώς μπορώ προγραμματισμού καθορίσει αν η εφαρμογή μου τρέχει στον προσομοιωτή iphone;

ψήφοι
242

Δεδομένου ότι οι εν λόγω κράτη, θα ήθελα κυρίως να γνωρίζουν εάν ή όχι τον κωδικό μου τρέχει στον προσομοιωτή, αλλά θα μπορούσε επίσης να ενδιαφέρονται να μάθουν τη συγκεκριμένη έκδοση του iPhone που εκτελεί ή να προσομοιωθεί.

EDIT: Πρόσθεσα τη λέξη «προγραμματισμού» με το όνομα ερώτηση. Το σημείο της ερώτησής μου είναι να είναι σε θέση να συμπεριλάβει δυναμικά / αποκλείει κώδικα ανάλογα με την έκδοση / προσομοιωτή τρέχει, οπότε θα ήθελα πραγματικά να ψάχνει για κάτι σαν οδηγίας προ-επεξεργαστή που μπορεί να μου δώσει αυτές τις πληροφορίες.

Δημοσιεύθηκε 19/01/2009 στις 17:55
πηγή χρήστη
Σε άλλες γλώσσες...                            


22 απαντήσεις

ψήφοι
333

Ήδη ζήτησε, αλλά με έναν πολύ διαφορετικό τίτλο.

Τι #defines έχουν συσταθεί από Xcode κατά την κατάρτιση για το iPhone

Θα επαναλάβω την απάντησή μου από εκεί:

Είναι στα έγγραφα SDK κάτω «Χτίσιμο πηγαίο κώδικα υπό όρους»

Η σχετική ορισμός είναι TARGET_OS_SIMULATOR, η οποία ορίζεται στο /usr/include/TargetConditionals.h στο πλαίσιο iOS. Σε παλαιότερες εκδόσεις του toolchain, θα έπρεπε να γράψει:

#include "TargetConditionals.h"

αλλά αυτό δεν είναι πλέον απαραίτητη για την τρέχουσα (Xcode 6 / iOS8) toolchain.

Έτσι, για παράδειγμα, αν θέλετε να βεβαιωθείτε ότι χρησιμοποιείτε τη συσκευή, θα πρέπει να κάνετε

#if TARGET_OS_SIMULATOR
    // Simulator-specific code
#else
    // Device-specific code
#endif

ανάλογα με το ποια είναι η κατάλληλη για χρήση-περίπτωσή σας.

Απαντήθηκε 19/01/2009 στις 18:17
πηγή χρήστη

ψήφοι
106

Ενημέρωση κώδικα:

Αυτό είναι φιλοδοξούσε να λειτουργήσει επίσημα.

#if TARGET_IPHONE_SIMULATOR
NSString *hello = @"Hello, iPhone simulator!";
#elif TARGET_OS_IPHONE
NSString *hello = @"Hello, device!";
#else
NSString *hello = @"Hello, unknown target!";
#endif

Αρχική θέση (από καταργήθηκε)

Αυτός ο κωδικός θα σας πει αν τρέχετε σε προσομοιωτή.

#ifdef __i386__
NSLog(@"Running in the simulator");
#else
NSLog(@"Running on a device");
#endif
Απαντήθηκε 19/01/2009 στις 18:10
πηγή χρήστη

ψήφοι
61

Δεν οδηγία προ-επεξεργαστή, αλλά αυτό ήταν αυτό που έψαχνα, όταν ήρθα σε αυτή την ερώτηση?

NSString *model = [[UIDevice currentDevice] model];
if ([model isEqualToString:@"iPhone Simulator"]) {
    //device is simulator
}
Απαντήθηκε 18/08/2010 στις 11:35
πηγή χρήστη

ψήφοι
54

Ο καλύτερος τρόπος να γίνει αυτό είναι:

#if TARGET_IPHONE_SIMULATOR

και οχι

#ifdef TARGET_IPHONE_SIMULATOR

δεδομένου του πάντα ορίζεται: 0 ή 1

Απαντήθηκε 07/03/2011 στις 08:05
πηγή χρήστη

ψήφοι
26

Σε περίπτωση Swift μπορούμε να εφαρμόσουμε παρακάτω

Μπορούμε να δημιουργήσουμε struct που σας επιτρέπει να δημιουργήσετε ένα δομημένα δεδομένα

struct Platform {
    static let isSimulator: Bool = {
        #if arch(i386) || arch(x86_64)
            return true
        #endif
        return false
    }()
}

Στη συνέχεια Αν θέλαμε να ανιχνεύσει αν η εφαρμογή χτίζεται για τη συσκευή ή προσομοιωτή σε Swift στη συνέχεια.

if Platform.isSimulator {
    // Do one thing
}
else {
    // Do the other
}
Απαντήθηκε 25/02/2016 στις 04:48
πηγή χρήστη

ψήφοι
8

Όλοι όσοι απάντηση είναι καλή, αλλά μπερδεύει κάπως αρχάριος σαν εμένα, καθώς δεν διευκρινίζει έλεγχο της μεταγλώττισης και ελέγχου της εκτέλεσης. Προεπεξεργαστή είναι πριν από την κατάρτιση του χρόνου, αλλά θα πρέπει να καταστεί

Αυτό το blog άρθρο δείχνει πώς να ανιχνεύσει τον προσομοιωτή iPhone; σαφώς

Runtime

Πρώτα απ 'όλα, ας σύντομα συζητήσουμε. UIDevice σας παρέχει ήδη πληροφορίες για τη συσκευή

[[UIDevice currentDevice] model]

θα σας επιστρέψουμε «iPhone Simulator» ή «iPhone» σύμφωνα με την οποία η εφαρμογή εκτελείται.

μεταγλώττιση

Ωστόσο, αυτό που θέλετε είναι να χρησιμοποιήσετε την κατάρτιση ορίζει το χρόνο. Γιατί; Επειδή θα καταρτίσει η εφαρμογή σας είναι απολύτως να λειτουργεί είτε στο εσωτερικό του προσομοιωτή ή στη συσκευή. Η Apple κάνει μια ορίζουν ονομάζεται TARGET_IPHONE_SIMULATOR. Έτσι, ας δούμε τον κώδικα:

#if TARGET_IPHONE_SIMULATOR

NSLog(@"Running in Simulator - no app store or giro");

#endif
Απαντήθηκε 17/06/2014 στις 03:57
πηγή χρήστη

ψήφοι
7

ΥΠΑΡΧΕΙ ένας καλύτερος τρόπος ΤΩΡΑ!

Από το Xcode 9.3 beta 4 που μπορείτε να χρησιμοποιήσετε #if targetEnvironment(simulator)για να ελέγξετε.

#if targetEnvironment(simulator)
//Your simulator code
#endif
Απαντήθηκε 12/03/2018 στις 13:50
πηγή χρήστη

ψήφοι
6

Σε άμεση:

#if (arch(i386) || arch(x86_64))
...            
#endif

Από Εντοπισμός αν η εφαρμογή χτίζεται για τη συσκευή ή προσομοιωτή σε Swift

Απαντήθηκε 16/06/2016 στις 14:10
πηγή χρήστη

ψήφοι
6

Οι προηγούμενες απαντήσεις είναι λίγο παλιό. Βρήκα ότι το μόνο που χρειάζεται να κάνετε είναι να θέσει υπό αμφισβήτηση το TARGET_IPHONE_SIMULATORmacro ( δεν χρειάζεται να περιλαμβάνει άλλα αρχεία header [υποθέτοντας ότι είστε κωδικοποίησης για iOS]).

Προσπάθησα TARGET_OS_IPHONE, αλλά επέστρεψε την ίδια τιμή (1), όταν λειτουργεί σε μια πραγματική συσκευή και προσομοιωτή, γι 'αυτό ήθελα να συστήσω χρησιμοποιώντας TARGET_IPHONE_SIMULATORαντ' αυτού.

Απαντήθηκε 21/05/2013 στις 08:10
πηγή χρήστη

ψήφοι
4

Είχα το ίδιο πρόβλημα, τόσο TARGET_IPHONE_SIMULATORκαι TARGET_OS_IPHONEτα πάντα ορίζονται και ρυθμίζονται σε 1. έργα λύση του Πιτ, φυσικά, αλλά αν ποτέ συμβεί να αξιοποιήσει κάτι άλλο από την Intel (απίθανο, αλλά ποιος ξέρει), εδώ είναι κάτι που είναι ασφαλές, Εφ 'όσον το υλικό iphone δεν αλλάζει (έτσι κωδικός σας θα λειτουργεί πάντα για τα iPhones σήμερα εκεί έξω):

#if defined __arm__ || defined __thumb__
#undef TARGET_IPHONE_SIMULATOR
#define TARGET_OS_IPHONE
#else
#define TARGET_IPHONE_SIMULATOR 1
#undef TARGET_OS_IPHONE
#endif

Βάλτε ότι κάπου βολικό, και στη συνέχεια να προσποιούνται ότι οι TARGET_*σταθερές ορίζονται σωστά.

Απαντήθηκε 16/06/2009 στις 18:48
πηγή χρήστη

ψήφοι
2

Για Swift 4.2 / Xcode 10

Δημιούργησα μια επέκταση για UIDevice, ώστε να μπορώ εύκολα να ζητήσω, αν ο εξομοιωτής λειτουργεί.

// UIDevice+CheckSimulator.swift

import UIKit

extension UIDevice {

    /// Checks if the current device that runs the app is xCode's simulator
    static func isSimulator() -> Bool {        
        #if targetEnvironment(simulator)
            return true
        #else
            return false
        #endif
    }
}

Σε μου AppDelegate για παράδειγμα, μπορώ να χρησιμοποιήσω αυτή τη μέθοδο για να αποφασίσει καιρός εγγραφή για απομακρυσμένη ειδοποίηση είναι αναγκαίο, η οποία δεν είναι δυνατόν για τον προσομοιωτή.

// CHECK FOR REAL DEVICE / OR SIMULATOR
if UIDevice.isSimulator() == false {

    // REGISTER FOR SILENT REMOTE NOTIFICATION
    application.registerForRemoteNotifications()
}
Απαντήθηκε 25/11/2018 στις 13:29
πηγή χρήστη

ψήφοι
1

Έργα για Swift 4καιXcode 9.4.1

Χρησιμοποιήστε αυτόν τον κωδικό:

#if targetEnvironment(simulator)
   // Simulator
#else
   // Device
#endif
Απαντήθηκε 18/07/2018 στις 19:06
πηγή χρήστη

ψήφοι
1

Με Swift 4.2 (Xcode 10), μπορούμε να το κάνουμε αυτό

#if hasTargetEnvironment(simulator)
  //simulator code
#else 
  #warning("Not compiling for simulator")
#endif
Απαντήθηκε 11/06/2018 στις 08:33
πηγή χρήστη

ψήφοι
1

Έχει κανείς υπόψη την απάντηση που παρέχονται εδώ ;

Υποθέτω ότι το ισοδύναμο στόχο-γ θα είναι

+ (BOOL)isSimulator {
    NSOperatingSystemVersion ios9 = {9, 0, 0};
    NSProcessInfo *processInfo = [NSProcessInfo processInfo];
    if ([processInfo isOperatingSystemAtLeastVersion:ios9]) {
        NSDictionary<NSString *, NSString *> *environment = [processInfo environment];
        NSString *simulator = [environment objectForKey:@"SIMULATOR_DEVICE_NAME"];
        return simulator != nil;
    } else {
        UIDevice *currentDevice = [UIDevice currentDevice];
        return ([currentDevice.model rangeOfString:@"Simulator"].location != NSNotFound);
    }
}
Απαντήθηκε 26/07/2017 στις 13:59
πηγή χρήστη

ψήφοι
1

Για να συμπεριλάβετε όλους τους τύπους των «προσομοιωτών»

NSString *model = [[UIDevice currentDevice] model];
if([model rangeOfString:@"Simulator" options:NSCaseInsensitiveSearch].location !=NSNotFound)
{
    // we are running in a simulator
}
Απαντήθηκε 12/06/2015 στις 18:51
πηγή χρήστη

ψήφοι
0

αν τίποτα δεν λειτούργησε, δοκιμάστε αυτό

public struct Platform {

    public static var isSimulator: Bool {
        return TARGET_OS_SIMULATOR != 0 // Use this line in Xcode 7 or newer
    }

}
Απαντήθηκε 17/09/2018 στις 13:33
πηγή χρήστη

ψήφοι
0

Η Apple έχει προσθέσει υποστήριξη για τον έλεγχο της εφαρμογής έχει ως στόχο για τον προσομοιωτή με τα ακόλουθα:

#if targetEnvironment(simulator)
let DEVICE_IS_SIMULATOR = true
#else
let DEVICE_IS_SIMULATOR = false
#endif
Απαντήθηκε 11/07/2018 στις 22:43
πηγή χρήστη

ψήφοι
0

SWIFT 4 Λύση

static let isSimulator: Bool = {
    return TARGET_OS_SIMULATOR == 1
}()

TARGET_OS_SIMULATORβρίσκεται στο Darwin.TargetConditionals.swiftαρχείο.

Απαντήθηκε 11/04/2018 στις 07:09
πηγή χρήστη

ψήφοι
0

/// Επιστρέφει true αν προσομοιωτή του και όχι μια συσκευή

public static var isSimulator: Bool {
    #if (arch(i386) || arch(x86_64)) && os(iOS)
        return true
    #else
        return false
    #endif
}
Απαντήθηκε 28/02/2018 στις 13:39
πηγή χρήστη

ψήφοι
0

Η απάντησή μου βασίζεται σε @Daniel Magnusson απάντηση και τα σχόλια των @Nuthatch και @ n.Drake. και γράφω αυτό για να εξοικονομήσετε χρόνο για την ταχεία χρήστες που εργάζονται σε iOS9 και μετά.

Αυτό είναι ό, τι λειτούργησε για μένα:

if UIDevice.currentDevice().name.hasSuffix("Simulator"){
    //Code executing on Simulator
} else{
    //Code executing on Device
}
Απαντήθηκε 23/12/2015 στις 12:30
πηγή χρήστη

ψήφοι
-3

Αυτό λειτούργησε για μένα καλύτερο

NSString *name = [[UIDevice currentDevice] name];


if ([name isEqualToString:@"iPhone Simulator"]) {

}
Απαντήθηκε 11/05/2016 στις 06:40
πηγή χρήστη

ψήφοι
-3

Κατά τη γνώμη μου, η απάντηση (που παρουσιάστηκαν παραπάνω και επαναλαμβάνεται κατωτέρω):

NSString *model = [[UIDevice currentDevice] model];
if ([model isEqualToString:@"iPhone Simulator"]) {
    //device is simulator
}

είναι η καλύτερη απάντηση, γιατί είναι προφανές ότι εκτελούνται κατά το χρόνο εκτέλεσης έναντι είσαι ΟΔΗΓΙΑ COMPILE.

Απαντήθηκε 09/09/2013 στις 15:45
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more