iOS应用程序中的URL路由:《指南针初学者指南》
应用程序通常具有许多屏幕, UIViewController
可以与显示和导航API一起很好地用作屏幕的基础。 一切都很好,直到您迷失在流的森林中,并且代码变得难以维护。
避免这种情况的一种方法是中央URL路由方法。 可以将其视为处理并解决所有路由请求的网络路由器。 这样,代码就变成了声明性的和解耦的,因此列表组件不需要知道它所呈现的内容。 URL路由还使日志记录和跟踪变得容易,并且易于处理外部请求(例如深链接)。
有多种执行URL路由的框架。 在本教程中,为简单起见,将使用Compass。 您将重构一个现有应用程序,这是一个名为PhotoFeed
的简化的Instagram应用程序。 完成本教程后,您将知道如何在Compass中声明和使用路由器以及如何处理深层链接。
下载入门项目并解压缩。 转到PhotoFeed
文件夹并运行pod install
安装此项目的特定依赖项。 打开PhotoFeed.xcworkspace
并运行项目。 点击登录以转到Instagram登录页面并输入您的Instagram凭据,然后浏览一下该应用程序。
主应用程序由UITabBarController
,其中显示了提要,当前登录的用户配置文件和菜单。 这是一个典型的Model View Controller
项目,其中UIViewController
处理Cell
委托并负责导航。 为简单起见,所有视图控制器都继承自TableController
和CollectionController
,它们知道如何管理特定模型和单元的列表。 所有型号均符合新的Swift 4 Codable
协议。
在Instagram上注册您的应用
为了使用Instagram API,您需要在Instagram Developer上注册您的应用程序。 获取您的client id
,切换回项目。 转到APIClient.swift
并修改您的clientId
。
注意 :该项目随附具有受限权限的默认应用。 该应用程序无法访问关注或关注者API,并且您只能看到自己的帖子和评论
指南针的概念非常简单:您拥有一组路线以及用于处理这些路线的中心位置。 将路线视为到应用内特定屏幕的导航请求。 URL路由背后的想法是从现代Web服务器中借用的。 当用户在浏览器中输入URL,例如https://flawlessapp.io/for-teams时,该请求将从浏览器发送到Web服务器。 服务器解析URL并返回请求的内容,例如HTML或JSON。 大多数Web服务器框架都支持URL路由,包括ASP.NET,Express.js等。 例如,这是您在express.js中处理URL路由的方式:
app.get('/ api / category /:categoryTag',函数(req,res){
const page = getCategoryPageFor(req.params.categoryTag)
res.send(页面)
})
用户或应用程序请求一个特定的URL,该URL表达有关应返回或显示的内容的意图。 但是,Compass不会返回网页,而是根据UIViewController
构造屏幕并显示它们。
路线模式
这是在Compass中声明路由模式的方式:
Navigator.routes = [“个人资料:{userId}”,“帖子:{postId}”,“注销”]
这只是您在Navigator
上注册的模式数组。 这是定义所有路线的中心位置。 由于它们位于一个位置,因此所有导航都保留在一个位置,并且易于理解。 在上面的示例中, {userId}, postId}
是将解析为实际参数的占位符。 例如,对于post:BYOkwgXnwr3
,您将获得BYOkwgXnwr3
postId
。 指南针还执行模式匹配,其中post:BYOkwgXnwr3
匹配post:{postId}
,而不是comment:{postId}
, blogpost:{postId} ,
…在以下各节中将变得很有意义。
航海家
Navigator
是路线注册,导航和处理的中心位置。
下一步是触发路由请求。 您可以通过Navigator
。 例如,这是您在Feed中请求打开特定帖子的方式:
Navigator.navigate(缸:“ post:BYOkwgXnwr3”)
指南针使用用户友好的urn
(统一资源名称的缩写)来使其与深度链接无缝协作。 该urn
与路由模式post:{postId}
匹配。 Compass使用{param}
作为特殊标记来标识参数,并使用:
作为定界符。 您可以通过配置Navigator.delimiter
将定界符更改为其他名称。 您已经了解了如何注册路线以及如何在Compass中导航。 接下来,您将学习如何根据需要自定义处理代码。
位置
Navigator
后台解析并使用Location
。 给定post:BYOkwgXnwr3
的URN
,您将获得一个Location
,其中path
是路由模式,而arguments
包含已解析的参数。
path =“ post:{postId}”
参数= [
“ postId”:“ BYOkwgXnwr3”
]
要实际执行导航,请为Navigator.handle分配一个带Location
的闭包。
在下一部分中,您将把PhotoFeed更改为使用Router
和Routable。
第一步是将Compass包含在您的项目中。 使用CocoaPods
,这很容易。 使用项目编辑Podfile
,并在end
语句之前键入Podfile
pod 'Compass', '~> 5.0'
。 然后打开终端并执行以下操作:
吊舱安装
本教程中使用的Compass版本是5.1.0
。
注册路由器
首先,您将创建一个简单的路由器来处理所有登录后路由。 打开AppDelegate.swift
,然后在文件顶部导入Compass:
导入指南针
接下来,在var mainController: MainController?
下添加以下路由器声明var mainController: MainController?
宣言:
var postLoginRouter = Router()
然后声明一个名为setupRouting
的函数,您将在扩展中执行此操作,以将路由设置与AppDelegate
的主要代码分开。
最后,您需要调用此新添加的函数。 在window?.makeKeyAndVisible()
上方添加以下行:
setupRouting()
生成并运行。 似乎还没有工作! 为了使事情发生,您需要添加所有路由处理程序。 您将在下一部分中进行此操作。
实施路线处理程序
首先,创建一个新文件,并将其命名为Routers.swift
。 在这里,您将声明所有路由处理程序。 在文件的开头,添加import Compass
。 Compass声明了一个简单的协议– Routable
,该协议决定如何处理Current Controller
的给定Location
请求。 如果无法处理请求,它将引发RouteError
。 其实现如下所示:
公共协议路由表{
函数导航(到位置:位置,来自currentController:CurrentController)抛出
}
这是一个非常简单的协议。 您创建的任何路由仅需要实现该单一方法。 现在创建您的第一个处理程序来处理用户信息请求。
深层链接通常被视为外部导航,因为路由请求来自您的应用外部。 多亏了您开发的中央路由系统,用于处理外部和内部路由请求的代码几乎相同,并且完全没有代码重复。
推送通知有助于吸引用户使用您的应用程序。 您可能已经在_Medium_上收到诸如“嘿,结帐今天最受欢迎的故事”,在Facebook上收到“您的朋友今天过生日”之类的消息,……当您点击这些横幅时,您将被直接带到该特定屏幕。 多么酷啊? 这可以通过您的URL路由方法来实现。 想象一下,用户轻按一个推送通知横幅,上面写着“您是PhotoFeed上的名人-立即签出您的个人资料!”,然后直接发送到他们的个人资料屏幕。 为此,您只需要将URN信息嵌入推送有效负载中并在您的应用程序中进行处理即可。
配置
首先,您需要指定您的捆绑包ID。 转到Target Settings\General
以更改您的捆绑包ID,因为推送通知需要唯一的捆绑包ID才能工作。 默认情况下,您的项目使用com.fantageek.PhotoFeed
。
接下来,您需要注册您的App ID 。 转到会员中心并注册您的应用程序ID。 记住您的团队ID ,因为在最后一步中将需要它。 还要在“ 应用程序服务”下选中“ 推送通知”复选框。
现在,您需要生成身份验证密钥。 Apple提供令牌身份验证作为推送通知的新身份验证机制。 令牌易于生成,可用于所有应用程序,并且在大多数情况下,它永远不会过期。 仍在Member Center中,创建一个新的Key并将其下载为.p8文件。 记住您的密钥ID,因为在最后一步中将需要它。
下一步:启用推送通知功能。 返回Xcode,转到“ Target Settings\Capabilities
并启用“ 推送通知 _”,它将向您的项目添加PhotoFeed.entitlements
。
下一步是注册推送通知。 打开MainController.swift
并将以下导入添加到MainController.swift
的顶部:
导入用户通知
您只想在登录后启用推送通知,因此MainController
是理想的选择。 建议针对iOS 10及更高版本的应用使用UserNotifications。
在本教程中,您将使用一个名为PushNotifications的工具来帮助您轻松地为您的应用创建推送通知。 从此处下载工具PushNotifications
。 该工具将有效载荷直接发送到APN。
选择iOS \ Token以使用Token Authentication
,您可以通过从证书,标识符和配置文件中创建和下载密钥来获得。 浏览以.p8
您先前下载的.p8
身份验证密钥文件。 输入Team ID ,您可以通过转到Membership Details输入Key ID进行检查 ,这是第一步中与Key关联的ID。 输入Bundle ID和设备令牌 。 将以下内容粘贴到as中。 它是与URN相关联的传统有效负载。
{
“ aps”:{
“提醒”:“您已成为PhotoFeed上的名人,现在就签出您的个人资料”,
“ urn”:“ user:self”
}
}
由于您正在使用Xcode进行调试,因此请选择Sandbox
作为环境。
点击立即发送 。 如果您的应用程序在后台,则会出现警报。 轻按它会将您带到您的应用并显示您的用户个人资料。 太棒了! 再次感谢URL路由,您刚刚在推送通知中实现了深层链接。
这是带有本教程中所有代码的最终项目。
您现在已经了解了中央路由模式,已经掌握了指南针,甚至重构了一个实际的应用程序。 但是,没有适合所有应用程序的灵丹妙药。 您需要了解您的要求并进行相应调整。 如果您想进一步了解其他导航模式,请参考以下建议:
- 协调员
- 流量控制器
- 在VIPER中进行路由
请记住,这不仅与代码有关,而且与应用程序提供的用户体验有关。 因此,请确保您符合《人机界面指南iOS》中的指南导航。