iOS应用程序中的URL路由:《指南针初学者指南》

应用程序通常具有许多屏幕, UIViewController可以与显示和导航API一起很好地用作屏幕的基础。 一切都很好,直到您迷失在流的森林中,并且代码变得难以维护。

避免这种情况的一种方法是中央URL路由方法。 可以将其视为处理并解决所有路由请求的网络路由器。 这样,代码就变成了声明性的和解耦的,因此列表组件不需要知道它所呈现的内容。 URL路由还使日志记录和跟踪变得容易,并且易于处理外部请求(例如深链接)。

有多种执行URL路由的框架。 在本教程中,为简单起见,将使用Compass。 您将重构一个现有应用程序,这是一个名为PhotoFeed的简化的Instagram应用程序。 完成本教程后,您将知道如何在Compass中声明和使用路由器以及如何处理深层链接。

下载入门项目并解压缩。 转到PhotoFeed文件夹并运行pod install安装此项目的特定依赖项。 打开PhotoFeed.xcworkspace并运行项目。 点击登录以转到Instagram登录页面并输入您的Instagram凭据,然后浏览一下该应用程序。

主应用程序由UITabBarController ,其中显示了提要,当前登录的用户配置文件和菜单。 这是一个典型的Model View Controller项目,其中UIViewController处理Cell委托并负责导航。 为简单起见,所有视图控制器都继承自TableControllerCollectionController ,它们知道如何管理特定模型和单元的列表。 所有型号均符合新的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:BYOkwgXnwr3URN ,您将获得一个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》中的指南导航。