Social.framework を利用して Twitter の DM を送信する

Social.framework （と Accounts.framework）を利用して **Twitter の DM を送信**する手順です。


##1. フレームワークをプロジェクトに追加

以下の２つを追加し、

- Social.framework
- Accounts.framework

DM送信を実装するクラスでヘッダをインポートしておきます。

````
#import <Social/Social.h>
#import <Accounts/Accounts.h>
````


##2. Twitterアカウントのアクセス権を取得

Twitterアカウントのアクセス権を取得し、ACAccountオブジェクトを取得します。

````
ACAccountStore *store = [[ACAccountStore alloc] init];
ACAccountType *type = [store accountTypeWithAccountTypeIdentifier:
                              ACAccountTypeIdentifierTwitter];

[store requestAccessToAccountsWithType:type
                               options:nil
                            completion:^(BOOL granted, NSError *error) {
                                
                                if (!granted) {
                                    
                                    NSLog(@"not granted");
                                    
                                    return;
                                }
                                
                                NSArray *twitterAccounts = [store accountsWithAccountType:type];
                                
                                if (!(twitterAccounts > 0)) {
                                    
                                    NSLog(@"no twitter accounts");
                                    
                                    return;
                                }
                                
                                ACAccount *account = [twitterAccounts lastObject];
                            }];
````


##3. DM 送信

SLRequestクラスを利用して、direct_messages/new APIをたたきます。

````
NSURL *url = [NSURL URLWithString:@"https://api.twitter.com/1.1/direct_messages/new.json"];
NSDictionary *parameters = @{@"text": @"テスト送信",
                             @"screen_name": @"shu223"};

SLRequest *request = [SLRequest requestForServiceType:SLServiceTypeTwitter
                                        requestMethod:SLRequestMethodPOST
                                                  URL:url
                                           parameters:parameters];

request.account = account;
[request performRequestWithHandler:^(NSData *responseData,
                                     NSHTTPURLResponse *urlResponse,
                                     NSError *error)
 {
     NSError *jsonError = nil;
     id jsonData = [NSJSONSerialization JSONObjectWithData:responseData
                                               options:0
                                                 error:&jsonError];
     if (error){
         
         NSLog(@"error:%@", error);
     }
     
     if (jsonError) {
         
         NSLog(@"jsonerror:%@", jsonError);
     }
     
     dispatch_async(dispatch_get_main_queue(), ^{
         
         NSLog(@"jsondata:%@" , jsonData);
     });
 }];
````

上で使用しているパラメータについて補足すると、

- text
  - 送信するテキスト
  - required
- screen_name
  - 宛先ユーザーのscreen name（@のあとに続く名前）
  - option

となっています。


##補足

iOS 6 より deprecated になりましたが、Twitter.framework の TWRequest を用いても同様のことができます。

````
TWRequest *request = [[TWRequest alloc] initWithURL:url
                                         parameters:parameters
                                      requestMethod:TWRequestMethodPOST];
````

##参考資料

[POST direct_messages/new | Twitter Developers](https://dev.twitter.com/docs/api/1.1/post/direct_messages/new)