美文网首页iOS DeveloperiOS 实用技术iOS开发技巧
当Fastlane遇到Xcode9打包出来不一定是ipa而是坑

当Fastlane遇到Xcode9打包出来不一定是ipa而是坑

作者: 抢手的哥 | 来源:发表于2017-09-30 15:09 被阅读2460次

Fastlane简介

Fastlane 是用Ruby语言编写的一套自动化工具集和框架,每一个工具实际都对应一个Ruby脚本,用来执行某一个特定的任务。Fastlane的强大之处,就是可以将不同的工具(action)有机而灵活的结合在一起,从而形成一个完整的自动化流程,大大提高了日常的开发测试效率,推荐大家使用。
如果你尚未使用这个工具,可以点击一下几篇文章学习如何使用:
【CI】持续集成-引导篇
【CI】持续集成-第一篇 fastlane

背景&现象

公司项目日常开发中,已经使用了fastlane,配合gitlab一起实现自动打包以及分发,使用期间感觉很顺畅,没有出过什么问题。但是,自从Xcode升级到Xcode9正式版之后打包一直出问题,打不了包。

环境配置

fastlane版本: 2.59.0

| Key                         | Value                                       |
| --------------------------- | ------------------------------------------- |
| OS                          | 10.13                                       |
| Ruby                        | 2.3.3                                       |
| Bundler?                    | false                                       |
| Git                         | git version 2.13.5 (Apple Git-94)           |
| Installation Source         | ~/.rvm/gems/ruby-2.3.3/bin/fastlane         |
| Host                        | Mac OS X 10.13 (17A365)                     |
| Ruby Lib Dir                | ~/.rvm/rubies/ruby-2.3.3/lib                |
| OpenSSL Version             | OpenSSL 1.0.2k  26 Jan 2017                 |
| Is contained                | false                                       |
| Is homebrew                 | false                                       |
| Is installed via Fabric.app | false                                       |
| Xcode Path                  | /Applications/Xcode.app/Contents/Developer/ |
| Xcode Version               | 9.0                                         |

*generated on:* **2017-09-30**

工程项目中 provisioning profile(以下简称pp文件),灵活运用了match这个action外加手动配置。

工程配置.png

错误描述:

error.png

看到了框框的那句话,刚开始以为是推送证书或者是provisioning profile的问题,然后手动在此执行了match,把证书什么的里里外外更新了一遍,发现还是不起作用。没办法,只能翻看github 看看issue,看看有木有类似的处理方案。

原因

功夫不负有心人,喵神大佬道破真相:
Xcode9将不会允许你访问钥匙串里的内容,除非设置allowProvisioningUpdates。

社会我喵神.png

所以说,在执行xcode -exportArchive的时候,因为权限访问钥匙串,所以无法读取到项目工程里的pp文件,进而打包失败,并且报错说缺少pp文件。

所以解决方法,在你的fastfile里gym action加入 allowProvisioningUpdates

gym(
    scheme: scheme,
    export_method: "ad-hoc",
    silent:true,
    output_directory:outputDirectory,
    output_name:ipaName,
    archive_path:outputDirectory,
    export_xcargs: "-allowProvisioningUpdates",
)

保存,再执行一次打包命令,请注意,这个时候xcode会弹窗让你确认,点一直允许就是了。特别注意的是,如果和我们公司一样的环境,那么那台远程打包的服务器,在更新完fastfile第一次跑的时候,要远程连接上去手动点击确认框,不然打包脚本就会一直卡在那里。

image.png

到此为止,Xcode9读取钥匙串权限的问题就结束了。

但是,你以为这样就结束了吗?就能打包成功了吗?

紧接着又是另外一个错误:


不匹配.png

WTF,明明打包方式是ad-hoc,但是匹配的pp文件确是AppStore的?😓😓

这必然是个坑

在此打开了官方文档看到了这么一句话

image.png
翻译一下,如果你们没用match这个action,来管理pp文件,我们推荐你在fastfile里面,自己定义一个map,指定bundleID 和 pp文件,以保证能够正常构建app。但是我在文章开头就po图了,我项目工程里的pp文件都是用match来管理的。所以刚开始,这段话被我忽略了。后续又是一阵在github issue上漫游。https://github.com/fastlane/fastlane/issues/10315 找到一个类似的问题。
既然bundleID,或者pp文件不对,那我能不能尝试着主动写死正确的bundleID和pp文件名,放进fastfile?

于是把gym加了个参数,不同环境下指定好:

        gym(
            scheme: scheme,
            export_method: "ad-hoc",
            silent:true,
            output_directory:outputDirectory,
            output_name:ipaName,
            archive_path:outputDirectory,
            export_xcargs: "-allowProvisioningUpdates",
            export_options: {
                provisioningProfiles: {
                    app_identifier => "match AdHoc #{app_identifier}"
                }
            }
        )

保存,重新run打包脚本,终于可以成功打包了😁😄。


oh yeah.png

简单说说Xcode8和9打包

笔者由于fastlane问题没解决,所以这期间打包工作都是手动完成的,Product - Archive然后等待Xcode自动打,这些操作相信大家都会的,不多说了。选择测试包之后,弹出框框问你是否瘦身,一般别管就是。然后重点来了,相比Xcode8多了这么个页面:

image.png
选择pp文件,从网络获取,Xcode必须要登录开发者账号,从账号里面拉取相关pp文件,还要自己选择是哪个。
image.png
平时的测试包选择“ad-hoc”就是,然后接着生产ipa。在Xcode8里,最终生成的一个ipa文件夹,里面就一个ipa,但是xcode9除了ipa之外,还有一些其他的东西,如下图。
image.png
除了ipa之外,有个东西引起了我的注意ExportOptions.plist 预览了一下这个plist,里面就记录了刚刚上几步的一些选择项。比如瘦身选项,还有个很关键的东西provisioningProfile这个字段是个dictionary。
image.png

难道没有一种似曾相识的赶脚?

再次看看这张图:


error.png

红框框的部分的最后,说的plist就是它。这个就是Xcode在导出ipa的时候一些参数。另外,手动Xcode打包和在终端里面敲 xcodebuild -archivePath,xcodebuild -exportArchive -exportOptionsPlist 本质是一样的,都是打包,参数就是同一个。
再回过头来,看看我们最终的解决方案,我们在gym中添加了一个字段,就是在写参数而已

export_options: {
                provisioningProfiles: {
                    app_identifier => "match AdHoc #{app_identifier}"
                }
            } 

可能原因

到这一步,在回头看看以上出现的bundleID和PP文件不匹配错误,在用match管理pp文件的前提下,有可能是因为Xcode9引起的问题,打包流程或者参数读写哪里有点变化,需要fastlane团队做进一步适配更新。上文中issue的链接状态到截止笔者写作完成之时,任是在open状态。所以这个原因有待关注,当然也希望能有大佬在指出原因,感激不尽~

至此为止,踩过的坑全部都填平了。不光是fastlane,用其他的一些工具或者第三方的时候还是要多多关注github上的issue,这里是块大大宝藏,等待被你挖掘!

相关文章

网友评论

  • 孤独感爆棚:你这边的服务器是mac吗?
    抢手的哥:@孤独感爆棚 肯定是
  • 君赏:楼主 我的签名 Swift 语言打包的 framework 抱错了
    抢手的哥:@Peter_Zhang 它不是写了么,'app_identifier' 不可用,检查你的脚步有没有定义
    Peter_Zhang:[!] Could not find action, lane or variable 'app_identifier'. Check out the documentation for more details: https://docs.fastlane.tools/actions我的加入了export_options这个之后就报错,问下是什么原因吗?
    抢手的哥:什么错误?你先根据错误的信息定位
  • paintingStyle:Fastfile文件配置如下:
    # 开始打包
    gym(
    #输出的ipa名称
    output_name:”#{scheme}_#{get_build_number()}”,
    #指定项目的scheme
    scheme:"#{scheme}",
    # 是否清空以前的编译信息 true:是
    clean:true,
    # 指定打包方式,Release 或者 Debug
    configuration:"Release",
    # 指定打包所使用的输出方式,目前支持app-store, package, ad-hoc, enterprise, development
    export_method:"ad-hoc",
    # 指定输出文件夹
    output_directory:"~/Desktop/fastlaneBuild",
    # Xcode9将不会允许你访问钥匙串里的内容,除非设置allowProvisioningUpdates。
    export_xcargs:"-allowProvisioningUpdates",
    # 隐藏没有必要的信息
    silent:true,
    export_options: {
    provisioningProfiles: {
    "com.tyfocg.app" => "tyfocgApp_ad_1009",
    }
    }
    )

    设置指定了证书,还是报错:
    error: exportArchive: Provisioning profile "tyfocgApp_release_1009" is not an "iOS Ad Hoc" profile.
    CoderMikeHe:gym(
    scheme: scheme,
    export_method: "ad-hoc",
    silent:true,
    output_directory:outputDirectory,
    output_name:ipaName,
    archive_path:outputDirectory,
    export_xcargs: "-allowProvisioningUpdates",
    export_options: {
    provisioningProfiles: {
    app_identifier => "match AdHoc #{app_identifier}"
    }
    }
    )

    这段代买具体写在Fastfile的那里呢。
    paintingStyle:成功了,导出设置必须添加到options扩展中
    抢手的哥:调用输出的log呢,对应关系对么?
  • 我把今生当成了来世:好文,jenkins+fastlane还是看的蒲公英的文档。
  • e17839d42eb6:前两天,使用fastlane 编译成功,然后上传到版本管理网站HockyApp 的时候,出现错误:
    ssl_connect returned=1 errno=0 state=error: certificate verify failed
    我已开始以为是网络不好,结果接下来几天都是这个错误
    在网上查一下,说是ruby 版本的的问题,什么证书问题...
    都试了,没有效果,想问一下,你又遇到类似情况嘛?
    e17839d42eb6:你好,最近遇到一个使用HockeyApp 上传失败的问题,Jenkins 已经显示成功编译并创建 .ipa,uploading to HockeyApp,但是总是会收到 Net::ReadTimeout,然后HockeyApp 里会有新的版本,但是新版本下载打不开,在launch 界面就会崩溃……
    你遇到过类似的问题么?:confounded:
    e17839d42eb6:@抢手的哥 你好,上传的action,在哪里控制啊,Fastfile 里没看到啊
    抢手的哥:@afraidiot 这个是你上传网络请求https适配的问题,你检查一下你上传的action。
  • e17839d42eb6:下周编译电脑就要升级到Xcode9,看了之后感觉背后一凉...
    我没使用match管理pp文件,直接手动选择的...
    到时候看看会遇到什么坑吧:joy::joy:
    e17839d42eb6:@抢手的哥 但是我有不祥的预感:joy::joy:
    抢手的哥:@afraidiot 祝你好运
  • 4ed059837eca:你好,我在xcode 9下打包,一直报错,怎么解决
    xcodebuild.sh: line 96: 15879 Segmentation fault: 11 xcodebuild -exportArchive -archivePath "$archive_file" -exportPath "$ipa_file" -exportOptionsPlist "$plist_file" -allowProvisioningUpdates
    抢手的哥:没看到报错的原因
  • paintingStyle:[19:03:35]: fastlane finished with errors

    [!] Error packaging up the application

    #######################################################################
    # fastlane 2.61.0 is available. You are on 2.59.0.
    # You should use the latest version.
    # Please update using `fastlane update_fastlane`.
    #######################################################################

    2.61.0 Lots of improvements


    我使用fastlane update_fastlane不能更新到最新的版本,显示未检测到更新

    paintinyledeMBP:tyfocg_app rzj$ fastlane update_fastlane
    Updating installed gems
    Nothing to update
    Cleaning up installed gems...
    Clean Up Complete
    抢手的哥:@paintingStyle bundle update fastlane 试试
    paintingStyle:@抢手的哥 使用你的方法后

    Successfully installed fastlane-2.61.0
    1 gem installed

    paintinyledeMBP:~ rzj$ fastlane -version
    +-----------------------+---------+--------+
    | Used plugins |
    +-----------------------+---------+--------+
    | Plugin | Version | Action |
    +-----------------------+---------+--------+
    | fastlane-plugin-pgyer | 0.2.1 | pgyer |
    +-----------------------+---------+--------+

    fastlane 2.59.0
    paintinyledeMBP:~ rzj$
    抢手的哥:gem install fastlane -NV
  • 印第安的老斑鸠:正在使用fastlane,还没升级到Xcode9,留以填坑...
    抢手的哥:@印第安的老斑鸠 :smile::smile:有其他坑可以再拉出来交流交流
  • zhangPeng丶:666 写的很详细,学习了!
    抢手的哥:谢谢支持:smile:

本文标题:当Fastlane遇到Xcode9打包出来不一定是ipa而是坑

本文链接:https://www.haomeiwen.com/subject/ilkgextx.html