别的wwW64xc咋99热com找不到怎么弄64xccom可以正常收视的地了

未找到信息!
未找到信息!
收录 / 索引信息
未找到信息!
创新作文大赛
一般不超过80字符
网站关键词
一般不超过100字符
一般不超过200字符
同主机安全
虚假或欺诈网站
挂马或恶意网站
未存在违规内容
alexa排名趋势
服务器信息
服务器类型
源文件大小
压缩后大小
最后修改时间
关闭关闭关闭[iOS]从零开始写个自动打包IPA脚本 - 简书
[iOS]从零开始写个自动打包IPA脚本
新项目这边每次版本移交,
给测试都是直接xcode挨个拿手机安装的流程.
一次两次还好,天天这么搞,而且每次一大波手机扔过来,瞬间觉得,自己好像是个疫苗注射员似的,顺次给每个手机打一针.
于是..我崩溃了..
是在是看不下去了,于是准备写个脚本以后自己打包,测试直接下载就好了.
那么怎么实现这么一个事情呢?
其实上一家公司,做个类似的东西,虽不是我做的,但是大体流程还是知道的:
写个bash脚本,执行自动打包iOS版本,到指定的目录 (有条件的公司,可以自己搭个小服务器,这样谁都可以随时随地的打包)
将打包好的文件上传到fir.im (当然上传到自己公司的服务器或者任何地方都行,只是fir.im我一直用,觉得比较方便)
开发一个内部使用的类似APPStore,上面放着自己公司的所有APP,每次有更新的时候,测试童鞋直接通过这个自己下载新APP就可以了
1. 准备背景知识
其实当我们Xcode点击了build或者运行comand+R之后,Xcode自己执行的命令是xcodebuild这条命令.
然后,编译好之后,怎么生产ipa包?
用xcrun命令
话不多说,先上手:
打开终端,cd到你的工程位置,然后先试一下xcodebuild命令,
chengpoleness@polen xcodebuild_iPA $ xcrun --version
xcrun version 29.
//xcodebuild
chengpoleness@polen ios (develop) $ xcodebuild -version
Build version 7D175
看上去很简单,大概了解了一下,就开始用:
chengpoleness@polen ios (develop) $ xcodebuild
13:05:04.623 xcodebuild[] [MT] PluginLoading: Required plug-in compatibility UUID ACA8656B-FEA8-4B6D-8E4A-93F4C95C362C for plug-in at path '~/Library/Application Support/Developer/Shared/Xcode/Plug-ins/XcodeColors.xcplugin' not present in DVTPlugInCompatibilityUUIDs
13:05:04.625 xcodebuild[] [MT] PluginLoading: Required plug-in compatibility UUID ACA8656B-FEA8-4B6D-8E4A-93F4C95C362C for plug-in at path '~/Library/Application Support/Developer/Shared/Xcode/Plug-ins/OMColorSense.xcplugin' not present in DVTPlugInCompatibilityUUIDs
=== BUILD TARGET xxx OF PROJECT xxx WITH THE DEFAULT CONFIGURATION (Release) ===
Check dependencies
Write auxiliary files
write-file /Users/chengpoleness/Documents/code/xxx/ios/build/xxx.build/Release-iphoneos/xxx.build/xxx.hmap
write-file /Users/chengpoleness/Documents/code/xxx/ios/build/xxx.build/Release-iphoneos/xxx.build/xxx-own-target-headers.hmap
write-file /Users/chengpoleness/Documents/code/xxx/ios/build/xxx.build/Release-iphoneos/xxx.build/Script-492BA63FB67F55.sh
接着满屏的快速滚动,可以看到clang依次在编译各个文件,登录大概十几秒闪屏,然后失败了!!!?
ld: library not found for -lPods
clang: error: linker command failed with exit code 1 (use -v to see invocation)
** BUILD FAILED **
The following build commands failed:
Ld build/xxx.build/Release-iphoneos/xxx.build/Objects-normal/armv7/xxx normal armv7
Ld build/xxx.build/Release-iphoneos/xxx.build/Objects-normal/arm64/xxx normal arm64
(2 failures)
这个就是找不到pods了,
为什么会这样?
自己直接用Xcode 亲自product-archive 了一遍,okey啊,没出现任何问题!
那是为什么呢?
各种goole,stackoveflow,但是基本说的是不要只打开project,而是打开workspace,其实这个是针对直接用xcode进行编译或者打包的时候,出现问题的解决方案,
然后尝试了其他解决方案,诸如ONLY_ACTIVE_ARCHS = NO等,都无效.
最终在下面这篇文章里,找到了灵感:
其实解决方案很简单,执行xcodebuild需要指定你所需要对应的workspace和scheme
所以命令如下:
xcodebuild -workspace /Users/chengpoleness/Documents/code/xxx/ios/xxx.xcworkspace -scheme xxx
执行前,先查看下-list,这个可以知道xcodebuild命令下对应的参数需要填写的内容
chengpoleness@polen ios (develop) $ xcodebuild -list
15:24:26.656 xcodebuild[] [MT] PluginLoading: Required plug-in compatibility UUID ACA8656B-FEA8-4B6D-8E4A-93F4C95C362C for plug-in at path '~/Library/Application Support/Developer/Shared/Xcode/Plug-ins/XcodeColors.xcplugin' not present in DVTPlugInCompatibilityUUIDs
15:24:26.661 xcodebuild[] [MT] PluginLoading: Required plug-in compatibility UUID ACA8656B-FEA8-4B6D-8E4A-93F4C95C362C for plug-in at path '~/Library/Application Support/Developer/Shared/Xcode/Plug-ins/OMColorSense.xcplugin' not present in DVTPlugInCompatibilityUUIDs
Information about project "xxx":
Build Configurations:
If no build configuration is specified and -scheme is not passed then "Release" is used.
然后,成功了,如下:
chengpoleness@polen ios (develop) $ xcodebuild -workspace /Users/chengpoleness/Documents/code/xxx/ios/xxx.xcworkspace -scheme xxx
15:26:29.627 xcodebuild[] [MT] PluginLoading: Required plug-in compatibility UUID ACA8656B-FEA8-4B6D-8E4A-93F4C95C362C for plug-in at path '~/Library/Application Support/Developer/Shared/Xcode/Plug-ins/XcodeColors.xcplugin' not present in DVTPlugInCompatibilityUUIDs
15:26:29.629 xcodebuild[] [MT] PluginLoading: Required plug-in compatibility UUID ACA8656B-FEA8-4B6D-8E4A-93F4C95C362C for plug-in at path '~/Library/Application Support/Developer/Shared/Xcode/Plug-ins/OMColorSense.xcplugin' not present in DVTPlugInCompatibilityUUIDs
=== BUILD TARGET Pods OF PROJECT Pods WITH CONFIGURATION Debug ===
Check dependencies
=== BUILD TARGET xxx OF PROJECT xxx WITH CONFIGURATION Debug ===
Check dependencies
PhaseScriptExecution Check\ Pods\ Manifest.lock /Users/chengpoleness/Library/Developer/Xcode/DerivedData/xxx-djwnuzytnxhekrhjhypwxdqrxtet/Build/Intermediates/xxx.build/Debug-iphoneos/xxx.build/Script-492BA63FB67F55.sh
Validate /Users/chengpoleness/Library/Developer/Xcode/DerivedData/xxx-djwnuzytnxhekrhjhypwxdqrxtet/Build/Products/Debug-iphoneos/xxx.app
cd /Users/chengpoleness/Documents/code/xxx/ios
export PATH="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/Users/chengpoleness/.rvm/gems/ruby-2.0.0-p598/bin:/Users/chengpoleness/.rvm/gems/ruby-2.0.0-p598@global/bin:/Users/chengpoleness/.rvm/rubies/ruby-2.0.0-p598/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/chengpoleness/.rvm/bin:/usr/local/marven/apache-maven-3.3.9/bin:/Users/chengpoleness/Library/Android/sdk/platform-tools:/Users/chengpoleness/Library/Android/sdk/tools"
export PRODUCT_TYPE=com.apple.product-type.application
builtin-validationUtility /Users/chengpoleness/Library/Developer/Xcode/DerivedData/xxx-djwnuzytnxhekrhjhypwxdqrxtet/Build/Products/Debug-iphoneos/xxx.app
** BUILD SUCCEEDED **
关于xcode的project的架构图:
15.49.27.png
(挑重点地说) 大致流程就是:
2.1 先git 指令,pull到最新的分支
这个很简单,没什么好说的了.
git clean -df
git reset --hard
git checkout $BRANCHNAME
git pull --rebase origin $BRANCHNAME
echo "即将打包的分支log如下:"
git log -5
pod update --verbose --no-repo-update
不过这几个指令,带有删除性,比如git clean -df,git reset 这种,所以用的时候要谨慎,如果你把脚本放在自己的工程目录下,就可能一不小心脚本就被删掉了(亲历者说...?)
所以最终版本改成了
# git update
git checkout $BRANCHNAME
if [ $? -ne 0 ]; then
#pod update --verbose --no-repo-update
if [ $? -ne 0 ]; then
只保留了checkout 和pull, pod没有用,是因为我们这边除了googleMap其他全是自造轮子,所以...并不需要?.
2.2 xcodebuild进行编译
xcodebuild \
-workspace $SORCEPATH/xxx.xcworkspace \
-scheme $SCHEMENAMEPLQ \
-configuration Debug \
CODE_SIGN_IDENTITY="iPhone Developer: xxxx(T8TXPM5FC7)"
PROVISIONING_PROFILE="5110ff0a-b845-475e-a4xxxxxxxxxx" \
-derivedDataPath $IPAPATH/$BRANCHNAME/$DATE
我这边因为是研发阶段,所以打包是debug包,如果是要打release 包,configuration中修改成Release,以及其他对应的修改下就行.
2.3 成功后xcrun打包成ipa包
xcrun -sdk iphoneos PackageApplication \
-v $IPAPATH/Build/Products/Debug-iphoneos/$SCHEMENAME.app \
-o $IPAPATH/$IPANAME
最终脚本如下:
下午8.20.47.png
打包的文件命名我是按照时间来命名的,这样也方便找,尤其应对于可能分分钟就要突然来打包的测试团队.
3. 生成ipa包,上传到fir.im
3.1 fir比较好,有命令可以直接上传,但是需先安装fir-cli
安装过程如下:
chengpoleness@polen xcodebuild_iPA $ gem install fir-cli
Fetching: chunky_png-1.3.5.gem (100%)
Successfully installed chunky_png-1.3.5
Fetching: rqrcode-0.10.1.gem (100%)
Successfully installed rqrcode-0.10.1
______________
/ // /_/ /_____/ /
/ __/ _/ // _, _/_____/ /___/ /____/ /
/___/_/ |_|
\____/_____/___/
Installing ri documentation for thor-0.19.1
Parsing documentation for fir-cli-1.4.9
unable to convert "\xCE" from ASCII-8BIT to UTF-8 for lib/fir/util/parser/bin/pngcrush, skipping
Installing ri documentation for fir-cli-1.4.9
13 gems installed
安装如果遇到问题,可以到
3.2 使用fir指令,上传我们的ipa包
fir login -T cb954882xxxxxxxx
# fir.im token
fir publish $IPAPATH/Develop/xxx.ipa
另外,也可以直接用fir指令,进行打包或者编译,这个具体也没研究,其实就是对xcodebuild做了个封装,本质上还是执行那些指令,这里不再详述了.
chengpoleness@polen xcodebuild_iPA $ fir
fir build_apk BUILD_DIR
# Build Android app (alias: `ba`).
fir build_ipa BUILD_DIR [options] [settings]
# Build iOS app (alias: `bi`).
# Describe available commands or one specific command (aliase...
fir info APP_FILE_PATH
# Show iOS/Android app info, support ipa/apk file (aliases: `...
# Login fir.im (aliases: `l`).
fir mapping MAPPING_FILE_PATH
# Upload app mapping file to BugHD.com (aliases: `m`).
# Show current user info if user is logined.
fir publish APP_FILE_PATH
# Publish iOS/Android app to fir.im, support ipa/apk file (al...
fir upgrade
# Upgrade fir-cli and quit (aliases: `u`).
fir version
# Show fir-cli version number and quit (aliases: `v`).
-T, [--token=TOKEN]
# User's API Token at fir.im
-L, [--logfile=LOGFILE]
# Path to writable logfile
-V, [--verbose], [--no-verbose]
# Show verbose
# Default: true
-q, [--quiet], [--no-quiet]
# Silence commands
-h, [--help], [--no-help]
# Show this help message and quit
4. 测试一下
4.1 执行.sh文件
chengpoleness@polen xcodebuild_iPA $ sh xcodebuild.sh
要是有比较懒的同学,直接把.sh文件,拖到命令行里面也行
4.2 过程与结果
编译过程的输出信息太多,删减了下,大概看一下流程:
chengpoleness@polen xcodebuild_iPA $ sh xcodebuild.sh
HEAD is now at 30865e1 version 3.5.0, build 29
Already on 'develop'
=== CLEAN TARGET Pods OF PROJECT Pods WITH CONFIGURATION Debug ===
=== CLEAN TARGET xxx OF PROJECT xxx WITH CONFIGURATION Debug ===
** BUILD SUCCEEDED **
/* '以上是编译成功,接下来打包ipa'
Packaging application: '/Users/chengpoleness/Documents/code/xxx/buildiPA/develop/1/Build/Products/Debug-iphoneos/xxx.app'
Arguments: output=/Users/chengpoleness/Documents/code/xxx/buildiPA/develop/1/1xxx_1.ipa
Environment variables:
_system_name = OSX
### Checking original app
Done checking the original app
adding: Payload/xxxx.app/xxxViewGpsOverlay.nib
(in=4889) (out=2502) (deflated 49%)
total bytes=, compressed= -& 56% savings
Results at 'xxxxxxxx/Documents/code/xxx/buildiPA/develop/1/xxx_1.ipa'
/* '以上是打包成功,接下来是上传fir.im' */
I, [T18:03:56.670]
INFO -- : Login succeed, current
user's email: xxxx
I, [T18:03:56.670]
I, [T18:03:57.674]
INFO -- : Publishing app via chenglong&&.......
I, [T18:03:57.674]
INFO -- : ? -------------------------------------------- ?
I, [T18:03:59.674]
INFO -- : Fetching com.osmgolf.xxx@fir.im uploading info......
I, [T18:03:59.674]
INFO -- : Uploading app: xxx-3.5.0(Build 29)
I, [T18:04:00.674]
INFO -- : Uploading app icon......
I, [T18:04:00.674]
INFO -- : Converting app's icon......
I, [T18:04:01.674]
INFO -- : Uploading app binary......
I, [T18:04:16.674]
INFO -- : Updating devices info......
I, [T18:04:16.674]
INFO -- : Updating app info......
I, [T18:04:16.674]
INFO -- : ? -------------------------------------------- ?
I, [T18:04:16.674]
INFO -- : Fetch app info from fir.im
I, [T18:04:17.674]
INFO -- : Published succeed: http://fir.im/xxxx
I, [T18:04:17.674]
恭喜!!!上传fir.im成功!
OK,测试通过.
5.开发内部版“AppStore”
这个就这里不详述了,因为太简单.
写个tableview,把自己的app的链接放上去,每次有新版本了,通过这个App就可以下载,之前做过的截图如下:
至此,自动打包IPA的相关工作开发完成,可以投入使用了...
6 扩展-Debug/Release
6.1 背景:
目前的脚本打包都是默认打debug包的,但是如果我打Release包怎么办?如果我Debug包不同网络域名想切换怎么办?
6.2 Debug/Release
Okey,我们依次来解决这些问题:
其实很简单,xcodebuild指令有个-configuration, 我们使用这个决定是打Debug还是Release
那这个打出来的Debug和Release有什么区别呢?
这个相当于编译的时候是按照Debug模式或者Release模式来打包,从编译角度来说,区别挺大的,比如Debug会在某些堆栈环节预留更多的空间(我之前就遇到过同样的代码,但是Debug没问题,Release会有bug的情况,如果不知道这个的话,很难查出来或者理解这些bug,具体细节有空专门细说吧,这里不详述了)
所以,解决方案:定义一个CONGRUATION,根据传入的参数,决定打Debug还是打Release
# $1表示传入的第一个参数,启动脚本传入Debug或者Release就可以
CONGRUATION=$1
# 在xcodebuild和xrun的地方都使用$CONGRUATION即可
xcodebuild \
-workspace $SOURCEPATH/xxx.xcworkspace \
-scheme $SCHEMENAME \
-configuration $CONGRUATION \
-derivedDataPath $IPAPATH \
xcrun -sdk iphoneos PackageApplication \
-v $IPAPATH/Build/Products/$CONGRUATION-iphoneos/$SCHEMENAME.app \
-o $IPAPATH/$IPANAME
6.2 Different Host 域名切换
这个其实解决方案很多:
代码里写个Debug页面,里面设置可以切换不同的域名即可,
以前公司的APP就是这么做的,因为我们测算环境非常多,比如:
QA01,QA02,QA03...QA10...
所以直接在APP里就可以进行切换不同域名.
polen提醒:
切换后一定要让用户退出,避免发生不必要的逻辑混乱
2& 需要设置个宏开关,确保Release版本用户100%走线上域名,Debug版本可以随意加各种逻辑判断.
务必避免如果代码不建壮,发生线上用户误入测试环境的悲剧 (当然,这个肯定属于bug了,严格是不应该发生的了,但是难免意外,没有东西是100%绝对的,这里只是提醒...)
如果你们的测试环境没那么多,可能就2-3个,可以在打包的时候,通过脚本决定用哪个环境,具体怎么做:
CTO说怎么样能让脚本给代码传个值进入,然后代码在编译的时候根据这个值决定用哪个测试环境.
思考了很多方法,包括用脚本去改代码(硬改,用sed进入到.m文件修改,但这样太危险,而且很不友好)
后来学习到使用PREPROCESSOR_DEFINITIONS,就是xcode在打包前会先从 一个config中读取一些配置信息,这些在xcode-building里面可以直接设置,自然也可以通过xcodebuild指定穿进去,传入的就是GCC_PREPROCESSOR_DEFINITIONS
所以就是:
设定一个SERVER_TYPE宏定义,如果#ifdef
SERVER_TYPE的话,使用传入的参数,否则使用代码自定义的逻辑
# $serverType是启动脚本传入的参数值
if [ $CONGRUATION = Debug ]; then
PREPROCESSOR_DEFINITIONS='${inherited}'"COCOAPODS=1 SERVER_TYPE=$serverType DEBUG=1"
PREPROCESSOR_DEFINITIONS='${inherited}'"COCOAPODS=1 SERVER_TYPE=$serverType"
xcodebuild \
-workspace $SOURCEPATH/xxx.xcworkspace \
-scheme $SCHEMENAME \
GCC_PREPROCESSOR_DEFINITIONS="$PREPROCESSOR_DEFINITIONS" \
-configuration $CONGRUATION \
-derivedDataPath $IPAPATH \
具体代码中如何使用:
//HOST_TYPE决定最终的域名
#ifdef SERVER_TYPE
#define HOST_TYPE SERVER_TYPE
#ifdef DEBUG
#define HOST_TYPE HOST_TYPE_CANARY
#define HOST_TYPE HOST_TYPE_PRODUCTION
okey,以上就解决了Debug和Release相关的问题
GCC_PREPROCESSOR_DEFINITIONS的补充
6.3.1 关于GCC_PREPROCESSOR_DEFINITIONS今天做了一点修改:加了一句代码'${inherited}'
6.3.2 先说是什么
这句话表示继承高级别的配置内容。
但是为什么是单引号,后面的内容双引号。这个是bash的语法问题:单引号告诉shell忽略所有特殊字符,而双引号忽略大多数,但不包括、\、` 我们最终直线xcodebuild的时候,需要得到的命令是{inherited}, 而用双引号,$后面的内容会被当做变量从而导致错误。
6.3.3 再说为什么
如果不加,那么如果project或者cocospods中有其他的 GCC_PREPROCESSOR_DEFINITIONS内容,就会被覆盖掉。
6.3.4 引申问题
cocospods中定义的GCC_PREPROCESSOR_DEFINITIONS是什么时候悄悄被加进去的?
15.20.54.png
看上面这张图就很清楚,在project的info文件下面的Configurations里面,可以看到Pods-XXX.debug, 你使用cocoapods的话,依赖包的config文件都在这里,可以看一下,如下:
Pods-xxx.debug.xcconfig
这个里面就是各种第三方pods自己的一些宏定义。
所以说,xcode在build的时候,首先在project层级会读取cocopds的debug.config里面的配置信息,然后再读取指定target的config配置信息,target层级的配置信息在xcode target目录下build setting里面,当我们使用脚本的时候,可以直接再在脚本中指定我们自己所需要的GCC_PREPROCESSOR_DEFINITIONS。
如果大家想打包的时候有一些自己的config文件,可以参照官方说明:
脚本中使用指定config命令如下:
xcodebuild -target &your_target_name& -xcconfig &your_configuration_file&.xcconfig
使用后控制台的输出如下:
$ xcodebuild -target iOS -xcconfig configuration.xcconfig
Build settings from configuration file 'configuration.xcconfig':
IPHONEOS_DEPLOYMENT_TARGET = 10
SWIFT_TREAT_WARNINGS_AS_ERRORS = YES
=== BUILD TARGET watchOS Extension OF PROJECT MyProject WITH THE DEFAULT CONFIGURATION (Debug) ===
=== BUILD TARGET watchOS App OF PROJECT MyProject WITH THE DEFAULT CONFIGURATION (Debug) ===
=== BUILD TARGET iOS OF PROJECT MyProject WITH THE DEFAULT CONFIGURATION (Debug) ===
Notes: 之所以今天专门加这个东西是因为,最近打包遇到了一些问题,我们所用的第三方的库,有一些自定义的GCC_PREPROCESSOR_DEFINITIONS, 但之前的脚本GCC_PREPROCESSOR_DEFINITIONS没有${inherited}, 所以导致第三方自定义的宏被覆盖掉了,导致代码执行遇到了编译错误。所以特此过来纠正下。
7.遇到的一些疑难杂症
7.1 SDK不匹配导致编译失败
7.1.1 背景
下午()正在忙,突然测试同学跑过来,大喊:“不好了,不好了...”
我以为要说台风来了,(做好了可以下班的准备..?)
结果,来了句:
“打包脚本失败了,失败了!!”
我擦,啥情况,用了几个月了好好的,突然就失败了...
7.1.1 原因
后来确认下来是这么个情况,iOS10发布了,之前一直拖延,最近不是很忙了,于是有同事下载了xcode8-beta3和iOS10的安装profile。
然而iOS10的SDK更新,导致我们有个代码逻辑无法实现,于是Fix了一下,然后继续交给测试同学打包测试,结果就打包失败了,我看了下失败原因:
property 'firstAnchor' not found on object of type 'NSLayoutConstraint *'
object_setIvar(constraint.firstAnchor, referenceItem, view);
下午5.44.54.png
然后查了下代码,代码逻辑应该是没问题的。而找不到这个property是因为这个代码使用的iOS10的SDK,用旧版本自然是找不到,然后问了下测试,直接用xcode编译可以么?回答说可以。
那分析下来就应该是路径的问题了.
去她位置上看了下,(因为我自己没装xcode8,所以自己没法调试).一看发现问题了,她目前是两个xcode都在,但一个叫Xcode,一个叫Xcode-beta,脚本跑起来的时候,SDK肯定还跑得是以前的xcode的啊,自然编不过,于是改了一下名字,把原来的Xcode改为Xcode7,新的Xcode-beta改为Xcode.
然后,问题解决!?
7.2 PackageApplication 找不到
升级到xcode 9 以后Apple接口更新了,原来的xcode run方法的接口被depreated了。
解决方案:
xcodebuild 方法需要加入-archivePath xx/xxx/xxx.archive archive
将archive转为ipa包:xcodebuild -exportArchive -archivePath xx/xxx/xxx.archive - -exportOptionsPlist xxx/xx.plist -exportPath xxx/xx
如果后续脚本有扩展,我会继续更新此文.
Notes: 有些地方应该是iOS,而非ios,懒得改了,就这样吧,嗯.
曾经搞通信,现在玩iOS,未来想做...
背景 新项目这边每次版本移交, 给测试都是直接xcode挨个拿手机安装的流程. 一次两次还好,天天这么搞,而且每次一大波手机扔过来,瞬间觉得,自己好像是个疫苗注射员似的,顺次给每个手机打一针. biu! NEXT... biu! NEXT... biu! NEXT... ....
本文始发于我的博文详解Shell脚本实现iOS自动化编译打包提交,现转发至此。 目录 前言 Shell脚本涉及的工具xcodebuild和xcrunaltoolfir-cliPlistBuddy 一些概念的区别 具体实现xcodebuild和xcrun准备Plist文件获取...
前言 众所周知,现在App的竞争已经到了用户体验为王,质量为上的白热化阶段。用户们都是很挑剔的。如果一个公司的推广团队好不容易砸了重金推广了一个APP,好不容易有了一些用户,由于一次线上的bug导致一批的用户在使用中纷纷出现闪退bug,轻则,很可能前期推广砸的钱都白费了,重...
前言 众所周知,现在App的竞争已经到了用户体验为王,质量为上的白热化阶段。用户们都是很挑剔的。如果一个公司的推广团队好不容易砸了重金推广了一个APP,好不容易有了一些用户,由于一次线上的bug导致一批的用户在使用中纷纷出现闪退bug,轻则,很可能前期推广砸的钱都白费了,重...
感谢大神@shupengzhang的指导,感谢网上大神的文章,那么我们进入正题! 引用文章以及文章内的传送门:http://blog.csdn.net/wang/article/details/ 归纳总结,简化步骤,希望能帮助大家。 (PS...
这个世界分为你看到的世界和客观存在的世界。你看到的世界,不一定真实,而真实的世界在那里,你又不一定能明白。 这就如同你从事的校外少儿美术教育,尽管你已经工作了三年、五年、甚至十年,但是你到底对校外少儿美术教育有多深的理解?校外少儿美术教育这个词你已经讲了许多年,但是你究竟有...
我的感官如灌饱了水的植物慢慢舒展开来 我辨识了清风留在身后的足印 听见雪花幽幽降落的叹息 不需翻译 我理解了树木正在向我招手 而阳光发出温暖的笑声 逗弄我自以为的孤寂。 从此形塑了眼前这个人 是的,我非常孤寂 但我没有不快乐 因为,那一刻 我什么都不是 我就是我自己 没人肯...
早起老公一直不起,起晚了还怪我问他要工资卡,最后说办酒席时候再给。商议出结果,于是我们吃了早饭,去老妈那报备,
老妈在老公面前一直说女儿让她惯坏了,什么都不会做,洗衣服、做饭一样不会,以后过日子千万别嫌弃她呀。以前都是自己帮女儿操办的,想着家里也没什么家务活,自己...
计划实施时间:11月8日——2月15日 我的可利用大块时间: 早晨4:00-6:30 中午12:30-14:00 晚上21:30-22:30 碎片时间: 上午晨读前10分钟,幼儿吃早饭10分钟,幼儿喝水如厕时10分钟,幼儿吃午饭10分钟,幼儿进睡室后10分钟。 下午幼儿吃晚...
原题|请尊重一个“差生”的努力 日本的一匹特殊网红吸引了我——神奇的赛马春丽。 春丽出名,在于它屡战屡败、屡败屡战。职业赛场生涯,它从来没赢过一次。 在春丽连败100场的时候,日本电视台为它作了专题报道,意料之外的是,一夜之间,春丽名声大噪,家喻户晓。 越来越多的人专程赶过...

我要回帖

更多关于 xcxp66.com 的文章

 

随机推荐