2014/01/19

IIJmioのiOSサンプルアプリのOAuth周りのシグナル処理について

RACSignalのサブクラスであるRACSubjectは、メソッドにsendNext:sendError:sendCompletedを持っているので、自分でイベントを送信する機能を持っています。

これらのメソッドを使うと、ReactiveCocoaFramework Overviewにある通り、非RACなものからシグナルを出すことができるようになります。

今回はそのような利用例として、IIJmioのiOSサンプルアプリでのOAuth認証での事例を紹介します。

インタフェースにOAuth用のRACSubjectを持たせています。

@interface MIORestHelper ()
@property RACSubject* authSignal;
@end

これは、UIWebViewを作ってloadRequest:を出すときに初期化しています。

ここではシグナルの初期化と、シグナル終了時の処理ブロックを追加しているだけです。

- (RACSignal*)authorizeInView:(UIView*)view {
    UIWebView* webview = [[UIWebView alloc] init];
    webview.delegate = self;
    [webview loadRequest:self.authorizeRequest];

    [view addSubview:webview];
    webview.frame = view.frame;

    self.authSignal = [RACSubject subject];
    return [self.authSignal finally:^{
        webview.delegate = nil;
        [webview removeFromSuperview];
    }];
}

実際にイベントを送信するのは、shouldStartLoadWithRequest:navigationType:webView:didFailLoadWithError:で行っています。

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
    NSURL* redirect = [NSURL URLWithString:self.redirectURI];
    if ([request.URL.host isEqualToString:redirect.host]) {
        if ([self checkAccessToken:request]) {
            [self.authSignal sendCompleted];
        } else {
            [self.authSignal sendError:nil];
        }
    }
    return TRUE;
}

- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error {
    [self.authSignal sendError:error];
}

ここでは、次のようにイベントを送信しています。

  • OAuthのリダイレクト先であるかとアクセストークンが付いているかをチェックして、そうだったらCompletedイベントを送信
  • リダイレクト先であるが、アクセストークンがないならErrorイベントを送信
  • webView:didFailLoadWithError:ならErrorイベントを送信

nextイベントは送信していません。

関連リンク

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。