在iOS App info.plist中使用预处理器定义

时间:2013-01-08 00:46:59

标签: objective-c ios xcode

我有一个使用SSO和Facebook的iOS应用程序,作为让你的应用程序与Facebook的SSO一起工作的一部分,你必须在info.plist中指定FacebookAppId和回调网址。我有2个不同的Facebook组,一个用于测试,一个用于生产。我希望能够根据预处理程序指令设置上面指定的两个键的值。

在我的MessageBomb-Prefix.pch中,我有以下内容,它可以正常工作:

#ifdef TEST
    //Development environments
    #define PARSE_APP_ID "dev parse app id"
    #define PARSE_CLIENT_ID "dev parse client id"
    #define FB_APP_ID "dev facebook id"
#else
    //Production environments
    #define PARSE_APP_ID "prod parse app id"
    #define PARSE_CLIENT_ID "prod parse client id"
    #define FB_APP_ID "prod facebook id"
#endif

然而,在我的info.plist中,我已经完成了以下操作,但它似乎不起作用:

<key>CFBundleURLTypes</key>
    <array>
        <dict>
            <key>CFBundleTypeRole</key>
            <string>Editor</string>
            <key>CFBundleURLSchemes</key>
            <array>
                <string>fb${FB_APP_ID}</string>
            </array>
        </dict>
    </array>
    <key>FacebookAppID</key>
    <string>${FB_APP_ID}</string>

甚至可以做我想做的事情。我已经将项目设置为预处理info.plist。

由于 彼得

3 个答案:

答案 0 :(得分:14)

如果您进入构建设置,则可以将Preprocess Info.plist File设置为YES,然后将Info.plist Preprocessor Prefix File设置为.h文件,并将其#define放入项目中{{1}指令。

例如,如果我向Info.plist文件添加密钥:testKey,其值为TEST_VALUE。然后我将test.h放在我的项目中:

#define TEST_VALUE hello_world

然后我将Preprocess Info.plist File设为YES,将Info.plist Preprocessor Prefix File设为test.h

检索时该键的值现为“hello_world”。如果您经常更改宏的值,您可能会发现需要执行Product / Clean来查看更改,因为XCode似乎缓存了已编译的值。

答案 1 :(得分:8)

Info.plist预处理器将允许您在Info.plist中使用构建设置,而不是#define。因此,您可以将FB_APP_ID定义为目标中的自定义用户构建设置(并为不同的方案提供覆盖),然后此值将可供Info.plist使用。但是,用户构建设置不会暴露给您的代码。也就是说,除非你弄乱你的预处理器定义构建设置并添加一个看起来像

的条目
FB_APP_ID=@\"$(FB_APP_ID)\"

(需要使用反斜杠来获取经过shell调用的双引号)

如果您的应用ID可能包含空格,那么您需要添加引号以通过shell调用:

FB_APP_ID="@\"$(FB_APP_ID)\""

最后,您将拥有如下所示的构建设置:

Build settings

答案 2 :(得分:6)

要在plist中访问:

创建新变量
enter image description here


定义
enter image description here


在您的信息播放器中使用
enter image description here