chenzhao

  • java
  • iOS
  • IT
知识积累
不积跬步无以至千里
  1. 首页
  2. iOS
  3. 正文

IOS自动打包研究

2016年 11月 10日 95点热度 0人点赞 0条评论

//自动打包sh https://github.com/jkpang/PPAutoPackageScript

注 最后问题解决使用手动导出的plist文件 并且 把
<key>compileBitcode</key> <false/>
为false 就能打包成功了

xcode 9 了 自动打包也出现问题了, 找到一个文章: 注 但是我这里打包还是出问题,但是离成功更近一步

From: http://www.jianshu.com/p/9bae9e433035

Xcode

是不是很开心终于升级Xcode9了。
是不是上传Fir发现错误内心崩溃了。
是不是在满大街查找解决方法。

自动上传脚本,保存到项目的目录下,使用sh *.sh -u 进行上传,其中的fir的token和项目的名称需要修改,其他的等报错再修改吧。详见如下:

#/bin/sh
#coding utf-8
#上传模块需要FIR.im CLI 
#安装gem install fir-cli
#token 获取 http://fir.im/user/info

#安静模式,不输出多余log
quiet=1

while getopts "huv" arg #选项后面的冒号表示该选项需要参数
do
    case arg in
         t)
            echo "t's arg:OPTARG" #参数存在OPTARG中
            ;;
         u)
            upload=1
            ;;
         v)
            quiet=0
            ;;

         h)
            echo Commands:
            echo"   make -u        #build ipa and upload fir.im"
            ;;
         ?)  #当有不认识的选项的时候arg为?
        echo "unkonw argument"
    ;;
    esac
done

token="需要替换"  #token 获取 http://fir.im/user/info

echo '--------------start----------------'
echo '>> clean...'
proj=(cd (dirname{0}) ; pwd -P)
xcodebuild clean 1>/dev/null
project=需要替换
product="proj/build/project.ipa"
rm product

echo '>> build...'
if [[quiet == 1 ]]
then
    xcodebuild -workspace "project.xcworkspace" -scheme "project" archive -archivePath proj/build/project.xcarchive -configuration Ad-hoc -sdk iphoneos >/dev/null
else
    xcodebuild -workspace "project.xcworkspace" -scheme "project" archive -archivePath proj/build/project.xcarchive -configuration Ad-hoc -sdk iphoneos
fi

echo '>> create ipa...'

xcodebuild -exportArchive -archivePath proj/build/project.xcarchive -exportOptionsPlist exportOptions.plist -exportPath "proj/build"

#copy dsym to xcarchives
echo '>> archive dsym...'
if [[ -dproj/build/project.xcarchive ]]
then
    filename=(date "+%Y%m%d%H%M.%S")
    mkdir -p "proj/build/archives"
    cp -rproj/build/project.xcarchive/ "proj/build/archives/filename.xcarchive"
    cp "product" "proj/build/archives/filename.xcarchive"
fi

if [[ upload == 1 ]] && [[ -f "product" ]]
then
    fir l token
    fir p "product"
    clear
    fir i "product"
else
    open "proj/build"
fi

使用之前的Fir自动上传脚本,突然发现报错了,可在升级Xcode 9之前明明还是好的呢,So 只能想办法解决。先看下报错日志:

2017-09-20 14:22:07.140 xcodebuild[31386:364151] [MT] IDEDistribution: Step failed: <IDEDistributionSigningAssetsStep: 0x7f8cdcc95b90>: Error Domain=IDEDistributionSigningAssetStepErrorDomain Code=0 "Locating signing assets failed." UserInfo={NSLocalizedDescription=Locating signing assets failed., IDEDistributionSigningAssetStepUnderlyingErrors=(
    "Error Domain=IDEProvisioningErrorDomain Code=9 \"\"name.app\" requires a provisioning profile with the Push Notifications feature.\" UserInfo={NSLocalizedDescription=\"name.app\" requires a provisioning profile with the Push Notifications feature., NSLocalizedRecoverySuggestion=Add a profile to the \"provisioningProfiles\" dictionary in your Export Options property list.}"
)}
error: exportArchive: "name.app" requires a provisioning profile with the Push Notifications feature.

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

** EXPORT FAILED **

第一反应是不是重新制作一遍Push证书,是的吧。我也是这样想的,然后发现然并卵。

自动脚本发现不可行时,我想到的方法是那只能手动了。选择相应的Build Configuration进行Building生成*.app.

切换编译配置

切换编译配置

然后获取到_.app,将这个文件拖到iTunes上进行_.app转*.ipa,是吧。

这个一个坑啊。,你会发现怎么找不到“应用程序”的选项啊。
iTunes的最新版本已经将app Store的功能取消了,已经没有应用程序的选项了。折磨了大半天,发现None is None。

最后只能使用最后的方法了,使用Xcode的Archive再导出ipa包。与上传App Store的方法类似。(不会给我留言哈)
最后生成的文件有:

ipa文件

ipa文件

将生成的*.ipa文件上传到Fir上,工作完成。

首先是不是觉得怎么多了3个文件啊,呵呵哒。这就是Xcode的改变啊。主要变化是多了ExportOptions文件,这个应该与之前的报错有关。
其次找到了自动上传的方法了,将这个ExportOptions的文件放到项目中,我的目录是

9BCA754A-C6AF-4529-9360-8453E0ADD652.png

9BCA754A-C6AF-4529-9360-8453E0ADD652.png

然后在执行自动化上传Fir脚本成功。

发现在Xcode 9中,exportOptions.plist的变化,

之前

之前

之后

之后

之后

主要多了provisioningProfiles, signingCertificate和signingStyle。针对自动化脚本的报错,应该是少了provisioningProfiles的属性。
按图片手动添加所有属性就可以执行成功了,当然你也可以先使用Xcode导出一次获取到exportOptions.plist文件。

每次升级系统或Xcode都会有一天的时间是在等待和解决问题。今天iOS11 还碰到了因为使用了WebViewJavascriptBridge第三方库导致奔溃的问题,又是忙了一阵,解决方法:

WebViewJavascriptBridgeBase *base = [[WebViewJavascriptBridgeBase alloc] init];
        if ([base isWebViewJavascriptBridgeURL:navigationAction.request.URL]) {
            DLog(@"isWebViewJavascriptBridgeURL is YES.");
            return;
        }
decisionHandler(WKNavigationActionPolicyAllow);

END


最近在发现每次打开发包测试非常的耗时和麻烦 , 发布包就无所谓了现在需求就一个包,
然后研究了下自动打包,google 了一番各种尝试 然后实行了一个方法

#!/bin/bash

SCHEMENAME=boosjdance
BRANCHNAME=develop

DATE=(date +"%Y_%m_%d_%H_%M_%S")
SOURCEPATH=( cd "( dirname0 )" && pwd)
#打包ipa 文件目录
IPAPATH=SOURCEPATH/AutoBuildIPA/BRANCHNAME/DATE
#打包ipa 文件名字
IPANAME=boosjdance_DATE.ipa

#delete trash files
if [ -e IPAPATH/* ]; then
	mvIPAPATH/* ~/.Trash
	if [ ? -ne 0 ]; then
		echo "error : delete trash files!!"
		exit 1
	fi
fi

# build boosjdance
xcodebuild \
-workspaceSOURCEPATH/boosjdance.xcworkspace \
-scheme SCHEMENAME \
-configuration Debug \
clean \
build \
-derivedDataPathIPAPATH
if [ -e IPAPATH ]; then
	echo "xcodebuild Successful"
else
	echo "error:Build failde!!"
	exit 1

fi

#xcrun .ipa

xcrun -sdk iphoneos PackageApplication \
	-vIPAPATH/Build/Products/Debug-iphoneos/SCHEMENAME.app \
	-oIPAPATH/IPANAME

if [ -eIPAPATH/IPANAME ]; then
	echo "\n ---------------------------------------\n\n\n"
	echo "configuration! build SuccessFul!"
	echo "\n-----------------------------\n\n"
	echo "Current Branch log:"
	openIPAPATH
else
	echo "\n-----------------------------\n"
	echo "error:IPA failed!"
	echo "\n------------------------\n"
fi

build.sh 文件,放在项目目录
cd 到目录 sh build.sh
运行
OK了,发现很多文章说配置文件的路径 和名字问题, 这个sh 没有这样的配置,还能是默认的,反正实现了我的自动打包,以后在研究 ,


优化了下代码打包正式包 ,

#!/bin/bash
#xcodebuild -list 可查
SCHEMENAME=boosjdance
# 文件地址
BRANCHNAME=develop

DATE=(date +"%Y_%m_%d_%H_%M_%S")
SOURCEPATH=( cd "( dirname0 )" && pwd)
#打包ipa 文件目录
IPAPATH=SOURCEPATH/AutoBuildIPA/BRANCHNAME/DATE
#打包ipa 文件名字
IPANAME=boosjdance_DATE.ipa

#delete trash files
if [ -e IPAPATH/* ]; then
	mvIPAPATH/* ~/.Trash
	if [ ? -ne 0 ]; then
		echo "error : delete trash files!!"
		exit 1
	fi
fi
#1 (发现传入不了写死 后面会根据这个参数去判断path路径)表示传入的第一个参数,启动脚本传入Debug或者Release就可以
CONGRUATION=Debug

# 下面两个可写 可不写 ,写在 configuration 下面 可以定义参数判断是正式的还是测试的
# 因为是自己可以自动识别就不写了位置在xcode 上找到相应的位置上看设置 注,写了报错
#CODE_SIGN_IDENTITY="iPhone Developer: Cheng'en hu (xxxxxxxxx)"  \
#PROVISIONING_PROFILE="boosjdance" \
# build boosjdance
xcodebuild \
-workspace SOURCEPATH/boosjdance.xcworkspace \
-schemeSCHEMENAME \
-configuration CONGRUATION \
clean \
build \
-derivedDataPathIPAPATH
if [ -e IPAPATH ]; then
	echo "xcodebuild Successful"
else
	echo "error:Build failde!!"
	exit 1

fi

#xcrun .ipa

if [CONGRUATION == Debug ]; then
	IPhoneosPath=Debug-iphoneos
else
	IPhoneosPath=Release-iphoneos
fi
xcrun -sdk iphoneos PackageApplication \
	-v IPAPATH/Build/Products/IPhoneosPath/SCHEMENAME.app \
	-oIPAPATH/IPANAME

if [ -eIPAPATH/IPANAME ]; then
	echo "\n ---------------------------------------\n\n\n"
	echo "configuration! build SuccessFul!"
	echo "\n-----------------------------\n\n"
	echo "Current Branch log:"
	openIPAPATH
else
	echo "\n-----------------------------\n"
	echo "error:IPA failed!"
	echo "\n------------------------\n"
fi

迷你版本无打包方式不同

WORKSPACE="boosjdance.xcworkspace"
SCHEME="boosjdance"
#  Release or Debug
CONFIGURATION="Debug"
RELEASE_BUILDDIR="Build/Products/Debug-iphoneos"
APPLICATION_NAME="boosjdance"
# 输出目录
BUILD_OUTPUT_DIR="buildOutput"
# 描述文件名
PROVISONING_PROFILE="boosjdance"

rm -rf BUILD_OUTPUT_DIR 
mkdirBUILD_OUTPUT_DIR
xcodebuild -workspace WORKSPACE -schemeSCHEME -configuration CONFIGURATION clean
xcrun agvtool new-version -all "{BUILD_NUMBER}"
xcodebuild -workspace WORKSPACE -schemeSCHEME -configuration CONFIGURATION archive -archivePath "{BUILD_OUTPUT_DIR}/{APPLICATION_NAME}.xcarchive"
cdBUILD_OUTPUT_DIR
7z a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=on "{APPLICATION_NAME}.xcarchive.7z" "{APPLICATION_NAME}.xcarchive"
cd ..
xcodebuild -exportArchive -exportFormat IPA -exportProvisioningProfile "{PROVISONING_PROFILE}" -archivePath "{BUILD_OUTPUT_DIR}/{APPLICATION_NAME}.xcarchive" -exportPath "{BUILD_OUTPUT_DIR}/${APPLICATION_NAME}.ipa"

2016 双11 更新
自动上传fir.im
安装

gem install fir-cli

要是证书问题自行搜索,我重新安装了下更新了下ssl ok了

上传代码跟在上面的后面

# 上传ipa 包
export LANG=en_US
export LC_ALL=en_US;
echo "正在上传到fir.im...."
echo "IPAPATH/IPANAME"
#####http://fir.im/api/v2/app/appID?token=APIToken,里面的appID是你要上传应用的appID,APIToken是你fir上的APIToken
fir p IPAPATH/IPANAME
curl -X PUT --data "更新日志=$IPANAME" http://fir.im/api/v2/app/5822c666ca87a86919000b6b?token=d929e94bd98485d7c056509ab5f3990f
echo "\n打包上传更新成功!"

-- #############上传到蒲公英##############

# 上传ipa 包 蒲公英
#上传蒲公英
curl -F "file=@{BUILD_OUTPUT_DIR}/{BUILD_OUTPUT_DIR2}/${APPLICATION_NAME}.ipa" \
-F "uKey=xxxxxxx" \
-F "_api_key=xxxx" \
https://www.pgyer.com/apiv1/app/upload
echo "\n打包上传更新完成 具体看日志!"

发现fir.im 需要ruby 2.2.4 版本 出了一个ssl 错误, 然后升级版本改了pem 文件好了 但是还是觉得是ruby 版本的问题

参考原文简书:
http://www.jianshu.com/p/97c97c2ec1ca

标签: 暂无
最后更新:2022年 11月 11日

陈昭

IT 程序员

打赏 点赞
< 上一篇
下一篇 >

文章评论

取消回复

COPYRIGHT © 2022 chenzhao. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang