代码之家  ›  专栏  ›  技术社区  ›  Iducool

如何获取目标名称?

  •  42
  • Iducool  · 技术社区  · 11 年前

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

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

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

    我尝试使用访问

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

    此代码给出的错误类似于“使用未声明的标识符'myapptargetname'”

    7 回复  |  直到 11 年前
        1
  •  68
  •   Sergey Demchenko    10 年前

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

    enter image description here

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

    var plistFileName = NSBundle.mainBundle().infoDictionary?["TargetName"] as String
    
        2
  •  30
  •   Jonny Vu    10 年前
    NSLog(@"Target name: %@",[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleName"]);
    

    希望能帮助你!

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

        3
  •  22
  •   Lawliet    7 年前

    Swift 4,X代码9+

    捆绑包名称:

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

    捆绑包显示名称:

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

    Swift 3,X代码8+

    let targetName = Bundle.main.infoDictionary?["CFBundleName"] as? String ?? ""
    
        4
  •  3
  •   Grenoblois    3 年前

    斯威夫特5:

    var plistFileName = Bundle.main.infoDictionary?["CFBundleName"]
    
        5
  •  0
  •   Andreas moved to Codidact    6 年前

    我必须赊账 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-C C++ / Swift 等。这是由于 NSString 中使用的前缀 目标-C ,所以对于这种语言来说,应该是 MACRO=@\""$MACRO"\" 而不是 MACRO=\""$MACRO"\" .

        6
  •  0
  •   ivanzoid    4 年前

    如果你有很多目标,这种方法将比@Sergey Demchenko建议的方法更方便,因为你只需要做一次,如果你添加新的目标,就不需要在Info.plist中做任何更改。

    1. 转到“项目生成设置”(而不是“目标的生成设置”),然后添加以下预处理器宏:
    TARGET_NAME="$(TARGET_NAME)"
    

    enter image description here

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

    添加以下文件:

    AppTargetName.h :

    #import <Foundation/Foundation.h>
    
    NSString * _Nullable AppTargetName(void);
    

    AppTargetName.m ,带有一些C预处理器的魔力(谢谢 to ):

    #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)")
    }
    
    
        7
  •  -1
  •   Atef    8 年前

    在Xcode 7.3.1中

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