এক্সকোড / আইওএস: DEBUG / রিলেস বিল্ডে কোড চলছে কিনা তা কীভাবে নির্ধারণ করবেন?


241

আমি এমন একটি অ্যাপ তৈরি করছি যা সংবেদনশীল ক্রেডিট কার্ডের ডেটা প্রক্রিয়া করে।

যদি আমার কোডটি ডিবাগ মোডে চলছে তবে আমি এই ডেটাটি কনসোলে লগ করতে এবং কিছু ফাইল ডাম্প তৈরি করতে চাই।

তবে চূড়ান্ত অ্যাপস্টোর সংস্করণে (যেমন এটি রিলিজ মোডে চলাকালীন) এটি প্রয়োজনীয় সমস্ত কিছুই অক্ষম (সুরক্ষা বিপত্তি)!

আমি আমার প্রশ্নের যথাসাধ্য উত্তর দেওয়ার চেষ্টা করব; সুতরাং প্রশ্নটি হয়ে যায় 'এই সমাধানটি কি এটি করার সঠিক বা সর্বোত্তম উপায়?'

// add `IS_DEBUG=1` to your debug build preprocessor settings  

#if( IS_DEBUG )  
#define MYLog(args...) NSLog(args)  
#else  
#define MYLog(args...)  
#endif  

উত্তর:


248

আপনার অ্যাপ্লিকেশনটির বিল্ড সেটিংসটি 'অ্যাপল এলএলভিএম - প্রিপ্রোসেসিং', 'প্রিপ্রসেসর ম্যাক্রোস' এর অধীনে ডিবাগের জন্য DEBUGসেট করা হচ্ছে তা নিশ্চিত করতে পরীক্ষা করুন - প্রকল্পটি নির্বাচন করে এবং বিল্ড সেটিংস ট্যাবে ক্লিক করে এটি করুন। DEBUGসত্যই DEBUGসেট করা হচ্ছে কিনা তা অনুসন্ধান করুন এবং দেখুন ।

মনোযোগ দিন যদিও। আপনি দেখতে পাবেন যে DEBUG অন্য পরিবর্তনশীল নামে যেমন DEBUG_MODE এ পরিবর্তিত হয়েছে।

আমার প্রকল্প সেটিংসের সেটিংস ট্যাব তৈরি করুন

তারপরে শর্তসাপেক্ষে আপনার উত্স ফাইলগুলিতে DEBUG এর জন্য কোড করুন

#ifdef DEBUG

// Something to log your sensitive data here

#else

// 

#endif

আপনার উত্তরের জন্য থ্যাঙ্কস, আমি যদি #ifdef DEBUG NSLog@("Something");#else//#endifএটির মতো করার চেষ্টা করি:, এটি কার্যকর হয় না। আমি কীভাবে একটি বোতাম শুরু করতে পারি বা কনসোলে কিছু লগ করতে পারি দয়া করে, আপনি কী নিজের প্রশ্ন সম্পাদনা করতে পারবেন?
মলোক

সুইফটে কী হবে?
টেকনোফাইল

আমি রান সময়টিতে এই ম্যাক্রোগ্রাফিকভাবে পরিবর্তন করতে পারি? আমি এমন একটি বোতাম সক্ষম করতে চাই যা প্রযোজনা APIগুলিতে স্যুইচ করে। সেই বোতামটিতে, আমি DEBUG কে 0 এ পরিবর্তন করতে এবং ব্যবহারকারীকে অ্যাপটি পুনরায় চালু করতে হবে এমন বার্তাটি প্রদর্শন করতে চাই। সুতরাং পরের বার এটি উত্পাদন API গুলি ব্যবহার করবে।
হিরেন প্রজাপতি

130

সুইফ্টে সমাধানের জন্য দয়া করে এসও তে এই থ্রেডটি দেখুন

মূলত সুইফ্টের সমাধানটি এরকম দেখতে পাবেন:

#if DEBUG
    println("I'm running in DEBUG mode")
#else
    println("I'm running in a non-DEBUG mode")
#endif

অতিরিক্ত হিসাবে আপনি একটি এন্ট্রি মাধ্যমে কী জন্য বিভাগে DEBUGপ্রতীক সেট করতে হবে । উদাহরণের জন্য নিম্নলিখিত স্ক্রিনশটটি দেখুন:Swift Compiler - Custom FlagsOther Swift Flags-D DEBUG

এখানে চিত্র বর্ণনা লিখুন


1
আমি সুইফ্ট সংকলকটি কোথায় পাই - কাস্টম ফ্ল্যাগগুলি?
বিভক্ত

2
@ কনফিলে: আমি একটি স্ক্রিনশট সংযুক্ত করেছি যা কোথায় সন্ধান করতে হবে তা পরিষ্কার করা উচিত। আশা করি এটা সাহায্য করবে!
Jeehut

1
মনে রাখবেন এটি নির্দিষ্ট ফ্রেমওয়ার্ক / এক্সটেনশনের জন্য এটি সংজ্ঞায়িত করা দরকার! সুতরাং আপনার যদি কোনও কীবোর্ড / আজ এক্সটেনশন থাকে তবে এটি এখানে সংজ্ঞায়িত করুন। আপনার যদি অন্য কিছু ধরণের কাঠামো একই জিনিস থাকে। এটি কেবল তখনই প্রয়োজনীয় হতে পারে যদি প্রধান লক্ষ্য উদ্দেশ্য হয় ...
ওয়ার্পজিট

ধন্যবাদ, মনে Other Swift Flagsযদি না আপনি নির্বাচন কী প্রদর্শিত হবে না Allএবং combinedউপরে
অস্কার ঝাঙ

ধন্যবাদ! এই যে আমি অনুপস্থিত ছিল। আমি এটি সুইংয়ের জন্য নয় বরং কলঙ্কের জন্য সেট করেছিলাম।
বাগগাফ

90

অ্যাপল ইতিমধ্যে DEBUGডিবাগ বিল্ডগুলিতে একটি পতাকা অন্তর্ভুক্ত করেছে , সুতরাং আপনার নিজের সংজ্ঞা দেওয়ার দরকার নেই।

মোডে NSLogনা থাকাকালীন আপনি কেবল নাল অপারেশনের জন্য কেবল নতুন সংজ্ঞা দেওয়ার বিষয়েও বিবেচনা করতে চাইতে পারেন DEBUG, এইভাবে আপনার কোডটি আরও পোর্টেবল হবে এবং আপনি কেবল নিয়মিত NSLogবিবৃতি ব্যবহার করতে পারেন :

//put this in prefix.pch

#ifndef DEBUG
#undef NSLog
#define NSLog(args, ...)
#endif

33

বেশিরভাগ উত্তরে বলা হয়েছে যে কীভাবে #ifdef DEBUG সেট করবেন এবং তাদের মধ্যে কেউই কীভাবে ডিবাগ / রিলিজ বিল্ড নির্ধারণ করবেন তা বলছে না।

আমার মতামত:

  1. স্কিম সম্পাদনা করুন -> চালান -> বিল্ড কনফিগারেশন: ডিবাগ / রিলিজ চয়ন করুন। এটি সিমুলেটর এবং আপনার পরীক্ষার আইফোনের কোডের স্থিতি নিয়ন্ত্রণ করতে পারে।

  2. স্কিম সম্পাদনা করুন -> সংরক্ষণাগার -> বিল্ড কনফিগারেশন: ডিবাগ / রিলিজ চয়ন করুন। এটি পরীক্ষা প্যাকেজ অ্যাপ এবং অ্যাপ স্টোর অ্যাপের কোড স্থিতি নিয়ন্ত্রণ করতে পারে। এখানে চিত্র বর্ণনা লিখুন


পুরস্কৃত উত্তর !!! এটি আমার সমস্যা চিহ্নিত করতে আমাকে সহায়তা করে। আমার ক্ষেত্রে আমি অ্যাপটি স্টোরে Archiveমোডটি রেখেছি Debugএবং অ্যাপটি জমা দিয়েছিলাম। আইটিউনস থেকে অ্যাপ ডাউনলোডের পরে ফলাফলটি পরীক্ষা করার সময় এটি কার্যকরভাবে কাজ করে না। সুতরাং নিশ্চিত হয়ে নিন যে DEBUG/RELEASEশুধুমাত্র যখন সম্পর্কিত মোডটি নির্বাচিত হবে তখনই কাজ করে Build/Run/Archive
ভাভিন_ম ২

13

সুইফ্ট এবং এক্সকোড 10+

#if DEBUGযে কোনও উন্নয়ন / অ্যাড-হক বিল্ড, ডিভাইস বা সিমুলেটারে পাস করবে। এটি কেবল অ্যাপ স্টোর এবং টেস্টফ্লাইট বিল্ডগুলির জন্যই মিথ্যা।

উদাহরণ:

#if DEBUG
   print("Not App Store build")
#else
   print("App Store build")
#endif

8

জিটাও জিওংয়ের উত্তরটি আমি যা ব্যবহার করি তার থেকে খুব কাছাকাছি; আমি ফাইলের নামও অন্তর্ভুক্ত করেছি (ফাইলের পথ ছড়িয়ে দিয়ে )।

#ifdef DEBUG
    #define NSLogDebug(format, ...) \
    NSLog(@"<%s:%d> %s, " format, \
    strrchr("/" __FILE__, '/') + 1, __LINE__, __PRETTY_FUNCTION__, ## __VA_ARGS__)
#else
    #define NSLogDebug(format, ...)
#endif

7

এক্সকোড In-এ, অ্যাপল এলএলভিএম .0.০ এর অধীনে একটি ক্ষেত্র রয়েছে - প্রিপ্রোসেসিং , যাকে বলা হয় " প্রিপ্রোসেসিয়ার্স ম্যাক্রোস প্রিম্পম্পিলড ইন ইউজড নট ... "? আমি করা ডিবাগ সামনে ডিবাগ এবং এটি কোড নিচে ব্যবহার করে আমার জন্য কাজ করে:

#ifdef DEBUG
    NSString* const kURL = @"http://debug.com";
#else
    NSString* const kURL = @"http://release.com";
#endif

4

সনাক্ত করার জন্য আরও একটি ধারণা:

DebugMode.h

#import <Foundation/Foundation.h>

@interface DebugMode: NSObject
    +(BOOL) isDebug;
@end

DebugMode.m

#import "DebugMode.h"

@implementation DebugMode
+(BOOL) isDebug {
#ifdef DEBUG
    return true;
#else
    return false;
#endif
}
@end

হেডার ব্রিজ ফাইলটিতে যুক্ত করুন:

#include "DebugMode.h"

ব্যবহার:

DebugMode.isDebug()

প্রকল্পের বৈশিষ্ট্যগুলি দ্রুতগতির পতাকাগুলির অভ্যন্তরে কিছু লেখার দরকার নেই।


1

আমি আপনাকে প্রশ্নের উত্তর দিয়েছি কিনা তা নিশ্চিত নই, সম্ভবত আপনি এই কোডগুলি চেষ্টা করে দেখতে পারেন:

#ifdef DEBUG
#define DLOG(xx, ...)  NSLog( \
    @"%s(%d): " \
    xx, __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__ \  
    )
#else
#define DLOG(xx, ...)  ((void)0)
#endif 

যে সংজ্ঞায়িত করছে ঠিক কি আপনি তা ব্যাখ্যা করতে পারেন? এটি ঝরঝরে দেখাচ্ছে, তবে আমি এটি বেশিরভাগভাবে পাই না। এক্স সাধারণত একটি অ্যাপল সংরক্ষিত ম্যাক্রো নির্দেশ করে, যেখানে PRETTY_FUNCTION ব্যবহারকারীর দ্বারা উত্পাদিত কিছু নির্দেশ করে, ফলে ফলাফলটি বিভ্রান্তিকর হয়
P i

2
xx হ'ল ফর্ম্যাট স্ট্রিং, আপনি যা চান তা ব্যবহার করতে পারেন, যদি এটি পূর্ববর্তী স্ট্রিংয়ের সাথে অভিন্ন হয়। আপনি FUNCTION ব্যবহার করতে পারেন , তবে PRETTY_FUNCTION মুদ্রণ উদ্দেশ্য - সি পদ্ধতির নামগুলি। এই লিঙ্কটি এটি খুব ভাল ব্যাখ্যা।
Zitao Xiong
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.