gpt4 book ai didi

ios - xcodebuild 不会编译项目,除非它至少使用 Xcode 打开一次,用于 cocoapods 集成项目

转载 作者:可可西里 更新时间:2023-11-01 03:27:12 26 4
gpt4 key购买 nike

我有一个带有 cocoa pod 的项目。

这是我用来构建项目的命令。

/usr/bin/xcodebuild -scheme Jenkins -workspace /Users/Shared/Jenkins/Documents/Jenkins/Jenkins2/Jenkins.xcworkspace -configuration Release clean build CONFIGURATION_BUILD_DIR=/Users/Shared/Jenkins/Documents/JenkinsTestNuu/app 'CODE_SIGN_IDENTITY=iPhone Distribution: XXXX yay (3G5FKTZJ2K)' PRODUCT_BUNDLE_IDENTIFIER=com.XXXX.two PROVISIONING_PROFILE=6e6506e9-8233-4886-9084-ce21e8f8bbae



上面的脚本只有在项目至少使用 Xcode 打开一次后才能正常工作,然后 Xcode 可以关闭没有问题。

如果项目尚未打开,则如果我运行脚本
轮子在下面旋转,永远没有任何进展,例如在下图中

problem

如果它打开一次而不是下面的旋转轮下面的文本将显示在下面

=== CLEAN TARGET XWebView OF PROJECT Pods WITH CONFIGURATION Release ===

Check dependencies

Clean.Remove clean /Users/Shared/Jenkins/Documents/JenkinsTestNuu/app/XWebView.framework.dSYM builtin-rm -rf /Users/Shared/Jenkins/Documents/JenkinsTestNuu/app/XWebView.framework.dSYM

Clean.Remove clean /Users/Shared/Jenkins/Library/Developer/Xcode/DerivedData/appanme-bqjwbjcqisegldeaonpytprisnig/Build/Intermediates/Pods.build/Release-iphoneos/XWebView.build builtin-rm -rf /Users/Shared/Jenkins/Library/Developer/Xcode/DerivedData/appanme-bqjwbjcqisegldeaonpytprisnig/Build/Intermediates/Pods.build/Release-iphoneos/XWebView.build

Clean.Remove clean /Users/Shared/Jenkins/Documents/JenkinsTestNuu/app/XWebView.framework builtin-rm -rf /Users/Shared/Jenkins/Documents/JenkinsTestNuu/app/XWebView.framework

=== CLEAN TARGET Pods OF PROJECT Pods WITH CONFIGURATION Release ===

Check dependencies etc...



在任何非 cocoapods 项目中都没有观察到这个问题。

那么是什么原因造成的,如何解决呢?

最佳答案

为什么会发生?

Xcode 打开的项目与 Xcode 迄今为止未打开的同一项目之间的快速 diffMerge 工具分析

Diff Merge tool analysis

由此我们可以看到在 .xcodeproj 中由 Xcode 打开后创建了许多与方案相关的文件

所以 xcodebuild 通过使用与方案相关的元数据创建 .app 但没有针对其失败的构建方案

如何解决这个问题?

由于缺少元数据,它无法构建,因此需要打开 Xcode,以便 Xcode 自动创建文件,因此会有一些构建方案。

但是,当您打开 Xcode 时,会在 xcuserdata 下为特定用户创建此 Scheme 相关文件。即每个用户都有自己的文件,保存打开的状态文件夹,最后打开的文件等...

将这个文件留在我们身边并不是明智之举。

问题可以通过勾选 Manage Schemes 下的 Shared Check 框来解决

这将方案从您的个人 xcuserdata 下移到可以通过源代码管理提交的共享文件夹中,您可以安全地忽略 xcuserdata 并将共享文件夹保留在源代码管理中

Manage schemes

现在,即使只打开一次,我们也可以在不打开 Xcode 的情况下构建代码。

品牌
(UI、build设置和功能)

  • 用户界面
  • 应用图标和其他图标
  • iTunes 图稿
  • build设置
  • 应用名称
  • 捆绑标识符
  • 配置文件
  • 代码签名身份
  • 功能性
  • 品牌特定 URL(登录、注销、资源获取等...)

  • 使用终端

    品牌.sh
       #Author: Durai Amuthan(h.duraiamuthan@gmail.com)
    #This is to achieve multiple branding of an iOS app by configuring the variables below

    #************ Configuring the brand starts ************

    #Directory path where .xcworkspace or .xcodeproj exists
    PathOfProjectDirectory=/Users/Shared/Jenkins/Documents/JenkinsTestNuu/New/

    #Path where info.plist exists
    PathOfInfoPlist=$PathOfProjectDirectory/XxYyZz

    #Path to icons where new iTunesArtwork and application icon exixts
    #Note: Make sure proper naming conventions of file has been followed
    PathOfNewIcons=/Users/Shared/Jenkins/Documents/icons-two

    #Path to asset resource where you have kept your application icon.
    PathOfAppIconSet=$PathOfProjectDirectory/XxYyZz/Icon.xcassets/AppIcon.appiconset

    #Path where do you want the .app file has to be kept
    PathToApp=/Users/Shared/Jenkins/Documents/JenkinsTestNuu/app

    #Path where do you want the .ipa file has to kept
    PathToIpa=/Users/Shared/Jenkins/Documents/JenkinsTestNuu/ipa

    #Cocoapods project or project that involves more than one modules are scheme based
    isWorkspaceBased=true

    #Path of the Project (.xcodeproj) - applicable for workspace(.xcworkspace) based project
    PathofProjectFile=$PathOfProjectDirectory/XxYyZz.xcodeproj

    #Path of the Workspace (.xcworkspace)
    PathofWorkspaceFile=$PathOfProjectDirectory/XxYyZz.xcworkspace

    #Name of the target - applicable only for non-workspace(.xcodeproj) based projects
    Target=XxYyZz

    #Scheme of the iOS app
    Scheme=XxYyZz

    #To ascertain Cocoapods has been used or not
    isCocoaPodsBased=true

    #Configuration of the app (Debug -(Development) or Release(Adhoc or Distribution))
    Config=Release

    #For giving access to signing idetity found in KeyChain
    LoginKeychainPath=/Users/Shared/Jenkins/Library/Keychains/login.keychain
    LoginKeyChainPassword=xxyyzz

    #Name of the code signing identity.You can find the name in Keychain or xcode build setting
    CodeSigningIdentity='iPhone Distribution: Xx Yy Zz Limited (3Z5MHUYJ2L)'

    #Path of the provisioning profile
    PathToMobileProvision=/Users/Shared/Jenkins/Desktop/BrandingTest.mobileprovision

    #UUID value found inside Provisioning profile has to be given
    #Do not forget to install provisiong profile in the system
    ProvisioningProfileIdentity=6e6506e9-8233-4886-9084-zf21e8f8bbae

    #Bundle identifier of the app
    BundleIdentifier=com.xxyy.zz

    #AppVersion of the app
    AppVersion=2.2.2

    #App Name
    Appname=Two

    #************ Configuring the brand ends ************

    #** Creatting the build based on configuration starts **

    cd $PathOfInfoPlist
    echo "****************** Setting App Name ******************"
    /usr/libexec/PlistBuddy -c "Set :CFBundleName $Appname" info.plist
    /usr/libexec/PlistBuddy -c "Set :CFBundleDisplayName $Appname" info.plist
    echo "app name has been set as $Appname"

    cd $PathOfProjectDirectory
    echo "****************** Setting AppVersion ******************"
    /usr/bin/agvtool new-marketing-AppVersion $AppVersion
    /usr/bin/agvtool new-AppVersion -all $AppVersion

    echo "****************** Changing app icons & iTunes Artwork ******************"
    cp -R $PathOfNewIcons/*.png $PathOfAppIconSet
    echo "App icons has been changed at $PathOfNewIcons"
    cp -R $PathOfNewIcons/iTunesArtwork@2x $PathOfProjectDirectory/XxYyZz
    cp -R $PathOfNewIcons/iTunesArtwork $PathOfProjectDirectory/XxYyZz
    echo "iTunesArtwork has been changed at $PathOfProjectDirectory"

    #Unlock login keychain
    security unlock-keychain -p $LoginKeyChainPassword $LoginKeychainPath
    if $isCocoaPodsBased == 'true'
    then
    echo "****************** Installing Cocoapods **********************"
    /usr/local/bin/pod install
    echo "Cocoapods has been installed"
    fi

    echo "****************** Creating .app ******************"
    if $isWorkspaceBased == 'true'
    then
    /usr/bin/xcodebuild -scheme $Scheme -workspace $PathofWorkspaceFile -configuration $Config clean build CONFIGURATION_BUILD_DIR=$PathToApp "CODE_SIGN_IDENTITY=$CodeSigningIdentity" "PRODUCT_BUNDLE_IDENTIFIER=$BundleIdentifier" "PROVISIONING_PROFILE=$ProvisioningProfileIdentity"
    else
    /usr/bin/xcodebuild -target $Target -project $PathofProjectFile -configuration $Config clean build CONFIGURATION_BUILD_DIR=$PathToApp "CODE_SIGN_IDENTITY=$CodeSigningIdentity" "PRODUCT_BUNDLE_IDENTIFIER=$BundleIdentifier" "PROVISIONING_PROFILE=$ProvisioningProfileIdentity"
    fi
    echo ".app has been generated at $PathToApp"

    echo "****************** Creating .ipa *******************"
    /usr/bin/xcrun -sdk iphoneos PackageApplication -v $PathToApp/XxYyZz.app -o $PathToIpa/$Appname.ipa --embed $PathToMobileProvision --sign "$CodeSigningIdentity"
    echo "$Appname.ipa has been generated at $PathToIpa"

    #** Creatting the build based on configuration ends **

    该文件是自我描述的,您可以轻松理解。
    只需在文件中配置变量的值并像下面这样调用它
    sh Branding.sh

    仅供引用:

    如果您还希望更改除 App Icon 和 iTunesArtwork 之外的其他一些图标
    使用 cp命令例如
    cp path/to/source path/to/destination

    要了解更多信息,请做 cp man
    使用上述文件,您可以为 UI 和build设置进行品牌化。

    对于功能性品牌,您必须保持
  • 品牌特定 URL
  • 与品牌相关的其他输入

  • 在单独的 plist 文件中,以便在构建应用程序时也可以根据各自的品牌更改这些内容

    Plist file

    在编码方面,您可以自定义应用程序以从 plist 中读取值,如下所示

    功能定义:
    func getPlistFile()->Dictionary<String,AnyObject>? {
    var dictPlistFile:Dictionary<String,AnyObject>?
    if let path = NSBundle.mainBundle().pathForResource("plistfile", ofType: "plist") {
    if let dictValue = NSDictionary(contentsOfFile: path) as? Dictionary<String, AnyObject> {
    dictPlistFile=dictValue
    }
    }
    return dictPlistFile
    }

    函数调用:
    var Value=getPlistFile()?["Key"]

    您可以在构建应用程序时使用 PlistBuddy 根据品牌更改 key 的值

    这是语法
    /usr/libexec/PlistBuddy -c "Set :Key Value" plistfile.plist

    使用 Jenkins

    我们可以在 jenkins 中有效地重用这里的 shell 脚本

    1.您必须使用 参数化jenkins中shell脚本中的所有变量添加参数 ...就像在下面的屏幕截图中我为一个变量所做的那样你必须为所有其他变量做

    Paramterization

    2.选择 执行 shell 构建步骤

    Build Step

    3.复制Creating the build based on configuration开始和Creating the build based on configuration结束之间的脚本并将其粘贴到Execute Shell中
    Execute Shell

    注:
  • 资源规则

    在通过非 xcode 接口(interface)构建和打包应用程序时,某些版本中存在关于 Xcode ResourceRules 的已知错误。

    所以它必须运行一次以停用 xcode 中资源规则路径的验证。资源规则路径是不推荐使用的功能,苹果不接受带有资源规则的应用程序,但如果我们在不使用 Xcode 的情况下构建应用程序,验证错误说未找到资源规则会出现反驳我们必须只运行脚本一次的情况。

  • xcode_fix_PackageApplicationResourceRules.sh
    #!/bin/sh
    # A script to patch xcrun PackageInstallation so that it doesn't use the deprecated --resource-rules
    # See "Do not use the --resource-rules flag or ResourceRules.plist. They have been obsoleted and will be rejected."
    # under https://developer.apple.com/library/mac/technotes/tn2206/_index.html#//apple_ref/doc/uid/DTS40007919-CH1-TNTAG205
    # Reported as Apple bug #19384243
    #
    # should be run as a user who can modify the PackageApplication file

    xcodedir=$1

    function usage {
    # FIXME we cannot parse args properly because 2 are optional...
    echo "USAGE: $0 xcodedir"
    echo " xcodedir: an install dir like /Application/Xcode6.1.1.app"
    }

    if [[ $# -ne 1 ]]; then
    echo "ERROR: invalid number of arguments"
    usage
    exit -1
    fi

    pi="$xcodedir/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/PackageApplication"
    piorig="$piOrig"

    if [[ ! -f "$pi" ]]; then
    echo "$pi file not found. Invalid argument ?"
    usage
    exit -1
    fi

    grep resource-rules "$pi"
    if [[ $? -ne 0 ]]; then
    echo "PackageApplication doesn't use resource-rules. Skipping"
    exit 0
    fi

    if [[ -f "$piorig" ]]; then
    echo "Backup file $piorig already exist. Aborting"
    exit -1
    fi

    perl -p -i'Orig' -e 'BEGIN{undef $/;} s/,resource-rules(.*sign}).*ResourceRules.plist"/$1/smg' "$pi"
    echo $?
  • 解锁 key 扣

    每当您在终端中运行 Branding.sh 时,它都会提示用户名和密码作为其访问系统钥匙串(keychain)

    每当您在 jenkins 中运行作业时,您都会收到“不允许用户交互”错误

    所以要解决这个问题,你必须按照以下步骤
  • 打开钥匙串(keychain)访问
  • 右键单击私钥
  • 选择“获取信息”
  • 选择“访问控制”选项卡
  • 单击“允许所有应用程序访问此项目”
  • 单击“保存更改”
  • 输入您的密码
  • 配置文件

    如果您收到“找不到匹配的配置文件”,请确保您已双击并通过 Xcode 安装它。

    安装后,您将在 ~/Library/MobileDevice/Provisioning Profiles/中看到 UUID.mobileprovision

    此 UUID 是移动供应中的值,表示已安装供应配置文件。

  • 我希望这可以帮助你

    关于ios - xcodebuild 不会编译项目,除非它至少使用 Xcode 打开一次,用于 cocoapods 集成项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36318336/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com