Tag: iOS应用开发

2019年构建出色iPhone应用程序的分步过程

在本文中,您将学习MindSea团队逐步实现iPhone应用程序的过程。 没错-我们正在拉开窗帘! 这是我们今天将指导您的三步过程: 步骤1:开始制定行动应用程式策略 第2步:规划应用的UX(在编写代码之前) 步骤3:建立产品路线图 但是在我们开始深入研究之前,我们必须回答一个问题: 你为什么要听我们怎么说? 在过去的十年中,我们一直在为B2B和B2C品牌(SaaS公司,新闻媒体等)构建移动应用程序。 我们构建的应用已被数百万用户下载。 我们已经与Proposify等SaaS公司合作: 像Adam这样的B2C品牌可以帮助: 和国家邮政等新闻媒体: 我们所有移动应用程序项目中的一个常数是什么? 我们的三步过程。 我们使用称为移动应用程序蓝图的分步过程来构建这些应用程序以及许多其他成功的iPhone应用程序。 因此,让我们开始吧! 步骤1:开始制定行动应用程式策略 如果要构建成功的移动应用程序,则必须从战略入手。 在实际编写一行代码或构建第一个线框之前,您需要知道您要构建的内容以及原因。 在此步骤中,需要重点注意三点: 为您的移动应用建立主要目标 在进入开发过程之前,请先退后一步,确定您实际上在尝试通过移动应用程序实现的目标。 如果您一开始没有设定目标,那么剩下的过程将毫无目标-您将不知道自己是否朝着正确的方向前进。 确定您的目标受众-并且要具体! 产品市场契合度很高。 您以前听过这句话: “如果您想成为所有人的一切,那么您将一无所有。” 在计划移动应用程序时,请确保您不打算针对大众。 定义您的受众群体,不要太宽泛。 但是也不要在另一个方向上走得太远。 如果您定位的受众群体太小,从长远来看,您不会看到正的投资回报率。 只创造值得创造的东西 有想法是件好事—毕竟,这就是引导您构建应用程序的原因。 但… 太多的想法(和太多的功能)可能会使您拥有一个移动应用程序,该应用程序执行很多操作,而它们却做得很差。 如何避免这种情况? 专注于需求。 观众需要从您的移动应用程序中获得什么? 它应该提供什么功能? 它应该解决什么问题? 必须包括哪些功能? 立即执行工作,以避免以后必须重建整个应用程序时进行两倍的工作。 请记住:第一次迭代不一定是唯一的迭代,因此不要尝试将所有内容都放入您的第一次构建中。 第2步:规划应用的UX(在编写代码之前) 现在您知道了您的目标是什么,需要包括哪些功能,下一步就是编写代码,对吗? 没那么快。 在 编写一行代码之前…… …您需要确定应用程序的工作方式以及用户的旅程。 然后,您必须进行全部测试。 这是我们的方法: 逐个屏幕概述用户旅程 构建移动应用程序最重要的步骤之一是: 规划人们实际使用该应用程序的方式。 […]

React Native和OneSignal第1部分(iOS)

对于React Native,使用One Signal api进行远程通知非常轻松且舒适。 有非常简单的安装和配置步骤。 让我们开始; 创建一个React Native项目 $ react-native init项目 安装一个信号包并链接到项目 $ npm install-保存react-native-onesignal $ react-native链接react-native-onesignal 如果您没有,请注册一个信号帐户。 在XCode中打开您的项目,然后转到“ 功能”标签,然后将“ 推送通知 ”设置为“开” 再次在“ 功能”选项卡中,找到“ 后台模式”并将其设置为“开”,然后选中“ 远程通知” iOS推送证书 访问此页面并使用“自动配置工具”轻松创建证书。 下载.p12文件。 从OneSignal的“所有应用程序”页面中选择您的应用程序,然后转到“应用程序设置”,然后按Apple iOS设置右侧的配置。 上载之前导出的.p12文件 从’react’导入React,{组件}; 从’react-native-onesignal’导入OneSignal; //从节点模块导入包导出默认类App扩展了组件{constructor(properties){ 超级(属性); OneSignal.init(“ YOUR_ONESIGNAL_APPID”); OneSignal.addEventListener(’received’,this.onReceived); OneSignal.addEventListener(’opened’,this.onOpened); OneSignal.addEventListener(’ids’,this.onIds); } componentWillUnmount(){ OneSignal.removeEventListener(’received’,this.onReceived); OneSignal.removeEventListener(’opened’,this.onOpened); OneSignal.removeEventListener(’ids’,this.onIds); } onReceived(通知){ console.log(“收到通知:”,通知); } onOpened(openResult){ console.log(’Message:’,openResult.notification.payload.body); console.log(’Data:’,openResult.notification.payload.additionalData); console.log(’isActive:’,openResult.notification.isAppInFocus); console.log(’openResult:’,openResult); […]

开发iOS应用-第2部分

这是示例屏幕截图。 一旦完成开发并为应用商店做准备。 使用Apple开发人员帐户,您可以将您的应用进行测试,然后要求测试人员为您执行测试。 发布: 乐在其中- 在应用商店中发布iOS应用 。 完成此操作后,您将成为iOS的正式开发人员和App的自豪所有者 。 但这当然也是最棘手的部分。 如前所述,在创建iOS应用程序的过程中,我学到了很多东西。 一个主要也是最重要的教训是 不要为这个过程留出一些时间,因为这不是一件容易的事。 我不会在这里涂糖衣。 很难将您的应用程序放入应用程序商店,尤其是第一次。 伙计们,现在不要责怪苹果公司的严格指导方针。 如果要保持App Store清洁,则需要它。 那为什么我说很难呢? 好。 因为要发布应用程序,有很多准则/规则。 这就是您需要的东西, 您将需要完成,运行良好且设计精美的iOS应用。 (当我说设计精美时,我是认真的,Apple希望您遵循他们的《 人机交互指南》 ) 然后,您需要注册Apple Developer Program 。 您将充分利用此功能,并在完成测试版后以及想要认真对待事情时(例如,当您要将应用程序放到应用商店中时)进行注册。(请记住, 每笔费用约为99美元年 ) 在开始发布之前,请仔细阅读《 App评论指南》 。 您不一定必须逐字逐句地进行检查,但是如果这样做,那就很好了。 虽然您开发了出色的iOS应用程序,但Apple会对您的产品进行评论,他们也必须有同样的感觉。 一旦他们批准了您的应用,该应用就会在应用商店中启动。 很多事情都会出错,但是最重要的是将应用程序带到商店 。 所以你不敢放弃。 预留大约2周的时间进行发布。 您可能需要与Apple团队来回交流,否则您可能会在第一次遇到问题。 但是要留出时间。 Apple的应用程序审查团队非常明确,可以让您知道他们对在应用程序商店中发布该应用程序的期望。 因此,与他们沟通并获得所有需要的清晰度。 苹果承诺将在24小时内对任何请求做出答复,最多2个工作日,并且他们确实做到了。 快速提示: 确保在Xcode中调试应用中的所有可能错误。 没有警告信息 ! 如果您上传的版本不是beta版本 ,则在应用程序或其描述中不会提及“ beta […]

获得iOS开发人员工作需要了解的三件事

找工作很难。 如果您花了很多时间浏览iOS开发人员的职位,您会发现所需技能列表非常艰巨。 您真的需要五年经验吗? 了解TDD是否有意义? 他们列出的所有那些框架呢? 他们有多重要? 看来他们还希望有人将应用程序运送到App Store。 您也需要这样做吗? 在我的生活中,有一点我看了看所有的东西,耸了耸肩,决定不申请。 然后,我负责并在业余时间系统地学习了其中的每一项技能。 这是我作为独立的iOS开发人员工作多年后发现的。 大多数职位发布都是心愿单,而不是硬性要求 技能清单并不是一成不变的。 它可能甚至不是由开发人员编写的。 您会看到,大多数开发人员都太忙了,以至于不愿意撰写职位发布。 在其他许多相互竞争的优先事项之间,我们的时间几乎被拉长了。 通常是这样的。 人力资源部的一个人问开发人员,他们在新员工中想要什么技能。 然后,开发人员会喷出任何突然冒出来的东西。 人力资源人员会编译一个列表,将其添加到职位发布中,并提供给所有人查看。 这样我们才能得到听起来像这样的职位 “我们正在寻找一位资深Rockstar iOS Ninjaneer,他熟悉通知,委托,表视图,配置,堆栈视图,TDD,Stacy提到的一件事和变量。 除非您有Swift十年的工作经验,否则请不要申请。” 同时,回到现实世界,事实证明, 您只有三项核心技能才能成为iOS开发人员。 这是因为大多数iOS应用项目都是同一事物的不同风格。 要了解优秀员工的模样,您需要了解一般的iOS应用项目 无论是供企业使用还是供消费者使用,大多数人都希望应用程序能够与Internet通讯。 结果,典型的iOS应用仅是围绕某种Web服务的漂亮外壳。 如果您接受这个前提,这三个技能将是最优先的 对Web服务的理解以及编写与之交互的代码的能力。 对关注点和设计模式(例如MVC和MVVM)分离的理解,可以加强这种分离。 了解对象持久性及其如何在iOS应用中实现。 而已。 这实际上只是三个核心技能。 让我们更详细地了解它们。 对Web服务的理解 要成为一名高效的iOS开发人员,您需要编写与Interwebs交流的代码。 这意味着您需要了解Web服务,REST API,数据库,异步进程和JSON。 您编写的代码将与这些东西交互。 除了iOS应用程序外,有些工作可能还需要您构建Web服务,但这并不是很常见。 通常,他们为此有一个单独的人。 关键是您需要知道那些东西是什么。 您需要花费大量的时间来构建可与Web服务一起使用的应用程序。 如何获得经验 我通常不会提倡这一点,但是到底是什么。 只需联系一些公司,告诉他们您正在学习iOS开发,并询问他们是否对开发人员进行了代码测试。 代码测试将告诉您获得该工作所需的一切。 大多数iOS代码测试都要求您编写一些示例应用程序,以与其示例Web服务对话。 它们是学习Web服务如何工作的好方法,而无需自己构建Web服务。 如果您可以在其时间限制下通过其中一项测试,那么您已具备基本的Web服务技能。 […]

MVVM + FlowControllers路径的动机–杰出发明–中

有许多种构建iOS应用程序的方法。 MVC(模型视图控制器),MVP(模型视图演示者),MVVM(模型视图模型),VIPER(视图交互器演示者实体路由),Redux……当然,您可以命名其他许多名称。 我已经编写iOS应用程序已有一段时间了,并且我注意到MVVM + FlowControllers方法对我来说非常有效。 在这篇文章中,我想重点介绍“为什么?”,而不是其他方法,以及“如何?”,我在自己的应用程序中使用了它。 为什么? 开始 开始iOS开发通常与学习基本模式有关,您可以使用这些基本模式来解决在尝试在应用程序中创建第一个屏幕时遇到的问题。 MVC很可能是第一个处理您的视图和逻辑的模式,该模式在iOS开发人员中非常流行(不仅限于它们)。 这主要是由于Apple在UIKit框架和您可以在其教程中找到的代码示例中大力推广了这种模式。 MVC不好吗? 是! 这是最糟糕的! 这会导致Massive ViewControllers出现在您的应用程序上……开个玩笑…… 不,这不对。 当我最近阅读“关于iOS应用程序体系结构的很多话”一文时,我感到非常高兴。 我不能说我完全同意那里所说的一切,但是我可以肯定地认同某些部分。 为什么我很高兴阅读这篇文章? 因为这句话: “没有人会强迫您在一个控制器中实现多个数据源。 在viewDidLoad中发起网络调用。 在UIViewController中解析JSON。 用Singleton实例硬连接View。” 许多开发人员将MVC的混乱和混乱归咎于MVC,而这实际上是由开发人员自己造成的。 如果您缺乏纪律,那么即使VIPER也无法为您提供帮助。 某些模式可能使更容易正确地构造代码并保持代码整洁,但是是否遵守纪律始终取决于您。 如果最后还不错,我应该使用MVC吗? 如果我是一名熟练的顾问,我可能应该说“这取决于”。 MVC显然有其优点和缺点,我敢打赌,您会发现许多很棒的文章将帮助您下定决心。 为什么选择MVVM? 如果MVC还不错,那么我遵循MVVM路径的动机是什么? 仅举几个例子: 它使我可以将代码的很大一部分远离UIKit (这是一种可以更快地测试此代码的功能–作为macOS框架)。 它使我能够测试驱动视图的逻辑。 它与反应式编程方法非常有效(但您无需使用它们即可从MVVM中受益) 所以现在,在采用了MVVM模式的原理之后,我能够拥有被动视图(尽可能愚蠢)和驱动视图的逻辑,这些逻辑也与UIKit分离。 为什么不采用像VIPER这样的模式真正很好地定位的划分方法呢? 好吧…你可以做到的。 我以前从未在大型项目中使用过VIPER(很高兴听到您对此的看法!),但是,我想说这种模式对于中小型应用程序可能是一个简单的过大杀伤力。 我认为,如果您想让您的解决方案易于理解,同时又能够轻松测试您的代码,并与依赖于UIKit的代码区分开,那么MVVM会非常有效。 流量控制器 使用它们的动机是什么? 在ViewController“ A”内找到负责转换到屏幕“ B”的代码时,这并不稀奇。 这种方法的问题是,突然之间,您在这两个实体之间建立了紧密的耦合,如果您想在其他情况下拆分或重用它们,可能会遇到麻烦。 好吧……问一个问题总是很好–这是一个问题吗? 如果您正在做一些简单的事情,那么使用这种导航可能会很好,但是,如果您要处理更复杂的事情,添加flowController肯定会有所帮助。 请记住,添加flowController并不是一项高成本的任务-即使在简单的应用程序中,我也倾向于使用它们,因为它们可以帮助我更好地组织代码并让我对应用程序中导航的工作方式有个很好的了解。 将flowController添加到您的应用将帮助您: 使屏幕彼此分开,这将使您可以模块化并轻松地重复使用它们。 控制应用程序各部分的流程(您可能会有许多不同的flowControllers) […]

快速到React Native —第1周

看,纸牌屋 我对版本的恐惧最终成为事实。 我开始的入门项目(遵循React Native文档)使用了旧版本的Expo和React Native。 因此,我更新了所有内容,并花了60分钟来跟踪问题,现在当我在Atom中工作时,流程不再起作用。 所以我必须手动运行Flow … 并不是说iOS开发从来没有这样的问题,但是我觉得这些事情发生的频率降低了。 道具和状态vs实例let和var 如果我明白这一点,我很确定prop等同于声明为let的实例变量,而state等同于var声明的实例变量。 学习新平台始终是一个挑战。 我可以接任何分支:-) 流程:如果很重要,为什么不使用它 好的,这是我这周的咆哮。 如果Flow被认为是使使用JavaScript编写的代码安全并且是React Native的推荐解决方案的原因,那么为什么它是如此糟糕? 以及为什么它在React Native框架代码上返回错误。 为什么要使其始终如一地工作是一个主要的难题…… 如果Flow标记了一些错误,React Native背后的团队至少可以同意不发货。 现在,我有24个错误,这些错误令Flow Flags我无能为力。 因此,当我运行Flow时(手动,请记住,由于某种原因它不再在Atom中运行),我必须仔细检查所有内容,以确保不会在我的代码中弹出新内容。 这很痛苦,并且会导致出现错误,因为我最终变得懒惰并错过了新的错误…… 如果“应该”使用Flow,那么为什么RN入门站点上的代码示例未添加Flow装饰?!?!? 我不得不谷歌如何获取该代码以通过流程验证。 当然我学到了一些东西,但是来吧…… 通天还是反应? 我应该选择哪个 在教程之后,您最终添加了一些工具和命令,这些工具和命令只是为了到达那里而并非总是完全理解。 是的,这通常意味着在将来的某个时刻,您将最终了解您的实际工作以及原因。 因此,Atom有时表明我有两个“不兼容的程序包”,并带有一条错误消息(确实看起来有人对此进行了思考,这很棒),但我仍然感到困惑。 您告诉我阅读此内容后应该做什么: language-babel检测到存在不兼容的名为“ react”的Atom软件包。 建议您禁用“ react”或“ language-babel” 原因: Atom社区软件包“ react”(不要与Facebook React混淆)可以为提供JSX自动缩进功能的atom方法打补丁。 当它检测到JSX范围而不考虑所使用的语法时,它会尝试自动缩进由language-babel突出显示的JSX。 由于language-babel还尝试使用标准atom API进行自动缩进,因此会造成潜在的冲突。 那么我应该踢哪一个呢? 这让我想起了Windows vs Apple。 Windows提供所有选项,Apple会为您预选。 我更喜欢Apple是有原因的,我通常不想强调所有选项。 所以问题仍然存在,我应该保留哪一个? Flex与自动版式 […]

使用QLPreviewController快速显示文档

从远程URL显示文件。 假设我们有一个必须在应用程序中显示的文档的远程URL。 在显示任何此类文档之前,我们必须将文件下载到app目录,然后才能显示该文件。 为什么不应该将远程URL作为QLPreviewItem传递? 您可能会认为QLPreviewItem是NSURL类型,我们可以执行类似的操作以直接显示文件。 QLPreviewItem = remoteURL 为! 网址 是!! 我们做得到。 该文档也可能会显示。 但这不是处理远程URL的正确方法。 如果我们不下载就显示大尺寸文档,则将看不到它们。 共享文档时可能会导致崩溃。 所以这就是我们要做的。 看图 我们将异步下载文件,下载后,文件应从临时 位置移至destinationURL 。 并且此destinationURL将用于在QLPreviewController中显示文件。 见图,我们在完成块中返回fileLocation 。 如果您不知道完成块。 看看链接。 同样,我们都已设置为显示来自远程URL的文件。 我们只需要按下按钮displayFileFromURL(_ sender:UIButton)。 您可以从我的Git存储库QuickLookDemo下载完成的演示项目。 摘要 伙计们,这一切都是关于我对Quick Look框架的经验。 我最近使用了此功能,因此想与大家分享。 尝试一下,让我知道我是否错过任何事情。 祝您好运,如果您喜欢或学到新东西,请推荐并分享。

我寻求与Ableton建立联系的新方式

我受到Ableton Live 10新增的“收藏”功能的启发。 我觉得它开始使我意识到DAW工作流程的根本问题。 直说吧,我爱DAW音乐制作。 我特别喜欢在Live中工作。 我发现这是完成工作的鼓舞人心的创造环境。 Ableton Push 2的发展使Device Mode控件在所有新图形中都变得如此优雅。 我认为没有更好的方法来控制这些参数。 浏览器也变得更加面向用户。 它功能强大,可反映应用程序中实际浏览器的外观。 当我以高估的信念飞跃并购买了2017年的Touch Bar MacBook Pro时,我立即被触摸条迷住了,这是Ableton命令的可能性! 我很快发现了为此存在有限的实现。 我的意思是,如果您从事Logic工作,那就太好了。 但是,尚无Ableton支持。 有一个名为Midi Touchbar的免费应用程序,它将您的触摸条变成一个通道条。 很高兴有帮助。 但是我想要更多! 我发现自己正在寻找更高层次的集成。 我尝试了一个由Steven Slate编写的名为“批处理命令程序”的IOS应用程序,但我对使用一个按钮启动多个命令的想法感到震惊。 我也很喜欢创建自己的自定义工作流程的整个过程。 对我来说,这代表了当今可用的DAW生产工作流管理的顶峰。 但是,我是一名制图人,而对我来说,美术部门就睡着了。 我可以看到应该是什么样子。 一旦在我的脑海中有了一个想法,我就很难发现它。 从那时起,我开始寻找IOS开发人员,使我对iPad或Apple Touchbar的想法做出美好的新尝试! 然后,我从他们那里得到了一些报价,这让我大声笑,同时哭了! 但是,其中一个程序员给了我一个他朋友参与的应用程序的名称。 那个朋友把他的小应用卖给了苹果。 猜猜它做什么? 是的,这是您计算机的命令中心。 连续发送应用程序的关键命令以启动整个工作流程! 该应用实际上被称为…iPad的工作流程。 这件事已经存在,这是一个启示。 但是,我再次不喜欢最终的界面看起来像什么。 更通用的外观按钮。

50 iOS面试问答第二部分

38- LLVM和Clang有什么区别? Clang是LLVM工具链的前端(“ clang”是LLVM的C语言家族前端)。 每个编译器都有三个部分。 1.前端(词法分析,解析) 2.优化器(优化抽象语法树) 3.后端(机器代码生成) 前端(Clang)获取源代码并生成抽象语法树(LLVM IR)。 39-什么是阶级? 类旨在定义一个对象及其工作方式。 这样, 类就像对象的蓝图。 40-什么是物体? 对象是类的实例。 41-什么是界面? Objective-C中的@interface与Java接口无关。 它只是声明一个类的公共接口,即其公共API。 42-我们何时以及为什么使用对象而不是结构? 结构是值类型。 类(对象)是引用类型。 43-什么是UIStackView? UIStackView提供了一种水平或垂直布置一系列视图的方法。 我们可以定义所包含的视图如何将自身调整为可用空间。 不要错过这篇文章。 44- iOS应用程序的状态是什么? 非运行中 -应用程序未运行。 无效 -应用程序在前台运行,但未收到事件。 例如,当收到呼叫或SMS消息时,可以将iOS应用置于非活动状态。 活动 -应用程序在前台运行,并接收事件。 后台 -该应用程序在后台运行,并正在执行代码。 已暂停 -应用程序在后台,但是没有代码在执行。 45-开发人员应该处理的最重要的应用程序委托方法是什么? 操作系统在应用程序委托中调用特定方法,以促进与各种状态之间的转换。 开发人员应处理的七个最重要的应用程序委托方法是: 应用程序:willFinishLaunchingWithOptions 启动启动过程时调用的方法。 这是在应用程序内执行任何代码的第一个机会。 应用程序:didFinishLaunchingWithOptions 启动过程快要完成时调用的方法。 由于此方法是在显示任何应用程序窗口之前调用的,因此这是准备界面和进行任何最终调整的最后机会。 applicationDidBecomeActive 一旦应用程序变为活动状态,应用程序委托将通过applicationDidBecomeActive方法接收回调通知消息。 每当应用程序从上一次切换到活动状态(由此产生的电话或SMS变为非活动状态)时,都会调用此方法。 applicationWillResignActive 有几种情况将产生applicationWillResignActive方法。 每次发生临时事件(例如电话)时,都会调用此方法。 还需要注意的是,“退出” […]

位置经理包装

位置管理器是一种包装器,可以以更简单的方式使用CLLocationManager(iOS框架使用GPS)并摆脱所有这些委托和错误处理。 位置管理器同时提供了一次性定位和实时跟踪的功能。 特征: 易于使用。 提供事先的错误处理。 根据设备电池百分比调整位置精度。 如何使用: 不要忘记添加“ NSLocationWhenInUseUsageDescription”键和“ NSLocationAlwaysAndWhenInUseUsageDescription”键到您的Info.plist文件中。 (Xcode在Info.plist编辑器中将这些键显示为“隐私-使用时位置用法说明”和“隐私-始终和使用时位置用法说明”。) 1.一次获取位置信息: let locationManager = LocationManager(withAccuracy: LMLocationAccuracy.bestForNavigation) locationManager.getCurrentLocation { (response) in switch response { case .failure(let locationError): switch locationError { case .authorizationFailed(let description): print(description) case .locationUpdationFailed(let description): print(description) } case .success(let location): print(“location is :”, location) self.lbllat.text = “\(location.coordinate.latitude)” self.lblLong.text = “\(location.coordinate.longitude)” } } 2.对于实时跟踪: […]