[iOS] JavaScript やaタグから簡単にスキームでiOSアプリのViewを呼び出せるライブラリを公開しました。


URL

GitHub
CocoaPods

環境

  • iOS8.0以上

想定している使用者さん

  • WebViewを使っている・使おうとしている方でカスタムスキームを使ってJavaScriptなどからiOSアプリのView遷移やアクション呼び出しをしたい
  • StoryBoardの管理やインスタンスの作成が面倒くさい
  • iOSアプリの初期開発をするが、Viewの遷移処理をまとめたい

経緯

まず、iOS開発をしていると、どうしてもViewの遷移処理やその書き方がバラバラになってしまうことが多いと感じていました。
具体的には

HogeViewController *hogeVC = [[HogeViewController alloc] init];
[self.navigationController pushViewController:hogeVC animated:YES];

とやっているところがあったり、

dispatch_async(dispatch_get_main_queue(), ^{
    HogeViewController *hogeVC = [[HogeViewController alloc] init];
    [self.navigationController pushViewController:hogeVC animated:YES];
});

とやっているところがあったりなどです。
他にもモーダルを呼び出すときには

HogeViewController *hogeVC = [[HogeViewController alloc] init];
[self presentViewController:hogeVC animated:YES completion:^{
      hogehoge..  
}];

のようにしなければならず、そもそもView遷移をまとめたい!
さらには、StoryBoardを呼び出す際にいちいち、

NSString *stbName = @"HogeViewController";
UIStoryboard *stb = [UIStoryboard storyboardWithName:stbName bundle:nil];
UIViewController *vc = [stb instantiateViewControllerWithIdentifier:stbName];
[self.navigationController pushViewController:vc animated:YES];

などとやるのは面倒くさい!
と考えていました。
そんな中様々なコードからインスパイアを受け、ちょうど手元でiOSの初期開発をしていたので汎用的に作りライブラリ化したという経緯です。

使い方

少し長くなってしまいましたが使い方に入ります。

インストール

pod 'AFSheme'

インポートは

#import AFSheme.h

で、使用できるメソッドは現在三通りです。

+(void)openShemeWithString:(NSString *)name 
                parameters:(NSDictionary *)parameters 
            createViewType:(CreateViewType)createViewType 
             useStoryBoard:(BOOL)useStoryBoard;
+(void)openSheme:(NSString *)className 
      parameters:(NSDictionary *)parameters 
  createViewType:(CreateViewType)createViewType 
   useStoryBoard:(BOOL)useStoryBoard;
+(void)openSheme:(UIViewController *)vc 
      parameters:(NSDictionary *)parameters 
  createViewType:(CreateViewType)createViewType;

一番上の+(void)openShemeWithString:(NSString *)name
はnameで指定したViewControllerへ遷移させるものです。
これは後述するDelegate methodでnameと実際のViewControllerを対応付けることにより実現されます。
このメソッドを使えば簡単にJavaScriptから任意のViewControllerを呼び出すことができます。

例えばアプリ側で
customsheme://?view=HogeViewController&hoge=fuga
へのアクセスを受け取り、HogeViewcontrollerをNSStringとして受け取れば

[AFSheme openSheme:@"CustomViewController",
        parameters:@{}
    createViewType:CreateViewTypePush
     useStoryBoard:YES];

のようにしてHogeViewControllerへ遷移させることができます。

その際、NSStringの@"HogeViewController"と遷移させたい実際のHogeViewControllerのクラス名を対応させるためにDelegate methodを実装する必要があります。
やり方は簡単でAppDelegate.mにこれだけです。

AppDelegate.m

#import AFSheme.h
#import HogeViewController.h

@interface AppDelegate () <AFShemeConverterDelegate>

@end

- (NSDictionary *)afShemeMappingDictionary {  
    return @{@"HogeViewController":HogeViewController.className};
}

UIViewControllerにカテゴリでクラスメソッド classNameを実装しています。
他のメソッドも

#import CustomViewController.h

[AFSheme openSheme:CustomViewController.className
        parameters:@{}
    createViewType:CreateViewTypePush
     useStoryBoard:YES];

#import CustomViewController.h

CustomViewController *customViewController = [[CustomViewController alloc] init];

[AFSheme openSheme:customViewController
        parameters:@{}
    createViewType:CreateViewTypePush];

のようにして使えます。

パラメータ

1.NSDictionary *parameters
遷移先のViewControllerに渡したいパラメーター。
遷移先のViewControllerにて
self.parameters
のようにアクセスできます。

2.CreateViewType createViewType
EnumでViewの遷移タイプを選択できます。

  • CreateViewTypePush

    • UINavigationControllerのpushViewControllerの遷移を行います。
      今表示されているViewControllerがnavigationControllerを親に持つ必要があります。
  • CreateViewTypeModal

    • UIViewControllerのpresentViewControllerの遷移を行います。
  • CreateViewTypeAlert

    • UIAlertControllerを表示したいときに使います。

3.BOOL useStoryBoard
遷移先のViewControllerにStoryBoardのスタイルを使うかどうかを選択します。

注意

このライブラリではStoryBoardの名前とidentifierをViewcontrollerのクラス名と同じだと想定して自動的にStoryBoardのインスタンスを生成しています。
なので例えば上述の三つのメソッドで

@interface FugaViewController ()

@end

のように実装されたFugaViewControllerを使う場合はそのStoryBoard名、identifierをFugaViewControllerにする必要があります。
ここには十分注意してください。
これもいちいちStoryBoardのインスタンスを作る手間を減らすためです。

今後

このライブラリを使えば、簡単にウェブとの連携ができたり、View遷移の手間が省けると思います。
まだまだ粗いところもありますが、是非お使いください!
今後CreateViewTypeなどの種類も増やすなどもっと便利にしたいと考えています。
ぜひPRなどお待ちしております!