Tag: iOS App开发

构建应用程序时犯下的最大错误

所以您想构建一个应用程序? 太好了,我喜欢人们对新的,创新的应用程序有惊人的想法,这些应用程序可以改变世界或做一些有趣的事情。 因此,您有了自己的想法,然后聘请了开发机构或自由职业者来实际构建它! ! 但是,你现在该怎么办? 坐下来,让他们使用所有精美的功能来构建大型应用程序? 没有。 即使这是大多数公司/个人最终要做的事情。 这是建立公司/个人应用创意的最糟糕的解决方案/方法。 您应该怎么做? 您需要选择实施Roadmapping的开发人员,代理商,策略。 那是什么? 简单来说,它是一个概述应用程序的主要目标/目的,受众,目标和支持的过程。 为什么这是必要的? 因为映射的主要目标是采取一个复杂的,功能加载的想法,并将其分解为最简单的形式和主要的ONE功能。 有了这些信息,您现在就可以设计和构建应用程序MVP和版本1,以便尽快将其发布给用户。 但是我的想法还不完整吗? 好。 您甚至都不知道用户想要什么,不需要一堆不必要的功能,只需要一个可以吸引用户使用的核心功能。 有了他们的反馈,建议和努力,您现在可以在您的应用程序的基础上构建并添加用户想要和持续使用您的应用程序的确切条件。 如果我不这样做怎么办? 您需要与您的开发人员/代理商就应用程序背后的PLAN进行讨论。 他们计划做什么,时间表和时间表,以及何时开始为Beta用户进行测试? 我知道我知道,这听起来像是常识,但是很容易让代理商完全接管并且对您的应用程序的实际过程不透明。 您需要尽快与开发人员/代理商进行沟通,并确保他们制定严格的时间表,计划和开发策略,以便尽快将最基本的MVP提交给Beta测试人员。 如果我不这样做怎么办? 老实说,你可能还好。 并非每个代理商或开发人员都使用此模型,并且他们可能会像您想要的那样为您构建出色的软件。 但是,可能会有一些弊端: 延长项目时间 没有开发范围—未来功能,时间表,发行版,版本控制 更高的开发成本 浪费的功能-更多错误 和更多。 当您没有具体规划路线图时,会有很多“ 假设 ”的计划,您打算如何将该想法从思想,测试到部署。 所以..我想构建一个应用程序,现在呢? 做您的尽职调查,确保您与多家代理商和开发商进行交谈,最重要的是不要仅仅选择最便宜的一家。 在同意开发具有3个以上功能的应用程序之前,请确保您正在与您一起进行某种计划,路线图和发现。 有一些出色的代理机构可以帮助您采纳您的伟大构想,并将其压缩成一个完美的MVP /版本1,并在一半的时间内将其发布给用户,以便您获得真正的价值。 反馈。 收到反馈后,就可以开始慢慢将新功能和新技术集成到您的应用程序中,从而完全满足用户的要求! 我真的希望这能帮助你们中的某些人避免构建应用程序时遇到的最大错误: 失去对开发机构/开发人员的所有控制权和权限。

带有Firebase(iOS)SDK的Google跟踪代码管理器

安装Firebase SDK。 在Firebase控制台中,创建新项目,然后将Firebase添加到您的iOS应用 (输入您的捆绑包标识符)。 下载GoogleService-Info.plist并将其复制到您的Xcode项目根目录中。 将Firebase的依赖项添加到Podfile并安装 pod“ Firebase / Core” 导入Firebase模块并配置FirebaseApp共享实例,通常在应用程序的应用程序中:didFinishLaunchingWithOptions:方法: FirebaseApp.configure() 要启用/禁用调试日志记录编辑方案并添加启动时传递的参数: -FIRAnalyticsDebugEnabled或-noFIRAnalyticsDebugEnabled 将Google跟踪代码管理器添加到您的项目 将Google跟踪代码管理器依赖项添加并安装到您的项目中: pod’GoogleTagManager’,’〜> 6.0′ 在Google跟踪代码管理器帐户中,创建容器(在ADMIN部分中),然后选择Firebase(iOS) SDK 。 提交更改并发布(在“ 工作空间”部分中)。 下载您的容器(“ 操作”->“在VERSION中 下载”部分)并复制到XCode项目根目录中的名为container的文件夹中 记录事件和变量 Google跟踪代码管理器使用Firebase Analytics的事件,参数和用户属性来触发和构建您在Google跟踪代码管理器网络界面中配置的代码。 从这种意义上讲,您的Firebase Analytics实施将充当您的数据层。 我使用EventType枚举来存储和管理将记录的所有事件。 AnalyticsLoger类的方法logEven也使用此参数。 我们可以创建变量来处理 设置Google Analytics(分析)跟踪ID 创建自定义 触发器。 为通用Google Analytics(分析)(而非Firebase Analytics)创建新标签 。 我们必须选择标签类型并放入我们的Google Analytics(分析)跟踪ID。 然后,我们必须选择触发器。 要在Universal Analytics Console中查看活动屏幕名称 ,我们需要设置文件screenName ,值是我们之前创建的事件参数变量。 毕竟,我们必须发布容器。 发布之后,GTM最多需要12个小时来更新应用中的容器。 如果您的应用程序处于开发阶段,则可以预览容器,或下载容器并将其包含在内以在应用程序中进行更新。 如果我们更换容器并想立即对其进行测试。 发布后,我们必须下载并复制到Xcode。 […]

OpenSports支持哪些货币?

无论您称其为“金钱”,“阿根廷”,“格尔德”,“迪内罗”还是“拉哈”,OpenSports都可以满足您的要求。 如果您以前曾经通过OpenSports组织过一场游戏,那么您可能知道我们的便捷在线支付方式; 您不再需要担心从参与者那里收取现金。 如果您尚未通过OpenSports筹集资金,则设置起来非常简单。 您所要做的就是创建活动并设置价格,然后观察玩家的资金流入。 接受货币💵💶 我们知道全球有许多OpenSports用户,因此我们使在不同国家/地区的收款变得更加容易。 OpenSports现在接受来自以下国家/地区的货币: 澳大利亚,奥地利,比利时,加拿大,丹麦,芬兰,法国,德国,香港,爱尔兰,意大利,日本,卢森堡,荷兰,新西兰,挪威,葡萄牙,新加坡,西班牙,瑞典,瑞士,英国和美国。 货币 澳元,欧元,克朗,克朗,港币,日元,纽元,新元,瑞士法郎,英镑,加元和美元。 继续赚钱并逃跑🏃💰 使用此新功能,便利是我们的首要任务。 我们不仅希望简化您的游戏组织,而且希望您能够以自己喜欢的货币收取费用,轻松,快速,高效地进行游戏。 因此,继续组织游戏,收款,赚钱,玩得开心! 如果您想谈收钱,请发送电子邮件至alicia@opensports.net Ali

Swift编程:模块化更好

通过模块化代码库满足单一责任原则。 我们通常会在很短的时间内开发一个应用程序,但是非常复杂。 为了达到交付目标,最好使用一些pod依赖项。 SJProgressHUD曾经是模块化的依赖项,用于显示Cocoapods上可用的弹出窗口或加载过程。 替代者是SVProgressHUD,MBProgressHUD,JQProgressHUD。 例如,让我们选择SJProgressHUD。 我们可以在每个地方附加SJProgressHUD.show() ,例如UIViewController类,AppDelegate类,Presenter或Controller(如果使用的是MVP / MVC),也可以附加在Model类中。 一切正常,但我们违反了软件开发原则:请勿重复。 如果我们将其放在模型上,则另一个问题是违反单一责任。 该模型不负责显示进度视图。 如果我们未能在模型类和视图类之间定义边界,那么由于零件之间的紧密耦合,下一个问题将会严重。 您的意大利面条代码必须重构。 有许多解决方案可以对其进行重构。 首先,我们从UIViewController创建一个扩展类。 在扩展文件中,添加一些将用于处理加载视图的函数,例如showLoading() , showError()和showSuccess() 。 导入SJProgressHUD 类UIViewControllerExtension { 扩展UIViewController { func showWaiting(消息:字符串){ SJProgressHUD.showWaiting(消息) } func showError(消息:字符串){ SJProgressHUD.showError(消息) } } } 创建扩展后,只要在UIViewController上,我们都可以从任何地方调用showWating(“getting doctors, please wait…”) 。 让我们看一下问题,实际上并不是UIViewController的所有派生类都需要知道这一点。 例如,我们的AboutVC仅显示应用程序版本。 //无需导入SJProgressHUD 类AboutVC:UIViewController { func viewDidLoad(){ } func viewWillAppear(){ //这里很神奇… wa可以在每个UIViewController的任何位置调用它。 //但是幸运的是AboutVC不需要了解它。 showWaiting(“请稍候…”) […]

React Native iOS应用中的多种方案和配置

React Native Schemes管理器 显然,由于packenger从节点模块目录创建Xcode项目引用时,packenger的工作方式,React-Native在处理Xcode构建配置和方案方面存在问题。 这可能是一个问题,因为您需要在应用程序中处理多个环境…… 幸运的是,您可以在React Native iOS应用中轻松处理多种方案和配置。 今天,我将撰写有关React Native Schemes Manager的工具,我发现该工具可用于解决React Native中的这一固有问题。 希望对您有所帮助。 1.添加新的构建配置 根据您的需要添加并命名新的构建配置。 您将通过克隆当前的“发行版”或“调试配置”来完成此操作。 在此示例中,我们将创建两个配置StagingQA的Debug副本和ProductionQA的Release副本: 2.为新的构建配置添加方案 如果您为每个构建配置创建模式,将更易于处理不同的包ID或显示名称或应用程序图标。 只要确保您创建的架构是“共享的”,并且在Run and Archive具有正确的构建配置参考即可。 有两种方法可以最快地创建一个新模式,即option(⌥) + click播放符号,然后复制原始模式。 您可以根据需要命名这些架构。 再次确保每个模式在Run和Archive中都具有正确的构建配置参考,并且已检查 “ Shared bod 。 3.安装React Native Schemes Manager 根据您的包管理器的偏好使用: yarn add –dev react-native-schemes-manager 要么 npm install –save-dev react-native-schemes-manager 4.更新您的package.json 按照React Native Schemes Manager的安装说明,您需要: 将 xcodeSchemes 部分 添加 […]

LEADTOOLS OCR App评论

发表于十月3,2016由凯蒂 LEADTOOLS为.NET(C#和VB),C / C ++,WinRT,iOS,OS X,Java和Web提供了快速,高精度的光学字符识别(OCR)SDK技术。 世界各地的开发人员正在利用LEADTOOLS SDK在其企业中所有平台(包括服务器,台式机和移动设备)上的应用程序中添加高性能的OCR和文档处理。 OCR是一个非常消耗处理器的过程,因此,服务器和台式机上的本机OCR是可以预期的。 但是,您知道LEADTOOLS OCR也可以在Windows Phone,Android和iOS上本地运行吗? 为了在您的设备上测试LEADTOOLS OCR的性能,我们创建了几个应用程序并将其放在各自的应用程序商店中。 这些应用可以将OCR图像存储在设备上或用相机拍摄,以提取文本或转换为基于文本的文档格式,例如PDF或DOC。 OCR应用程序功能包括: 从用手机的相机或相册拍摄的图像中提取并复制文本 将图像转换并导出为各种文档格式,包括:PDF,DOCX,文本,SVG等 英文,西班牙文,法文,德文和意大利文的OCR图像(SDK提供更多图像) 在图像中选择一个区域以对整个图像进行OCR或OCR 多种图像处理功能可优化文本识别,包括3D偏斜校正(梯形校正),颜色反转和旋转(SDK随附更多功能) 更好的是,如果您是开发人员,则可以在下载LEADTOOLS SDK时获取这些应用程序的源代码以在自己的应用程序开发中使用! OCR应用程序只是LEADTOOLS中提供的源代码中的应用程序之一。 有关更多信息或要下载免费的评估版SDK,其中包括OCR应用程序的源代码,请访问:https://www.leadtools.com/sdk/ocr 当我们构建此移动应用程序以向开发人员展示LEADTOOLS SDK中可用的OCR技术时,任何人都可以在下载LEADTOOLS OCR应用程序时使用并从中找到价值。 我们测试了许多其他可用的OCR应用程序,但文本识别的速度和准确性确实没有可比性。 此外,我们在易于使用的界面中提供了多种识别设置和各种输出格式。 但是,请不要相信我们,请亲自检查LEADTOOLS OCR应用程序(它是免费的!) 从Apple App Store下载LEADTOOLS OCR App 从Google Play下载LEADTOOLS OCR应用 请访问https://www.leadtools.com/demos/anywhere-apps,以查看您可以在设备上安装的所有移动应用程序(包括OCR)的列表。

Swift 3.0 ile Unit Testi

Herhangi bir kod yazmayabaşlamadanönce,单元测试中心,neden yapmayadeğerolduğunu已成功地完成了所有任务。 单元测试,测试小组,测试小组成员,测试小组成员,测试小组成员,测试小组成员。 Bu,işlevlerimizinbeklendiğigibiçalıştığınıdoğrulamaolanağısağlar。 雅妮,herhangi井işlevICIN已经井笛子girdiverildiğinde,işlevindoğrudeğerleridöndürüpdönmediğinibelirleyebiliriz已经geçersizgirdisağlanırsayürütmeişlemisırasındabaşarısızlıkları扎里夫井şekildeişleyebiliriz.Sonuçta,BU belirli井işlevioluşturankodun kalitesiniartırmayayardımcıolmak ICINalgoritmalarımızdakiveyamantığımızdakihatalarıbelirlememizeyardımcı oluyor。 XCode 8.1’de swift ilenasıl单元测试一般可用于单元测试。 单元测试示例包含单元测试,包括单元测试。 Projemizioluşturduktan桑德拉testiniyazacağımızfonksiyoniçinbasit bir senaryogeliştirelim。 Kullanıcımızdan名称ve agedeğişkeniolan iki tane用户nesnesialalımvebunlarınyaşıküçükolanınadınıdönenuygulamayıyapalım。 使用olarak用户模型。 使用者必须先进行操作,然后再进行操作。 达哈·索纳·埃克兰丹(danha sonra ekrandan)和其他用户之间的比较。 Buraya kadar kikısımbasit bir fonksiyon yazmakiçindi。 测试sınıflarıoluşturmayabakmadanönce,测试gezgini birgözatmayadeğer。 测试gezgini,projeiçindekitüm测试paketlerinin kaynak kodbileşenlerinibelirler ve测试sınıflarınıve测试yöntemlerinihiyerarşikbir已列出görüntüler。 Şimdibuyazdığımızfonksiyonun testiniyazalım。 UnitTestExampleTests可以设置,删除并测试fonksiyonu olan testExample的设置,还可以进行拆解。 设置fonksiyonu kurulum kodyazılankısımdır。 Buyöntem,sınıftaki她的测试yöntemininçağrılmasındanönceçağrılır。 tearDown isesınıftaki她的测试yöntemininçağrılmasından桑拉çağrılır。 Fonksiyonumuzu测试工具已设置,但用户已安装了该工具。 Daha声呐testCompareUserAgeadındabir test […]

将IOS本机应用程序与离子应用程序捆绑在一起

警告:此页面是非常技术性的,我希望您可能不必使用它,因为我们应该将它分成2个应用以提高性能,但是如果有帮助,请在下方评论comment 嗨,大家好。 最近,我有一个问题:“我们可以从IOS应用导航到导航应用吗?”。 您可能会想,为什么我们不创建新的App而是大声笑。 尽管如此,我必须实现它,所以我开始研究它,我将向您解释它的工作原理。 总览 此页面的目的是说明如何将iOS本机应用程序与Ionic应用程序捆绑在一起,以及如何将应用程序从主要本机应用程序切换到Ionic。 为了更加方便,我使用git子模块将离子应用程序代码提取到主应用程序。 步骤1:安装Cordova框架 由于导出的离子应用程序使用Cordova框架,因此我们也必须使用它 首先,安装依赖项项目管理,例如可可豆荚或迦太基(在此示例中为迦太基) 使用依赖库 开放终端 $ touch Cartfile $ vim Cartfile 然后,在下面添加 github“ apache / cordova-ios” 按Control + C键盘上的 然后输入:wq! 更新迦太基 在终端中,键入以下内容 $迦太基更新 将库添加到Xcode 打开Xcode,选择要捆绑的项目 在项目导航中选择应用程序 然后,单击构建阶段 单击将二进制文件与库链接部分以展开 然后单击添加(+),然后单击添加其他…Finder将显示在屏幕上 选择Carthage(在项目文件夹上)> Build> iOS> Cordova.framework 然后点击打开 步骤2添加git子模块 在终端中键入这些命令 $ git子模块添加框架/ 终端会将git的源代码加载到Frameworks文件夹中 例如,$ git子模块添加https://gitlab.com/o2oplatform/trueyours.git Frameworks / trueyours 已记录 在此步骤中,您必须在项目中具有git,然后才能运行上述命令。 如果没有,请在终端输入以下内容 […]

使用Swift在iOS上进行单元测试Model View Controller

Swift Single App View项目设置 因此,这很简单,只需打开Xcode,单击“创建新的Xcode项目”,选择“ iOS”和“ Single View App”。 然后单击“下一步”。 我将我的项目命名为“ Account”,但是您可以随便调用它。 从下拉框中选择适当的团队。 然后,取消选中“包括UI测试”和“使用核心数据”。 我们对单元测试感兴趣,因此请选中“包括单元测试” 。 然后,单击“下一步”。 至此,我们有了可以开始构建的样板代码。 让我们花点时间注意Xcode为我们创建的所有文件。 其中包括AppDelegate,主故事板,“帐户组”文件夹下的ViewController和具有一些样板单元测试用例的AccountTests文件。 我们的ViewController具有以下代码: 我们已经完成了在应用程序中实现整个MVC模式的工作,并为此编写了单元测试。 最后,我希望您在尝试开发MVC应用程序时记住以下几条原则 使用协议在控制器中建模和查看 对模型和视图使用合成而不是继承。 对控制器的模型和视图使用依赖注入 。 并始终尽早编写单元测试用例 。 希望本文能有所帮助,因为这是我的第一篇有关媒体的文章,请让我知道我的工作方式。 我在Orthogonal工作,我们根据监管准则和标准为客户开发医疗应用程序。 由于这些应用程序与健康相关,因此我们遇到了非常新颖和前沿的概念,这些概念处于AI,IoT和医学的交汇处,我们与客户合作进一步发展。 听起来很有趣? 我们一直在寻找有才能的人。 在https://orthogonal.io上查看我们

用户注册用例中的第一个重构

我们可以“第一时间正确”获得系统是一个神话。 这篇文章是基于另外两个帖子。 首先检查它们以获得更广泛的了解: 使用TDD https://medium.com/cocoaacademymag/authentication-rules-in-a-handcrafted-ios-application-with-tdd-8db5396ebac6的手工iOS应用程序中的身份验证规则 使用集成测试在iOS上进行Firebase用户注册https://medium.com/cocoaacademymag/firebase-user-registration-at-ios-with-integration-tests-fa450e4ec8bb 这篇文章将为您提供有关我在项目中所做的更改的更新。 这些更改在此提交中。 我还将谈论: 单一责任原则 实体 测试驱动开发和单元测试 问题 在写这个项目的最后一篇文章时,我意识到我的用户注册用例不止一个责任。 这打破了第一个SOLID原则,即单一责任原则。 用例具有验证数据和跨其他层传递数据的复杂性。 现在我已经知道责任在哪里,是时候提取代码并对其进行测试了。 负责进行格式验证的代码将提取到小类中,这些小类将负责单个目的。 这些类称为实体。 实体封装了企业范围的业务规则。 实体可以是带有方法的对象,也可以是一组数据结构和函数… …它们封装了最通用和最高级的规则。 当某些外部变化时,它们变化的可能性最小。 马丁,罗伯特。 “清洁建筑” 2012 我只显示ValidateEmailEntity 。 因为其他实体遵循相同的过程。 所以我从 实体测试。 第一种情况非常简单,只是空电子邮件的断言,应该是无效的。 并使此测试成功运行。 下面的代码已经足够了。 在这个简单的场景之后,我开始增加测试的复杂性。 通过电子邮件使用无效字符,没有提供者,不完整和特殊字符来进行断言。 幸运的是,一个简单的正则表达式(可在Stack Overflow上找到)使所有方案都通过了。 下面的代码显示ValidateEmailEntity是如何获得的。 为每个数据格式验证创建一个实体后,我将回到用例并利用这些实体。 以下是具有多个职责的旧用例: 旧用例 重构(添加13个和删除24个)后, 用例更加简洁易懂: 如您所见,我还创建了一个具有isValid属性的协议,以促进错误验证。 另一个得到相应的错误。 可能要注意的是,我还创建了一个协议来保留某种模式,这对于仅过滤无效输入很有用,并且我还创建了一个error属性。 并且由于我正在测试与用例分开的验证,因此不再需要在用例级别上测试所有数据变体。 因此,我运行了测试,所有测试都是绿色的,重构成功完成。