Tag: iOS应用程序开发

在Swift-3.0中与Enum一起玩……

为什么Swift中需要Enum ? * D为一组相关值定义一个通用类型 * 使用枚举 硬编码字符串 枚举示例 关联值&& 原始值?? 关联值用于将自定义值与Case绑定在一起。每次都有值的变化。 Raw Values声明每种情况的默认值

Twitter最佳iOS技巧:11月版

开发社区在11月非常活跃,因此我为您找到了许多出色的iOS Twitter技巧。 准备探索Xcode 9的最新功能(暂时忘掉一些错误!),有关单元测试的许多技巧(您已承诺明年开始编写),方便的LLDB详细信息和一些有趣的时刻! 上个月开始享受280个符号的宝石。 Twitter技巧#1 这个方便的解释表将描述Pointer名称后面隐藏的所有“内脏”: Twitter技巧2 使用Core Data / Realm和多个线程时要遵循的“黄金法则”。 这样,数据库维护就不会随着时间的流逝而成为噩梦。 Twitter技巧#3 一个可变阴影的好用例! 您可以使用它来确保引用的是参数值的本地可变副本,而不是原始参数。 Twitter技巧#4 每个旅程都从一个步骤开始。 如果遵循以下3条简单的规则,即使是单元测试的旅程也是可以实现的: Twitter技巧5 在约翰·桑德尔(John Sundell)启发我们之后,您已经开始进行单元测试,对吗? 多亏了Arek,现在您知道⌃⌥⌘U快捷键的行为可能因光标位置而异: Twitter技巧#6 Xcode的能量影响分析器非常强大。 您甚至可以根据OLED功率模式估算对iPhone X的能量影响。 不是纯技巧,而是要知道! Twitter提示#7 最新的Xcode 9进行了不错的改进。现在,您可以在Objective-C项目中使用`@ available`关键字在运行时检查系统版本: Twitter技巧#8 最新的Xcode的另一个绝佳提示。 这是通过删除单个文件来提高UI性能的方法。 Twitter提示#9 使用自动版式时,停止更新动画的约束。 有一个更好的方法: Twitter技巧#10 您是否曾经想过将指纹用作Macbook Pro上的sudo密码? 现在,通过这一行代码,您可以做到这一点。 Twitter技巧#11 字典的alt下标处于最佳状态。 第一个版本更干净,也更快。 Twitter技巧#12 充分利用LLDB的e ( e表示expression )命令的全部潜能,并始终停止使用po命令。 这将大大改善您的调试体验。 Twitter提示#13 LLDB表达式很难处理吗? 使用此命令,您可以查看日志输出并找出问题所在。 Twitter提示#14 […]

NSFW模型的iOS CoreML项目[Swift]

一个使用CoreML和开放nsfw模型的小型iOS项目。 自从WWDC2017首次宣布以来,Apple的Core ML已经问世了一段时间。 这是一个令人兴奋的新框架,有了iOS 11,在macOS和iOS上运行ML模型变得更加容易。 Apple提供了许多已经采用Core ML模型格式的开源模型,可以在这里找到。 我的示例项目将使用Yahoo的开放式nsfw模型和python coremltools进行转换。 为了编写Core ML并在您的设备上运行它,您将需要: Xcode 9 Beta iOS 11测试版 打开nsfw模型 Python coremltools 0.4.0 我不会详细介绍安装Python的细节。 您将需要Python 2.7作为coremltools。 入门项目 我已经编写了一些UI代码,因此您可以专注于对ML部分进行编码🙂 1.将.caffemodel转换为.mlmodel 由于Yahoo的开放式nsfw模型为caffe模型格式,因此我们需要首先将其转换为CoreML模型格式。 我用python coremltools编写了一个简短的脚本来完成该任务。 该软件包的文档可以在这里找到。 在您刚刚从Yahoo的GitHub页面下载的“ open_nsfw_master ”项目中,进入其子文件夹“ nsfw_model ”并创建convert.py 。 import coremltools#将caffe模型转换为Core ML模型caffe_model =(’resnet_50_1by2_nsfw.caffemodel’,’deploy.prototxt’) coreml_model = coremltools.converters.caffe.convert(caffe_model, image_input_names =’数据’, is_bgr = True, red_bias = -104, blue_bias = -123, green_bias […]

交互式InfoWindow GoogleMaps iOS

Google Maps iOS API不支持交互式InfoWindows。 以下教程显示了如何通过向InfoWindow添加按钮来实现此功能。 使用GoogleMaps设置一个简单的应用程序 首先在XCode中创建一个单一视图应用程序。 将应用程序命名为GM-CustomInfoWindow-Button。 不要忘记也输入组织标识符。 XCode将为您生成一个新项目。 要使用GoogleMaps,您首先需要导入其库。 使用CocoaPods可以轻松完成此操作。 查看他们的站点以了解有关安装的更多信息。 使用Atom或记事本创建一个新文件并编写以下内容。 将文件保存在主项目目录中,并将其命名为Podfile。 然后在终端中,导航到您的主项目目录并运行pod install 。 CococaPods将为您安装所有必需的依赖项,并在您的主项目目录中创建一个工作区文件。 安装后,通过工作区文件打开您的应用程序。 为了使用GoogleMaps,您需要一个API密钥。 如果您不熟悉,那么绝对应该看看此页面 。 要使用GoogleMaps,您首先需要在Google的API控制台中注册您的应用程序,然后将API密钥复制到该应用程序中。 因此,首先通过单击导航区域上的应用程序名称导航到应用程序的常规设置。 在“常规”标签中,您会找到捆绑包标识符。 复制它并将其粘贴到API控制台中的API密钥的捆绑包标识符列表中。 这样,您已经为该特定的API密钥注册了应用程序。 接下来,您需要告诉您的应用程序必须使用哪个API密钥。 因此,转到AppDelegate类并import GoogleMaps 。 在方法func application(_ application: UIApplication, didFinishLaunchingWithOptions:….)用控制台中的API密钥替换“ YOUR-API-KEY”字符串(如下所示)。 下一步是创建mapView。 首先,首先更改您的ViewController文件。 首先,导入import GoogleMaps并实现GMSMapDelegate 。 import UIKit import GoogleMaps class ViewController: UIViewController, GMSMapViewDelegate { } 现在,您必须将ViewController连接到情节提要中的视图。 使用助手编辑器,通过创建一个名为mapView的IBOutlet并将故事板中ViewController的视图与ViewController文件连接起来,并将其类型更改为GMSMapView […]

Instagram API-使用Swift进行身份验证

本教程将向您介绍Instagram API,并教您如何验证Instagram帐户并检索访问其他端点(例如,获取媒体,喜欢,评论,关系等)所需的ACCESS_TOKEN。尚未使用任何第三方库。 1要使用该API,我们需要在Instagram API平台上注册一个应用程序并接收一个CLIENT ID。 下面的表格显示了该屏幕的外观。 我已经填写了一些虚拟的详细信息,因此在注册您的应用程序时请使用您自己的信息。 所有字段均为必填项。 对于redirect_uri字段,请输入一个有效域,并将其写下来,因为稍后您将需要它。 另外,如果您在使用隐私政策时遇到困难,可以在此处找到示例模板。 2输入所有必需的详细信息后,单击“详细信息”选项卡旁边的“安全性”选项卡,然后取消选中“ 禁用隐式OAuth”。 默认情况下,应选中它,如下所示。 完成后,只需单击注册按钮。 3如果您的应用程序已成功注册,您将被重定向到“管理客户端”屏幕,您可以在其中找到您的客户端信息。 Instagram默认将您的API设为沙盒模式。 这意味着每个访问令牌每小时只能使用500个请求。 如果您想了解有关限制的更多信息,可以在速率限制下找到它。 该限制足以进行测试,但如果要上线,则需要提交生产模式。 为此,Instagram希望您完成您的应用程序,然后录制视频以展示您如何使用其API,然后提交以供审核。 您还需要选择所需的权限。 提交过程类似于Facebook API。 您可以在管理->权限下找到提交表单。 Instagram API平台已完成。 现在让我们做一些编码! 🤓 Instagram没有像Facebook那样为我们提供应用程序登录。 相反,我们需要直接在UIWebView中调用特定的URL,这将打开Instagram登录表单。 然后,用户应输入他的凭据,我们的工作是拦截回调的响应。 这是实现Instagram身份验证的唯一方法。 我不会告诉您如何在界面生成器中添加UIWebView组件,就像我已经知道的那样。 我将只关注代码。 在继续之前,请使用UIWebView组件和IBOutlet创建单独的控制器。 添加常数 首先,我们将常量存储在名为API的结构下。 我更喜欢将所有常量保留在名为Constants.swift的单独文件下。 struct API {static let INSTAGRAM_AUTHURL =“ https://api.instagram.com/oauth/authorize/”static let INSTAGRAM_CLIENT_ID =” YOUR_CLIENT_ID“ static let INSTAGRAM_CLIENTSERCRET =” YOUR_CLIENT_SECRET“ static […]

使用Swift 5结果类型构建简单的异步API请求

Apple终于在2019年3月底将Swift 5发布到稳定版频道。它捆绑在macOS的Xcode 10.2中。 Swift 5为Apple平台中的Swift标准库提供了ABI稳定性。 这意味着,所有未来的Swift版本将与使用Swift 5代码编写的应用二进制兼容。 它还引入了App Thinning,缩小了应用程序的大小,因为ABI的稳定性意味着二进制文件不必将所有Swift标准库嵌入应用程序包中,从而减小了应用程序的大小。 从iOS 12.2开始,操作系统将包括Swift运行时和标准库。 您可以在下面的链接中阅读与Swift的未来有关的所有有关模块稳定性和库演变的信息。 ABI稳定性和更多 在MacOS,iOS,watchOS和tvOS上稳定Swift的ABI是一个长期的目标。 swift.org 是一个稳定的ABI。 在本文中,我们将讨论Swift 5的新Result类型,以及如何利用它来创建异步API请求并简化对完成处理程序闭包的处理。 在开始之前,让我们看看我们通常如何在Swift中创建一个异步函数。 我们通常使用几种方法。 1. Objective-C风格 使用Objective-C样式,我们创建一个带有多个参数的单个回调closure ,其中包含异步函数中的可选result value和可选error 。 func fetchMovies(URL:URL,completionHandler:@ 转义 ([Movie] ?, Error?)-> Void){ … } 2. Swift风格 在这种样式中,我们创建2个完成closures 。 一种是将result value作为参数处理成功,另一种是the error作为参数处理失败。 func fetchMovies(URL:URL,successHandler:@ 逃逸 ([Movie])->无效,errorHandler:@ 逃避 (Error?)->无效){ … } 介绍Swift 5结果类型 Swift 5最后引入了新的Result类型,以使用enum来处理异步函数的结果。 只有两种情况都使用带有关联值的Swift […]

Native Apps VS Hybrid Apps:关于永无止境辩论的一些思考

我们到过那里:浏览一个应用程序时会想到“到底是谁做的?”,因为用户体验非常糟糕,并且永远需要执行任何操作。 为什么这样说呢? 因为在我们深入研究到底要坚持原生应用还是混合应用开发之前,绝对值得一提的是,无论采取哪种方式,应用用户都希望获得 无缝体验。 正如我们SFL团队不只一次看到的那样,这是任何开发路线中最重要的方面,并且如果无法实现出色的性能,那么就本机与混合问题进行辩论是没有用的。 为什么? 只需查看以下统计信息: 如果您的客户不属于那些不太在乎其移动用户体验的用户的5%,那么您确实必须尽一切努力使其与众不同。 有关本机和混合应用程序的一些重要内容 从某种意义上说,可以将本机应用程序与定制的设计师服装进行比较。 它适合正确的方式,只是……感觉正确。 它是专门为移动操作系统开发的应用程序(如iOS的Objective-C或Swift或Android的Java。 每个操作系统都有严格的生态系统,技术和用户体验准则,该应用程序严格遵守这些准则。 因此,该应用程序使用户感到熟悉并快速运行。 为什么“感觉正确”很重要? 因为用户已经直观地知道如何在应用程序中导航。 当购买新的移动设备时,该用户会花费大量时间来习惯其导航,并且它永远不会没有挫败感。 本机应用程序使用户有机会从习惯于应用程序导航的新麻烦中解脱出来。 本机应用程序的另一个优点是,它们可以访问设备的内置功能(例如GPS,联系人,相机等)。 现在,回到混合应用程序。 这些是单独的网站,恰好与本机应用程序打包在一起。 乍一看很难区分混合应用程序,因为它们通常具有本机应用程序的初始外观。 有两种构建混合应用程序的方法。 最常见的一种可能是使用HTML,JavaScript和CSS等网络技术。 这种方法归结为构建在本地运行的单页应用程序(SPA),并增强了JavaScript功能以访问移动本机功能。 PhoneGap,Cordova和Ionic都以这种方式运行。 这种方法的缺点是性能会受到很大影响。 另一个常见的方法是提供一个框架,用于开发应用程序,然后通过映射到特定于平台的元素并用特定于平台的实现方式替换特定于本机的元素来针对不同的平台进行编译。 从性能的角度来看,这种方法要好得多。 React Native和Xamarin使用这种方法。 混合应用程序开发的使用很吸引人,因为它大大减少了上市时间和开发成本-一段代码解决了多个设备生态系统。 它也不需要单个生态系统的丰富知识,并且可以由技能水平相当有限的开发人员来执行。 但是,另一方面,这些应用程序在功能上受到限制,因为并非每个电话功能都映射到框架中。 想象一下,如果您的应用在Android和iOS上看起来一样。 这样或那样,这将不会以最佳方式影响用户体验。 资源 那么,为什么是本地人呢? 为什么要混合动力? 为了理解这一点,有必要了解以下内容:建立移动应用程序的决定是由以下两种动机之一推动的:您要么想赶上您的竞争对手之一,要么有了一个全新的想法,那就是没人能拥有曾经想过。 无论出于何种原因,客户端通常都希望在昨天准备好应用程序。 但是,这种匆忙通常意味着在应用程序质量上有很多妥协,并且有很大的压力要比您准备好更快地做出决策。 因此,在决定采用本机方法还是混合方法时,请记住以下几点: 本机应用程序性能更好,具有更好的用户体验和更高的安全性。 如果您有足够的资金并且时间限制不那么严格,则最好坚持使用本机应用程序。 如果您想大幅缩短产品上市时间和开发工作,则混合应用程序可能会帮您解决问题。 一切都与经验有关 无论您选择使用本机方法还是混合方法,都要牢记的重要一点是用户体验。 智能手机的使用已经超过了桌面访问应用程序和上网的范围,因此无缝体验是唯一可以确保您的移动设备不会对您造成不利影响的事情。 应用程序的性能及其用户体验会因选择的开发框架而有很大差异。 不用说,从两个角度来看,本机开发方法都是无与伦比的。 它更快,更可靠,这对于安全性至关重要的多个领域的应用尤其重要。 这些统计数据显示最终应用程序的性能对最终用户如何重要: 无缝的用户体验应该解决所有问题,并在导航,适应性和布局,交互性,动画,版式,颜色,应用程序内行为等方面带来无与伦比的体验。 仅通过本机方法才能完全实现这一点。 […]

iOS Swift教程-学习语言基础

Swift是一种非常容易学习的编程语言,因为其语法易于遵循。 在本iOS Swift教程中,我们将介绍一些Swift语言基础知识,并且我们将了解使用Swift编程语言进行开发的过程是多么容易。 在开始构建iOS应用之前,我们需要了解Swift语言的基础知识,并了解它们如何协同工作,然后才能构建所需的出色应用。 在本教程和所有后续教程中,我们将使用Swift 3。 定义变量 变量用于存储值,以后可以在程序中对其进行操作。 首先,让我们创建一个新的游乐场并保存。 然后清除所有游乐场内容。 要定义变量,请使用关键字var,后跟变量名称,如下所示: var myvar 您可以为变量使用任何名称,但不能以类似以下的数字开头变量名称: var 2myvar 上面的定义是不正确的,但是您可以包含如下数字: var myvar2 使用所需的任何变量名,但要具有描述性。 要为该变量分配值,请使用等号,如下所示: var myvar =“您好,LikeGeeks访问者,欢迎使用iOS Swift教程” 字符串插值 要打印字符串并包括其他类型的值,可以使用字符串插值\()进行如下转换: var var1 = 100 var var2 =“您好,我口袋里有$ \(var1)” var var2 =“你好,我口袋里有$ \(var1)” 您不仅限于字符串变量,还可以在Swift中定义不同类型的变量。 var var1 = true var var2 = 50 第一个变量var1是布尔类型。 您可以对布尔类型使用true或false。 第二个变量var2是整数类型,或者用Swift语言命名为Int。 在Swift中,您不需要键入变量类型,而该类型则是类型推断 。 Xcode根据提供的值检测变量类型,因此,如果在引号之间为变量分配值,则表示变量是字符串,如果键入整数作为值,则表示变量类型为Int等, 您可以像这样显式定义变量类型: […]

制作自己的CocoaPods-第2部分

第一部分演示了Cocoapods及其安装以及私有规范回购的创建。 不要错过创建私人椰壳足纲的第一部分。 实际上,这个系列的故事始于私人可可足类动物的意图,但是在写作的过程中,它使我与公共可可足类动物一并完成,使其焕发青春。 在这个故事中,您将逐步演示cocoapod的创建及其分布(无论是公开的还是公开的)。 制作自己的CocoaPod 步骤1 此步骤适用于直接的第2部分查看者,因为第1部分查看者在创建私有规范存储库时已经经历过。 登录到任何支持.git项目的源代码管理管理工具(即Github,Gitlab或Bitbucket)。 第2步 使用任何选项(私有或公共)创建一个新的存储库,并命名您的cocoapod存储库。 保留其余字段(描述除外),因为这些字段将在下一步添加。 对于该演示,我创建了一个名为my_own_cocoapod的存储库 私有和公共的创建过程都是相同的,但是分发过程会有所不同。 因此,请您明智地选择选项。 第三步 使用以下命令打开用于创建自己的cocoapod的终端。 $ cd [DIRECTORY_PATH] $ pod lib create [COCOAPOD_NAME] 在终端中,转到您自己的目录以创建自己的cocoapod。 对于演示, cd Desktop/MY_OWN_COCOAPODS/ Cocoapods具有很好的实用程序,可以使用示例项目以及可选的测试框架来创建自己的cocoapod。 该命令将通过交互式脚本提示,如下所示 平台? -> [iOS / macOS] 语言? -> [Swift / ObjC] 包括演示应用程序? -> [是/否] 建议测试框架? -> [快速/无] 基于视图的测试? -> [是/否] 它将在示例项目上运行pod install ,而您的选项由交互式脚本给出,并使用Xcode打开示例项目的.xcworkspace 。 对于演示, $ […]

带有NSLayoutConstraint的iOS动画,采用Swift 4和Xcode 10

大家好,我已经在Swift 4中使用NSLayoutConstraint尝试了一些简单的iOS动画。这是动画, 您可以在此处找到视频教程-Swift Dynamics 让我们进入代码。 请从此处下载入门应用程序。 入门应用程序在中心包含两个UIView和一个imageView。 首先,我将打开Main.storyboard并为Main.storyboard添加height和width约束。 之后,添加horizontal和vertical约束。 现在,我们将为top Orange view添加约束。 我在0处添加了前导,尾随和顶部约束。 将bottom约束添加到imageView’s垂直间距。 现在,为第二个视图添加行trailing和bottom约束。 将顶部约束添加到imageView’s垂直间距。 打开assistant Editor并为imageView创建一个引用。 为imageView的vertical约束创建一个引用。 打开ViewController.swift并创建另外两个变量 var minHeight:CGFloat = 0.0 var viewCenter:CGFloat = 0.0 minHeight是我们可以垂直滚动到的最大值(顶部或底部)。 viewCenter是视图的中心。 这里的要点是限制平移手势只能在垂直方向上移动。 因此,我将编写UIPanGestureRecognizer的扩展。在UIPanGestureRecognizer ,我们将覆盖touchsMoved(_ touches: _ event: )函数。 每次我们拖动imageView时都会调用此方法。 在此函数内,我们必须计算阻力的velocity 。 从速度中我们可以检查运动是horizontal运动还是vertical运动。 如果velocity.x值大于velocity.y值,那么我们将取消运动。 这是最终代码, 类PanDirectionGestureRecognizer:UIPanGestureRecognizer { init(目标:AnyObject,操作:选择器){ super.init(target:target,action:action) } 覆盖func touchesMoved(_ touches:Set ,事件:UIEvent){ super.touchesMoved(触摸,带有:事件) 如果状态==。开始{ 令vel […]