iOS技术栈程序员iOS Developer

脚本化生成 ipa 并上传至第三方托管

2018-06-17  本文已影响80人  申申申申申

简介

项目进行一定阶段的时候,需要给团队中的QA同学(但不局限于QA)安装app

有时候修复了几个bug后,瞬间七八个手机飞到面前,感觉像是医生给病人打针一样,biu~ 下一个~ biu~ 下一个~ biu~ 下一个~ biu~ 下一个~ biu~ 下一个~...

一般可以把测试版的app放到第三方托管网站上(比如笔者使用的蒲公英),打包后可以把ipa上传,然后需要安装的同学可以直接扫码或者safari打开链接安装即可

然后就变成了,打包 --> 上传

偶尔几次倒还可以接受,但机械重复的动作总是让人烦躁

于是乎,只能抽时间研究研究自动化脚本(一个命令执行打包成ipa,并上传到蒲公英)


环境

笔者环境


关键点分析,一些相关命令说明,时间紧的同学可以直接拖到源码部分

可以 $ man xcodebuild

  1. Xcode中如果执行command b 或者 command r时候,其实相当于先执行xcodebuild,然后xcrun(实际操作中,会出现问题,见下文问题总结)或者 xcodebuild -exportArchive
  2. xcodebuild命令
    首先cd到项目根目录
ff:ff fengfeng$ xcodebuild -version
Xcode 9.3
Build version 9E145
ff:ff fengfeng$
 ff:ff fengfeng$ xcodebuild -list
 Information about project "***":
 Targets:
     ff

 Build Configurations:
     Debug
     Release
     discribution

 If no build configuration is specified and -scheme is not passed then "Release" is used.

 Schemes:
     ff

 ff:ff fengfeng$ 
 ff:ff fengfeng$ xcodebuild -showsdks  
 iOS SDKs:
 iOS 11.3                        -sdk iphoneos11.3

 iOS Simulator SDKs:
 Simulator - iOS 11.3            -sdk iphonesimulator11.3

 macOS SDKs:
 macOS 10.13                     -sdk macosx10.13

 tvOS SDKs:
 tvOS 11.3                       -sdk appletvos11.3

 tvOS Simulator SDKs:
 Simulator - tvOS 11.3           -sdk appletvsimulator11.3

 watchOS SDKs:
 watchOS 4.3                     -sdk watchos4.3

 watchOS Simulator SDKs:
 Simulator - watchOS 4.3         -sdk watchsimulator4.3
 ff:ff fengfeng$ 
xcodebuild build -workspace ***.xcworkspace \
-scheme *** \
-configuration Debug \
-sdk iphoneos11.3
参数 说明
-workspace ***.xcworkspace 工作空间文件
-scheme *** 构建工程名称
-configuration [Debug/Release] 构建Debug或者Release
-sdk iphoneos11.3 指定编译时使用的SDK
xcodebuild archive -archivePath /***/*** \
-workspace ***.xcworkspace \
-scheme *** \
-configuration Debug \
-sdk iphoneos11.3
参数 说明
-archivePath /***/*** 保存生成.xcarchive包的路径
-workspace ***.xcworkspace 工作空间文件
-scheme *** 构建工程名称
-configuration [Debug/Release] 构建Debug或者Release
-sdk iphoneos11.3 指定编译时使用的SDK
xcodebuild -exportArchive \
-archivePath /xx/xx/xx.xcarchive \
-exportPath /xx/xx/xx \
-exportOptionsPlist /xx/xx/xx.plist
参数 说明
-archivePath xcodebuild archive [-optionName ...] 编译生成. xcarchive
-exportPath 导出的ipa保存的目录
-exportOptionsPlist 导出时 需要的 配置文件的 路径
  1 <?xml version="1.0" encoding="UTF-8"?>
  2 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
  3 <plist version="1.0">
  4 <dict>
  5         <key>compileBitcode</key>
  6         <false/>
  7         <key>method</key>
  8         <string>development</string>
  9         <key>provisioningProfiles</key>
 10         <dict>
 11                 <key>com.***</key>
 12                 <string>***</string>
 13         </dict>
 14         <key>signingCertificate</key>
 15         <string>iPhone Developer</string>
 16         <key>signingStyle</key>
 17         <string>manual</string>
 18         <key>stripSwiftSymbols</key>
 19         <true/>
 20         <key>teamID</key>
 21         <string>***</string>
 22         <key>thinning</key>
 23         <string>&lt;none&gt;</string>
 24 </dict>
 25 </plist>
xcodebuild clean -workspace ***.xcworkspace \
-scheme *** \
-configuration Debug \
-sdk iphoneos11.3
参数 说明
-workspace ***.xcworkspace 工作空间文件
-scheme *** 构建工程名称
-configuration [Debug/Release] 构建Debug或者Release
-sdk iphoneos11.3 指定编译时使用的SDK
  1. 编译和提取ipa的主要命令就是👆介绍的,现在说明下如何将打包好的ipa上传到蒲公英
    a. 准备 API Key User Key password
    如何查看 API Key User Key:登录蒲公英 - 右上角 - 账户设置 - API 信息

    b. 使用如下命令,注意file=后面的@

    curl -F "file=@/***/***/***.ipa" \
    -F "uKey=user_key" \
    -F "_api_key=api_key" \
    -F "password=pwd" \
    https://qiniu-storage.pgyer.com/apiv1/app/upload 
    

    c. 如果上传后,会返回一串json,错误说明,或者成功信息
    上传成功后返回的数据,格式化后如下

     {
         "code":0,
         "message":"",
         "data":{
             "appKey":"***",
             "userKey":"***",
             "appType":"1",
             "appIsLastest":"1",
             "appFileSize":"***",
             "appName":"***",
             "appVersion":"1.3",
             "appVersionNo":"1",
             "appBuildVersion":"6",
             "appIdentifier":"***",
             "appIcon":"***",
             "appDescription":"***",
             "appShortcutUrl":"***",
             "appCreated":"2018-06-17 22:03:56",
             "appUpdated":"2018-06-17 22:03:56",
             "appQRCodeURL":"***"
         }
     }
    

源码

使用复制下面源码,将各种路径和配置依据实际情况配置正确,然后终端执行即可
默认生成的是Develop版本,因为笔者公司提交app store要求专人打包
使用前 需要提前 切换好分支或者 git pull

哈哈,从此,一键上传,然后把生成的链接或者二维码给相关同学即可,再也不用,一个手机一个手机的打针了 ~

#!/bin/bash

scheme_name=***
branch_name=develop
configuration=Develop
date=`date +%Y%m%d_%H%M%S`

# 项目根路径
source_path="/***/***/"
# 打包生成的文件 所在的文件夹
ipa_root_path="/***/***"
# .xcarchive 文件所在的文件夹
ipa_build_path=$ipa_root_path"/build/"
# 生成的 .xcarchive文件 (不带后缀 .xcarchive)
ipa_build_result_path=$ipa_build_path$date
# 打包成功后生成的文件夹名,由分支、时间组成
ipa_name=$branch_name"_"$date
# -exportOptionsPlist 需要的 plist 文件的路径
plist_path="/***/***/***.plist"

# 如果有 .xcarchive 文件,移动至垃圾桶 或者 删除之
if ! [ "`ls $ipa_build_path`" = "" ]; then  
    # mv $ipa_build_path/* ~/.Trash
    rm -rf $ipa_build_path/*
    if [ $? -ne 0 ]; then
        echo "~~~~~~~~ delete files failed ~~~~~~~~"
        exit 1
    fi
fi

# build ***.xcworkspace

# 已废弃
# xcodebuild \
# -workspace $source_path"/"$scheme_name".xcworkspace" \
# -scheme $scheme_name \
# -configuration Debug \
# clean \
# build \
# -derivedDataPath $ipa_build_result_path

xcodebuild \
archive -archivePath $ipa_build_result_path \
-workspace $source_path$scheme_name".xcworkspace" \
-scheme $scheme_name \
-configuration $configuration

if [ -e $ipa_build_result_path".xcarchive" ]; then
    echo "~~~~~~~~ xcodebuild successful ~~~~~~~~"
else 
    echo "~~~~~~~~ xcodebuild failed ~~~~~~~~"
    exit 1
fi

# xcrun ***.ipa
# 已废弃
# xcrun -sdk iphoneos PackageApplication \
# -v $ipa_build_result_path/Build/Products/Debug-iphoneos/$scheme_name.app \
# -o $ipa_path/$ipa_name

xcodebuild -exportArchive \
-archivePath $ipa_build_result_path.xcarchive \
-exportPath $ipa_root_path/$ipa_name \
-exportOptionsPlist $plist_path

if [ -e $ipa_root_path/$ipa_name ]; then
    echo -e "creat ipa successful\n"
    open $ipa_root_path/$ipa_name
else
    echo "creat ipa failed"
    exit 1
fi

# 上传至蒲公英
# ipa路径
pgy_ipa_path=$ipa_root_path/$ipa_name/$scheme_name".ipa"
pgy_api_key="***"
pgy_user_key="***"
pgy_pwd="***"

echo "-------->>>>>> 上传ipa到蒲公英 <<<<<<--------"  

curl -F "file=@${pgy_ipa_path}" \
-F "uKey=${pgy_user_key}" \
-F "_api_key=${pgy_api_key}" \
-F "password=${pgy_pwd}" \
https://qiniu-storage.pgyer.com/apiv1/app/upload 

if [ $? = 0 ]; then  
    echo -e "\n"
    echo "-------->>>>>> 上传蒲公英成功 <<<<<<--------"  
else  
    echo -e "\n"
    echo "-------->>>>>> 上传蒲公英失败 <<<<<<--------"  
fi 

效果图

遇到的问题
  1. xcrun: error: unable to find utility "PackageApplication", not a developer tool or in PATH creat ipa failed
    Xcode 8.3移除了PackageApplication,使用archive
    或者 参考:https://stackoverflow.com/questions/43068608/xcrun-error-unable-to-find-utility-packageapplication-not-a-developer-tool/43185342

2.requires a provisioning profile
exportOptionsPlist文件格式错误,缺少provisioningProfiles
可以正常手动打包,并且导出为对应的ipa,然后在生成的ipa所在的文件中有ExportOptions.plist文件,可以使用这个即可

error: exportArchive: "***.app" requires a provisioning profile with the Associated Domains and Push Notifications features.

Error Domain=IDEProvisioningErrorDomain Code=9 ""***.app" requires a provisioning profile with the Associated Domains and Push Notifications features." UserInfo={NSLocalizedDescription="***.app" requires a provisioning profile with the Associated Domains and Push Notifications features., NSLocalizedRecoverySuggestion=Add a profile to the "provisioningProfiles" dictionary in your Export Options property list.}

** EXPORT FAILED **

不定期更新 不合适的地方 还请指点~ 感激不尽

上一篇下一篇

猜你喜欢

热点阅读