【问题标题】:Add/Replace URL Scheme in Info.plist using bash script使用 bash 脚本在 Info.plist 中添加/替换 URL 方案
【发布时间】:2014-06-27 04:09:09
【问题描述】:

我想使用 bash 脚本/命令在 Info.plist 文件中添加/替换 URL 方案。

我尝试了sed 各种模式的命令,但没有成功。

我们希望使用 Jenkins 自动生成构建,并且我们的 URL 方案可以针对各种构建进行更改,因此我们希望修改 Info.plist 文件,以便我们可以添加新的 URL 方案(如果不存在)或替换现有的一种使用脚本/命令。

请提出实现此目的的命令。

【问题讨论】:

  • 添加一些想要的源和结果样本,正则表达式将取决于环绕信息。还提供一些不成功的 sed 命令(这将有助于解释失败的原因)

标签: ios bash sed jenkins url-scheme


【解决方案1】:

你可以使用plutil工具

$INFO_PLIST_FILE=path_to_your_plist_file

$NEW_URL_STRING=new_url_string

echo "removing current url string"
plutil -remove CFBundleURLTypes.0.CFBundleURLSchemes.0 $INFO_PLIST_FILE

echo "updating with new url string"
plutil -replace CFBundleURLTypes.0.CFBundleURLSchemes.0 -string $NEW_URL_STRING $INFO_PLIST_FILE

【讨论】:

    【解决方案2】:

    可能对其他人有用。

    我已经根据bundle id制作了运行脚本来在构建时添加谷歌反向客户端:

    # @usage
    # 1. Get reverse client id for google signin according to bundle id
    # 2. Set in info.plist file
    
    REVERSE_CLIENT_ID=""
    
    if [ $PRODUCT_BUNDLE_IDENTIFIER = "com.max.bundle1" ]
    then
        REVERSE_CLIENT_ID="com.googleusercontent.apps.id1"
    elif [ $PRODUCT_BUNDLE_IDENTIFIER = "com.max.bundle2"]
    then
        REVERSE_CLIENT_ID="com.googleusercontent.apps.id2"
    fi
    
    /usr/libexec/PlistBuddy -c "set :CFBundleURLTypes:1:CFBundleURLSchemes:0 $REVERSE_CLIENT_ID" "${PROJECT_DIR}/${INFOPLIST_FILE}"
    

    它对我来说很好用。为了使它工作,我在第二个位置添加了 URL 类型,如下图所示:

    这里set :CFBundleURLTypes:1: 是第二种 URL 类型,因为我已经有一个。如果您没有其他 url 类型,那么您必须在最后一行写 set :CFBundleURLTypes:0:。或根据您的 url 类型数量。

    就像这样,您可以在运行时编辑一些值,例如 info.plist 文件中的内部版本号。

    【讨论】:

      【解决方案3】:

      任务

      • 为暂存/生产设置不同的 url 方案

      详情

      Xcode 9.2

      解决方案

      1 创建网址方案

      在运行脚本中(写在下面) /usr/libexec/PlistBuddy -c "set :CFBundleURLTypes:1:CFBundleURLSchemes:0 $SCHEME" "$INFOPLIST_MYAPP"

      我们有 :CFBundleURLTypes:1

      1 = 项目 1

      2 添加运行脚本

      INFOPLIST_MYAPP="${SRCROOT}/SM2/Application/InfoPlist/Info.plist"
      SCHEME=""
      
      case "${CONFIGURATION}" in
      
          "Debug_Staging" | "AdHoc_Staging" | "Test_Staging" | "Profile_Staging" )
          SCHEME="sm2dev" ;;
      
      
          "Debug_Production" | "AdHoc_Production" | "Distribution" | "Test_Production" | "Profile_Production" )
          SCHEME="sm2" ;;
      
          *)
              ;;
      esac
      
      /usr/libexec/PlistBuddy -c "set :CFBundleURLTypes:1:CFBundleURLSchemes:0 $SCHEME" "$INFOPLIST_MYAPP"
      

      所有项目方案

      【讨论】:

        【解决方案4】:

        我们可以使用 awk 命令代替 sed 轻松实现复杂的事情。

        我能够在“Ed Morton”的帮助下完成任务,如sed : Insert lines after specific pattern with newline

        【讨论】:

          【解决方案5】:

          假设您的 URL 方案是“myName”,那么您的 info.plist 文件中应该有一个条目,例如:

          <array>
              <string>myName</string>
          </array>
          

          您可以使用 sed 将 myName 更改为 newName,如下所示:

          sed -i '' 's/<string>myName/<string>newName/' 'info.plist'
          

          &lt;string&gt; 很重要,因为您可能不想用newName 替换其他myName 字符串,因此它会缩小范围。

          根据 OP 评论更新:

          我不确定您的 info.plist 文件是什么样的,但这是一个通用解决方案。如果CFBundleURLTypes 不存在,您可以创建一个template 文件,将您喜欢的内容添加到info.plist。例如:

          <key>CFBundleURLTypes</key>
          <array>
              <dict>
                  <key>CFBundleURLSchemes</key>
                  <array>
                      <string>myName</string>
                  </array>
                  <key>CFBundleURLName</key>
                  <string>com.xxx.myName</string>
              </dict>
          </array>
          

          所以现在您有一个名为template 的文件,其中包含之前的代码。要使其仅插入到第一个&lt;dict&gt; 的位置,请将info.plist 文件中的第一个&lt;dict&gt; 更改为&lt;myDict&gt;。然后,您可以检查您的模式是否存在,如果不存在,则插入template,然后将myName 替换为newName,如下所示:

          if ! grep -q "<string>myName</string>" "info.plist"; then
             sed -i '' "/<myDict>/ r template" info.plist
          else
             sed -i '' 's/<myDict>/<dict>/' 'info.plist'
          fi
             sed -i '' 's/<string>myName/<string>newName/' 'info.plist'
          

          为了更简洁,您可以将之前的代码放入 bash 文件 insertURL.bash,然后运行该文件。

          【讨论】:

          • 嗨阿拉什,感谢您的回复。如果 URL Scheme 已经存在,这将起作用。您能否建议 sed 命令检查是否未添加然后添加?
          • 使用s///,后跟t label,如果发生替换,则其行为类似于goto。如果 label 为空,则 goto 转到脚本末尾(并处理下一行/循环)
          • @patelkavit 根据您的评论更新了答案。
          • @Arash 我尝试了您更新的解决方案,但是它将模板代码插入到 plist 中找到 的行下。这是不正确的,我希望它只插入根字典下。我试图找到代码中使用的“r”的替代品,但没有成功。请给我建议。
          • @patelkavit 我想我试穿的info.plist 只有一个&lt;dict&gt;。无论如何,这只是查找和替换的问题。因此,您可以以某种方式将您的第一个 &lt;dict&gt; 标记为不同的东西。例如将其替换为原始info.plist 中的&lt;myDict&gt;。然后只搜索并替换那个。我更新了答案。
          猜你喜欢
          • 2020-09-22
          • 2015-05-17
          • 2011-12-07
          • 2014-02-16
          • 2013-07-21
          • 1970-01-01
          • 1970-01-01
          • 2017-03-10
          • 2013-04-30
          相关资源
          最近更新 更多