>

点击看操作视频,澳门博发娱乐官网并且默认配

- 编辑:澳门博发娱乐官网 -

点击看操作视频,澳门博发娱乐官网并且默认配

视频地址 如果文章不详细,点击看操作视频

需求:当两个甚至两个以上的app存在小差异时,可以在一个工程(project)创建多个target每个target对应一个app。

ijkplayer 是 bilibili 开源的一款优秀的播放器, 基于 FFmpeg, 支持 iOS/Android, 点播/直播, 以及多种编码. 官方并不直接提供 framework 框架包, 这样大家可以根据需要选择配置, 自己编译并打包. 但是也让很多第一次使用的小伙伴一脸懵逼, 并且默认配置只支持 http, 如果想播放 https 链接的视频, 那么需要做额外的配置

前言

workspace、project、target、scheme,这些基本概念非常容易混淆,特别是经常使用Xcode编译和打包的开发者,往往会忽视这些基础知识。
最近开始用xcodebuild,Xcode的可视化操作带来的便利就是对命令行的生疏,特写一篇文章来回顾下。

前言

CocoaPods是一个用来管理第三方依赖库的工具。可以解决库与库之间的依赖关系,下载库的源代码,同时通过创建一个Xcode的workspace来将这些第三方库和我们的工程连接起来,供开发使用。

CocoaPods can help you scale your projects elegantly.

先看一下安装配置完的效果:

澳门博发娱乐官网 1

安装完后的工程目录

会发现多了一个Pods路径,下面已经下载好了所需要的第三方库。然后在之前熟悉的工程文件中就可以直接拿来用了:

澳门博发娱乐官网 2

屏幕快照 2017-11-27 11.07.16.png

 项目需求:代码抽层,业务逻辑和数据处理要高度抽离,模块化,需要将model 层 和 network层抽离出来。所以,就考虑建一个公共工程,每次新建项目,只是需要依赖这个工程就行了,代码的模块化之后我们可以对每一个模块持续优化集成,便于实现一些更加复杂的需求和结构设计。 思路设计:①MonkeyApp,用于存放公共的库。②MonkeyAppDemo用于写demo和示例。 具体步骤: 1、创建MonkeyApp工程,注意这里被依赖的工程要是Cocoa Static Library。

主要操作:共用文件时,用宏区!但有些文件就共用就不方便,如Info.plist文件。不共用文件,就设置选择属于自己的Target

本文为 iOS 的编译打包过程, 环境为 Mac + Xcode

workspace、project、target和scheme

了解这四个基本概念,有利于理解用命令行编译的参数设置。

  • project是基本工程,包含了所有的代码文件和资源文件、以及基本的编译相关设置。project可以单独存在,也可以被包含在workspace。
  • workspace是project的管理文件,一个workspace可以包含多个project,同个workspace内的project之间可以引用。
  • target是编译目标,target会继承project的基本设置,并重新设置target相关的编译信息(主要是Build Settings 和 Build Phases)。
    一个target对应一个product,一个工程里可以有多个target。target之间可以存在依赖,如果targetA依赖targetB,那么编译targetA的时候会先编译targetB。多个target只能有一个处于active状态,由Xcode的scheme决定。
    如下图,圆圈所在就是编译目标,有两个target,分别是产生product和测试相关,其中的LearnAnimationTests就是依赖LearnAnimation

    scheme和target

  • scheme是编译任务,配置了Build、Run、Test、Profile、Analyze、Archive相关的信息(见下图),同时可以指定运行的目标(如图中是iPhone 7 Plus)
    我们可以定义多个scheme,但是只能使用一个。

一、安装CocoaPods

  1. 打开Terminal终端,检测系统是否已经安装ruby
    通常情况下都有自带ruby
    $ ruby -v
    ruby 2.0.0p648 (2015-12-16 revision 53162) [universal.x86_64-darwin16]
  2. 执行安装命令
    sudo gem install cocoapods但这个会等很久,因为“墙”
    所以需要改变安装源。
    ①查看所有安装源:
    $ gem sources -l
    *** CURRENT SOURCES ***
    https://rubygems.org/
    ②改变安装源:
    $ gem sources -remove https://rubygems.org/
    $ gem sources -a http://rubygems-china.oss.aliyuncs.com
    ③安装CocoaPods:
    $ sudo gem install cocoapods
    最后成功会显示Successfully installed cocoapods-1.3.1

澳门博发娱乐官网 3psb.png

image.png

安装 homebrew, git, yasm. (如果已经安装好可以跳过, 不清楚的再来一遍也无妨)

.app .xcarchive 和 .ipa的区别

这三个文件都是Xcode直接产出的运行相关文件,通过指令同样可以生成这三个文件。

  • .xcarchive 是通过Xcode打包或者 xcodebuild archive打包出来的文件,里面包括了.app文件、dSYM符号文件等;

  • .ipa 是一个zip压缩包,主要有Payload文件夹,里面有.app文件,Symbols是符号文件;

  • .app 程序运行包,其中包括二进制的可执行文件以及运行所需要的资源以及plist,还有就是签名文件和privisioning file;

二、使用CocoaPods引入第三方库

  1. 搜索源是否存在:
    $ pod search masonry
    如果有的话会帮我们标识需要的库
    如果第一次使用,会出现:
    Setting up CocoaPods master repo这个会跑很长的时间,是在配置CocoaPods,要一直翻着墙。
    在一大堆显示后有Setup completed表示配置完成,下次使用就很快了。

  2. 创建工程:
    创建完一个iOS工程后
    $ cd /Your Project FilePath路径的部分直接用finder打开把文件夹拖过来就可以
    $ touch PodFile
    对其中的内容进行添加:
    $ vim PodFile

    因为PodFile升级到1.0.1之后,pod里的内容必须明确地指出所用第三方库的target,否则会出现The dependency is not used in any concrete target的错误。

    以下是写入PodFile的内容

    platform :ios,'8.0'   (平台版本)
    use_frameworks!   (可有可无)
    target 'your project name' do
    pod 'Masonry','~>1.0.1'  (表示指定[1.0.1,1.1.1)区间内的版本号)
    end
    

    保存退出:
    esc (:wq)

    最后一步是读取PodFile找到相关类库下载并自动集成到项目中,同时生成新的*.xcworkspace文件:
    pod install
    【注意】:如果卡在这里不动或报错,是因为在默认升级,流程引用资源被墙掉了。
    那就用命令规避每次执行setup要更新spec仓库的操作:
    pod install --verbose --no-repo-update
    会跑很多的东西,但不会太久,当你看到下图的内容时,表示引入Masonry搞定了!!!

    澳门博发娱乐官网 4

    屏幕快照 2017-11-27 14.13.12.png

2、创建MonkeyAppDemo工程。在MonkeyAppDemo上面右键,添加文件,选中MonkeyApp.xcodeproj,建立依赖关系。

左面板选中文件 --> 显示右面板 --> 选择右面板的下一栏“文件”图标(一般在最左边) --> 可以看到箭头指向的Target Membership。打勾表示该文件属于哪些Target,勾选了多个Target,则该文件被多个Target使用。选中相应的Target然后在Build phase 搜索相应的文件并删除。如果添加的话。如下图:

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"brew install gitbrew install yasm

命令行编译

xcodebuild是命令行构建工具,接下来尝试用xcodebuild产生上面所说的.app、.xcarchive 和 .ipa文件。(苹果文档,通过在命令行输入man xcodebuild同样可以看到)

三、工程添加CocoaPods头文件目录

只有配置了目录后,才能愉快地进行import。不然会一直提示找不到文件==
操作:
在项目的target里面设置,添加CocoaPods头文件目录:目录路径直接写 ${SRCROOT},再双击出现面板后面选recursive

澳门博发娱乐官网 5

屏幕快照 2017-11-27 14.17.50.png

至此!!
大功告成啦!!
可以愉快地使用Masonry进行自动布局~
随手转发正能量,推荐一个Masonry简单使用的文章:http://www.jianshu.com/p/f0b17ecfd04e

澳门博发娱乐官网 61__#$!@%!#__psb.png

image1.png

在一个合适的位置新建一个文件夹, 假设为桌面, 文件夹名为 ijkplayer.

1、产生.app文件

如果工程设置的Mach-O Type设置是Executable,编译产生的就会是.app文件。
例如,我们使用Debugconfiguration设置来编译Livetarget,命令是xcodebuild -target Live -configuration Debug,结果如下:

类似,如果使用Release也可以产生.app文件,命令是:
xcodebuild -target Live -configuration Release,结果如下

image.png

3、在MonkeyAppDemo里面import相关的类会出现找不到的error,会编译错误。需要进行下面的操作:

一个是添加编译文件(".m" ".h" 或swift中的 ".swift:), 别一个是资源(除了了图中所示,一般就是图片等)。
设置步骤:
1、创建Target
2、修改Target名称、Scheme名称
3、配置Info.plist
4、桥接文件设置
5、宏定义(Preprocessor Macros)设置
6、Assets。xcassets的设置(app图片、launch启动页)

打开终端, 输入下面的指令

2、产生.xcarchive文件

xcodebuild的archive 动作(action)可以产生.xcarchive文件,下面是一个普通的archive指令:
xcodebuild archive -project "LearnAnimation.xcodeproj" -scheme "LearnAnimation" -configuration Release -archivePath archive/learn.xcarchive

澳门博发娱乐官网 72__#$!@%!#__psb.png4、编译一次还是有错误。还是编译还出现找不到相关的文件。这个时候可以判断的是,编译的结果没有能够正确的依赖,进行下面的步骤 ;添加target的依赖关系,保证编译MonkeyAppDemo的时候先编译MonkeyApp。选中MonkeyAppDemo Target,然后选中其Build phases选项,添加MonkeyApp target。

创建target有两种方式:
一、是通过新建target可以通过File-->New-->Target,然后选择其中一个模板来创建,app类型的target,可以选择Empty Application模板,不过新建的target有自己的AppDelegate和main,但如何使其原来的AppDelegate和 main复用 (未找到相应资料)

# 进入到刚刚新建的文件夹内cd ~/Desktop/ijkplayer/# 获取ijkplayer源码git clone https://github.com/Bilibili/ijkplayer.git ijkplayer-ios# 进入源码目录cd ijkplayer-ios# 切换分支 (目前为k0.8.8, 可以自行去GitHub查看最新版本号)git checkout -B latest k0.8.8

3、产生.ipa文件

xcodebuild的-exportArchive参数可以用来打包.ipa文件,下面是一个普通的打包指令:
xcodebuild -exportArchive -archivePath archive/learn.xcarchive -exportPath App -exportProvisioningProfile "provisioning file name"

 5:如果需要引入MonkeyApp中的图片资源,需要copy file选项勾选 6:存在category的时候,使用category会导致Crash解决办法是在Sample里面添加编译的命令 

二、另一种方法是通过对原有的target做duplicate(duplicate only),复制一份。其好外:如果两个target的相同点很多,用duplicate,就可以把相关的设置全部拷贝过来,而不需要做 过多的修改,生成一个新的target。
例子--二方法:
1、复制工程中的其中一个Target(如果工程中有多个target、复制最相似的target,这样Info.plist文件的不需要过多修改)

默认为最少支持, 如果足够你使用, 可以跳过这一步. 否则可以改为以下配置:

扩展内容

澳门博发娱乐官网 84__#$!@%!#__psb.png

image2.png

  • module-default.sh 更多的编解码器/格式
  • module-lite-hevc.sh 较少的编解码器/格式
  • module-lite.sh 较少的编解码器/格式

1、命令行修改plist参数

PlistBuddy支持修改plist,下面是一个修改指令:
/usr/libexec/PlistBuddy -c "Set :TestVersion ${TestVersion}" ${infoplist_path} ${infoplist_path} 替换为自己的plist的路径。

PlistBuddy简单使用,简书上也有详细介绍的文章。

7:最终效果,这样就可以完成model层和network层的抽层了。

一个新工程默认target名与工程名一样
对原target(如果项目中以有多个target,可以选中最相近target进行复制,这样可以减少相对少量的设置)上右键如下图所示

2、编译project工程和xcworkspace工程的区别

xcodebuild编译project,可添加-project projectName参数,也可以不添加
xcodebuild编译xcworkspace,需要添加-workspace workspaceName参数
如果对于缺省的参数,xcodebuild会优先使用xcode工程内的设置,再使用默认值。

澳门博发娱乐官网 95__#$!@%!#__psb.png

image3.png

# 进入 config 目录cd config# 删除当前的 module.sh 文件rm module.sh# 可根据需要替换为`module-default.sh`, `module-lite-hevc.sh`, `module-lite.sh`# 创建软链接 module.sh 指向 module-lite-hevc.shln -s module-lite-hevc.sh module.shcd ..cd iossh compile-ffmpeg.sh clean

cd .../init-ios.sh

3、xcodebuild编译报错library not found

ld: library not found for -lAFNetworking
clang: error: linker command failed with exit code 1 (use -v to see invocation)

报错是链接时AFNetworking找不到,检查工程设置中是否有引入AFNetworking;如果工程设置正常,那么检查AFNetworking是否为pod方式引入,如果是则xcodebuild的目标需要是xcworkspace

点击Duplicate(复制),也可快捷键Command+D,弹出如下

最后会生成支持 https 的静态文件 libcrypto.alibssl.a, 如果不需要可以跳过这一步

4、蒲公英上传ipa指令

打包出来的ipa配合下面的上传指令,可以把ipa包直接发到蒲公英上。
curl -F "file=@Live.ipa" -F "uKey=key12345" -F "_api_key=key54321" http://www.pgyer.com/apiv1/app/upload

image4.png

# 获取 openssl 并初始化./init-ios-openssl.shcd ios# 在模块文件中添加一行配置 以启用 openssl 组件echo 'export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-openssl"' >> ../config/module.sh./compile-ffmpeg.sh clean

# 如果下一步提示错误`xcrun: error: SDK "iphoneos" cannot be located`, 请执行`sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer/`, 再重新执行下一步# 编译openssl, 如果不需要https可以跳过这一步./compile-openssl.sh all# 编译ffmpeg./compile-ffmpeg.sh all

总结

在真机的代码覆盖率测试的背景驱动下,我强行对Xcode基础知识进行一遍回顾,同时也要复习bash脚本语言,然后用xcodebuild对以前的工程进行编译、打包,加深理解。
如果再有必要,搭建自动化构建的环境,应该不是难题。

bash脚本语言
workspace、project、target和scheme的官方介绍

一般选中中间那个Duplicate Only(仅复制),默认选中是复制且过渡到iPad,看你需要进行选择, 本文现在只讲解仅复制。选中后如下图

ps: 如果提示错误:

image5.png

./libavutil/arm/asm.S:50:9: error: unknown directive .arch armv7-a ^make: *** [libavcodec/arm/aacpsdsp_neon.o] Error 1

会生成两个文件,其名称命名规则为被copy 的Target Name 再加上“ copy”(空格加copy)邚TargetTest copy(target文件)、TargetTest copy-Info.plist(plist文件)。

最新的 Xcode 已经弱化了对 32 位的支持, 解决方法:在 compile-ffmpeg.sh 中删除 armv7 , 修改如:FF_ALL_ARCHS_IOS8_SDK="arm64 i386 x86_64"再重新执行出现错误的命令: ./compile-ffmpeg.sh all

2、修改Target文件名称及与之对应的Scheme

用命令:

image6.png

open IJKMediaPlayer/IJKMediaPlayer.xcodeproj

本文由胜博发-编程发布,转载请注明来源:点击看操作视频,澳门博发娱乐官网并且默认配