Tag: 应用

Swift地图之外的世界

在这篇文章中,我将谈论一些我们在Swift中很少听到的东西: 应用函子。 这些使我们可以用最少的代码执行一些非常强大的操作。 这使用的是我上次介绍的HKT(高级类型)框架的扩展和简化版本。 我们看过Swift中的Functors : 总而言之 , Functor是“容器”(例如Array或LinkedList之类的序列),它们具有一个称为fmap的超能力映射 ,该映射可转换容器的内容,但使容器本身保持完整。 即使您从LinkedList中的数据开始,常规映射也会始终返回Array。 在本文中,我们将进一步介绍这个想法。 fmap (和标准库中的普通地图 )在某些方面非常有用 ,但肯定会受到限制。 例如,当您想使用具有多个参数的函数来转换容器时会发生什么? 这是我们可以使用应用函子解决的问题。 守则 和以前一样,代码可以在游乐场(包括一些挑战!)和XCode项目中使用,以添加到自己的代码中。 污染数据 通过一个激励性的示例,假设我们正在编写一个Web应用程序来计算退休储蓄。 由于这是公共应用程序,因此我们担心我们可能会传递恶意数据。 处理此问题的一种方法是将所有外部Web数据视为已污染 (就像Ruby一样)。 然后,我们就有一个干净的过程来检查数据并将其标记为安全 。 在Swift中,让我们使用枚举为WebData建模: (因为我们正在使用上一篇文章中的HKT框架,所以存在可构造的一致性和TypeParameter ) 有趣的是,受污染的数据无处不在-任何一个输入被污染的函数都会有一个受污染的输出(或者等效地,只有所有输入都是安全的,函数的输出才是安全的) 因此,假设我们有一个普通函数,该函数接受3个输入并计算一个输出。 接下来,我们从网络上获得此功能的3个输入: 我们要做的是使用这些输入来运行退休金计算; 但返回一个WebData值,该值仅在所有输入都安全的情况下才是安全的 。 这是一种实现方法,其中包含一个很大的switch语句。 这行得通,但是有很大的缺点:它的功能很长(因为有3个参数,所以要在开关中测试2³= 8个组合); 我必须专门为WebData编写函数(而原始函数仅使用常规的Int,Double等); 我将对我要在应用程序中使用的每个功能重复练习。 但是, WebData是一个可应用的函子 -我们将在稍后看到它的含义-因此,我们可以免费使用HKT框架(或多或少)提供的一些帮助程序功能。 在这种情况下,我们将使用框架中的Appl3 , 将3个参数的函数应用于3个应用函子的列表。 这样,我只需一行代码即可获得与长switch语句相同的效果, 而不必更改我的原始功能。 假设我们现在清除一些数据: 对于那些喜欢“延续风格”的人,您也可以使用它,它允许具有任意数量的参数的功能: 如您所见,这比您自己解包WebData容器要简单得多。 这也是可以用于许多其他类型的技术。 稍后我们将看到一些示例。 但是首先,让我们更详细地解释应用函子。 […]

Flutterのアプリアイコンを环境ごとに分ける

本记事では,Flutterのアプリアイコンをンを环境ごとに分ける简単な方法について绍介します。 アプリアイコン以外全般については,iOSメインですが以下をご覧ください。 Flutterで环境ごとにビルド设定を切り替える— iOS编 最低限度,以下くらいには分けると円滑に开発・テスト・リリースができます。 flutter_launcher_iconsを利用 Flutterには,flutter_launcher_iconsというiOS ・ Andoidアプリアイコンを生成するとても便利なツールがあります。 flutter_launcher_icons | 飞镖包 flutter_launcher_icons Dart软件包–该软件包简化了更新Flutter应用的启动器图标的任务… pub.dartlang.org fluttercommunity / flutter_launcher_icons Flutter启动器图标–一个软件包,简化了更新Flutter应用程序的启动器图标的任务。 完全… github.com 基本的な使い方は以下です。 1.インストール #pubspec.yaml dev_dependencies: flutter_launcher_icons:“ ^ 0.7.0” 2.设定を记述 #pubspec.yaml(flutter_launcher_icons-development.yamlでも良い) flutter_icons: image_path:“ assets / images / icon.png” android:true ios:是的 もっと细かい指定も可能ですが,READMEを见てください 3.画像ファイルを配置 上で指定したimage_pathの场所にアイコンに指定したい画像ファイルを置く。 4.コマンド実行 $ flutter包pub运行flutter_launcher_icons:main 风味ごとにアイコンを変える そして,本题のFlavorごとにアイコンを変えるやり方です。 以下のPull Requestで対応された机能ですが,まだ使い方のサンプルなど整っておらず, masterではなくflavorブランチに隔离されています。 通过sestegra读取风味图标文件·提取请求#69·fluttercommunity / flutter_launcher_icons 预期文件如下:flutter_launcher_icons.yaml或pubspec.yaml,来自默认图标flutter_launcher_icons… github.com […]

在WKWebView和本机代码之间创建链接

在过去的一个月中,我一直在为对产品有一些特定要求的客户工作; 他们想要一个使用特定地图组件的应用程序,就像他们在网络应用程序中使用的组件一样。 这意味着两件事:javascript🙈并试图找出如何在本机代码和将包含地图的Web视图之间进行通信。 让我们花一些时间来概述问题。 我们在这里处理两个主要组件:用于容纳地图的WKWebView和本机用户界面。 我们希望在这些组件之间双向发送消息。 当用户与地图上的某些对象进行交互时,我们需要在本机代码中触发事件以执行操作,例如显示界面元素,或触发对新视图的选择。 我们还需要从本机代码向Webview发送消息,因此我们可以将所有繁重的工作委托给本机应用程序,以最大程度地减少javascript必须进行的计算。 对我们来说很幸运,WKWebView提供了我们需要的一切。 稍作修改,我们就可以对其进行配置,使其完全满足我们的需求! 设置Web视图是很简单的,而且有据可查,因此这里不再赘述。 您可以通过代码实例化它,也可以在Interface Builder中的视图中拖动一个并为其创建出口。 我选择了后者。 让我们使ViewController符合WKScripMessageHandler和WKNavigationDelegate: 不要忘记在viewDidLoad中将网络视图的na vigationDelegate设置为self! 好了,现在我们已经拥有了Webview设置的一部分。 稍后我们将再次讨论,但是首先,我们将深入研究一些javascript。 快速免责声明:我不是Web开发人员。 如果您是经验丰富的javascript专业人士,请避开下面的代码。 我们需要在javascript中做的就是创建一些函数来处理传入的响应,并将响应发送回Webview。 我希望您对设置index.html文件感到满意,所以我不会向您展示如何做到这一点。 现在,我们可能想做其他事情,而不仅仅是记录接收到的值,但是为了解释这个概念,这样做就可以了。 假设我们要在Web视图中保留一个人员列表,那么将从本地上下文中调用addPerson函数以将其添加到Web视图中。 可以调用sendNameToNative函数将消息发送回本机代码。 让我们添加最后一个构建块,以使一切正常工作! 我们需要在loadView函数中做一些事情,所以我们将重写它。 在这里,我们将为Web视图设置一些属性,以在调用sendNameToNative函数时侦听来自javascript的回调。 您可能需要根据设置视图的方式来摆弄这个。 您可能要做的一件事是将框架更改为等于view.frame,而另一处可能解决问题的方法是在最后一行之后添加view = webview 。 这可能会带来其他问题。 这里只剩下一件事要做,实际上是在向Webview发送消息。 这是我们难题的最后一部分; 实际将消息发送到Webview。 调用此函数使我们可以在Web视图中执行javascript。 在示例中可以看到,当我们要发送字符串时,需要在其周围添加”。 现在,我们可以在webView(_:didFinish 🙂函数中调用类似的函数来设置加载时的Webview,并在与本机用户界面交互后调用它以发送更多消息。 请记住,当您处理用户输入的属性时,您可能需要对其进行验证,以免在Web视图中执行恶意的javascript。 现在您已经确定了结构,可以开始疯狂了: 实际处理响应以触发本机代码中的某些动作,例如动画或segue。 添加更多处理程序以处理来自Web视图的不同响应,从而在两者之间创建紧密连接 恭喜你! 如果您正在阅读本文,那么您已经在WKWebView和应用程序的本机上下文之间创建了连接。 这提供了很多可能性,您可以根据需要进行扩展。 如果您为此创造了一些很棒的东西,请与我分享! 如果您喜欢这篇文章,请查看 我写 的 其他文章 ! […]

iOS 10.3对成长型市场营销人员意味着什么?

戴维·雷恩克(David Reyneke) 苹果本周为即将发布的iOS 10.3发布了beta版本。 自2013年Google Play商店推出类似功能以来,更新一直着重于用户反馈。 iOS 10.3的新功能将使开发人员可以通过Apple系统提示来提示用户,而无需离开应用程序内体验。 此外,此更新还为开发人员提供了在App Store中回应评论的功能。 不再留下负面评论了! 是时候重新考虑用户反馈的提示了 由于App Store排名算法非常重视好评,因此,增长市场营销人员一直希望在用户对应用的兴趣达到空前高涨的时候,优雅地提示用户对其应用进行评论。 我们在Prolific的许多合作伙伴应用程序中都采用了这种策略,询问用户是否有良好的使用体验,或者将其发送到App Store以查看他们是否同意,或者将其路由到反馈表,如果他们似乎没有话要说的话。 但是,我们经常争论这种策略可能对用户体验的影响。 这些提示在什么时候不影响产品的实用性? Apple似乎已将辩论内部化,使您可以提示用户提出审阅请求的次数标准化了。 借助iOS 10.3,Apple每年将每位用户的上限限制为三个。 这个限制无疑会促使产品团队考虑何时使用三枪最有利。 这是一个简单的例子,我们的高级iOS开发人员Thibault Klein为我们模拟了。 准备开始回应评论 随着越来越多的开发人员开始理解使用SKStoreReviewController API的重要性,进而吸引更多用户到App Store分享经验,评论将继续成为赌注。 此最新举动仅表明Apple对评论的重视以及它将如何继续影响App Store Optimization。 像Apptentive这样的服务(也在自己的博客文章中解决了该问题),还有助于在公共App Store反馈的基础上获取私人反馈。 尽管这些反馈捕获方法存在相似之处,但Apptentive等公司很可能会发现从iOS 10.3更新中获得的价值有所增加。 随着越来越多的应用提示用户进行评论,这也将增加获取私人反馈并及时回应用户的重要性。 此外,诸如Apptentive之类的工具可帮助我们了解何时才是提示用户的最佳时机,而不是在一年之内仅允许进行三次尝试的情况。 响应App Store评论的能力无疑将成为应用程序开发人员的普遍做法。 作为产品团队,我们不仅可以在App Store上应用我们从用户那里听到的信息,而且还可以让他们知道我们如何计划解决他们的担忧。 另一方面,我们也可以感谢我们最大的品牌拥护者和传播者。 Apple App Store的下一步是什么? 自从iOS 10推出以来,我们一直非常重视增强App Store的功能。 例如,Apple Search Ads是一个备受期待的新广告网络,开发人员仍在努力。 App Store的提交审核流程也得到了极大的改进,与前几次迭代中将近10个工作日的访问时间相比,有些应用在短短几天内就获得了批准。 苹果对App Store的持续投资对开发人员来说是一个好兆头。 […]

大中央派遣(GCD)

GCD是用于管理任务执行的库,对于开发人员而言,异步编程使开发更容易,更安全。 异步允许任务同时执行,而不是通过在不同线程/进程上并行运行来阻止当前执行线程。 通过在后台线程上处理长时间运行的块,同时仍允许用户与主线程上的UI进行交互,它使应用程序具有更高的响应速度。 术语 串行和同步是同义词,并发和异步是可互换使用的。 主队列-处理应用程序的所有UI和未明确要求在后台队列中运行的代码的队列。 串行-串行队列中的任务一个接一个执行,一次仅执行一个任务。 任务按照插入队列的顺序执行。 并发-允许您并行执行多个任务。 任务以它们添加到队列的顺序开始,但不必等待彼此开始执行。 执行和完成的顺序不是预定的。 dispatch_queues 有两种类型的调度队列(队列由dispatch_queue_t表示),串行的和并发的。 要使用串行队列,请使用主队列 让mainQueue = dispatch_get_main_queue 或创建自己的 让serialQueue = dispatch_queue_create(“ @ anthonyprograms”,DISPATCH_QUEUE_SERIAL) 使用并发队列时,有多种选择:使用系统队列或创建自己的队列。 有四个优先级不同的系统队列,从最高到最低分别是: DISPATCH_QUEUE_PRIORITY_HIGH DISPATCH_QUEUE_PRIORITY_DEFAULT DISPATCH_QUEUE_PRIORITY_LOW DISPATCH_QUEUE_PRIORITY_BACKGROUND 优先级指出哪个任务将首先运行,优先级越高,它执行得越早。 让systemConcurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0) 您可以创建自己的 让currentparallelQueue = dispatch_queue_create(“队列”,DISPATCH_QUEUE_CONCURRENT) 将任务提交到队列 将任务提交到队列时,它可以同时运行或串行运行。 运行dispatch_sync(queue)依次运行该块,该块等待该块完成,然后再继续执行下一个任务。 并且dispatch_async始终是异步的。 只是您将所有UI块排队到同一队列中,因此不同的块将按顺序运行,但与数据处理代码并行运行。 队列示例 输出:“ polo \ n marco”。 这是因为GCD正在将异步代码块添加到队列中并继续运行该代码。 但是,当您更新UI时会发生什么? 在处理UI的后台线程上运行代码将导致崩溃。 为了在后台执行某些块,然后使用该结果来更改UI,必须首先获取主队列。 团体 假设您有一些更复杂的事情,需要更多类型的处理,并且只想在所有任务完成后更新UI。 这样,您可以使用dispatch_group_t。 […]

在Swift的iOS应用中创建自己的地图(如Uber)。

i)针对您的iOS应用使用Google-API SDK。 首先在Appdelegate中进行设置: GMSServices.provideAPIKey(AppConstants.googleMapsApiKey) GMSPlacesClient.provideAPIKey(AppConstants.googleMapsApiKey) *不要忘记在Appdelegate import中导入GoogleMaps和GooglePlaces ii)转到ViewController并添加View。 将名称更改为GMSMapView 。 在地图中心创建GMSMapView的出口和附加的Image,并在顶部创建搜索栏以显示位置名称。 在Viewcontroller中检查位置授权 iii)在iPhone上拖动地图,这将触发GMSMapViewDelegate的 2个委托方法。 func mapView(_ mapView:GMSMapView,didChange位置:GMSCameraPosition)—将触发 在地图上的任何动画或手势期间反复进行。 * func mapView(_ mapView:GMSMapView,idleAt position:GMSCameraPosition)—在地图变为空闲时调用 iv)因此最终的归还是要从上述代表处返回Posion: Github演示

使用Firebase的iOS应用开发面向初学者

使用Pring开发iOS应用 本文是针对尚未在Firebase上进行开发的开发人员的。 我将尽可能详细地解释这项工作,以便Android开发人员和Web开发人员可以立即开始。 https://github.com/1amageek/Pring 开发环境 macOS High Sierra Xcode 9.4 斯威夫特4 iOS 11 创建一个Xcode项目并准备Firebase 让我们创建一个新的Xcode项目 首先,启动Xcode。 让我们做一个新项目。 在这里,选择Master-Detail App。 请在产品名称中输入项目的名称。 我命名为Firebase Sample。 这是非常重要的,因为捆绑包标识符是从组织标识符生成的。 如果您有域,请使用它。 请关闭一次Xcode项目。 使用Cocoapods安装Firebase SDK 请使用Terminal移至项目目录。 在项目目录中执行以下命令。 荚初始化 如果生成Podfile ,则表示成功。 如果遇到错误,请安装Cocoapods。 https://cocoapods.org/ 编辑您的Podfile 平台:ios,“ 11.0” 目标“ Firebase示例” use_frameworks! 吊舱“ Pring” 结束 保存您的Podfile并执行以下命令 吊舱安装 如果显示如下,则表示成功。 更多文件将添加到项目目录。 创建一个名为Firebase Sample.xcworkspace的文件。 打开这个 请确认Pods已添加到项目中,如下所示。 Firebase SDK安装到此结束。 准备Firebase 我安装了Firebase […]

Nativ vs. Web App — Sterben秃头“ echten”应用程序?

Ich alsselbstständigerApp Entwickler mus immer schauen,是Ball zu bleiben。 Einen neuen Trend的趋势来自kürzesterZeit kein Geld mehr verdiene中的dassich。 不愿透露姓名的人是Flash Entwickler,我的名字是meinten,而dass Flash的名字是DASGROßEDING bleiben wird。 在德国的时代与历史上的Viele haben sich,在Leben lang das Geld mit der der Schubkarre上的Hause fahren。 Leider weit gefehlt和ich kenne nun schon einige Beispiele,在eine finanzielle Notlage gerutscht中丧命。 Ich muss mirnatürlich和darüberGedanken机械师。 Android和iOS上的Native Native App Entwicklung中的Meine Kernkompetenzen liegen。 Allein damit bin ich […]

Justa发生的团队

我记得在前两个“移动新闻”应用设计课程中,我们感到多么尴尬和威吓。 我们不认识任何人,尤其是彼此。 这也没有帮助我们一个人都不知道我们想要创建什么样的应用程序。 因此,当我们被告知“快速约会”时,我们自然地呆在一边,与最亲近的人交谈。 甚至不说话,主要是听。 我们在某个时候简短地互相交谈,但只是闲聊。 是时候组建团队了,我们又发现了对方, 只是 发生了一些事 。 我们最初的应用想法彼此之间有很大不同,但最终我们决定了一个我们认为自己实际上不会做的想法-Best By。 这个程序可以让人们知道他们的食物何时到期。 马上,我们注意到存在其他食品过期应用程序。 我们最大的挑战将是使我们的产品更好,更易于使用,同时找到食品的数据及其有效期信息。 我们在本周初见面,提出了Quatro团队(我们的创造力)游戏计划。 我们的会议包括集思广益的想法,但最重要的是,在Snapchat上彼此添加! 谁在Quatro团队中? 怎么了,我是Jahnavi。 我是世界上最好的大学的企业传讯和新闻学高级主任。 我在压力和拖延方面也有未成年人。 我参加本课程的原因是技术和创新使我兴奋,并且我希望成长为一名设计师和开发人员。 通常,您可以在Monkey’s Nest,Taco Joint或我的PJ中找到我,看到Bachelor! 您好,我是扎克。 我是UT的新闻学专业大四学生。 我上这堂课是因为我想对当今的应用程序和技术更加熟悉。 我希望有一天能以科学技术为重点,提出创新的报告,这些创新有可能为人类的科学技术进步做出改变游戏规则的贡献。 我对空间和整个宇宙中的可能性非常着迷。 我也非常非常喜欢自制甜茶。 我有时间读书时喜欢读书。 我喜欢西方人,幻想和科幻小说。 嗨,我是艾琳。 这是我在UT大学计算机科学专业的最后一个学期。 我参加本课程的原因是,我非常喜欢在其他一些计算机科学课程中制作应用程序,并且对本课程中增加的跨学科方面非常感兴趣。 我很高兴看到与新闻专业的学生合作将如何改变移动开发课程的过程和最终产品。 嗨,我是Abhinav。 我是UT的计算机科学专业三年级的学生,我正在上这堂课,以便可以在App Store中使用一个应用程序。 我之前涉足过制作iOS应用程序的工作,但您从未见过。 我很高兴能与新闻学专业的学生一起发布一款有用的应用程序,它将对您中的某些人有所帮助。 当我不在校园或在家中时,我可能会迷失在格林贝尔特(Greenbelt)的树林中,在街对面打网球或去西校区看一场表演。

冲刺完成

我们公开谈论了我们预期最后几周会有多压力。 好吧,这是正确的,因为这种趋势也延续到了本周,而Quatro团队仍然感到焦虑。 但是我们确实取得了进步,并淘汰了我们一直希望实现的一些目标。 我们的第一个视频对我们和我们的听众来说是一个美好的时光。 我们的第二部影片毫无疑问是我们想要的,本周我们大部分时间都在拍摄和编辑该影片。 在整个应用程序开发过程中,团队的共识是保持幽默感和嘲讽的社交渠道。 Best By的使命很严肃-减少世界各地的食物浪费-因此我们希望行销轻松。 新闻专业的学生接管了Video2。这是我们的长项,因此我们想尝试一些极富创意和独特性的挑战。 由于Best By是食品应用程序,为什么不从食品本身的角度拍摄视频? 您可能现在很困惑,当Zach提出这个想法时,Jahnavi也是如此。 观看最终产品以清除您的疑惑,了解Best By的愿景! 最可怕的冲刺定于下周日举行。 Quatro团队本周的重点将是调整最后一刻的变化并避免任何不幸。