文档章节

Bazel教程:构建iOS应用[翻译]

chai2010
 chai2010
发布于 2016/05/19 09:33
字数 998
阅读 436
收藏 9

Bazel教程:构建iOS应用

本教程包含以下步骤(Bazel新用户请先参考: Bazel入门教程):

  • 代码预览
  • 创建BUILD构建文件
  • 针对模拟器构建应用
  • 查看构建输出
  • 在模拟器环境运行/调试应用
  • 针对设备构建应用
  • 安装应用到设备

需要在 Mac OS X 环境,WORKSPACE 不用配置。

查看源文件结构

iOS应用源文件在$WORKSPACE/ios-app/UrlGet目录。

代码在这里:https://github.com/bazelbuild/examples/tree/master/tutorial/ios-app/UrlGet

创建BUILD文件

在命令行用vi创建并编辑BUILD文件(其它编辑器也可以):

$ vi $WORKSPACE/ios-app/BUILD

添加一个objc_library规则

Bazel针对构建iOS应用提供了诸多规则命令。在这里,我们首先使用 objc_library 规则从源文件和Xib文件构建 静态库。 (这个只是最小的规则,此外还有ios_application规则可以用于构建多架构的iOS应用。)

BUILD的内容如下:

objc_library(
    name = "UrlGetClasses",
    srcs = [
        "UrlGet/AppDelegate.m",
        "UrlGet/UrlGetViewController.m",
    ],
    hdrs = glob(["UrlGet/*.h"]),
    xibs = ["UrlGet/UrlGetViewController.xib"],
)

规则对应的目标名字是UrlGetClasses

添加objc_binary规则

objc_binary 创建一个 bundled应用中的二进制可执行程序。

BUILD文件添加如下内容:

objc_binary(
    name = "ios-app-binary",
    srcs = [
        "UrlGet/main.m",
    ],
    deps = [
        ":UrlGetClasses",
    ],
)

其中deps属性引用了前面的UrlGetClasses静态库。

添加ios_application规则

ios_application 规则用于创建.ipa打包应用, 同时生成Xcode过程文件。

BUILD文件添加如下内容:

ios_application(
    name = "ios-app",
    binary = ":ios-app-binary",
    infoplist = "UrlGet/UrlGet-Info.plist",
)

完整的BUILD文件在这里:https://github.com/bazelbuild/examples/blob/master/tutorial/ios-app/BUILD

构建模拟器环境的应用

命令行环境,确保当前目录对应Bazel的workspace:

$ cd $WORKSPACE

输入以下命令构建应用:

$ bazel build //ios-app:ios-app

Bazel将启动构建工作。当构建完成时,输出类似下面的信息:

INFO: Found 1 target...
Target //ios-app:ios-app up-to-date:
  bazel-bin/ios-app/ios-app.ipa
  bazel-bin/ios-app/ios-app.xcodeproj/project.pbxproj
INFO: Elapsed time: 3.765s, Critical Path: 3.44s

查找构建的输出

输出的.ipa和其它文件在$WORKSPACE/bazel-bin/ios-app目录。

模拟器环境运行/调试应用

现在可以从Xcode环境的模拟器来运行应用。先打开$WORKSPACE/bazel-bin/ios-app/ios-app.xcodeproj工程文件, 然后选择相应版本的iOS模拟器,然后点击 Run 按钮运行。

注意: 如果要Xcode工程中的任何信息发生变化(比如删除文件或添加/改变依赖),必须使用Bazel重新生成Xcode工程文件。

针对设备构建应用

针对设备构建应用,需要设置bazel以找到目标对应设备的provisioning profile配置文件。 根据以下步骤设置:

  1. 打开网页 Apple Profiles 下载设备对应的provisioning profile配置文件。 如果又疑问,请参考 Apple's documentation

  2. 将profile配置文件放到$WORKSPACE/tools/objc目录。

  3. 可选操作 - 可以在.gitignore中忽略配置文件。

  4. 编辑 $WORKSPACE/tools/objc/BUILD 文件,添加:

    filegroup(
        name = "default_provisioning_profile",
        srcs = ["<NAME OF YOUR PROFILE>.mobileprovision"],
    )
    

现在可以构建针对设备的应用了:

$ bazel build //ios-app:ios-app --ios_multi_cpus=armv7,arm64

上面的命令将构建针对多个类型的设备应用。如果只需要构建真的特定类型的应用, 可以指定一个特定的设备架构体系结构。

如果需要选择一个特定版本的Xcode或特定版本的SDK,可以通过--xcode_version=7.2 --ios_sdk_version=9.2指定。 要确保选定版本的SDK对应的Xcode已经安装到本机。

如果需要指定一个能够运行的最小iOS版本,可以通过--ios_minimum_os=7.0指定。

安装应用到设备上

安装应用到设备最简单的方法是打开Xcode,然后点击Windows > Devices菜单。 从左边列表选择相应的设备,点击 "+" 按钮并选择生成的 .ipa 文件。

如果程序没有运行,请检查设备和provisioning profile配置是否匹配。 点击Devices下面的View Device Logs按钮,可以查看到相关的错误信息。


https://chai2010.cn/

© 著作权归作者所有

共有 人打赏支持
chai2010

chai2010

粉丝 421
博文 101
码字总数 82162
作品 10
武汉
程序员
私信 提问
iOS 学习资料整理

视频教程(英文) Developing iOS 7 Apps for iPhone and iPad 斯坦福开放教程之一, 课程主要讲解了一些 iOS 开发工具和 API 以及 iOS SDK 的使用, 属于 iOS 基础视频 iPad and iPhone Applic...

拉偶有所依
2015/01/19
2.2K
4
[bazel]-bazel的使用

Change log 目录 [bazel]-导读 [bazel]-bazel的使用 [bazel]-tulsi的使用 [bazel]-如何编译 [bazel]-缓存 一.是什么 bazel原理: http://www.cnblogs.com/Jack47/p/build-in-the-cloud.html b......

Sunxxxxx丶
2018/08/22
0
0
10个优秀Objective-C和iOS开发在线视频教程

如果你自己开发iOS应用,你肯定会发现网上有很多资源。学习编程的一个最好的方法就是自己写代码,而开始写代码的最快的方式就是看其他人怎么写。我们从海量视频和学习网站中整理出了我们认为...

mingxun
2014/05/09
0
0
15+ 个有用的 iPhone 应用开发教程

从头开始构建一个购物清单应用程序 iPhone Development Tutorials from thenewboston Learn How To Develop For The iPhone How To Create Your First iPhone App (2012 Edition) 创建首个 ......

oschina
2013/01/04
3.3K
3
如果只有一个月的时间学 iOS 开发,我们该做些什么?

一年前,我还是一个 Android 开发者。那时候我没有任何 iOS 编程相关的知识,我甚至没用过任何苹果的产品。然而,这已成为过去,现在我已经能同时开发 iOS 和 Android 应用了。 现在,我想给...

oschina
2017/03/09
3.3K
13

没有更多内容

加载失败,请刷新页面

加载更多

开始看《Java学习笔记》

虽然书买了很久,但一直没看。这其中也写过一些Java程序,但都是基于IDE的帮助和对C#的理解来写的,感觉不踏实。 林信良的书写得蛮好的,能够帮助打好基础,看得出作者是比较用心的。 第1章概...

max佩恩
昨天
11
0
Redux 三大原则

1.单一数据源 在传统的MVC架构中,我们可以根据需要创建无数个Model,而Model之间可以互相监听、触发事件甚至循环或嵌套触发事件,这些在Redux中都是不被允许的。 因为在Redux的思想里,一个...

wenxingjun
昨天
7
0
跟我学Spring Cloud(Finchley版)-12-微服务容错三板斧

至此,我们已实现服务发现、负载均衡,同时,使用Feign也实现了良好的远程调用——我们的代码是可读、可维护的。理论上,我们现在已经能构建一个不错的分布式应用了,但微服务之间是通过网络...

周立_ITMuch
昨天
4
0
XML

学习目标  能够说出XML的作用  能够编写XML文档声明  能够编写符合语法的XML  能够通过DTD约束编写XML文档  能够通过Schema约束编写XML文档  能够通过Dom4j解析XML文档 第1章 xm...

stars永恒
昨天
2
0
RabbitMQ学习(2)

1. 生产者客户端 void basicPublish(String exchange, String routingKey, boolean mandatory, boolean immediate, BasicProperties props, byte[] body) 1. 在生产者客户端发送消息时,首先......

江左煤郎
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部