MWOpenInKit是处理iOS应用中第三方URL方案的一种简单方法。
iOS平台上链接到第三方应用基本上是无效的。假设您作为开发者,希望允许用户在Google Maps中打开地图链接,而不是使用内置的Maps.app。现在您需要编写一大堆自定义代码,以确定Google Maps是否已安装,并询问用户他们的偏好,并理想地记住这个偏好。
如果我们用一个更复杂的例子来说明,比如Twitter客户端,您现在可能要管理几十个不同的第三方URL方案,它们都截然不同,且可能没有很好地记录。
因此,很少有应用会链接到AppleEasy-to-link-to应用程序处理的外部第三方应用程序,即使用户更喜欢第三方应用程序。
MWOpenInKit试图解决这个问题。
对于用户:
它提供了一个精美的选择界面,让用户选择在哪个第三方应用中执行操作。
对于开发者:
它提供了一个基于语义动作的优雅、一致的API。您不需要手动构造URL,只需告诉它您试图做什么即可。您不需要手动检查哪些应用程序安装了,只需让MWOpenInKit自动查询设备以确定哪些应用程序可以执行指定的操作。
安装
pod install
后,您应该在您的应用程序代码中使用#import <MWOpenInKit/MWOpenInKit.h>
并开始使用它。用法
NSURL *url = [NSURL URLWithString:@"http://google.com"]
MWBrowserHandler *browserHandler = [[MWBrowserHandler alloc] init];
MWActivityPresenter *presenter = [browserHandler openURL:url];
[presenter presentModalActivitySheetFromViewController:self];
以最简单的方式使用MWOpenInKit,您只需要实例化一个处理器对象,给它一个要执行的操作,然后告诉结果的展示对象展示自己。下面是如何在iPhone上使用外部网络浏览器打开URL的示例
如果用户仅安装了MobileSafari,这将从Safari打开,就像您调用[[UIApplication sharedApplication] openURL:url]
一样。
这总会在模态表单中显示,但如果您的应用是通用型或仅适用于iPad,您可能希望将应用表单显示为弹出视图。以下代码将在iPhone上以模态方式自动显示,并在iPad上使用UIPopoverController
显示。
NSURL *url = [NSURL URLWithString:@"http://google.com"]
MWBrowserHandler *browserHandler = [[MWBrowserHandler alloc] init];
MWActivityPresenter *presenter = [browserHandler openURL:url];
[presenter presentActivitySheetFromViewController:self
popoverFromRect:someRect
inView:self.view
permittedArrowDirections:UIPopoverArrowDirectionAny
animated:YES];
所有这些选项都将直接传递到UIPopoverController
中。类似地,存在一个presentActivitySheetFromViewController:popoverFromBarButtonItem:permittedArrowDirections:animated:
,如果适当的话,它会调用等效的UIPopoverController
方法。
存在许多不同的处理器对象,它们按应用程序类型分组。例如,MWBrowserHandler
,MWMapsHandler
和MWTwitterHandler
分别处理在网页浏览器中打开链接、地图应用程序和Twitter客户端。
一些处理器有可选的配置参数。例如,当链接到地图应用程序时,您可以指定地图应中心在哪里以及缩放程度;这些选项将在您搜索位置、获取路线指示或执行处理器支持的其他任何动作时生效。
MWMapsHandler *mapsHandler = [[MWMapsHandler alloc] init];
mapsHandler.center = CLLocationCoordinate2DMake(42.523, -73.544);
mapsHandler.zoom = 14;
[mapsHandler directionsFrom:@"Washington Square Park" to:@"Lincoln Center"];
这是MWOpenInKit
真正强大的地方。这为您提供了一个干净、语义化的API来构建链接,而不是手动拼接URL,无论您的用户是想使用Apple Maps还是第三方应用程序。
有关可用处理器及其方法和配置选项的详细列表,请参阅项目的文档。
详尽的文档(使用appledoc生成)可以在运行script/generate-docs.sh
的根目录下的docs
目录中找到。或通过CocoaDocs查看。
提供了一个演示应用程序,您可以查看MWOpenInKit的功能。
pod install
。MWOpenInKitDemo.xcworkspace
。该演示允许您执行MWOpenInKit支持的所有操作。
如果您安装的应用程序能够执行任务,并有且仅有一个这样的应用程序,MWOpenInKit将默认直接打开该应用程序,而不是提示用户选择。在演示应用程序中,有一个切换始终显示选择用户界面。建议您在实际的iOS设备上运行该演示,该设备已安装第三方应用程序。如果您必须在没有第三方应用程序的模拟器上运行它,则该切换将允许您看到选择用户界面的外观。
扩展MWOpenInKit以包含您的应用程序的URL方案非常简单。
在/MWOpenKit/Apps/
目录内,创建一个以您的应用程序命名的新的目录。
在该目录中,创建一个plist文件。其名称应该是您想要显示的名称,并且它应包含一个字典。每个键是适当MWHandler
对象中方法的签名,键是用于生成该方法的模板字符串,其中{handlebars}
包裹的变量将在运行时进行插值。
尽可能多的情况下,模板变量键的名称与相应Objective-C方法的参数名称相同,但这并不是强制性的。我建议查看目录中的其他plist文件,以了解正确的方法键和模板键。
您的应用图标应放在同一目录下。您需要四个图标副本,所有这些图标的根名称都应与您的 plist 文件相同。
AppName.png
:60x60[email protected]
:120x120AppName-iPhone.png
:76x76[email protected]
:152x152这些图标将按原样显示,因此应该预先渲染。根文件名(例如示例中的“AppName”)必须与 plist 文件名完全匹配。
在 Xcode 中打开示例项目并运行测试(Cmd+U
)。这将运行一个 linter,它会告诉您如果您的 plist 中定义的任何操作没有对应实际 Objective-C 处理器方法,这有助于确保您没有出现任何拼写错误。
请注意,您不需要手动将任何文件添加到 Xcode 中;它们将被自动识别。如果在 Xcode 中看到意外的行为并且怀疑您的更改没有生效,请清除项目,删除衍生数据文件夹,并重置模拟器。
您还可能在实际的 iOS 设备上运行示例应用,以确保您的链接按预期工作。
提交 pull request!
如果您的应用程序支持当前处理器中没有表示的操作,或者属于目前没有处理器的应用程序类别,那么您必须编写代码以添加支持。现有的处理器代码易于阅读;请参考现有的处理器子类以创建自己的处理器方法或 MWHandler
子类。
在这种情况下,您对 `MWOpenInKit
` 的最佳贡献方式是将其用于您的应用程序并提交您应用程序 URL 方案的 pull request。但话虽如此,任何其他形式的贡献都是受欢迎的!对于新代码,强烈建议进行测试和通过 appledocs 提供文档。
MWOpenInKit
初始版本的目标是提供一种简单的方式来集成第三方应用链接,而不需要大量样板代码。以下是非详尽的未来扩展列表。
MWOpenInKit
的单个设备上所有应用。MFMailComposeViewController
或内嵌网页视图)。Mike Walker
最初版本的 MWOpenInKit 是在 Hacker School 上构建的。
MWOpenInKit 可在 MIT 许可证下获得。有关更多信息,请参阅 LICENSE 文件。