iOS11のIdentityLookupを使ってみる


# 前置き

WWDC2017で新規frameworkとしてひっそり発表されたものの、セッションがなくドキュメントだけかと思っていたら突如としてビデオが上がっているという謎の機能です。あ、機能は謎じゃなくてセッションがいつ行われたのか、それとも本番で外されビデオだけなのか謎ですね。時間も17分ちょっとなのでますます怪しいです。

# この機能について

SMS/MMSで届いたメッセージがJunkなのかをチェックする機能です。Extensionとして提供となりますが、Extensionはオフラインのときのみで、オンラインならサーバーにチェックしに行きます。

ソースはこんな感じ。いつものようにObjective-Cです、はい。

```MessageFilterExtension.m

#import "MessageFilterExtension.h"


@interface MessageFilterExtension () <ILMessageFilterQueryHandling>
@end

@implementation MessageFilterExtension

#pragma mark - ILMessageFilterQueryHandling

- (void)handleQueryRequest:(ILMessageFilterQueryRequest *)queryRequest context:(ILMessageFilterExtensionContext *)context completion:(void (^)(ILMessageFilterQueryResponse *))completion {
    // First, check whether to filter using offline data (if possible).
    ILMessageFilterAction offlineAction = [self offlineActionForQueryRequest:queryRequest];
    
    switch (offlineAction) {
        case ILMessageFilterActionAllow:
        case ILMessageFilterActionFilter: {
            // Based on offline data, we know this message should either be Allowed or Filtered. Send response immediately.
            ILMessageFilterQueryResponse *response = [[ILMessageFilterQueryResponse alloc] init];
            response.action = offlineAction;
            
            completion(response);
            break;
        }
            
        case ILMessageFilterActionNone: {
            // Based on offline data, we do not know whether this message should be Allowed or Filtered. Defer to network.
            // Note: Deferring requests to network requires the extension target's Info.plist to contain a key with a URL to use. See documentation for details.
            [context deferQueryRequestToNetworkWithCompletion:^(ILNetworkResponse *_Nullable networkResponse, NSError *_Nullable error) {
                ILMessageFilterQueryResponse *response = [[ILMessageFilterQueryResponse alloc] init];
                response.action = ILMessageFilterActionNone;
                
                if (networkResponse) {
                    // If we received a network response, parse it to determine an action to return in our response.
                    response.action = [self actionForNetworkResponse:networkResponse];
                } else {
                    NSLog(@"Error deferring query request to network: %@", error);
                }
                
                completion(response);
            }];
            break;
        }
    }
}

- (ILMessageFilterAction)offlineActionForQueryRequest:(ILMessageFilterQueryRequest *)queryRequest {
    // Replace with logic to perform offline check whether to filter first (if possible).
    return ILMessageFilterActionNone;
}

- (ILMessageFilterAction)actionForNetworkResponse:(ILNetworkResponse *)networkResponse {
    // Replace with logic to parse the HTTP response and data payload of `networkResponse` to return an action.
    return ILMessageFilterActionNone;
}

@end
```

ふとここで疑問がありました。Filterをするということはメッセージを読む必要があるってことは怪しいアプリが出回るんじゃないかと。ただ、それは杞憂に終わりました。

* Extensionからネットワークに送信できない
* Extensionから外部のフォルダにファイルを書き込み出来ない

ということらしいです。
でも、サーバーの方は丸見えなんですよね。あれれ？

日本に帰ったらSMS使えるようになるのでテストしてみたいと思ってます。

# セッション動画
https://developer.apple.com/videos/play/wwdc2017/249/


# ドキュメント
https://developer.apple.com/documentation/identitylookup