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


## URL
[GitHub](https://github.com/aoifukuoka/AFSheme)
[CocoaPods](http://cocoadocs.org/docsets/AFSheme/)

## 環境
* iOS8.0以上

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

## 経緯

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

```objc
HogeViewController *hogeVC = [[HogeViewController alloc] init];
[self.navigationController pushViewController:hogeVC animated:YES];
```
とやっているところがあったり、

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

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

```objc
HogeViewController *hogeVC = [[HogeViewController alloc] init];
[self presentViewController:hogeVC animated:YES completion:^{
      hogehoge..  
}];
```
のようにしなければならず、そもそもView遷移をまとめたい！
さらには、StoryBoardを呼び出す際にいちいち、

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

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

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

インストール

```rb
pod 'AFSheme'
```

インポートは

```objc
#import AFSheme.h
```

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

```objc
+(void)openShemeWithString:(NSString *)name 
                parameters:(NSDictionary *)parameters 
            createViewType:(CreateViewType)createViewType 
             useStoryBoard:(BOOL)useStoryBoard;
```

```objc
+(void)openSheme:(NSString *)className 
      parameters:(NSDictionary *)parameters 
  createViewType:(CreateViewType)createViewType 
   useStoryBoard:(BOOL)useStoryBoard;
```

```objc
+(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として受け取れば

```objc
[AFSheme openSheme:@"CustomViewController",
        parameters:@{}
    createViewType:CreateViewTypePush
     useStoryBoard:YES];
```
のようにしてHogeViewControllerへ遷移させることができます。

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

```objc:AppDelegate.m

#import AFSheme.h
#import HogeViewController.h

@interface AppDelegate () <AFShemeConverterDelegate>

@end

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

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

```objc
#import CustomViewController.h

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

```

や

```objc
#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のインスタンスを生成しています。
なので例えば上述の三つのメソッドで

```objc
@interface FugaViewController ()

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

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