40

我们知道 Xcode 维护环境变量,${TARGET_NAME}但是如何在 Objective-C 代码中访问这个变量呢?

我试过什么?
我已经"TARGET_NAME=${TARGET_NAME}"在构建设置的预处理器宏部分添加了这个。但现在我不确定如何"TARGET_NAME"在 Objective-C 代码中将此变量用作字符串。

在我的情况下,产品名称和目标名称不同,所以没有机会使用它。

我尝试使用

#ifdef TARGET_NAME
 NSLog(@"TargetIdentifier %@",TARGET_NAME);
#endif

此代码给出错误,例如“使用未声明的标识符'myapptargetname'”

4

7 回答 7

65

您可以将“TargetName”键添加到 Info.plist 文件中:

在此处输入图像描述

然后你可以访问它(swift代码):

var plistFileName = NSBundle.mainBundle().infoDictionary?["TargetName"] as String
于 2015-03-18T23:11:41.407 回答
29
NSLog(@"Target name: %@",[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleName"]);

希望能帮到你!

编辑:“CFBundleName” 感谢 Max 和 Daniel Bo 的表扬

于 2013-09-13T09:50:12.817 回答
20

斯威夫特 4,Xcode 9+

捆绑包名称:

Bundle.main.object(forInfoDictionaryKey: "CFBundleName") as? String ?? ""

捆绑显示名称:

Bundle.main.object(forInfoDictionaryKey: "CFBundleDisplayName") as? String ?? ""

斯威夫特 3,Xcode 8+

let targetName = Bundle.main.infoDictionary?["CFBundleName"] as? String ?? ""
于 2017-07-21T07:22:59.450 回答
1

斯威夫特 5:

var plistFileName = Bundle.main.infoDictionary?["CFBundleName"]
于 2021-09-03T14:07:08.837 回答
0

我必须相信vk.edward.li 的原始答案,因为这个答案只是对其进行了扩展。

所有构建设置宏也可以很容易地在源代码中用作预处理器宏。问题是它们没有提前设置。您必须自己指定可以访问哪些内容。

在此处输入图像描述

我已经添加了三个额外的预处理器宏。只需单击+,然后添加:TARGET_NAME=\""$TARGET_NAME"\",您就可以访问另外一个构建设置宏。

Project settings ––> Build Settings ––> Apple Clang - Preprocessing[Preprocessor Macros]. 请注意,如果您尝试同时为两种编译模式插入它们,DEBUG=1宏将被删除,但之后可以轻松地添加回来。

还值得注意的是,对于不同的语言,宏值应该设置不同:Objective-CC++/Swift等。这是由于在 中NSString使用的前缀Objective-C,所以对于那种语言,它应该MACRO=@\""$MACRO"\"代替MACRO=\""$MACRO"\".

于 2019-04-09T10:55:21.063 回答
0

如果您有很多目标,则此方法比@Sergey Demchenko 建议的方法更方便,因为您只需执行一次,如果添加新目标,则无需在 Info.plist 中进行任何更改。

  1. 转到项目构建设置(不是目标的构建设置),并添加以下预处理器宏:
TARGET_NAME="$(TARGET_NAME)"

在此处输入图像描述

  1. 现在,我们需要在代码中获取这个宏的值。Swift 不支持字符串宏,所以我们需要回到旧的 Objective-C。

添加以下文件:

AppTargetName.h

#import <Foundation/Foundation.h>

NSString * _Nullable AppTargetName(void);

AppTargetName.m,带有一些 C 预处理器的魔法(感谢

#import "AppTargetName.h"

#ifndef TARGET_NAME
    #define TARGET_NAME ""
#endif

#define STRINGIZE(x) #x
#define STRINGIZE2(x) STRINGIZE(x)
#define TARGET_NAME_STRING @ STRINGIZE2(TARGET_NAME)

NSString * _Nullable AppTargetName() {
    if (TARGET_NAME_STRING.length == 0) {
        return nil;
    } else {
        return TARGET_NAME_STRING;
    }
}
  1. 添加#import "AppTargetName.h"到 Obj-c 桥接头标头(如果没有,请添加/配置它)。

  2. 现在在 Swift 中,您可以调用AppTargetName()并获取您的目标名称,如果您添加新目标,则无需修改 Info.plist!

if let targetName = AppTargetName() {
    print("Target Name = \(targetName)")
}

于 2020-07-15T07:30:17.060 回答
-1

在 Xcode 7.3.1 中

if let targetName = NSBundle.mainBundle().infoDictionary?["CFBundleName"] as? String{
    print(targetName)
}
于 2017-03-31T21:46:45.330 回答