Tag: iOS App开发

Apple Watch的电视节目追踪器的状态

两个月前,我被迫从TV Show Tracker中删除了同伴观看应用程序。 Apple App Store提交的新要求于2018年4月1日生效:watch app提交必须使用watchOS 2及更高版本构建。 最初,我计划在接下来的几周内将该应用程序移植到watchOS 4。 在端口中前进,我已经意识到,为了最终确定端口,将需要重写大量代码。 考虑到这一点,我决定将手表应用的重新发布推迟到下一个主要版本的TV Show Tracker 4.0 for iOS推出,该版本将在未来几个月内推出(有关更多信息,请参见下文)。 Watch应用已于2015年4月与Apple Watch一起发布。它是通过watchOS 1.0 SDK开发的,该技术在技术上类似于为iOS开发Notification Center Widget。 在watchOS 1下,所有代码逻辑都在iPhone上运行,所有数据也存储在iPhone上。 这意味着开发要比为新操作系统开发全新的应用程序容易得多,这有两个原因: 由于WatchKit扩展程序在iOS上运行,因此大多数代码库都可以与iOS共享。 数据(即收藏节目列表,首选项,缓存的剧集信息)可以轻松地在Watch和iPhone应用程序之间共享和同步,因为它们实际上存储在同一设备上。 话虽这么说,移植到watchOS 2+意味着重写了大量与watchOS / iOS相互兼容的代码,以及用于在iPhone应用程序和手表对等之间共享和同步数据的新代码。 TV Show Tracker 3.0是在iOS 7之后不久发布的,已经有5年历史了。 3.0版是一个重大改头换面,但不是一个完整的重写,并且与2009年11月在iOS 3下发布的1.0版共享了很多代码库。 当出现错误时,这种非常古老的代码库变得很难维护,发展和修复。 这就是为什么我开始研究1.0以来最大版本的原因:TV Show Tracker 4.0,完全重写了应用程序🚀🚀🚀。 这个主要版本比以往任何时候都更加稳定,集成了新iPhone和iPad的最新功能,并将与每年添加到iOS的所有新功能保持同步。 近十年来,我收到无数关于快乐用户使用TST的电子邮件,这就是促使我保持该应用程序持续发展并不断改善的原因。 再次感谢您的支持! 我知道我在尝试响应和支持遇到问题并崩溃的每个用户时遇到了困难,对此我感到非常抱歉。 这是我现在从头开始开发一个全新应用程序的主要原因之一。 跟随@tvshowtracker是获取有关即将发布的版本的最新消息的最佳方法。 敬请关注!

使用Swift的iOS实用Firebase

该课程的原价为199美元,但在有限的时间内,您只需10.99美元即可获得完整的课程。 优惠券数量有限,请不要等待太久🙂使用下面的优惠券链接: https://www.udemy.com/practical-firebase-for-ios-using-swift/?couponCode=ILOVEFIREBASE 大家好, 在过去的几个月中,我一直在努力学习新课程“ 使用Swift的iOS实用Firebase ”。 我很高兴地宣布,该课程现已出版,可以出售。 我一直认为,学习某件事的最好方法就是去做。 适用于iOS的实用Firebase使用Swift反映了我边做边学的经验。 在本课程中,我们将创建多个实际应用程序,这些应用程序将使我们看到Firebase平台的强大功能。 让我们看一下将在本课程中构建的不同应用程序: 高水位 High Waters应用程序离我的心很近,因为它影响了我当地的休斯顿社区。 该应用程序的目的是通知用户水灾地区。 用户可以在地图上放置一个指示被淹区域的图钉。 任何人都可以看到该图钉,而无需刷新应用程序。 销的位置将保留在Firebase数据库中。 杂货应用 Grocery App是一款偶像应用程序,用于了解Firebase中的父子关系。 该应用程序还向用户介绍了Firebase身份验证系统,该系统允许用户使用自己的自定义凭据进行注册和登录。 用户能够创建新的购物清单,然后将项目添加到购物清单。 根据用户的凭据,每个购物清单与杂货一起保留。 WhatsUp聊天 诸如WhatsApp,Facebook Messenger,微信,Viber等聊天应用程序已成为我们社会不可或缺的一部分。 在本节中,我们将构建一个名为“ WhatsUp”的完整聊天应用程序。 WhatsUp聊天应用程序将允许用户向聊天室中的其他用户发送文本消息和照片。 本节将向您介绍JSQMessagesViewController,它使创建类似聊天的界面变得很容易。 学生还将学习如何使用Firebase存储将照片上传到Firebase平台。 我对本课程感到非常兴奋,希望您会喜欢学习并将Firebase与iOS应用程序集成。 该课程的原价为199美元,但在有限的时间内,您只需10.99美元即可获得完整的课程。 优惠券数量有限,请不要等待太久🙂使用下面的优惠券链接: https://www.udemy.com/practical-firebase-for-ios-using-swift/?couponCode=ILOVEFIREBASE 看完课程后,请给它评分并复习。 您的评分非常重要,它有助于添加更多内容并支付账单😉 谢谢, Azam

iOS开发部分-6

迅捷数组 在本教程中,您将学习数组,创建数组,访问数组的值以及数组中的一些常见操作。 目录 1.什么是数组? 2.如何声明数组? 2.1声明包含重复值指定数量的数组 时报 3.值如何存储在数组中? 4.修改数组元素 4.1整体修改数组 4.2添加新的数组元素 5.一些有用的内置数组函数和属性 5.1 isEmpty 5.2首先 5.3附加 5.4插入 5.5移除 5.6倒转 5.7个 在之前的Swift Data Types文章中,我们了解了如何创建可以容纳单个值的某些Data Type的变量/常量。 但是,如果我们要存储相同数据类型的多个值怎么办。 我们在Swift中使用了一个叫做Array的东西。 什么是数组? 数组只是一个容器,可以在有序列表中保存一个数据类型的多个数据(值),即,您以与定义数组中的项相同的顺序获得元素。 数组可以存储任何数据类型的值,例如Int , String ,class等。 如何在Swift中声明数组? 您可以通过在方括号 [] 指定数据类型来创建一个空数组 。 请记住,您必须在方括号内包括类型,否则Swift会将其视为普通数据类型,并且您只能在其中存储一个值。 声明一个空数组 有三(3)种方法可以在Swift中创建空数组,而速记语法方式始终是首选。 方法1:速记语法 var arr = [Int]() 方法2:数组初始化 var arr = Array() 方法3:具有数组文字的数组 var arr:[Int] = [] […]

iOS开发第-3部分

Swift数据类型 目录 什么是数据类型? 数据类型的大小 Swift数据类型 –布尔 –整数1)整数8和2) UInt –浮动 –双 –人物 –弦 要记住的事情 1.什么是数据类型? 数据类型是变量或常量可以存储在其中的数据(值)的类型。 例如,在文章Swift变量和常量中,您创建了一个变量和一个常量以将字符串数据存储在内存中。 该数据可以是文本/字符串(“ Hello”)或数字(12.45),也可以是位(0&1)。 定义数据类型可确保仅存储定义的数据类型。 让我们看一个场景: 假设您要创建一个游戏。 由于大多数游戏在游戏完成后都会显示高分和玩家姓名,因此您需要为游戏存储这两个数据。 高分是一个数字(例如59),而玩家的名字是一个字符串(例如Jack)。 您可以创建两个变量或常量来存储数据。 在Swift中,这可以通过将变量和数据类型声明为: var highScore:Int = 59 var playerName:String =“杰克” 在这里,我们声明了存储值59的Int类型的highScore变量。并且,声明了存储值Jack的String类型的playerName变量。 但是,如果您执行以下操作: var highScore:Int =“杰克” 您将得到一个编译时错误,指出无法将’String’类型的值转换为指定的’Int’类型 。 这是因为您声明highScore存储整数值,但在其中放置了字符串。 此错误可确保highScore只能存储一个数字,而不能存储玩家的姓名。 数据类型的大小 数据类型的另一个重要部分是其大小。 这指定了可以存储在给定变量或常量中的数据大小。 Type的大小以位为单位进行测量,最多可以存储2bits的值。 如果您不了解Bit,请将其视为0或1的值。 因此,对于Type size = 1位,它最多只能存储21 = 2,两个值:0或1。因此,字母程序的1位系统可以将0解释为a / 0,将1解释为b / […]

UIGestureRecognizer:теория,практика,кастомизация

ПредставляяпервыйiPhone于2007年年初发行,СтивДжобсапеллировалкустареваниюконцепциифизическойклавиатуру Сэтогомоментанаразвитиеустройствскачественнымитачскринами,позоои Теперьпалец – главныйинструментуправлениядевайсомимыможемтапатьпокнопкам,свайпатьсписки,пинчитьфотографии…Давайтеразберемсякакэтореализованососторонысофтаинаучимсяиспользоватьвсюмощьмеханизмараспознаванияжестов。 UITouchиегообработка Нодавайтепопорядку。 Передтем,какначинатьраспознаватьжесты,надопонять,каквообщеприложениеполучаетинформациюокасаниях,свайпах,нажатияхнаэкраниктоихобрабатывает。 Чтопроисходит,когдапалецпользователякасаетсяэкрана? Системасоздаетобъекттипаевоетере Этозначит,чтонавремявсейцепочкисобытий “палецкоснулсяэкрана→палецдвижетсяпоэкрану→палецоторвалсяотэкрана” длякаждогопальца,касающегосяэкрана,существуетуникальныйобъектUITouch。 Далее,используямеханизм命中测试’,находитсясамаяглубокаявиирархииUIView,框架которойсодержиевсеб ПолученнаяUIViewстановитсяfirstResponder ,使用UITouchипрокидыватьихдальшепоresponseerChain 。 Дляобработкипоступающихсобытий,UIViewпредоставляетнесколькометодов: touchesBegan(_ touches:设置,并带有事件:UIEvent?) —началокасания(экранакоснулисьпальцы) touchesMoved(_ touches:Set ,事件:UIEvent?) —изменениепараметровкасания(позициянаэкране,сила(ForceTouch)) touchesEnded(_ touches:设置,带有事件:UIEvent?) —конецкасания(пальцыбылиубранысэкрана) touchesCancelled(_ touches:Set ,事件:UIEvent?) —отменакасания(далеерассмотрим,чтоэтозначит) ТаккакэкранiPhoneподдерживаетмультитач,товодинмоментвремениможетизменитьсясостояниесразу Например,еслипользователькоснетсяэкранадвумяпальцамиодновременно,системавызоветtouchesBegan лишьодинраз,новомножестве 设置 мыполучимдваобъекта—图库矢量图片。 Первыетриметода( 的touchesBegan,touchesMoved,touchesEnded)отвечаютза“нормальный”жизненныйциклUITouchивызываютсяприначалекасания,измененииегопараметров(позициянаэкране,силанажатия)иконцекасаниясоответсвенно。 Однако, 触摸 выбиваетсяизихряда已取消。 Насамомделе,концомжизненногоциклаUITouchможетбытьнетолькофизическийконецжеста,ноикакое-либопрограммноесобытие,вследствиекоторогосистемабудетвынужденапрерватьобработку данногокасания 。 Этоможетпроизойти,например,вслучае,еслипоявилсяинтерфейсвходящегозвонкаипродолжениеобработкикасаниябудетнекорректным – пользовательуженаходитсявконтекстедругогоприложения(телефон)。 Ожидается,чтоприполученииtouches已取消 приложениеотменитвседействиякоторыемоглибытьпротевреивведен。 Дляпониманиялогикиэтоготребованиярассмотримкнопку。 Пустьпользовательнажалнанее,ноещенеподнялпалецивэтовремяпроисходитвходящийзвонок。 ЕслиобработатьtouchesCancelledаналогичноtouchesEndedивызватьобработчикнажатиякнопки,топослеокончаниязвонкаивозвратавприложение будетпроизведенокакое -тодействие,котороепользовательмогнеожидать。 […]

使用Swiftify更好地发送消息

许多开发人员在初次尝试使用该语言时就对Objective-C的消息发送语义感到困惑。 消息发送的语义使得可以“调用”空对象上的方法。 您实际上并不是在调用方法,而不是将消息发送到没有地址的地方。 如果您是在Swift中构建应用,则不必担心理解Objective-C消息发送。 这就是为什么最新版本的Swiftify的Objective-C至Swift Converter大大改进了我们处理消息发送的方式。 在Objective-C中,属性只是方法周围的语法糖,可以像调用方法一样调用它。 @implementation TestViewController:UIViewController-(IBAction)graphButtonClicked:(id)sender { GraphViewController * graphViewController = [[[[self splitViewController] viewControllers] lastObject]; }@结束 注意对[self splitViewController]而不是self.splitViewController 。 在Swift中,您不能引用self.splitViewController()因为该方法不存在。 我们的转换器按预期处理此问题: 类TestViewController:UIViewController { @IBAction func graphButtonClicked(_ sender:Any){ 让graphViewController = splitViewController?.viewControllers.last as? GraphViewController } } 对[self splitViewController]属性getter的调用将替换为Swift中适当的属性调用。 甚至splitViewController的可选性都是正确的! 您可以在此处测试示例。 Objective-C如何处理方法和消息还有另一个有趣的方面。 Objective-C方法的参数名称不是方法签名的一部分。 @interface TestViewController:UIViewController -(NSString *)greetPerson:(NSString *)personName; @ end @ implementation TestViewController:UIViewController-(NSString *)greetPerson:(nonnull NSString […]

将AWS AppSync与React-Native-Navigation集成

如果您使用的是来自Wix的React-Native-Navigation库,请使用分步方法将AWS AppSync与React-Native App连接。 本教程可以用作设置React-native iOS应用程序的指南,该应用程序使用React-Native-Navigation库进行导航,并使用AWS AppSync处理基于云的数据。 首先,设置存储库。 在本教程中,我将使用gitHub,您将在本文结尾处找到该仓库的链接。 react-native初始化yourAppName 请访问官方文档以遵循此安装步骤。 容易跟随截图! https://wix.github.io/react-native-navigation/#/installation-ios 返回官方文档并按照使用步骤进行操作:https://wix.github.io/react-native-navigation/#/usage。 您需要根据wix的上述说明创建一些屏幕; 我坚持使用名字FirstTabScreen,SecondTabScreen和PushedScreen与文档中的示例代码保持一致。 现在,每个屏幕都可以具有基本结构(请参见下文),同时我们确保react-native-navigation正常运行。 在应用程序根目录下的index.js文件中,您会注意到Navigation.startTabBasedApp函数的tabs:数组中每个对象的icon:和selectedIcon:属性; 您可以在此处提供应用程序导航选项卡中显示的所有图标图像的路径。 就本教程而言,我将注释掉这些属性,以免在启动应用程序时出现任何错误。 从’react’导入React,{Component} 从’react-native’导入{Text,View} Class FirstTabScreen扩展了Component { render(){ 返回( 这是您的第一个选项卡屏幕 ) } } 导出默认的FirstTabScreen 按照wix的上述说明并为每个屏幕创建三个简单的组件之后,我们可以转到终端并首次启动我们的应用程序: 反应本机运行iOS 成功! 现在,我们可以进行本机导航! 首次启动控制台时,您会看到一个橙色的“创建API”按钮, 如果这是您第一次使用GraphQL(对我而言),那么“入门”窗口中提供的“架构参考”将为您提供丰富的信息,并且易于遵循。 为了全面了解GraphQL,没有像官方文档这样的地方:http://graphql.org/learn/。 有关AppSync团队创建的其他GraphQL和AppSync资源,请参阅本文结尾。 就本教程而言,我们将使用在模式编辑器中注释掉的示例模式,并对查询类型进行一些修改。 使用左侧的导航菜单,然后单击“架构”以进入编辑器。 执行以下操作以完成您的架构的设置: 成功保存架构后,将在右侧“数据类型”窗口上方启用白色的“创建资源”按钮。 单击它以自动为Schema中的数据类型置备AWS DynamoDB表。 在这种情况下,我们只有一种名为“ Post”的数据类型: AppSync完成设置资源后,现在将在“查询”和“突变”的解析器字段中填充表名称。 您会注意到,尚未自动为“ putPost”突变和“ allPost”查询分配解析器。 我将逐步介绍如何手动设置解析器,首先我们从“ putPost”开始: 接下来,我们将为allPost设置解析器: 简单! […]

适用于应用商店优化的iOS 11视觉指南

苹果的iOS 11更新是App Store的重大改版,并将在ASO中掀起巨大浪潮 。 那么,像您这样的ASO如何准备并确保您准备好大步向前,甚至从中受益呢? 索取我们的iOS 11 ASO视觉指南[此处]! 尽管有一些出色的深入资源(例如StoreMaven指南)可用于了解iOS 11中发生的更改,但该指南通过以下方式提供了独特的价值: 它以视觉为重点 ,带有文本注释,可提供补充见解。 它提供了iOS 10与iOS 11 App Store体验的并排比较 ,从顶部图表到功能选项卡,搜索结果和应用程序产品页面。 它提供了Web 上可用的iOS 11产品页面的唯一全面视图 (请注意,此产品页面是一个由多个现有应用程序中的元素组成的模型,用于说明目的)。 它长达6页,是像您这样的ASO的绝佳速览资源,并且可以作为有用的文档,轻松地向您的队友解释变化 。 在谈到ASO时,我想花点时间提及过去几个月来,我一直在努力与移动增长机构Phiture的Moritz Daan共同撰写一本书,名为Advanced App店铺优化 。 该书将近400页,目的是解释您在该主题上可以想象的一切,包括其他几位知名ASO专家的内容,并且肯定会成为世界上最全面的ASO指南之一。 我们有一个登陆页面,在发布该信息时,我将对其进行更新,因此,敬请期待,并在2017年9月4日(星期二)发布该书! 伙计们,到此为止! 请确保将我们的博客添加为书签,注册到我们的电子邮件新闻通讯以获取新的帖子更新,如果您有兴趣与我们合作,请与我们联系。 Incipia是一家移动应用程序开发和营销机构,专门为公司构建和营销应用程序,并擅长于高质量,稳定的应用程序开发以及基于关键字的营销策略,例如App Store Optimization和Apple Search Ads。 对于帖子主题,反馈或业务咨询,请 与我们联系 ,或将查询发送至 hello@incipia.co 。

协议扩展-iOS

在开始阅读本文之前,我强烈建议您继续阅读以下文章。 了解协议-iOS 通过委托和协议在ViewController之间传递数据 与往常一样,让我们​​如下设置基本协议和类。 如果您已经阅读了我以前关于Protocol的文章,我希望下面的代码可以自我解释。 否则,出于上述相同原因,也会抛出如下错误 您已经猜到了,扩展中的方法仅适用于已确认该扩展之母的类。 在这种情况下,它具有战争能力。 如果我把所有事情都放在一个文件中。 它看起来应该像下面这样。 希望您从本教程中学到了更多有关协议的知识。 祝好运!

使用Objective-C可以做的5件事,但是使用纯Swift却做不到

我喜欢使用Swift进行编程,就像喜欢使用Objective-C或Python或C#进行编程一样,因此,本文并非旨在偏爱这两种语言。 在以后的文章中,我将尝试介绍您可以使用Swift进行的操作,但是不能使用Objective-C进行的操作。 话虽这么说,但是在写了很长时间的Objective-C之后,有时用纯 Swift进行编程时似乎缺少一些工具,尽管通常有一些方法仅使用Swift就能获得大致相同的结果。 用Objective-C编写的许多应用程序和框架都依赖于这些工具,有时还依赖于骇客,这使我们的代码更简洁,更易于使用。 我将以可能是Objective-C中最具争议的主题开始我的列表。 1.)方法混乱 混乱是有争议的,因为它允许您通过更改类选择器的实现来在运行时更改类的行为。 这意味着您可能会拥有一项服务,该服务为您提供类名或方法名作为字符串,并更改应用程序在运行时的行为方式。 不能从NSObject继承而来的纯Swift类(我们想要转换为@dynamic缺乏此功能,但本质上动态性较低且类型安全的语言首先吸引了大多数Swift开发人员。 那里有许多Objective-C框架/库,它们使用方法混乱使我们的生活更轻松并且代码更简洁。 Aspects是一个功能强大的库,它使用复杂的特性使在Objective-C中实现面向方面的编程成为可能。 这使您能够为诸如应用程序分析之类的事情实现非侵入式代码,如另一个库ARAnalytics中所示。 OCMock在很大程度上依赖于Objective-C运行时,而Swift并没有真正支持它。 Rollout.io使用方法混乱,将实时更新推送到您的应用程序。 Rollout.io发生了一个有趣的发展,他们在其中描述了他们甚至如何使用Swift应用程序进行实时更新! 2.)C ++互操作 Objective-C通过名为Objective-C ++的结构支持与C ++代码的互操作性。 许多项目/库都使用C ++作为其核心组件,以便能够更快地交付该库的跨平台版本,而不是用平台的本地语言重写整个库。 PSPDFKit和Realm是很好的例子。 当然,您可以将C ++代码包装在C或Objective-C中,然后通过Swift与该代码对话,但这会增加代码量和代码库的维护量。 3.)performSelector: performSelector:是NSObject类的实例方法,该方法将指定的消息发送到接收方并返回消息的结果。 在这样的对象上进行方法调用会触发一系列事件,这些事件将调用objc_msgSend函数(在Swift中也不可用)。 如果该类的方法调用存在实现,则该函数进行查找,否则,将其链接到超类,直到到达NSObject的根级别为止,在该根级它将引发unrecognized selector sent to instance ,该unrecognized selector sent to instance NSInvalidArgumentException 。 这种机制使您可以在不预先知道对象类型的情况下向对象发送消息,如下所示: 类personClass = NSClassFromString(@“ Person”); id object = [personClass new]; NSString * name = […]