BFGCallbackRouter 是 Objective-C 中针对 iOS 应用实现 x-callback-url 1.0 初稿规范的方案。本意是创建一个简单、轻量和灵活的实现。
路由器最好放在您应用程序的应用委托中,并将其作为属性保留。
#import "BFGCallbackRouter.h"
…
@property (nonatomic, strong) BFGCallbackRouter *router;
…
@synthesize router;
…
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
self.router = [[BFGCallbackRouter alloc] init];
}可以使用三种方法之一将行为添加到路由器中。
- (void)addAction:(NSString *)action scheme:(NSString *)scheme notificationName:(NSString *)notificationName;
- (void)addAction:(NSString *)action scheme:(NSString *)scheme delegate:(id<BFGCallbackDelegate>)delegate;
- (void)addAction:(NSString *)action scheme:(NSString *)scheme handler:(BFGCallbackActionHandler)handler;行为是从您的 URL 中的 x-callback-url 行为参数中的名称。在 app://x-callback-url/foo 中,行为是 foo。方案是您的应用程序的 URL 方案(在上面的示例中,为 app)。路由器支持多个 URL 方案,如果您的应用程序需要它(或正在实现一个库或具有排除自己方案且需要集成的库或框架,如 TextExpander touch SDK)。
如果您调用 notificationName 变体的 -addAction,则您指定的名称将是在收到回调时发布的通知的名称。发送的 NSNotification 对象的 object 属性将包含代表发送的回调参数的 BFGCallback 对象。(下面将详细介绍。)
[self.router addAction:@"foo" scheme:@"scheme" notificationName:@"ApplicationDidReceiveFooActionNotification"];调用 delegate 变体的 -addAction 期望一个符合 BFGCallbackDelegate 协议的对象的引用。该协议要求对象实现一个 必需 方法:签名 - (void)handleCallback:(BFGCallback *)callback 的 -handleCallback:。要代理的方法的参数将代表发送的回调参数的 BFGCallback 对象。(下面将详细介绍。)
[self.router addAction:@"bar" scheme:@"scheme" delegate:(BFGCallbackDelegate *)self.window.rootViewController];最后,调用 handler 变体的 -addAction 需要一个符合 BFGCallbackActionHandler 或 void(^BFGCallbackActionHandler)(BFGCallback *callback) 的代码块。发送到代码块的 BFGCallback 对象是代表发送的回调参数的对象。(下面将详细介绍。)
[self.router addAction:@"foo" scheme:@"scheme" handler:^(BFGCallback *callback) {
// do stuff here
}];在您的应用代理中的 -application:openURL:sourceApplication:annotation: 方法中,调用 BFGCallbackRouter 的 -routeURL:errorHandler: 方法
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
[self.router routeURL:url errorHandler:^(BFGCallbackError error) {
[self showAlertWithTitle:@"Callback Error" message:[NSString stringWithFormat:@"Invalid URL callback (%ld).", (long)error]];
}];
return YES;
}
- (void)showAlertWithTitle:(NSString *)title message:(NSString *)message {
UIAlertController *alert = [UIAlertController alertControllerWithTitle:title
message:message
preferredStyle:UIAlertControllerStyleAlert];
[alert addAction:[UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:NULL]];
[self.window.rootViewController presentViewController:alert animated:YES completion:NULL];
}BFGCallbackError 是一个包含不同错误值的 enum,如果您需要针对特定的错误采取行动。
BFGCallback 对象BFGCallback 对象包含从回调接收到的所有信息,并具有以下属性
sourceURL,这是发送到应用的完整URLaction,这是 x-callback-url 操作的名称source,如果存在,包含 x-source 参数的值onSuccess,如果存在,包含 x-success 参数的值onCancel,如果存在,包含 x-cancel 参数的值onError,如果存在,包含 x-error 参数的值parameters,包含一组任何其他URL查询参数的字典,其中已移除x-callback-url参数BFGCallback 对象还具有三个方法来处理x-success、x-cancel和x-error回调。
- (BOOL)performOnSuccessCallbackWithAdditionalParameters:(NSDictionary *)additionalParameters;
- (BOOL)performOnCancelCallback;
- (BOOL)performOnErrorCallbackWithCode:(NSInteger)code message:(NSString *)message;要执行适当的回调,请调用相应的回调方法。成功回调允许您向URL添加额外参数,例如返回值或来自您的应用的其他输出参数。错误回调接受用于设置标准 errorCode 和 errorMessage 参数的值,这些参数用于 x-error 参数。
每个方法返回一个 BOOL 值,指示回调是否成功或由于某些URL处理错误而无法完成,如果您需要对成功或失败采取行动。
BFGCallbackRouter 需要 iOS 8.1,尽管它可能在旧版的iOS中工作(未经测试)。
将 BFGCallback.[hm] 和 BFGCallbackRouter.[hm] 复制到您的项目中。
该库应通过与桥接头一起使用Swift而正常工作(未经测试)。
BFGCallbackRouter 在MIT许可证下授权。虽然您没有任何义务在应用程序中归因于库的使用,但归因于使用库是受欢迎的。
如果您遇到任何问题,请在Twitter上找到我,Twitter名为@blackfog或@blackfoggames。您也可以通过 craig at blackfoginteractive dot com 发送电子邮件给我。