如何获得目标名称?

时间:2013-09-13 09:39:27

标签: iphone objective-c xcode build-process

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

我试过了什么? 我在Build Settings的Preprocessor宏部分添加了"TARGET_NAME=${TARGET_NAME}"这个。但现在我不确定如何在Objective-C代码中将此变量"TARGET_NAME"用作字符串。

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

我尝试使用

进行访问
#ifdef TARGET_NAME
 NSLog(@"TargetIdentifier %@",TARGET_NAME);
#endif

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

7 个答案:

答案 0 :(得分:55)

您可以添加" TargetName" Info.plist文件的关键:

enter image description here

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

var plistFileName = NSBundle.mainBundle().infoDictionary?["TargetName"] as String

答案 1 :(得分:29)

NSLog(@"Target name: %@",[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleName"]);

希望能帮到你!

已编辑:“CFBundleName” 感谢Max和Daniel Bo的推荐

答案 2 :(得分:15)

Swift 4,Xcode 9 +

捆绑名称:

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

捆绑显示名称:

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

Swift 3,Xcode 8 +

let targetName = Bundle.main.infoDictionary?["CFBundleName"] as? String ?? ""

答案 3 :(得分:1)

在Xcode 7.3.1中

if let targetName = NSBundle.mainBundle().infoDictionary?["CFBundleName"] as? String{
    print(targetName)
}

答案 4 :(得分:0)

**对于Swift 4 **

我不确定在Swift中有一个Constants文件有多好,但是您可以创建类似的内容:

enum TargetType:String, CaseIterable{
    case target1 = "My Target 1"
    case target 2 = "My Target 2"
    case unknown
}

var currentTarget:TargetType = {
    return TargetType(rawValue: (Bundle.main.object(forInfoDictionaryKey: "CFBundleName") as? String ?? "")) ?? .unknown
}()

因此您可以在任何时候调用它

if currentTarget != .unknown{
    print(currentTarget.rawValue)
}

如果要在Constants类中添加变量,则:

class Constants: NSObject {

    static var currentTarget:TargetType = {
        return TargetType(rawValue: (Bundle.main.object(forInfoDictionaryKey: "CFBundleName") as? String ?? "")) ?? .unknown
    }()

}

答案 5 :(得分:0)

我必须相信the original answer by vk.edward.li,因为这个答案只是在此之上扩展。

所有构建设置宏都可以轻松地在源代码中用作预处理器宏。问题在于它们没有预先设置。您必须自己指定要访问的内容。

enter image description here

我已经添加了三个额外的预处理器宏。只需单击+,然后添加以下内容: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"\"

答案 6 :(得分:0)

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

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

enter image description here

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

添加以下文件:

TARGET_NAME="$(TARGET_NAME)"

AppTargetName.h

#import <Foundation/Foundation.h> NSString * _Nullable AppTargetName(void); ,并带有一些C预处理器魔术(感谢to):

AppTargetName.m
  1. #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; } } 添加到Obj-c桥接标头(如果没有,则添加/配置)。

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

AppTargetName()