伙计们,大家好!欢迎收听另一期Compile Swift播客。本周,我们将深入探讨一些与Swift相关的主题。我们将讨论应用程序意图。但首先,Jeff先生,你好吗?是的,我一直专注于为Bark发布一个主要功能版本。
我现在正在开发的功能是Apple Wallet导出。因此,这需要做一些前端工作和后端工作。所以我一直在服务器上使用Hummingbird进行一些Swift开发,并构建和部署它。所以现在我已经完成了所有的后端工作。我做到了。
它或多或少地连接到我的前端。现在我需要做每个人都讨厌我的不幸部分——把它放在付费墙后面。所以,你知道,不幸的是,不能让人们免费使用这个功能。是的。
我们应该讨论一下Hummingbird,伙计们,你们可能还记得,我会在节目说明中添加链接,我们的好朋友Yannis,我以前做过一期节目采访了他,我们绝对应该谈谈Hummingbird。但我很好奇,你打算如何将其投入生产?大概是在某种Linux盒子或类似的东西上?
我有一个由Hetzner公司托管的单一VPS,我运行它,基本上把它放在一个Docker容器中,然后将其上传并在我的服务器上运行。酷。你知道,实际上......
我前几天一直在考虑这个问题,我应该问你,有没有一个好的Docker容器,我们可以启动它,它有服务器上的Swift以及所有这些东西都设置好了,准备运行?有一些很棒的Docker容器可以进行Swift开发。这实际上是我最早的病毒式视频之一,是我发布了关于如何在非Mac设备上使用Swift的方法。
呃,系统通过利用Docker容器和GitHub代码空间。所以有一些非常好的Docker镜像可以进行Swift开发,也可以部署Swift代码。它们各有优缺点。所以,是的,使用Swift很容易上手,不能真正使用所有Apple的框架。你可以使用Swift,可以使用foundation,可以使用内置的东西,但是,呃,
能够在Linux上或任何机器上使用它,因为你可以运行Docker,你可以将其作为虚拟镜像运行并在那里运行Linux。所以是的,能够在这些Docker镜像中进行Linux开发。是的,Swift语言开发。
无论你称它们为什么,它们在提供一些不错的Swift Docker镜像方面做得很好。酷。我们应该改天谈谈这个,因为你知道,我从开发的角度尝试过它们,但我一直想知道并且从未研究过,因为我从未需要过。但是,你知道,哦,有没有,你知道,一个好的、安全的,最重要的是,生产环境的。所以我们也许会改天做一个关于这个的节目。
是的。所以本周,我想我已经完成了Job Finder Tracker的更新,这是初始更新。
恢复功能和其他一些更新,我遇到一个奇怪的bug,你知道当你遇到那些bug时,你会对自己说,是我还是这是一个真正的bug,你永远无法配置它,所以我把它推到了测试版,这是一个奇怪的,这是一个奇怪的情况,你使用的是CloudKit,你会想,好吧,它需要几秒钟才能下载数据吗?
或者有什么问题?所以,你知道,也许我们以后会谈谈这个。但我希望本周能把它发布出去。
也许下周。这取决于我是否有机会制作视频。所以,我们拭目以待。但无论如何,就像,天哪,我写了一些代码。我为自己感到骄傲。好的。好的。那么让我们进入主题吧。所以我会快速概述一下应用程序意图的高级概念。然后我知道你实际上做了一些事情。
我敢说,使用应用程序意图进行生产工作。所以,你知道,这肯定很有趣。但对于那些不知道的人,我想大多数开发人员至少听说过它们,对吧?因为Apple喜欢谈论它们。但是应用程序意图。所以,从广义上讲,应用程序意图是什么,它使你能够以不同的方式让用户,我稍后会列举一些,
进入你的应用程序或提取数据,基本上是在不必每次都打开应用程序的情况下与你的应用程序交互。例如,
如果你想使用应用程序意图,你会将它们用于诸如Spotlight访问之类的事情。小部件可能是非常流行的一个。Siri是另一个我确信每个人都遇到过的用户。控制中心。我可能最感兴趣的是快捷操作。
因为所有这些可能性为你的应用程序和其他应用程序之间的自动化工作流程以及所有这些事情打开了大门。当然,除此之外,如果你真的想并且有需要,你还有那个老式的操作按钮,正如你之前开始时所说的那样,它实际上是运行快捷方式的功能。
大部分情况下都是按钮。我们不是在谈论新的那个,对吧?我们不是在谈论相机控制的那个。我们说的是那个按钮......不是相机控制的那个。是的,不是那个。还没。我们说的是已经存在了,天哪,是什么?iPhone的两个或三个版本?至少两个,对吧?两个?它随iPhone 15一起发布。好的。好的。所以,我的意思是,从高层次来看,这就是应用程序意图。它们是一种......
与你的应用程序交互,让其他人与它们交互。就像我说的,小部件和Siri可能是你使用过的最著名的,而且你可能没有意识到它是什么,但它们非常有用。但是,你知道,Jeff,我们将深入探讨如何创建它们等等。但是,你知道,更多地谈谈你如何使用它们以及为什么我们认为
这是,你知道,这是未来发展方向,对吧?嘿,伙计们,如果你喜欢在这个播客中听到的内容,并且你想帮助这个播客继续发展,并邀请优秀的嘉宾进行精彩的对话,我邀请你成为Patreon的支持者。你可以访问patreon.com/compileswift,在那里你可以获得无广告版本的播客以及其他内容。
我会说应用程序意图基本上是一种将你的应用程序可以执行的单个原子操作暴露给系统的方法。通过这样做,你可以将这些操作与你的应用程序执行的其他操作、其他应用程序执行的其他操作或系统执行的其他操作结合起来,并使用它们来将许多事情联系在一起,并且
是的,我最初开始使用应用程序意图最明显、最可见的形式,当然,是在快捷方式应用程序中使用它们。而......
使用快捷方式进行应用程序意图的最大好处也是最大的诅咒是,当然,快捷方式非常强大用户的功能。因此,将快捷方式作为你的应用程序意图目标并没有太多好处,因为快捷方式
这实际上只会被一小部分用户使用。但是,当我更多地探索应用程序意图以及它们的功能时,事实证明有很多......在我看来,我认为在许多开发人员看来,应用程序意图与快捷方式有关。快捷方式是非常专业的用户功能。但事实证明,虽然......
应用程序意图是为快捷方式设计的,这是一种思考方式。这些操作实际上可以通过更明显、更直接地呈现给用户的方式来展现。并且
专注于构建应用程序意图是有意义的,因为其他更公开的意图就在那里。因此,这就是诸如应用程序意图之类的东西。这就是iOS 18中新的自定义控件之类的东西。这就是焦点过滤器之类的东西。这是一个更强大的用户功能。嗯,
或动态小部件。快捷方式,抱歉,聚光灯操作,动态小部件。是的,所有这些东西。因此,虽然你作为开发人员可能想从快捷方式中的单个项目来考虑它,因为这是设计这些原子操作的正确思维模型。事实证明,这些操作中的每一个都比
在快捷方式之外的方式更有用。我认为这里对应用程序意图的真正好用的定义是当用户没有意识到他们在使用它时,对吧?我的意思是,是的,你知道,我问Siri一些问题,Siri终于准确地回答了,因为我有一个Siri识别的应用程序意图,对吧?
是的,在我们今天录制节目的同时,Apple发布了iOS 18.1的候选版本,这个版本真的开始能够利用一些Apple智能应用程序意图和在那里进行的工作。但多年来,至少两三年了,你已经有能力将你的应用程序意图暴露给Spotlight。因此,当用户在他们的应用程序中搜索某些内容时,
你的应用程序可以执行的某些操作可能会出现在搜索列表中,即使用户没有特别查找该应用程序。所以这就是我所说的“为快捷方式设计”这个想法的含义,因为这是正确的思维模型,然后用它来。
在用户更有可能遇到的其他领域站稳脚跟。例如,在我的Bark应用程序中,我有一个意图,它只显示给定的条形码。输入条形码的名称,它会将该条形码传递给你。
我现在还没有采纳我自己的建议。这是因为我在发布Bark时有一个紧迫的期限,但是是的,所以我在这里有一个快捷操作,但是如果我将其也作为Spotlight操作公开会更有意义呢?而我所要做的实际上只是将现有的应用程序意图变成Spotlight操作。突然之间,你就可以在Spotlight中搜索你的条形码了,永远不必启动我的应用程序,永远不必看到我的应用程序,只需停止。
进入Spotlight,搜索你的条形码名称,点击它,砰,那里有你的条形码图像。我认为这对于用户来说非常有用,而对于大多数用户来说,好吧,你可以在快捷方式中显示条形码,也许并没有那么有用。这是一个很好的例子,因为例如,我有一些演唱会门票的条形码,对吧?
你知道,是的,我可以进入应用程序并获取它等等,但是我这里有一些通过意图的选择。你让我能够,你知道,我可以把它作为小部件放在我的主屏幕上。我得到了这个东西。我只需要点击它。砰,就是这样。或者,你知道,如果我想冒着在公共场合与Siri交谈的风险,我不知道为什么有人会想这样做,但是你可以问Siri以及那些事情。但关键是Siri
意图将直接把我带到我想要从应用程序中获取的特定内容。就像,我的意思是,这可能是一个不好的例子,但是天气小部件,对吧?我的位置。好吧,你知道,它可能是,我不知道,但在后台,也许正在发送我的邮政编码或我的GPS坐标,通过,你知道,应用程序意图将其提取出来并获取天气。我们谈论的就是这种事情,对吧?是的。
所以,是的,就像我说的那样,应用程序意图最著名的用途,至少在18.1和Apple Intelligence之前,是快捷方式。但我认为我列出了它可以用于的许多其他事情的部分列表。也许我知道你也有自己独立的研究。也许你错过了一些。我知道的是......
能够配置小部件。所以当你长按小部件并有背景时,你可以更改小部件的一些内容。就像天气小部件一样,它可能是你正在查看的城市?是的。这都是由应用程序意图处理的。对于我们去年或前年获得的交互式小部件,我不记得了。当你在小部件中点击某些内容并执行操作时,这都是由应用程序意图处理的,这是一个应用程序意图。
你今年获得了新的自定义控制中心项目。当你点击它们时,它们会根据应用程序意图执行某些操作。沿着同样的思路,你还有交互式动态活动。当你的屏幕上有一个动态活动时,你想让它做一些事情。这都是应用程序意图。
我们已经讨论了一段时间了,聚光灯操作。这是能够看到你的应用程序中作为操作或在某些情况下只是实际项目的东西,这是一个应用程序意图。焦点过滤器。所以当你......
你的应用程序中的某些内容会根据用户当前选择的焦点而改变,无论是他们的就寝时间焦点、驾驶焦点、工作或个人焦点等等。这是一个很好的例子。将这些偏好暴露给用户都是应用程序意图。它与配置小部件应用程序意图非常相似。
然后是与Apple的一些硬件交互的能力。我们之前提到了这一点。这主要只是运行快捷方式,但你显然可以只使用操作按钮来使用单个操作快捷方式。我认为很多人都会错过的是Apple Pencil Pro的挤压功能。哦,好点子。你实际上可以直接将其绑定到快捷方式。
并让它做不同的事情。所以这就是我的应用程序意图可以做的事情列表,而不是快捷方式。不,你做到了。我错过了什么吗?不,你做到了。你那里有一些我错过的。是的。现在我实际上想把这一集叫做“意图挤压”。只是......
看看它会把我们带到哪里,你知道。不,实际上,我完全忘记了铅笔的那个。是的,我认为很多人也忘记了。是的,这很酷。当你......的时候你用过那个吗?我没有,没有。黑色荧光笔Apple Pencil集成完全只是直接处理Apple Pencil挤压交互。它没有使用Apple Pencil。明白了。好的。好的。
现在,为我澄清一下,因为在我看来,我认为应用程序意图实际上也是对,你知道,一些东西的替代,例如,间接深度链接,对吧?并非暗示它是,但它在某种程度上类似于可执行深度链接。
这样说公平吗?
他有一篇文章叫做“以行动为中心的設計”,这篇文章并不是关于应用程序意图的,但它与应用程序意图有关,它说的是,与其将你的应用程序设计为一组UI,不如将你的应用程序设计为用户可以执行的一组操作,然后在这些操作之上构建UI。执行此操作的用户界面是什么样的?
一旦你有了这组操作,它就是一组名词和动词。一旦你有了这组操作,它们就可以非常整齐地映射到应用程序意图。因此,你的应用程序可以执行或使用的所有名词和动词,为它们构建一个应用程序意图。
好了,这是我每天都离不开的一件事,那就是我的咖啡。任何认识我的人,或者任何听过我的播客或其他任何东西的人都知道,我绝对离不开我的咖啡,而且我喜欢好咖啡。所以事情是这样的,我会给你一包免费的咖啡,方法是访问peterwidom.com/coffee,并且
那里有一家很棒的公司遵循公平贸易实践,帮助各种规模的独立烘焙商,操作很简单。你要做的是,你将访问peterwhitam.com/coffee,在那里注册,你会收到一包免费的咖啡,是的,作为回报。他们通过给我一些咖啡来感谢我,但这并不是我这么做的原因。我这么做的原因是因为我发现......
如此多的好咖啡,如果没有这项服务,我永远不会遇到、听说过或体验过。Trade Coffee真是太棒了。你知道,那里有很多地方。我们都知道它们提供咖啡,好咖啡。
你可以去商店买咖啡,但是没有什么比发现新的独立烘焙商并支持他们、发现新的咖啡口味、新的研磨方式更好的了,你可以设置它。它非常智能。你告诉它你喜欢哪种咖啡。随着时间的推移,它会随着你的选择而变得越来越好,并为你提供你正在寻找的咖啡,并推荐一些与你非常相似的咖啡。
每次我收到一包新的咖啡时,我都会在之后尝试咖啡。我浏览服务并说,看,我喜欢这种咖啡。我认为这种咖啡还可以。或者我说,看,这真的不适合我。每次我这样做时,它都会使服务的下次选择对我来说更准确。
所以,再次,只需访问peterwhitam.com/coffee。今天就领取你的免费咖啡。如果你是一个咖啡爱好者,你一定会喜欢这项服务的。我已经使用它很多年了,并且强烈推荐它。所以如果我在考虑我的Bark应用程序,例如,我可以......
添加新的条形码。我可以扫描图片并从中获取条形码。我可以打开应用程序中的条形码。我可以向条形码添加位置。我可以向条形码添加时间。我可以将某些内容导出到Apple Wallet。这些都是我的应用程序可能采取的不同单个操作。我可能应该为每一个都创建一个应用程序意图。然后基于此,能够
说这些应用程序意图的其他用例是什么。例如,添加位置,这可能只在快捷方式中非常有用,但向我显示条形码在快捷方式中非常有用。这在Spotlight搜索中非常有用。这作为动态活动按钮非常有用。这在很多方面都非常有用。那么我能做什么?
一旦我列出了所有这些操作,例如,有人可能想要与它们交互的各种方式是什么?我认为拥有这样的东西很有意义。
呃,成为你设计时使用应用程序意图的基础。好的。是的,我将自己去阅读那篇文章,因为当我今天观看Apple开发者视频之一以提醒自己所有这些东西是如何工作的时,你知道,Apple非常多地从这个角度谈论它,你知道,动词等等。之后我坐在那里,我对自己想,好吧,我的工作查找器跟踪器应用程序。我想拥有哪些应用程序意图?
我开始写下一个列表。很快,就像你说的那样,你意识到,哦,其中一些对小部件有意义。其中一些对为其他开发人员打开交互有意义。你知道,像共享表以及所有这些事情。我认为我意识到的是,
很容易被带走,对吧?你不需要为应用程序中的所有内容提供基本上是一个可视化API。你只需要查看它们并说,人们想要快速执行的关键事情是什么,而不必一定进入应用程序,对吧?一旦我开始考虑这一点,我发现我的列表缩短了很多,我实际上想要做什么,对吧?
我并不关心什么?我认为我不同意。好的。酷。在这种情况下。并且为了支持我们链接到的另一篇文章,还有——这是一个较旧的WWDC视频。我不记得了。我必须去找到它以及它是哪一年的。好的。Apple工程师Michael Gorbach。
我不知道我是否正确地发音了这个名字,所以对不起,Michael。谈论像真的,老实说,你真的应该将你的应用程序可以执行的每一个操作都作为应用程序意图公开,并且能够
有效地允许用户重新组合你的应用程序,这使得用户能够以更多的方式与你的应用程序交互。所以这有点回到我一开始对Bark的讨论,就像,我为我的第一个Bark版本发布了数量非常有限的快捷方式,并且
但我确实知道,在未来的版本中,我还想做10个,因为我希望应用程序的每一个小部分都能以用户能够快速执行某些操作的方式提供。无论他们可能想要在应用程序中执行的任何单个操作,他们都能够在不必启动应用程序的情况下执行它。我认为我一直在使用Bark作为示例,因为这是我的新宠。所以这是最让我关注的。
我有一个Black Highlighter的用户,他对Black Highlighter可以执行的不同操作以及我可以通过应用程序意图公开Black Highlighter功能的所有方式感到非常兴奋。并且能够快速地说,哦,去获取我刚刚拍摄的最新屏幕截图,然后擦除其中的每一个电话号码,然后......
某种颜色,然后保存它。然后我现在已经拍摄了这张图片,现在我要把它放到我的快捷方式的其余部分,例如将其发布到Twitter。是的,
在我开始与这个用户互动之前,我在Black Highlighter的快捷方式中拥有的东西要少得多。他们一直在向我发送想法,就像它向我展示的事情的数量一样,哦,是的,不。如果我对Black Highlighter正在做的事情更细致、更彻底,它会使应用程序更强大,而我实际上不必......
使我的用户界面复杂化,因此它允许所有这些单个操作,所有这些单个操作实际上都在应用程序中,但是你知道,需要多次点击或需要多个步骤来执行,如果我以非常细致的方式将它们作为应用程序意图公开,用户基本上能够为它构建自己的界面
这是一种非常强大的方式。是的,这是快捷方式。这非常强大用户的功能,但是是的,
你可以想象Spotlight也会发生同样的事情,例如。就像,哦,我需要非常快速地执行X操作。让我只输入我要执行的操作。现在它已经可用。它已经为我完成了,我不必考虑它。我认为这是用户能够与你的应用程序交互而无需与你的应用程序交互的一种非常好的方式。
并且让用户意识到你的应用程序对他们有多重要,而无需经历诸如,“哦,天哪,我必须打开这个应用程序,我必须等待它执行此操作,我必须转到此页面,然后我必须执行该操作”之类的麻烦。能够改为将你的应用程序可以执行的每一件事都更多地暴露给系统。
让用户受益于你的应用程序,而无需你明确构建特殊功能。所以这很有趣。我从未从赋能用户重新组合我的应用程序的角度考虑过这个问题,并且基本上将应用程序意图链接在一起以执行一系列操作,并且
并以我从未设想过的方式使用该应用程序,或者,你知道,最终结果,诸如此类。然而,我认为公开太多东西是一个坏主意的原因,也许这只是我的经验,我一直在使用错误的应用程序,我不知道,是我讨厌当我转到设置一些小部件时,我会选择一个应用程序,然后我就会被成千上万个小部件变体淹没。
就像,看,我知道我想要什么。我不想要这个无休止的滚动列表。但是现在你已经说过了,
我喜欢这个想法,特别是如果我扭转上下文并说,好吧,如果我是一个高级用户并且我正在使用快捷方式,我可以基本上将一系列操作链接在一起,以使应用程序执行创建者从未梦想过的事情,但它使我有能力做到这一点。所以我会给你这个。是的。好的。我认为即使在那里面,也有一些东西更像是应用程序意图的强大功能与小部件的强大功能是什么,并且
你可以想象一个世界,在这个世界中,你正在谈论一个问题,即开发人员提供了一堆不同的窗口小部件。如果他们提供数量较少的小部件,因为应用程序意图更易于定制,那会怎么样?我认为这会带来更好的体验,你使用应用程序意图来使更有限的用户界面
并使其更易于定制,而不是说,好吧,我们将考虑用户可能想要的前10件事,并显示10个不同的窗口小部件,而不是拥有一个可以在30种不同方式下定制的单个窗口小部件。是的。是的。事实上,你知道,向聊天室里的cricket致敬,他指出,我们可以花很多时间来规划和构建这些界面,
但是,随着人工智能等技术的出现,你与设备之间有了更自然、更理想的对话,这些对话会执行操作,那么,好吧,我应该为你提供一个UI的想法是
但让我们让后台的智能AI使用我的意图来完成你要求我做的事情,基本上在这一点上没有UI,对吧?不,但这是一个很好的观点。是的。在这种情况下,你知道,有点像回到小部件的例子,或者回到Cricket所说的内容......
将所有这些都放在你的实际UI中意味着你让每个人的UI都更复杂了。而让人们构建模块来构建他们自己的UI,这意味着你可以为你想做的事情构建一个更简单的UI。而且也突然想到,你不用担心跨平台的UI。
因此,我可以很容易地与我的手表对话,就像我可以与台式机、手机和平板电脑上的应用程序对话一样。所以这是一个非常有效的观点。
好的,现在让我们深入一些代码,为人们提供一种入门方法以及一些使用方法。当然,我们会在节目说明中添加所有内容的链接。一如既往地强烈推荐,访问门户网站,观看视频,因为它们非常有信息量,实际上你将很快开始使用它。我非常惊讶它发生的如此之快。
好的,我将在这里给你一个基于视频的非常简单的例子。这是我应用程序的一个例子。它所做的只是创建一个应用程序意图,将其公开给系统,你点击它,它就会打开你的应用程序,对吧?是的,好的,没什么大不了的,但这是我能找到的最简单的应用程序意图形式。所以,你知道,你将打开一个新的Swift文件,对吧?你将创建一个结构体,给它起一个名字。在我的例子中,我称之为add job。
它是app intent类型。根据你的目标,有几种不同的类型,我们稍后会讨论其中一些。但这给了我一个空的结构体。在那里,我只有一个非常简单的静态let title,带有一个本地化的字符串,这样你就可以在系统中看到它了,对吧?它本质上就是一个标题。所以你知道用户将要使用的是什么。
然后我有一个要执行的函数。它是一个带有某些intent result的异步抛出函数。在那里,我所做的只是返回该结果,并且它为我的应用程序中的一些导航增加了一行。
然后在最后,在这个结构体中,我只有一个静态let openAppWhenRun设置为true,因为我没有传入任何配置之类的东西。就像只是运行应用程序一样。值得注意的是,如果你正在做一些额外的事情,比如传入数据或类似的东西,你就不需要添加这一行,因为显然它会打开你的应用程序。
但这就是你需要做的所有事情,以获得一个非常基本的、可用于系统的应用程序意图。我喜欢的是Apple已经消除了所有痛苦,对吧?不需要在我的应用程序配置中注册,说,“嘿,将这个公开给系统”或“这是一个列表”。你只需要创建这个结构体。
就是这样,它完成了,所以,这是一个非常基本的结构体的例子,但是Jeff,你想深入研究并使其更有趣吗?
休息时间到了。大家好,我是CompileSuite播客的Peter Whittem。我想告诉你关于Setapp的事情。Setapp是一项服务,每月只需支付10美元的订阅费,你就可以访问200多个Mac应用程序,现在它也作为该交易的一部分在iOS上可用。
我使用这项服务,因为它有很多我经常使用的非常好的顶级应用程序。对我来说,作为一个开发者,能够访问用于API、项目规划、撰写电子邮件、撰写文档的工具是无价的,你还可以获得所有这些东西,包括数据库应用程序,所有这些都在Setapps服务上,每月只需10美元。你可以根据需要使用任意数量的应用程序。
如果你有兴趣查看它,请访问peterwhitam.com,P-E-T-E-R-W-I-T-H-A-M.com/setapps,S-E-T-A-P-P。你可以在那里看到详细信息。它有一个链接,你可以点击它开始使用这项服务,看看它对你来说效果如何。我强烈推荐给每个Mac用户。休息时间结束。
是的,正如你所描述的,基本的应用程序意图只是一个具有特定协议和一些默认参数的Swift结构体。现在,你可以做的是,你还可以添加具有Apple提供的属性包装器的附加属性。这些允许你向你的意图添加额外的配置。
稍微回顾一下,我谈到了添加参数。添加参数后,你还可以添加参数摘要,这基本上是公开给快捷方式的UI。这是你在快捷方式中看到的句子。例如,我这里有我的open barcode。
你提供的是一个字符串,其中包含对参数作为键路径的参数摘要的引用。这就是你在快捷方式中看到的UI,你可以在其中使用英语文本或任何语言文本,并且
然后在这个句子中有一些小点,你可以通过直接选择某些内容或引用早期快捷方式的结果来填充这些小点。
这就是填充它的内容。这就是参数摘要,你拥有的包含对可能放入其中的槽的引用的整个句子。例如,你拥有app parameter属性包装器,它允许你从用户那里接收附加参数。例如,如果你在考虑快捷方式,你可能想要传入你正在处理的事物的名称,或者你可能想要传入你想要导出的图像的大小等等。
你可以接收许多不同的值。这些是你常用的属性列表值。你拥有你的整数、字符串、文件、URL,所有这些东西。这些是默认的系统值。你还可以公开......
应用程序内部的数据到应用程序意图框架。这被称为应用程序实体。这些是我之前描述的名词和动词中的名词。例如,在我的应用程序Bark中,条形码是一个应用程序实体,我需要公开我的应用程序中所有条形码作为应用程序实体。这允许我然后说,好吧,
有一个应用程序意图可以让我看到我所有条形码的列表。或者,如果用户想要一个打开特定条形码的参数,那么快捷方式可以向他们显示条形码列表,他们点击打开给定的条形码。他们可以点击条形码所在的小点,它会给他们显示条形码列表,然后他们可以选择他们想要打开的条形码。是的。
是的,你基本上可以查询应用程序中的数据,对吧?是的,完全正确。事实上,执行应用程序意图或应用程序实体所需的是定义一个应用程序实体查询。这是一个你实现的类型,它允许你返回你的应用程序正在使用的所有实体。
Cricket有一个问题,关于你是否仍然可以定义一个模型?是的,问号。如果模型没有存储在设备上,你可以将其定义为应用程序实体吗?如果你确实有一个列出这些的应用程序意图,你可以进行提取查询吗?是的,你可以有一个应用程序实体列出
进行查询,我相信它也具有例如网络访问权限,这样你就可以告诉它,“哦,我需要访问我的服务器并执行此操作”,这更复杂,而这是我不太了解的部分,因为我不太了解它的工作原理是
超过一定数量的实体。因此,你可以考虑一下,例如Netflix的目录。如果Netflix正在构建一个快捷方式,并且他们说,“观看电影”,而你拥有Netflix目录中所有可能的电影,那么这是一个你用来与这些电影集成的不同系统。我不完全了解它的工作原理。所以我认为这就是你进入这个级别的部分,
应用程序实体查询更适合于特定于用户的有限项目集。例如,这里更好的例子是一个天气应用程序。你会包含用户可能之前搜索过的实体。你不会包含世界上每一个城市。
嗯,这是一个你必须经历的不同系统。我对这个系统的工作原理了解不多。所以,好的。是的,你可以做一些更......
我认为你可以在那一部分调用服务器。我没有专门做过这个。所以我非常确定没有沙盒。你基本上只有有限的时间。这就是我想说的。但是你返回的结果,你可以随心所欲地处理它们。这是一个进行深度搜索或使用其他系统的问题。是的,因为我......
我认为,因为起初我不确定我是否理解。但是如果你说的是,我可以运行一个应用程序意图,它进行一些远程API调用,等待响应,返回,处理,无论是什么。
然后将其作为选择呈现给用户,或者你在该应用程序意图返回时要执行的操作。我想评论一下,我相信首先,有一个可以接受的用户等待时间。其次,甚至可能会有
你知道,一个预定义的过期时间,对吧?应用程序意图,我想Apple不会让你永远运行它,对吧?所以,如果你要带回大量数据或服务器速度慢、连接不良,任何类似的事情,我相信那里会有一些自动切断。
我认为大约是10秒钟。好的,这听起来很合理。它足够合理,可以访问服务器并执行某些操作。它不足以进行大量处理。是的,作为用户,我会等待10秒钟让应用程序意图做某事吗?我不知道我会不会。
嗯,因为我很不耐烦,你知道,但是,但是我认为如果他正在考虑做这样的事情,我实际上想知道这可能更多的是一个停下来思考的问题,你知道,如果这是应用程序中的一个目标,你如何在应用程序中做到这一点,也许。对。因为是的,我会担心用户交互级别和时间。很抱歉回复这个问题。嗯,有一个限制。它相当宽松。嗯,我,
我没有做过,但我99.9%确定你可以进行网络调用。基本上,你的应用程序可以做的任何事情,你都可以做。你可以说,你可以将你的应用程序意图标记为在你的应用程序的
环境中运行,我想。所以它基本上是启动你的应用程序,然后你可以执行你的应用程序通常执行的任何操作。因此,它不像许多扩展那样被沙盒化,扩展的情况是,“哦,你有一个非常有限的内存环境,你无法进行网络调用,你无法执行任何操作”。应用程序实体基本上可以执行应用程序可以执行的任何操作。
我想知道是否,是的,同样的事情。我没有研究过这个问题,但我几乎希望从安全性的角度来看,也许需要将你将被允许从应用程序中调用的内容列入白名单,这样你就不会希望有人试图恶意使用它或类似的东西,对吧?我不知道。
我的意思是,它像你的普通应用程序一样被沙盒化。所以......对。这就是我的意思。对不起,不仅仅是从应用程序意图,而是你的应用程序本身。如果你的应用程序要调用,并且你要公开......
安全措施肯定有效。是的,以防万一。所以我认为是这样的,你知道,如果你的用户没有在你的应用程序中授予你位置权限,那么你将不会在你的应用程序中拥有位置权限。对。绝对正确。是的,所以,是的,这就是其中一件事,你知道,比如Bark目前根本没有
照片权限。这将是未来即将推出的一个功能。这部分不在其中,我只是可以谈谈未来的计划。嗯,
但是你现在可以做的一件事,如果你真的想要访问你的照片库,你可以让快捷方式直接引用你的照片库。它会获取你的照片。它将这作为一张已经抓取的图像传递给Bark。然后,这是一种让你在Bark中使用照片库的方法,只需让它——让快捷方式基本上处理它即可。是的。
是的。然后这样我就不用构建了,哦,我需要知道,我需要访问照片权限。我不需要构建它。我可以像让快捷方式处理一样。好的。这里,它拥有所有照片权限访问权限,现在它正在获取该照片,并且它只是将该照片提供给我的应用程序意图。是的。它回到了我们之前所说的,对吧?快捷方式的美妙之处在于能够基本上将......
有用的项目连接在一起,是的,绝对正确,是的
所以是的,我们谈到了应用程序实体。所以是的,应用程序实体的定义方式,或者说实体查询的定义方式是,它说你可以通过给定的标识符查找实体。然后你返回与标识符匹配的任何实体。然后你还可以说建议的实体,这就像你认为现在与用户最相关的实体的一小组有限集。
所以这就是实体查询系统与我正在谈论的与核心聚光灯相关的另一个系统之间的区别。我不知道。是的。这是我真正不知道答案的部分,是如何进行更深入的......大量数据的公开。但是实体查询具有,是的,你可以通过特定标识符查找某些内容,并且你可以提供一组建议的内容,但是你,
不能真正进行......你知道,像深度搜索类型的东西,对吧?这,你知道,有点像我之前所说的,你知道,过度使用这个,要记住的是,就像你知道,当你创建一个API或类似的东西时,你知道,你创建的这些东西越多,它们可能很有用,但你管理的也越多,
并希望它们不会在未来的系统中崩溃。如果它们确实崩溃了,猜猜看?你必须去修复它们,对吧?但是再说一次,我认为这就是为什么它是其中之一,你知道,希望像现在一样,人们提前考虑这些问题并进行一些规划,对吧?不要仅仅因为,“哦,我应该把它放在那里”而把它放在那里。你知道,原因是什么,对吧?你知道,诸如此类的事情。
好的,这就是应用程序意图的第一级。这可能满足许多开发人员及其想要做的事情以及公开其应用程序的需求。但是我们还可以深入研究另一个级别,你可以在其中自定义它们,以完全满足你的需求,并以你认为适合你的应用程序的方式工作。
所以让我们继续。你在这方面肯定比我更有经验。所以你想继续深入研究吗?是的。因此,一旦你拥有了基本的应用程序意图,你可以采用其他协议来满足你的意图的特定用例。所以我们已经讨论了这里应用程序意图的各种用例。我们可以深入研究其中一个。因此,向小部件添加可定制性。
你采用你现有的应用程序意图小部件,正如我们讨论的那样定义它。你现在可以添加一个名为widget configuration intent的新协议。它所做的只是获取你定义的所有参数、参数摘要、标题等等。然后你说,好的,
这也可以用于配置小部件。因此,你提供的所有参数现在都会在点击小东西并转到“自定义”时显示在小部件中,然后它会显示你的小部件名称。
你已经识别为常规应用程序实体的所有参数现在都在这个小部件配置中。只需采用widget configuration intent协议,处理它具有的任何其他要求。我认为对于widget configuration intent,没有什么额外的要求。我现在正在查看文档,我没有看到任何内容。所以是的,你拥有你的基本应用程序意图。你说......
它现在也是一个widget configuration intent。然后你将其分配给你的小部件。当你定义你的小部件时,你可以说,“由......配置”,然后你将你的应用程序意图放在那里。因此,你可以有一个应用程序意图在快捷方式中执行某些操作,并说,“顺便说一句,这也是一个widget configuration intent”。然后突然间,你有了相同的代码来处理两种不同的情况。我在Apple视频中看到的他们给出的一个快速示例,我认为,
很快就把它带回家了,那就是,你知道,有趣的是,因为他们一开始就提到了它,你没有看到它。它就像,“哦,你必须点击小三角形,对吧?”然后它在快捷方式中展开,例如,你知道,基本上是你的选项,你可以点击它。例如,这个是一个你可以从中选择的下拉列表,对吧?但是配置方面,如果我错了请纠正我,所有东西都必须像大多数这些东西一样,
不包括我们简要讨论的外部数据,必须在发布应用程序时在应用程序中进行配置,对吧?因为系统必须能够阅读并了解你的应用程序想要公开的内容,以便在安装应用程序时,它会在系统中配置所有这些内容,对吧?
是的,我的意思是,这就是我们之前讨论的应用程序实体查询。是的,好的。那就是你告诉应用程序,“嘿,这就是我的数据如何公开给系统,以及这里可能包含的内容”。因此,例如,你的widget configuration intent中的一个参数可以是你的应用程序实体。然后你说,“我需要你获取......”
这种类型的项目,用户需要在这个列表中选择一个元素,然后他们就可以让它成为你小部件的一部分,例如,我们再次回到小部件的想法
你可以说你的应用程序实体是城市,在你的widget configuration intent中,它将拥有该app parameter属性包装器。然后,例如,你可以拥有var city: city,嗯,
而city完全由这个应用程序意图查询定义,等等。然后当你到达你的小部件并点击它并转到编辑时,在背面,你有一个城市行。然后你点击它,它会弹出一个菜单,你可以从该菜单中选择你的城市。
这就是它的工作方式。因此,你可以想象在快捷方式中使用完全相同的实体,你可以在其中有一个句子,例如,“向我显示城市的的天气”。然后你点击该城市。它会选择......
那里的项目,然后它会返回一些文本,例如,是的,嗯,我认为这是一个他们没有专门针对天气提供的示例,而是有点像,你知道,在视频中,他们有一个关于如何将其放入那里的示例,我认为这件很棒的事情是,一旦你看到它,你看到他们在视频中这样做,并且他们向你展示了代码,你
你会很快理解它。它就像,哦,这个,你知道,就像我之前说的那样,你知道,我最初难以处理深层链接之类的东西。但是他们在视频中表达这种方式,它很有意义,并且要处理的代码和配置少得多,除非你选择使其复杂化。
我的意思是,无论如何,对吧?如果你想的话,可以过度设计它,但不推荐这样做。是的。应用程序意图的设计确实导致它不会变得过于复杂,因为你希望它成为这些非常小的、非常独立的......
因此,你希望你的应用程序实体真正做到快速执行一项操作,进入,退出,就是这样。如果你想让它变得更复杂,那么你正在做的是将多个意图链接在一起,并且
你甚至可以直接在应用程序意图中执行此操作。应用程序意图可以调用其他应用程序意图,或者你可以将其留给用户,他们负责在快捷方式等中将它们链接在一起。是的。我的建议是,你知道,就像你在开头提到的那样,也许提供执行此操作的模块,但是......
节省你的麻烦。让用户能够做他们想做的事情。首先,你不需要尝试预先处理它,除非你的应用程序中有一个非常具体的特性会受益于,“哦,如果我为用户设置这些东西,以及大量配置等等”。好的,去做吧。
对。但是再说一次,这都是你以后的维护工作。如果你想更改某些内容或Apple让你更改它怎么办?例如,让我描述一下我在Black Highlighter中的一些应用程序意图。我有一个应用程序意图是,“好的,给我一张图片。给我一些要涂黑的文字,我会给你吐出一张图片。”另一个......
我拥有的意图实际上只是在Black Highlighter中打开一张图片。给我一张图片,用该图片启动应用程序。现在,用户可以做的一件事是,他们实际上可以将这两张图片链接在一起,并说,“我想在Black Highlighter中打开这张图片,但我有一组默认设置,我希望始终涂黑。所以我将让它执行默认操作,然后打开图像。”用户可以自己构建这些内容,
但是,我可以作为开发人员做的一件事来简化此操作,我可以实际提供一个隐藏参数、隐藏参数,一个小小的......一个有点用词不当。它只是隐藏在一个下拉菜单后面,并且在那里有一个复选框,即打开一次运行。然后我可以做的是,作为开发人员,我可以检查这个open when run属性,并且,
它只是一个布尔值。如果为真,我可以直接从我的redact intent调用我的open intent。所以我可以说,“继续,获取这张图片,进行涂黑,然后启动应用程序。”我在幕后所做的是,我只是调用用户可以直接调用的相同的open intent。这是一种通过直接从redact进行操作来为他们提供便利的方式。
扫描、涂黑、打开,而不是用户必须将扫描、涂黑、打开意图作为三个单独的项目。好的,这很有趣,因为它回答了我一直在想的一个问题,那就是,你知道,我将要说明的是,在某些时候,如果应用程序意图感觉过于交互或复杂,那么你应该在那时说,
好的,现在我应该打开应用程序,你应该真的在应用程序中执行此操作。但是你在这里描述的是我从未想到过的事情,那就是,“嘿,让我做一下能够轻松完成的部分。”然后,如果你想做这个额外复杂的部分,我们将打开应用程序并将其传递给它。对。所以你得到了两全其美。
是的。是的。我认为这就是将这些分解成最小的单个部分的好处,它允许你从其他意图构建你自己的意图,但也允许用户以他们想要的方式混合和匹配这些意图。是的。是的。明白了。是的。
我想这有点像编写函数,对吧?编写一个执行一项操作的小函数。不要像我那样做。好了,朋友们。我觉得我们已经涵盖了应用程序意图。当然足以让你开始并产生兴趣。你绝对应该感兴趣,因为这个,你知道,来自Apple的人工智能,以及,你知道,希望有一天来自那位女士的改进。
它将成为未来的一件事,对吧?应用程序意图。因此,你越早加入并至少了解它,就越好。话虽如此,Jeff,他们在哪里可以找到你?他们在哪里可以找到你所有这些正在运行的应用程序意图的应用程序?一如既往,所有内容都在CuckooType.com。就是这样。一如既往,我在CompileSwift.com。就是这样,朋友们。我们下一集再见。