我们知道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'”
答案 0 :(得分:55)
您可以添加" TargetName" Info.plist文件的关键:
然后你可以访问它(快速代码):
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,因为这个答案只是在此之上扩展。
所有构建设置宏都可以轻松地在源代码中用作预处理器宏。问题在于它们没有预先设置。您必须自己指定要访问的内容。
我已经添加了三个额外的预处理器宏。只需单击+
,然后添加以下内容:TARGET_NAME=\""$TARGET_NAME"\"
,您就可以访问另一个构建设置宏。
Project settings ––> Build Settings ––> Apple Clang - Preprocessing[Preprocessor Macros]
。请注意,如果您尝试同时为两种编译模式插入它们,则DEBUG=1
宏将被删除,但随后可以轻松地将其添加回去。
还值得注意的是,应针对不同的语言分别设置宏值:Objective-C
和C++
/ Swift
等,这是由于NSString
前缀在Objective-C
中使用,因此对于该语言,应为MACRO=@\""$MACRO"\"
而不是MACRO=\""$MACRO"\"
。
答案 6 :(得分:0)
如果目标很多,则此方法将比@Sergey Demchenko建议的方法更方便,因为您只需执行一次即可,并且如果添加新目标,则无需在Info.plist中进行任何更改。
RecyclerView
添加以下文件:
TARGET_NAME="$(TARGET_NAME)"
:
AppTargetName.h
#import <Foundation/Foundation.h>
NSString * _Nullable AppTargetName(void);
,并带有一些C预处理器魔术(感谢to):
AppTargetName.m
将#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桥接标头(如果没有,则添加/配置)。
现在在Swift中,您可以调用#import "AppTargetName.h"
并获取目标名称,如果添加新目标,则无需修改Info.plist!
AppTargetName()