在访问对隐私敏感的数据(如照片库,相机,联系人,日历,提醒,麦克风,位置等)之前,必须先获得授权。 当您未经许可直接访问它们时,您的应用程序将崩溃。 然后,Xcode将记录如下: 该应用已崩溃,因为它尝试访问没有使用说明的隐私敏感数据。 该应用程序的Info.plist必须包含一个NSContactsUsageDescription键,该键具有一个字符串值,向用户解释该应用程序如何使用此数据。 该如何处理? 正如苹果所说: 您必须通过在Info.plist文件中包含适当用途的字符串键来静态声明应用程序对受保护数据类的预期用途。 在您的项目中打开名为info.plist的文件,右键单击它,将其作为Source Code打开,然后将此代码粘贴到该文件中。 或者,您可以默认打开info.plist作为“ Property List ,单击“添加”按钮,Xcode将在键入“ Privacy -时为您提供建议的完成内容Privacy -借助键盘⬆️和⬇️。 可算作私有数据的框架列表很长: 联系人,日历,提醒,照片,蓝牙共享,麦克风,相机,位置,健康,HomeKit,媒体库,动作,CallKit,语音识别,SiriKit,电视提供商。 请记住在和之间写下您为何要求此授权的描述,否则您的应用将被apple拒绝: NSPhotoLibraryUsageDescription $(PRODUCT_NAME)照片使用 NSCameraUsageDescription $(PRODUCT_NAME)相机使用 NSMicrophoneUsageDescription $(PRODUCT_NAME)麦克风使用 NSLocationUsageDescription $(PRODUCT_NAME)的位置使用 NSLocationWhenInUseUsageDescription $(PRODUCT_NAME)的位置使用 NSLocationAlwaysUsageDescription $(PRODUCT_NAME)始终使用位置 NSCalendarsUsageDescription $(PRODUCT_NAME)日历事件 NSRemindersUsageDescription $(PRODUCT_NAME)提醒使用 NSContactsUsageDescription $(PRODUCT_NAME)联系人使用 NSMotionUsageDescription $(PRODUCT_NAME)动作使用 NSHealthUpdateUsageDescription $(PRODUCT_NAME)健康更新使用 NSHealthShareUsageDescription $(PRODUCT_NAME)健康共享使用 NSBluetoothPeripheralUsageDescription $(PRODUCT_NAME)蓝牙外围设备使用 NSAppleMusicUsageDescription $(PRODUCT_NAME)媒体库使用 NSSiriUsageDescription $(PRODUCT_NAME)siri使用 NSHomeKitUsageDescription $(PRODUCT_NAME)家用套件的使用 NSSpeechRecognitionUsageDescription $(PRODUCT_NAME)语音使用 NSVideoSubscriberAccountUsageDescription […]
我们每月的GitHub摘要又回来了,今天我们在谈论新的Swift和Objective-C库,这些库可以简化iOS开发人员的工作。 上帝之眼 斯威夫特,本月约2千颗星 GodEye是Swift库的开源集合,可让您自动显示日志,崩溃,网络,CPU,RAM和网络信息等。 它具有非常全面的结构,包含多个子项目。 甚至有一本关于这个巨大的实用工具的开发过程的书。 需要明确的是,这本书是中文的,但这是个好主意。 编写一行代码就足以在您的项目中实现GodEye。 GodEye不仅包括用于监视您的应用程序的库,还包括用于显示信息的用户界面。 何时使用: 当您想以方便的格式显示所有调试信息时。 以及更多:2017年3月:四个新的GitHub开源iOS库
在一个星期一的早晨,您的老板给您一个注释:“嘿,如果您添加一种简单的方法让用户从他的Facebook帐户中选择他的个人资料图片,该怎么办? 不到两个小时,就可以使用Facebook SDK做到这一点。” 很好! 让我们看一下惊人的Facebook文档,他们可能做了一个本机图像选择器,可以记录用户,检索用户的相册并显示每个相册的图片。 事实证明,没有使用原生iOS Facebook SDK进行优雅的Facebook图像选择器的简便方法。 您将需要处理Facebook登录,拒绝照片权限,从Graph API解析用户的相册,加载相册封面,解析相册的图片,加载和缓存图片。 真是一个痛苦的任务! 就像您的老板所说的,所有这些都在不到1或2个小时内完成。 有解决办法 ! 🎉 有几个网站和旧图书馆允许这样做。 仅这始终是旧的Swift版本或旧的Facebook SDK。 这就是为什么我决定制作自己的Swift Facebook选择器“ GBHFacebookImagePicker”并根据MIT许可将其发布给OpenSource社区的原因。 主要特点 选择器提供了一种非常简单的方法来向用户询问Facebook的照片许可权,并显示所有Facebook的帐户相册。 显示相册图片时,用户可以轻松选择其中的一张,然后选择器以最高质量下载所选图片。 选择器还提供了一种翻译弹出窗口的简单方法。 安装 GBHFacebookImagePicker可通过CocoaPods获得。 要安装它,只需将以下行添加到您的Podfile中: 豆荚“ GBHFacebookImagePicker” 用法🗝 您需要正确设置您的应用程序才能与Facebook一起使用:https://developers.facebook.com/docs/ios/getting-started 导入选择器: import GBHFacebookImagePicker 实现GBHFacebookImagePickerDelegate协议: // MARK: – GBHFacebookImagePicker Protocol func facebookImagePicker(imagePicker: UIViewController, didSelectImage image: UIImage?, WithUrl url: String) { // Do whatever you […]
缺乏资料 在某些情况下,我们希望接受用户的数据,同时也希望某些数据是可选的,这意味着它们不是必需的,但应在可能的情况下提供。 一个人的常量me实例提供了所有数据,但另一个人常量不提供所有数据,因为他可能没有中间名。 因此,他将nil作为middlename的值。 听起来不错,但是传递的nil会导致错误,为什么?,因为我们没有告诉swift将Middlename设为optional 。 Swift中的Optional是什么? Swift中的可选类型是可以保存值或不保存值的类型。 可选项通过附加?来编写? 任何类型: var middlename:字符串? 上面的意思是Middlename可以是字符串,也可以不包含任何由?表示的内容? 。 可选容器是一种容器。 可选的String是一个可能包含字符串的容器。 一个可选的Int是一个可能包含Int的容器 。 将可选件视为一种包裹。 在您打开它(或用可选语言“解开”)之前,您将不会知道它是否包含某些东西或什么都不包含。 它只是可以设置为nil的Optional值,这就是当我们向middlename传递nil值而未指定Optional类型时发生错误的原因。 var red: String = “Red” red = nil // error: nil cannot be assigned to type ‘String’ 如何创建一个可选的? 快速创建optional的最简单方法是添加? 在下面的类型前面 var middlename:字符串? 另一种方法是使用如下所示的Optional关键字 var middlename : Optional 使用(解包)可选 解开可选项的最简单方法是添加! 在可选名称之后。 注意\(middlename!) 可以用来解开中间名,因此我们可以获取值“ abel”。 问题在于,当我们将nil值传递给中间名时,我们会遇到运行时崩溃的消息,提示nil […]
迅速解决问题 先前的代码存在一些问题。 首先,考虑到我们正在谈论的是REST API,我们知道我们碰到了相同的端点,因此我们在重复自己很多次。 其次,这看起来很像将Objective-C转换为Swift,最后。 我们知道我们可以做得更好。 解决方案 假设我们希望有一个“真相”点来通过网络层更新用户,我们可以定义如下内容: 通过此UpdateUserEndpoint ,我们现在可以将希望在服务器上执行的更改传递到其初始化程序中。 这解决了前面示例的所有问题,并且坦率地说,我认为它更具可读性。 这就是一个简单的示例,说明如何使用Swift解决旧的Objective-C“问题”。
好吧,我正式完成了一半。 太好了,但太吓人了。 我们完成了MakersBnB挑战,我对获得的成绩感到非常满意。 还有很多工作要做,但是我和我的小组已经决定在休息时间做更多的事情。 这是我们到的地方! 佩伦斯基/ VRADbnb 通过在GitHub上创建一个帐户为VRADbnb开发做出贡献。 github.com 我们的回溯速度为2.45; 还早,但是我们迟到了,那是我们教练唯一能做的。 他为我们提供了一些非常令人鼓舞的反馈,很高兴在大一周之后进行了很好的讨论。 我们做了更多的工作,但是今天的主要焦点是我们上面的同类的毕业。 他们都做了演讲,做得很好。 绝大多数小组都使用Makers以前从未学过的语言写过东西。 真是太神奇了。 我简直不敢相信今晚将是我们8周。 然后,我们吃了一些比萨饼和饮料,然后去了酒吧。 我的出门时间比平常要晚,但很高兴在家中观看Netflix。 我仍未决定我在休息期间将要做什么,但明天我将花一些时间看一下Swift。 我真的很喜欢在回来时完成我的第一个iOS应用的想法。 今晚我要从学习/学习/阻止中休息一下,因为我们要到一月份才能站起来! 我为我们已经完成了一半而长辈们已经完成而感到难过,但是我为他们和我自己为我走了多远而感到骄傲!
在这篇文章中,您将了解继承。 不,不是那种有钱的亲戚过世而留下大量现金,然后辞掉工作而逃到巴厘岛度过永久假期的那种。 我们在谈论遗传,就像在遗传学中继承特征或特征一样。 稍后我们将详细讨论这一点,但让我们先深入研究代码。 创建家长班 首先,如果尚未打开Xcode,请点击Create New Playground 。 为其命名,例如Inheritance ,然后单击Next 。 选择某个位置以保存此.playground文件,然后单击“ Create以保存它。 您应该会看到类似下面的屏幕。 删除左侧的所有样板代码,但根据需要保留import UIKit 。 真正的继承是什么? 在iOS开发中,继承是面向对象编程的一项功能,您已在上一篇有关类的文章中了解了此功能。 类可以从其他类继承特征,这使其非常有用。 考虑到有关家庭的一切。 在每个家庭中,都有父母和孩子。 父母具有某些特质,这些特质会传给孩子们。 例如,我的头发是棕色的,而我父亲的头发是棕色的。 我从他那里得到了这种特质。 我们两个人之间还有许多其他相同的特征,但是我在许多方面与父亲有所不同。 虽然我中的许多人都很相似,但我拥有某些技能和特质,与我父亲不同。 在Swift中,我们将创建一个类作为父类。 它将包含许多一般特征。 然后,我们将创建一个子类,该子类将从父类继承特征。 子类将具有与父类相同的特征,但我们可以添加仅子类独有的特殊特征。 但是,让我们开始构建父类。 建立家长课堂 虽然我们可以创建有关实际父母的课程,并使之成为基于代码的遗传学实验,但我们将做一些更酷的事情-考虑超级棒的汽车! 🚗🚕🚙 撰写家长班 在您的Playground窗口中,添加以下Vehicle类,并为所有车辆具有的共同点创建一些变量: 车辆类别{ 变速轮= 4 var make:字符串? var模型:字符串? var currentSpeed:Double = 0 } 每辆汽车都有4个轮子,这就是我们创建该变量的原因。 但是,为什么我们没有为汽车的品牌或型号赋予价值呢? 嗯,每辆车都有某种制造商和模型,因此我们实际上不需要在父类中指定这些属性。 添加一些功能 在我们的Vehicle类中,我们实际上可以创建所有汽车都可以执行的一些功能: 车辆类别{ […]
如果您曾经开发过iOS应用程序,那么我猜您已经构建了一次或两次表视图或集合视图。 您可能还熟悉两个UI元素都具有的继承。 它们都继承自UIScrollView以获得滚动行为。 您可能已经猜到了,macOS并非如此。 要为用户增加滚动体验,您将必须实现NSScrollView 。 这不是一项艰巨的任务,但要使其顺畅运行,您必须了解NSScrollView的核心概念,或者更确切地说,是如何将iOS思维方式转换到macOS域。 如果您排除滚动视图本身,则NSScrollView由两部分组成: NSClipView和文档视图。 文档视图是您需要提供的唯一东西才能使它起作用。 由于苹果在提供所有活动部件如何组合方面做得非常出色,因此我不会赘述。 对于我们的示例,文档视图将是一个简单的NSView ,但它可能是表视图或集合视图。 https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/NSScrollViewGuide/Articles/Basics.html 对于这些示例,我决定通过使它们易于在操场上使用来提高其档次,只需将代码复制到操场上即可,您应该可以随意修改代码。 我们要做的第一件事是设置要用作滚动视图的文档视图的自定义视图。 我们给它一个比滚动视图更突出的高度,以使其滚动。 文档视图的大小用作滚动视图的内容大小。 因此,如果要水平滚动,则文档视图应比滚动视图宽。 为了给游乐场提供一个很好的例子,我们在自定义视图中添加了渐变,以使滚动更加明显。 因为我们希望滚动视图的初始位置位于顶部,所以我们需要将此信息提供给内容视图,即滚动视图的剪辑视图。 或者,我们也可以在文档视图本身上调用相同的方法,但是我倾向于总是在内容视图上调用它,因为它是非可选的,而文档视图则不是。 将内容偏移设置为子视图框架的整个高度似乎很奇怪。 有关框架如何在macOS中工作的更多信息,您可以阅读我以前的文章之一。 在那篇文章中,我们介绍了一个翻转视图坐标系的小技巧,让我们在此处应用相同的技巧,以了解如何更改实现以使以iOS为中心的框架查看方式更有意义。 现在,我们创建NSView的子类 ,并将属性isFlipped设置为返回true 。 现在我们可以简单地将内容偏移量设置为从零开始,这很容易推断。 就是这样,在操场上射击并旋转一下,最简单的实验方法就是亲眼看看。 有关NSScrollView必须提供的所有内容的更深入的信息,建议您查阅Apple的文档。
现在我和我的客户我们生活在真正的幸福中。 我 :我只是想掌握并自动执行,所以会增加内部版本号,进行编译并提交给Testflight。 他 :我不再将IPA文件拖放到iTunes中。 Testflight通知我,我可以访问开发人员提交的最新版本。 在Apple环境中,我们是安全的,但Bitrise是面向开发人员的开源持续集成工具。 现在,让我们澄清一下什么是自动化 。 配料 Xcode 7.3.1 存储在版本控制存储库中的Xcode项目(Swift或Objc) 一个存储您的存储库的git服务器( Bitbucket 和 Github 可以正常工作) 开发人员帐户,Apple电子邮件和密码。 密码应为字母数字。 可以从 iTunes Connect 获取的应用程序ID 一个免费的 Bitrise 帐户 应用程序的分发配置文件 有效的证书( 从钥匙串 导出的 .P12文件 。向其中添加密码。) 如果使用 Cocoapods,则为Podfile 。 食谱 打开Bitrise,然后使用您喜欢的GIT服务器登录。 我更喜欢Bitbucket,因为它们提供5个免费的私人存储库。 选择项目的存储库。 将ssh密钥添加到您的GIT服务器。 我让Bitrise自动执行此操作。 此ssh密钥将帮助Bitrise无需任何密码即可克隆存储库。 选择分支。 该分支应该是分发分支。 Bitrise将立即开始构建项目。 这是重要的一步,因此请务必小心,直到看到消息Validation👍🏻! 然后将一个Webhook添加到您的GIT服务器。 推送到GIT服务器时,Webhook很有用。 挂钩将在推送后通知Bitrise开始构建。 这也称为触发器 。 现在打开工作流程并进行管理。 将您的配置文件和证书添加到“代码签名和文件”页面。 在此输入.P12的密码。 […]
本文是同时介绍TDD和多个CI概念的指南的一部分。 您可以在 此处 查看介绍性文章 。 如介绍性文章所述,对于本指南,我们将使用TravisCI作为CI平台。 它对开源项目是免费的,并且易于使用。 让我们开始工作: 首先在TravisCI网站上创建一个帐户,然后对GitHub帐户进行配对(您也可以使用GitHub凭据直接登录到Travis,从而无需进行配对过程)。 从项目列表中选择所需的项目,以便Travis可以为其生成一个Webhook。 TravisCI现在已挂接到您的项目上,并且在您的代码更改时将得到通知(默认情况下,它设置为在每次推送以及合并时都运行。您可以在github的项目配置页面上对其进行编辑。 现在是时候告诉TravisCI每次对代码进行推送更改时要做什么。 为此,我们必须将一个文件添加到项目的根目录,并将其命名为“ .travis.yml”。 它看起来应该像这样: 7. TravisCI现在已经配置好,可以开始使用了! 提交并推送您的更改(确保包括.yml文件),应通知TravisCI,它将开始构建您的项目并运行测试! 如果一切顺利,您应该得到一个类似于以下的屏幕: 有些不对劲? 请在下面发表评论,我将尽力帮助! 8.您可能还需要检查日志,以了解实际情况。 但是, xcodebuild日志可能有些冗长和混乱。 为了解决这个问题,我们将使用另一个名为xcpretty小工具,它将获取构建日志并使其更加用户友好。 这很容易。 我们只需要向.yml配置文件添加几行: 2. SwiftLint的另一个优点是,您可以配置XCode来运行它,以便在每次构建后进行编码时都能得到实时警告! 为此,我们必须在Xcode的构建过程中添加一个新的“运行脚本阶段”,并包含以下脚本: 尽管非常有用,但SwifLint有时还是会有些干扰。 在某些情况下,您可能会收到您确实不想更改的代码的警告(例如上面的AppDelegate甚至是测试类,它们本来就很长)。 为避免这种情况,您可以配置.yml文件以指定文件排除项。 我希望您更明确一些,并像 // swiftline:disable:next line_length 随着SwiftLint的本地部分得到照顾,现在是时候让TravisCI处理它了。 同样,这是通过travis.yml:完成的travis.yml: 现在该创建一个CodeCov帐户了。 使用您的GitHub帐户注册并从列表中添加您的存储库。 您应该看到类似于此屏幕。 记下令牌ID,因为稍后我们将需要它。 最后,我们现在可以配置TravisCI,以便每次构建项目时也可以检查覆盖范围。 我们必须在yml文件中添加两件事: 通过添加标志-enableCodeCoverage YES ,将xcodebuild配置为也启用coverage数据 使用after_script选项将覆盖率数据上传到codecov 。 您的Yaml应该如下所示: 已知的错误 xcodebuild目前发生一个已知的错误,其中没有考虑UI测试,这会影响您的覆盖率。 例如,当我想以正确的百分比(在FizzBuzz示例中为100%)更新CodeCov时,例如在合并合并请求之前,我直接在XCode中运行整个测试套件,然后手动上载coverage使用相同的命令向codecov报告: bash […]