সুইফটে ডিভাইস বা সিমুলেটারের জন্য অ্যাপ তৈরি হচ্ছে কিনা তা কীভাবে সনাক্ত করবেন


277

অবজেক্টিভ-সিতে আমরা জানতে পারি ম্যাক্রো ব্যবহার করে কোনও অ্যাপ্লিকেশন ডিভাইস বা সিমুলেটারের জন্য নির্মিত হচ্ছে কিনা:

#if TARGET_IPHONE_SIMULATOR
    // Simulator
#else
    // Device
#endif

এগুলি টাইম ম্যাক্রোগুলি সংকলন এবং রানটাইম উপলভ্য নয়।

আমি কীভাবে সুইফটে একই অর্জন করতে পারি?


2
ওজেক্টিভ-সি-তে রানটাইমের সময় সিমুলেটর বা একটি আসল ডিভাইস কীভাবে সনাক্ত করা যায় তা নয়। সেগুলি সংকলক নির্দেশিকা যা বিল্ডের উপর নির্ভর করে বিভিন্ন কোডের ফলাফল করে।
rmaddy

ধন্যবাদ। আমি আমার প্রশ্ন সম্পাদনা করেছি।
রাফএল

9
সর্বোচ্চ ভোট দেওয়া উত্তরগুলি এই সমস্যাটি সমাধান করার সর্বোত্তম উপায় নয়! এমবেলস্কির উত্তর (বর্তমানে খুব নিচে) একমাত্র সমাধান যা কোনও সমস্যা ছাড়াই আসে। এমনকি অ্যাপল থেকে গ্রেগ পার্কারও সেভাবে এটি করার পরামর্শ দিয়েছিলেন: list.swift.org/pipermail/swift-evolution/Week-of-Mon-20160125/…
jan.vogt

1
ক্যাপস থাকা সত্ত্বেও, এটি চূড়ান্ত করার জন্য নির্ধারিত যে শুল্কের চেকের সাথে কিছু ভুল। অ্যাপল ইঞ্জিনিয়ারদের পরামর্শগুলি বেশিরভাগ ক্ষেত্রেই খারাপ ধারণা-বিবেচনা না করে আবর্জনা ধরা হয়, বা কেবল নির্দিষ্ট পরিস্থিতিতে প্রয়োগ করা হয়, যাতে আত্মনিয়োগের অর্থ কোনও কিছুই কম নয়।
ফ্যাটি

1
@ ফ্যাটি: এটি জেনে রাখা আকর্ষণীয় হবে যে প্রদত্ত উত্তরের কোনওটিই কেন আপনার চাহিদা পূরণ করে না, এবং আপনি অনুগ্রহ প্রদানের মাধ্যমে ঠিক কী জন্য প্রত্যাশা করছেন।
মার্টিন আর

উত্তর:


363

30/01/19 আপডেট

যদিও এই উত্তরটি কার্যকর হতে পারে, স্থির চেকের জন্য প্রস্তাবিত সমাধান (বেশ কয়েকটি অ্যাপল ইঞ্জিনিয়ারদের দ্বারা স্পষ্ট হিসাবে) আইওএস সিমুলেটারকে লক্ষ্য করে একটি কাস্টম সংকলক পতাকা সংজ্ঞায়িত করা। এটি কীভাবে করবেন সে সম্পর্কে বিশদ নির্দেশাবলীর জন্য, @ এমবেলস্কির উত্তর দেখুন

আসল উত্তর

আপনার যদি একটি স্ট্যাটিক চেক প্রয়োজন হয় (উদাহরণস্বরূপ / অন্যথায় রানটাইম নয়) আপনি সরাসরি সিমুলেটরটি সনাক্ত করতে পারবেন না, তবে আপনি ডেস্কটপ আর্কিটেকচারে আইওএস নিম্নলিখিত শনাক্ত করতে পারেন

#if (arch(i386) || arch(x86_64)) && os(iOS)
    ...
#endif

সুইফট 4.1 সংস্করণ পরে

সর্বশেষ ব্যবহার, এখন সরাসরি সকল অবস্থার জন্য সকল অবস্থার সিমুলেটরগুলির জন্য কেবলমাত্র একটি শর্ত প্রয়োগ করতে হবে -

#if targetEnvironment(simulator)
  // your simulator code
#else
  // your real device code
#endif

আরও স্পষ্টতার জন্য, আপনি সুইফ্ট প্রস্তাবটি পরীক্ষা করতে পারেন SE-0190


পুরানো সংস্করণের জন্য -

স্পষ্টতই, এটি কোনও ডিভাইসে মিথ্যা, তবে এটি iOS সিমুলেটারের ক্ষেত্রে সত্য হিসাবে ফিরে আসে ডকুমেন্টেশনে :

কোডটি 32 – বিট আইওএস সিমুলেটারের জন্য সংকলন করা হলে আর্ক (i386) বিল্ড কনফিগারেশনটি সত্য হয়।

আপনি যদি আইওএস ব্যতীত অন্য কোনও সিমুলেটারের জন্য বিকাশ করে থাকেন তবে আপনি কেবলমাত্র osপ্যারামিটারটি পরিবর্তিত করতে পারেন : যেমন

ওয়াচওএস সিমুলেটর সনাক্ত করুন

#if (arch(i386) || arch(x86_64)) && os(watchOS)
...
#endif

টিভিওএস সিমুলেটর সনাক্ত করুন

#if (arch(i386) || arch(x86_64)) && os(tvOS)
...
#endif

অথবা, এমনকি কোনও সিমুলেটর সনাক্ত করুন

#if (arch(i386) || arch(x86_64)) && (os(iOS) || os(watchOS) || os(tvOS))
...
#endif

পরিবর্তে যদি আপনি রানটাইম চেক দিয়ে ঠিক থাকেন তবে আপনি TARGET_OS_SIMULATORভেরিয়েবলটি পরীক্ষা করতে পারেন (বাTARGET_IPHONE_SIMULATOR আইওএস 8 এবং নীচে) , যা সিমুলেটারে সত্য।

অনুগ্রহ করে লক্ষ্য করুন যে এটি প্রিপ্রোসেসর পতাকা ব্যবহারের চেয়ে আলাদা এবং কিছুটা বেশি সীমাবদ্ধ। উদাহরণস্বরূপ আপনি যেখানে এটি ব্যবহার করতে পারবেন না aif/else সিন্ট্যাক্টিক্যালি অবৈধ (যেমন ফাংশনগুলির স্কোপের বাইরে)।

উদাহরণস্বরূপ বলুন যে আপনি ডিভাইস এবং সিমুলেটারে বিভিন্ন আমদানি করতে চান। ডায়নামিক চেক দিয়ে এটি অসম্ভব, যদিও এটি একটি স্থির চেকের সাথে তুচ্ছ।

#if (arch(i386) || arch(x86_64)) && os(iOS)
  import Foo
#else
  import Bar
#endif

এছাড়াও, যেহেতু পতাকাটি একটি 0বা একটি দিয়ে প্রতিস্থাপন করা হয়েছে1 সুইফ্ট প্রিপ্রোসেসর দ্বারা , আপনি যদি সরাসরি তা if/elseপ্রকাশের ক্ষেত্রে ব্যবহার করেন তবে সংকলকটি অ্যাক্সেসযোগ্য কোড সম্পর্কে একটি সতর্কতা উত্থাপন করবে।

এই সতর্কতার আশেপাশে কাজ করার জন্য, অন্য একটি উত্তর দেখুন।


1
এখানে আরও পড়া । এবং আরও সীমাবদ্ধ হতে, আপনি ব্যবহার করতে পারেন arch(i386) && os(iOS)
16

1
এটি আমার পক্ষে কার্যকর হয়নি। আমি i386 এবং x86_64 উভয়ই পরীক্ষা করে দেখতে হয়েছিল
akaru

3
এই উত্তরটি সমাধান করার সর্বোত্তম উপায় নয়! এমবেলস্কির উত্তর (বর্তমানে খুব নিচে) একমাত্র সমাধান যা কোনও সমস্যা ছাড়াই আসে। এমনকি অ্যাপল থেকে গ্রেগ পার্কারও সেভাবে এটি করার পরামর্শ দিয়েছিলেন: list.swift.org/pipermail/swift-evolution/Week-of-Mon-20160125/…
jan.vogt

2
নিখোঁজ হওয়া এপিআইয়ের জন্য ক্ষতিপূরণ হিসাবে এখন পর্যন্ত এই রস শত শত শত লোকের জন্য সহায়ক পরামর্শ হিসাবে প্রমাণিত হয়েছে। উপরের মন্তব্যে স্বাক্ষর করে উত্তর হাইজ্যাক করার পরিবর্তে কেবল যোগাযোগ করুন। আমি স্পষ্ট করে উত্তরটি আপডেট করেছিলাম এটি আর কোনও আপ-টু ডেট সমাধান নয় এবং আমি এর সাথে একটি লিঙ্ক সরবরাহ করেছি যা আরও সঠিক দেখাচ্ছে।
গ্যাব্রিয়েল পেট্রোনেলা

9
সুইফট ৪.১-তে, আপনি বলতে সক্ষম হবেন #if targetEnvironment(simulator):) ( github.com/apple/swift-evolution/blob/master/proposals/… )
হামিশ

172

সুইফটের জন্য স্বীকৃত ৪.১। #if targetEnvironment(simulator)পরিবর্তে ব্যবহার করুন। উৎস

সুইফটে সিমুলেটর সনাক্ত করতে আপনি বিল্ড কনফিগারেশন ব্যবহার করতে পারেন:

  • এই কনফিগারেশন নির্ধারণ -D IOS_SIMULATOR মধ্যে সুইফট কম্পাইলার - কাস্টম পতাকা> অন্যান্য সুইফট পতাকা
  • এই ড্রপ ডাউনতে যে কোনও আইওএস সিমুলেটর এসডিকে নির্বাচন করুনড্রপ ডাউন তালিকা

সিমুলেটর সনাক্ত করতে আপনি এখন এই বিবৃতিটি ব্যবহার করতে পারেন:

#if IOS_SIMULATOR
    print("It's an iOS Simulator")
#else
    print("It's a device")
#endif

এছাড়াও আপনি ইউআইডিভাইস ক্লাস প্রসারিত করতে পারেন:

extension UIDevice {
    var isSimulator: Bool {
        #if IOS_SIMULATOR
            return true
        #else
            return false
        #endif
    }
}
// Example of usage: UIDevice.current.isSimulator

8
এটি সেরা উত্তর হওয়া উচিত! এমনকি অ্যাপল থেকে গ্রেগ পার্কারও সেভাবে পরামর্শ দিয়েছেন: list.swift.org/pipermail/swift-evolution/Week-of-Mon-20160125/…
jan.vogt

1
সুইফট 3: ইউআইডিওয়াইস.সি.সি.আর.সিমুলেটর
টাইলারনল

1
আমি জিজ্ঞাসা করতে পারি কেন আমি যদি মুক্তির আওতায় এটি যুক্ত করি তবে এটি কার্যকর হয় না?
উইলিয়াম হু

3
এটিই একমাত্র সঠিক উত্তর। আপনি এটি xcconfigব্যবহার করে OTHER_SWIFT_FLAGS = TARGET_OS_EMBEDDEDএবং OTHER_SWIFT_FLAGS[sdk=embeddedsimulator*] = TARGET_OS_SIMULATORসিমুলেটারের জন্য ওভাররাইড করে ফাইলগুলিতে সেট আপ করতে পারেন ।
রুশবিশপ

1
এক্সকোড ৯.২-তে, এই উত্তরটি কিছু সময় সংকলন করতে ব্যর্থ হয়েছিল। আমার জন্য সমস্যাটি "ডি" সমাধান করার আগে "-" সরানো solved
ব্লেক

160

20 ফেব্রুয়ারী, 2018 হিসাবে আপডেট হওয়া তথ্য

দেখে মনে হচ্ছে @ রসবিশপের একটি অনুমোদনমূলক উত্তর রয়েছে যা এই উত্তরটিকে "ভুল" রেন্ডার করে - যদিও এটি দীর্ঘ সময় ধরে কাজ করে দেখা গেছে।

সুইফটে ডিভাইস বা সিমুলেটারের জন্য অ্যাপ তৈরি হচ্ছে কিনা তা সনাক্ত করুন

পূর্ববর্তী উত্তর

@ ডাব্লুজেডডাব্লু এর উত্তর এবং @ পাং এর মন্তব্যের ভিত্তিতে আমি একটি সাধারণ ইউটিলিটি কাঠামো তৈরি করেছি। এই সমাধানটি @ WZW এর উত্তর দ্বারা উত্পাদিত সতর্কতা এড়ায়।

import Foundation

struct Platform {

    static var isSimulator: Bool {
        return TARGET_OS_SIMULATOR != 0
    }

}

ব্যবহারের উদাহরণ:

if Platform.isSimulator {
    print("Running on Simulator")
}

10
গৃহীত একের চেয়ে অনেক বেশি ভাল সমাধান। প্রকৃতপক্ষে যদি কোনও দিন (যদিও এটি খুব অসম্ভব) তবে অ্যাপল আইওএস ডিভাইসে i386 বা x85_64 ব্যবহার করার সিদ্ধান্ত নিয়েছে, গৃহীত উত্তরটি কাজ করবে না ... বা এমনকি ডেস্কটপ কম্পিউটারগুলি একটি নতুন প্রকার পাবে!
ফ্রিজ্ল্যাব

2
নিশ্চিত হয়ে গেছে যে এটি এক্সকোড 7: পুরোপুরি কার্যকর করে public let IS_SIMULATOR = (TARGET_OS_SIMULATOR != 0)... একই জিনিস, সরলীকৃত। +1 ধন্যবাদ
ড্যান রোজনস্টার্ক 21 '21

1
@ ড্যানিয়েল এটি ভালভাবে কাজ করে এবং এটি আসলে আমার সমাধানের চেয়ে আরও সোজা। তবে এটি লক্ষণীয় যে এটি একটি প্রকৃত প্রাকপ্রসেসর পদক্ষেপের চেয়ে বেশি সীমাবদ্ধ। আপনার যদি লক্ষ্যটির অন্তর্ভুক্ত না হওয়ার জন্য কোডের কিছু অংশ প্রয়োজন হয় (উদাহরণস্বরূপ আপনি সংকলন সময়ে দুটি আমদানির মধ্যে চয়ন করতে চান), আপনাকে একটি স্ট্যাটিক চেক ব্যবহার করতে হবে। এই পার্থক্যটি হাইলাইট করার জন্য আমি আমার উত্তর সম্পাদনা করেছি।
গ্যাব্রিয়েল পেট্রোনেলা

এই উত্তরটি সমাধান করার সর্বোত্তম উপায় নয়! এমবেলস্কির উত্তর (বর্তমানে খুব নিচে) একমাত্র সমাধান যা কোনও সমস্যা ছাড়াই আসে। এমনকি অ্যাপল থেকে গ্রেগ পার্কারও সেভাবে এটি করার পরামর্শ দিয়েছিলেন: list.swift.org/pipermail/swift-evolution/Week-of-Mon-20160125/…
jan.vogt

2
@Fattie TARGET_OS_SIMULATOR != 0হয় ইতিমধ্যে উত্তর । এটি ড্যানিয়েল প্রদত্ত সমাধান। এটিকে আবার একটি মুক্ত ভেরিয়েবলে যুক্ত করার দরকার নেই, এটি ইতিমধ্যে রয়েছে। আপনি যদি মনে করেন এটি স্ট্রাক্টে রাখা খারাপ এবং এটি একটি মুক্ত ভেরিয়েবলে রাখা ভাল তবে এই সম্পর্কে একটি মন্তব্য পোস্ট করুন বা আপনার নিজের উত্তর দিন। ধন্যবাদ।
এরিক আয়া

69

এক্সকোড 9.3 থেকে

#if targetEnvironment(simulator)

একটি একক বৈধ আর্গুমেন্ট সিমুলেটর সহ সুইফট একটি নতুন প্ল্যাটফর্ম শর্ত লক্ষ্য পরিবেশকে সমর্থন করে। '#If টার্গেট-এনভায়রনমেন্ট (সিমুলেটর)' ফর্মের শর্তসাপেক্ষ সংকলন এখন বিল্ড টার্গেটটি যখন কোনও সিমুলেটর হয় তা সনাক্ত করতে ব্যবহার করা যেতে পারে। বর্তমান ওএস () এবং খিলান () প্ল্যাটফর্মের অবস্থার মাধ্যমে অপ্রত্যাশিতভাবে সিমুলেটার পরিবেশের জন্য টেস্টিংয়ের মতো প্ল্যাটফর্মের শর্তগুলি মূল্যায়ন করার সময় সুইফট সংকলক টার্গেট এনভায়রনমেন্ট (সিমুলেটর) ব্যবহার করার সময় সনাক্ত করতে, সতর্ক করতে এবং পরামর্শ দেওয়ার চেষ্টা করবে। (দঃপূঃ-0190)

আইওএস 9+:

extension UIDevice {
    static var isSimulator: Bool {
        return NSProcessInfo.processInfo().environment["SIMULATOR_DEVICE_NAME"] != nil
    }
}

সুইফট 3:

extension UIDevice {
    static var isSimulator: Bool {
        return ProcessInfo.processInfo.environment["SIMULATOR_DEVICE_NAME"] != nil
    }
}

আইওএস 9 এর আগে:

extension UIDevice {
    static var isSimulator: Bool {
        return UIDevice.currentDevice().model == "iPhone Simulator"
    }
}

উদ্দেশ্য গ:

@interface UIDevice (Additions)
- (BOOL)isSimulator;
@end

@implementation UIDevice (Additions)

- (BOOL)isSimulator {
    if([[NSProcessInfo processInfo] isOperatingSystemAtLeastVersion:(NSOperatingSystemVersion){9, 0, 0}]) {
        return [NSProcessInfo processInfo].environment[@"SIMULATOR_DEVICE_NAME"] != nil;
    } else {
        return [[self model] isEqualToString:@"iPhone Simulator"];
    }
}

@end

2
স্ট্রিংগুলির তুলনা করা আরও ভঙ্গুর যা সংজ্ঞায়িত ধ্রুবকগুলি ব্যবহার করে।
মাইকেল পিটারসন

@ P1X3L5 আপনি ঠিক বলেছেন! তবে আমি ধরে নিয়েছি যে এই পদ্ধতিটি ডিবাগ মোডে ডাকা হয় - এটি এত শক্ত হতে পারে না তবে কোনও প্রকল্পে যুক্ত করা দ্রুত
হটজার্ড

1
@ গ্যান্টম্যান প্রতিক্রিয়ার জন্য ধন্যবাদ। আমি কোডটি ঠিক করেছি
হটজার্ড

@ হটজার্ডটি দুর্দান্ত, এই কোনও will never be executedসতর্কতা তৈরি করে না
ড্যানি পি

59

সুইফট 4

আপনি এখন targetEnvironment(simulator)একটি যুক্তি হিসাবে ব্যবহার করতে পারেন ।

#if targetEnvironment(simulator)
    // Simulator
#else
    // Device
#endif

এক্সকোড 9.3-র জন্য আপডেট হয়েছে


8
এটি এখন স্বীকৃত উত্তর হওয়া উচিত। ওএস / প্রোগ্রামিং ভাষার আপডেটের ভিত্তিতে নতুন প্রস্তাবিত উত্তর প্রস্তাব করার জন্য এসও-তে কোনও উপায় থাকার ইচ্ছা আছে।
নিরব मे

4
এটি একটি দুর্দান্ত পয়েন্ট @ স্মরণীয় - এটি এসওর কয়েকটি প্রাথমিক ব্যর্থতার মধ্যে একটি। যেহেতু কম্পিউটিং সিস্টেমগুলি এত তাড়াতাড়ি পরিবর্তিত হয়, তাই এসও সম্পর্কিত প্রায় প্রতিটি উত্তর সময়ের সাথে সাথে ভুল হয়ে যায়
ফ্যাটি

40

আমাকে এখানে কিছু বিষয় পরিষ্কার করতে দিন:

  1. TARGET_OS_SIMULATORঅনেক ক্ষেত্রে সুইফ্ট কোডে সেট করা থাকে না; আপনি সম্ভবত দুর্ঘটনাক্রমে একটি ব্রিজিং শিরোনামের কারণে এটি আমদানি করছিলেন তবে এটি ভঙ্গুর এবং সমর্থিত নয়। ফ্রেমওয়ার্কগুলিতে এটি এমনকি সম্ভবও নয়। এই কারণেই কিছু লোক সুইফটে এটি কাজ করে কিনা তা নিয়ে বিভ্রান্ত।
  2. আমি সিমুলেটারের বিকল্প হিসাবে আর্কিটেকচার ব্যবহারের বিরুদ্ধে দৃ strongly়ভাবে পরামর্শ দিচ্ছি।

গতিশীল চেকগুলি সম্পাদন করতে:

চেকিং ProcessInfo.processInfo.environment["SIMULATOR_DEVICE_NAME"] != nilপুরোপুরি ঠিক আছে।

আপনি অন্তর্নিহিত মডেলটি যাচাই করে SIMULATOR_MODEL_IDENTIFIERস্ট্রিংগুলি ফিরে আসবে তা দ্বারা সিমুলেট করাও পেতে পারেন iPhone10,3

স্থির চেক সম্পাদন করতে:

এক্সকোড 9.2 এবং পূর্ববর্তী: আপনার নিজের সুইফট সংকলন পতাকাটি সংজ্ঞায়িত করুন (অন্যান্য উত্তরে দেখানো হয়েছে)

এক্সকোড 9.3+ নতুন টার্গেটটি পরিবেশ শর্তটি ব্যবহার করুন:

#if targetEnvironment(simulator)
    // for sim only
#else
    // for device
#endif

1
দেখে মনে হচ্ছে আপনার এখানে কিছু নতুন অভ্যন্তর তথ্য আছে। খুব উপকারী! দ্রষ্টব্য TARGET_OS_SIMULATOR অ্যাপ এবং ফ্রেমওয়ার্ক কোড উভয় ক্ষেত্রে বেশ কিছু সময়ের জন্য কাজ করেছে; এবং এটি এক্সকোড 9.3 বি 3-তেও কাজ করছে। তবে, আমার ধারণা এটি "দুর্ঘটনাজনিত"। এক ধরণের বোমার মত; কারণ এটি মনে হচ্ছে কমপক্ষে হ্যাকি উপায়। ফ্রেমওয়ার্ক কোড সরবরাহকারী হিসাবে যা Xcode 9.3 বা তার আগের সংস্করণে সংকলিত হতে পারে, দেখে মনে হচ্ছে সংকলক ত্রুটিগুলি এড়ানোর জন্য আমাদের #if টার্গেট এনভায়রনমেন্ট ... একটি # আইফ সুইফ্ট (> = 4.1) ম্যাক্রোতে আবৃত করতে হবে। অথবা আমি অনুমান করি ব্যবহার .... পরিবেশ ["সিমিউলেটর_ডাইওয়্যাভিয়া"]! = শূন্য। এই চেকটি আরও হ্যাকি মনে হচ্ছে, আইএমও।
ড্যানিয়েল

যদি "অপ্রত্যাশিত প্ল্যাটফর্ম শর্ত থাকে (প্রত্যাশিত 'ওএস', 'আর্চ', বা 'সুইফ্ট')" লক্ষ্য পরিবেশনা (সিমুলেটর) ব্যবহার করে ত্রুটি থাকে
ওলেকসান্ডার ২:0

@ আলেকসান্ডার এক্সকোড targetEnvironment9.3 এ অবতরণ করেছেন। আপনার এক্সকোডের একটি নতুন সংস্করণ দরকার।
রসবিশপ

@ রসবিশপ সাম্প্রতিক নতুন যুগের জন্য এটি পরিষ্কার করে দিচ্ছেন - ধন্যবাদ!
ফ্যাটি

আমি একটি 250 অনুগ্রহ প্রেরণ করেছি, যেহেতু এই উত্তরটি সর্বাধিক এবং নতুন তথ্য যুক্ত করবে - চিয়ার্স
ফ্যাটি

15

যেহেতু আমার জন্য সুইফ্ট ১.০ আর্ম ছাড়া অন্য কোনও স্থাপত্যের জন্য যাচাই করে চলেছে:

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

     //simulator
#else 
     //device

#endif

14

রানটাইম, তবে এখানে অন্যান্য সমাধানগুলির চেয়ে বেশ সহজ:

if TARGET_OS_SIMULATOR != 0 {
    // target is current running in the simulator
}

বিকল্পভাবে, আপনি কেবলমাত্র একটি উদ্দেশ্য-সি সহায়ক ফাংশন কল করতে পারেন যা প্রিপ্রোসেসর ম্যাক্রো ব্যবহার করে এমন একটি বুলিয়ান ফেরত দেয় (বিশেষত যদি আপনি ইতিমধ্যে আপনার প্রকল্পে মিশ্রিত হয়ে থাকেন)।

সম্পাদনা: সেরা সমাধান নয়, বিশেষত এক্সকোড 9.3। দেখুন HotJard এর উত্তর


3
আমি এটি করি তবে অন্য ধারাতে সতর্কতা পেতে পারি কারণ এটি "কখনই কার্যকর হবে না"। আমাদের শূন্য সতর্কতার নিয়ম রয়েছে, সুতরাং :-(
এরিকস

এটি একটি সতর্কবার্তা দেখায় তবে তা বোঝাতে পারে, আপনার যদি সিমুলেটর বা বিল্ডিংয়ের জন্য ডিভাইস নির্বাচন করা থাকে, তার উপর নির্ভর করে এই সতর্কতাটি যে অংশে কার্যকর হবে তা প্রদর্শন করবে তবে শূন্য সতর্কতা নীতিটির জন্য হ্যাঁ বিরক্তিকর
ফোনিক্স

1
আমি == 0পরিবর্তে ব্যবহার করার সময় কেবল সতর্কতা দেখছি != 0। উপরের লিখিত হিসাবে এটি ব্যবহার করা, এমনকি কোনও elseব্লক পরেও, সুইফট 4 এক্সকোড সংস্করণ 9.2 (9 সি 40 বি)
শিম

এছাড়াও আমি এটি একটি সিমুলেটর টার্গেটের পাশাপাশি একটি শারীরিক ডিভাইসে চালিত পরীক্ষা করেছি। এছাড়াও সুইফট ৩.২ (একই এক্সকোড সংস্করণ) এ একই বলে মনে হচ্ছে।
শিম

এক্সকোড 9.3 + সুইফ্ট 4.1 এ আমি সবেমাত্র লক্ষ্য করেছি যে এটির সাথেও সতর্কতা রয়েছে! = 0 Sheesh।
শিম

10

আধুনিক সিস্টেমে:

#if targetEnvironment(simulator)
    // sim
#else
    // device
#endif

এটা সহজ।


1
ড্যানিয়েলের উত্তরের চেয়ে প্রথমটি কেন "আরও সঠিক" হওয়া উচিত তা নিশ্চিত নয় । - নোট দ্বিতীয় যে হয় একটি কম্পাইল সময় চেক। শুভ নব বর্ষ!
মার্টিন আর

5

TARGET_IPHONE_SIMULATORআইওএস 9- TARGET_OS_SIMULATORএ অবমূল্যায়ন করা হ'ল প্রতিস্থাপন। এছাড়াওTARGET_OS_EMBEDDED উপলব্ধ।

টার্গেটকন্ডিশনালস থেকে :

#if defined(__GNUC__) && ( defined(__APPLE_CPP__) || defined(__APPLE_CC__) || defined(__MACOS_CLASSIC__) )
. . .
#define TARGET_OS_SIMULATOR         0
#define TARGET_OS_EMBEDDED          1 
#define TARGET_IPHONE_SIMULATOR     TARGET_OS_SIMULATOR /* deprecated */
#define TARGET_OS_NANO              TARGET_OS_WATCH /* deprecated */ 

1
আমি TARGET_OS_SIMULATOR চেষ্টা করেছিলাম কিন্তু TARGET_IPHONE_SIMULATOR করানোর সময় Xcode দ্বারা কাজ করে না বা স্বীকৃতি পায় না। আমি উপরের আইওএস 8.0 এর জন্য তৈরি করছি।
CodeOverRide

আমি আইওএস 9 হেডারের দিকে তাকিয়ে আছি। আমি আমার উত্তর আপডেট করব।
নুথ্যাচ

5

আমি আশা করি এই এক্সটেনশনটি কার্যকর হবে।

extension UIDevice {
    static var isSimulator: Bool = {
        #if targetEnvironment(simulator)
        return true
        #else
        return false
        #endif
    }()
}

ব্যবহার:

if UIDevice.isSimulator {
    print("running on simulator")
}

@ চেতানকোলি, আমি সংক্ষিপ্ত পরিবর্তে কোডটি খুব স্পষ্ট করে তুলতে যাচ্ছিলাম, সুতরাং এটি কারও পক্ষে বোঝা সহজ। আপনার সম্পাদনা সম্পর্কে আমি কেমন অনুভব করছি তা নিশ্চিত নয়।
লুকাস Chwe

3

এক্সকোড .2.২ (এবং এর আগে কিন্তু আমি এর আগে কতটা পরীক্ষা করে দেখিনি), আপনি "যে কোনও আইওএস সিমুলেটর" এর জন্য প্ল্যাটফর্ম নির্দিষ্ট বিল্ড ফ্ল্যাগ "-D TARGET_IPHONE_SIMULATOR" সেট করতে পারেন।

"সুইফ্ট সংকলক - গ্রাহক পতাকা" এর অধীনে প্রকল্পের বিল্ড সেটিংসটি দেখুন এবং তারপরে "অন্যান্য সুইফ্ট পতাকা" তে পতাকাটি সেট করুন। আপনি যখন কোনও বিল্ড কনফিগারেশন নিয়ে যান আপনি 'প্লাস' আইকনটি ক্লিক করে প্ল্যাটফর্ম নির্দিষ্ট পতাকা সেট করতে পারেন।

এটি এইভাবে করার কয়েকটি সুবিধা রয়েছে: 1) আপনি আপনার সুইফট এবং অবজেক্টিভ-সি কোডে একই শর্তসাপেক্ষ পরীক্ষা ("#if TARGET_IPHONE_SIMULATOR") ব্যবহার করতে পারেন। 2) আপনি ভেরিয়েবলগুলি সংকলন করতে পারেন যা কেবল প্রতিটি বিল্ডের জন্য প্রযোজ্য।

এক্সকোড বিল্ড সেটিংসের স্ক্রিনশট



1

আমি সুইফট 3 এ নীচের কোডটি ব্যবহার করেছি

if TARGET_IPHONE_SIMULATOR == 1 {
    //simulator
} else {
    //device
}

1
আমি এটি করি তবে অন্য ধারাতে সতর্কতা পেতে পারি কারণ এটি "কখনই কার্যকর হবে না"। আমাদের শূন্য সতর্কতার নিয়ম রয়েছে, তাই গ্রার ....
এরিকস

আপনি যখনই কোনও ডিভাইস দিয়ে চালানোর চেষ্টা করছেন এটি একটি সতর্কতা প্রদর্শন করবে, যদি আপনি এটি চালনার জন্য সিমুলেটর নির্বাচিত হন তবে সতর্কতাটি দেখাবে না।
ak_ninan


1

সুইফট 4:

বর্তমানে, ডিভাইসটি সিমুলেটর এবং কোন ধরণের ডিভাইস ব্যবহার হচ্ছে তা জানতে আমি প্রসেসইনফো ক্লাসটি ব্যবহার করতে পছন্দ করি :

if let simModelCode = ProcessInfo().environment["SIMULATOR_MODEL_IDENTIFIER"] {
            print("yes is a simulator :\(simModelCode)")
}

তবে, যেমন আপনি জানেন, simModelCodeকোন ধরণের সিমুলেটর চালু করা হয়েছিল তা তাত্ক্ষণিকভাবে বুঝতে কোনও আরামদায়ক কোড নয়, আপনার প্রয়োজন হলে আপনি বর্তমান আইফোন / ডিভাইস মডেল নির্ধারণ করতে এবং আরও বেশি মানুষের থাকার জন্য এই অন্য এসও উত্তরটি দেখার চেষ্টা করতে পারেন পঠনযোগ্য স্ট্রিং।


1

এখানে একটি Xcode 11 সুইফট উদাহরণ দেখা বন্ধ ভিত্তিক HotJard এর সন্ত্রস্ত উত্তর উপরে , এই এছাড়াও একটি যোগ isDevicebool এবং ব্যবহারসমূহ SIMULATOR_UDIDনামের পরিবর্তে। প্রতিটি লাইনে ভেরিয়েবল অ্যাসাইনমেন্টগুলি করা হয় যাতে আপনি যদি ডিবাগারটিতে আরও সহজেই তা পরীক্ষা করতে পারেন তবে আপনি এটি বেছে নিতে পারেন।

import Foundation

// Extensions to UIDevice based on ProcessInfo.processInfo.environment keys
// to determine if the app is running on an actual device or the Simulator.

@objc extension UIDevice {
    static var isSimulator: Bool {
        let environment = ProcessInfo.processInfo.environment
        let isSimulator = environment["SIMULATOR_UDID"] != nil
        return isSimulator
    }

    static var isDevice: Bool {
        let environment = ProcessInfo.processInfo.environment
        let isDevice = environment["SIMULATOR_UDID"] == nil
        return isDevice
    }
}

অভিধানের প্রবেশদ্বারটিও DTPlatformNameথাকা উচিত simulator



0

এক্সকোড 11, সুইফ্ট 5

    #if !targetEnvironment(macCatalyst)
    #if targetEnvironment(simulator)
        true
    #else
        false        
    #endif
    #endif

0

অন্যান্য উত্তর ছাড়াও।

উদ্দেশ্য-সি-তে, নিশ্চিত হয়ে নিন যে আপনি টার্গেটকন্ডিশনালগুলি অন্তর্ভুক্ত করেছেন

#include <TargetConditionals.h>

ব্যবহার করার আগে TARGET_OS_SIMULATOR

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.