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 发送电子邮件给我。