WeiboSDKでiOSからWeiboにログイン&ツイート

## 中国でソーシャルを絡めたiPhoneアプリを展開

基本的に、アプリは日本向けに開発するのだけど、このアプリ中国でもいけるのでは?となったりする。。けど、中国だとFacebookやTwitterは使えないので、ソーシャルと絡めたい場合は、中国語版Facebook&TwitterともいえるWeibo(新浪微博)を使わざるを得ない。ということで、iOS&WebioSDKの使い方メモです。

#### この記事の対象者

* Facebook / Twitterなどソーシャル連携した日本向けアプリの中国展開を考えている人。
* ユーザー数5億人ともいわれるWeiboにアプリで切り込みたいと考えている人。
* (中国語を勉強しながらアプリも開発したい人。)

## Webio実装の流れ

まずは全体の流れとしては下記の通り。

Weiboへのアカウント/開発者登録やアプリ登録は済んでいるものとします。
まだの人は右記サイト参照 &rArr; [iOSからWeibo(微博)にログイン〜ツイートしてみる](http://b.ruyaka.com/2013/12/10/weibo-ios-application-basic/)


<img src="http://b.ruyaka.com/wp-content/uploads/2013/12/スライド12.jpg" alt="weibo-ios-flow" width="700" height="525" class="alignnone size-full wp-image-2891" />

#### 追加・変更するファイル一覧

1. Prefix.pch
2. AppDelegate.h
3. AppDelegate.m
4. WeiboViewController.m
5. WeiboViewController.m

## WeiboSDKの初期設定

#### 1. 「Prefix.pch」

アプリキーとコールバックURIをそれぞれ定義しておきます。どちらもWeiboのアプリ管理ページで設定・取得できます。

```objectivec
#define kAppKey @"アプリキー"
#define kRedirectURI @"https://api.weibo.com/oauth2/default.html" // アプリのコールバック設定と合わせる。
```

#### 2. AppDelegate.h

```objectivec

#import <UIKit/UIKit.h>
#import "WeiboSDK.h" // 追加

@interface AppDelegate : UIResponder <UIApplicationDelegate, WeiboSDKDelegate> // デリゲート追加

@property (strong, nonatomic) UIWindow *window; 
@property (strong, nonatomic) NSString *wbtoken; // 追加 (トークン用)

@end
```

#### 3. AppDelegate.m

WebioSDKを設定し、デリゲートメソッドを3つ追加します。

```objectivec
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [WeiboSDK enableDebugMode:YES]; // 追加
    [WeiboSDK registerApp:kAppKey]; // 追加

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    [self.window makeKeyAndVisible];

    WeiboViewController* weiboViewController = [[WeiboViewController alloc] init];
    self.window.rootViewController = weiboViewController;
    
    return YES;
}

pragma - Weibo SDK delegate methods

- (void)didReceiveWeiboRequest:(WBBaseRequest *)request
{
    if ([request isKindOfClass:WBProvideMessageForWeiboRequest.class])
    {
        WeiboViewController *controller = [[WeiboViewController alloc] init];
        [self.window.rootViewController presentViewController:controller animated:YES completion:nil];
    }
}

- (void)didReceiveWeiboResponse:(WBBaseResponse *)response
{
    if ([response isKindOfClass:WBSendMessageToWeiboResponse.class])
    {
        NSString *title = @"发送结果";
        NSString *message = [NSString stringWithFormat:@"响应状态: %d\n响应UserInfo数据: %@\n原请求UserInfo数据: %@",
                                                       response.statusCode, response.userInfo, response.requestUserInfo];
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:title
                                                        message:message
                                                       delegate:nil
                                              cancelButtonTitle:@"确定"
                                              otherButtonTitles:nil];
        [alert show];
    }
    else if ([response isKindOfClass:WBAuthorizeResponse.class])
    {
        NSString *title = @"认证结果";
        NSString *message = [NSString stringWithFormat:@"响应状态: %d\nresponse.userId: %@\nresponse.accessToken: %@\n响应UserInfo数据: %@\n原请求UserInfo数据: %@",
                                                       response.statusCode, [(WBAuthorizeResponse *)response userID], [(WBAuthorizeResponse *)response accessToken], response.userInfo, response.requestUserInfo];
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:title
                                                        message:message
                                                       delegate:nil
                                              cancelButtonTitle:@"确定"
                                              otherButtonTitles:nil];

        self.wbtoken = [(WBAuthorizeResponse *)response accessToken];

        [alert show];
    }
}

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
    return [WeiboSDK handleOpenURL:url delegate:self];
}

これでひとまず、Weiboの基本設定完了。次にWeiboでのログインとツイートを実装します。

```

## Weiboへのログイン&ツイート実装

WeiboViewControllerを作成します。ここでログイン&ツイートボタンとそれぞれの処理を実装します。コードは以下の通り。

#### 4. WeiboViewController.h

```objectivec
#import <UIKit/UIKit.h>

@interface WeiboViewController : UIViewController

@end
```

#### 5. WeiboViewController.m

```objectivec
#import "WeiboViewController.h"
#import "WeiboSDK.h"
#import "AppDelegate.h"

@interface WeiboViewController () <WBHttpRequestDelegate>

@end

@implementation WeiboViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
	// Do any additional setup after loading the view.

    self.view.backgroundColor = UIColor.grayColor;

    // ログインボタン
    UIButton *ssoButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [ssoButton setTitle:@"ログイン" forState:UIControlStateNormal];
    [ssoButton addTarget:self action:@selector(ssoButtonPressed) forControlEvents:UIControlEventTouchUpInside];
    ssoButton.frame = CGRectMake(20, 250, 280, 50);
    [self.view addSubview:ssoButton];

    UIButton *tweetButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [tweetButton setTitle:@"つぶやく" forState:UIControlStateNormal];
    [tweetButton addTarget:self action:@selector(tweetButtonPressed) forControlEvents:UIControlEventTouchUpInside];
    tweetButton.frame = CGRectMake(20, 370, 280, 50);
    [self.view addSubview:tweetButton];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (void)ssoButtonPressed
{
    WBAuthorizeRequest *request = [WBAuthorizeRequest request];
    request.redirectURI = kRedirectURI;
    request.scope = @"all";
    request.userInfo = @{@"SSO_From": @"WeiboViewController",
            @"Other_Info_1": [NSNumber numberWithInt:123],
            @"Other_Info_2": @[@"obj1", @"obj2"],
            @"Other_Info_3": @{@"key1": @"obj1", @"key2": @"obj2"}};
    [WeiboSDK sendRequest:request];
}

- (void)tweetButtonPressed
{
    NSLog(@"*** tweetButtonPressed ");
    AppDelegate *myDelegate =(AppDelegate*)[[UIApplication sharedApplication] delegate];
    [WBHttpRequest requestWithAccessToken:myDelegate.wbtoken
                                      url:@"https://api.weibo.com/2/statuses/update.json"
                               httpMethod:@"POST"
                                   params:@{@"status":@"Hello World"}
                                 delegate:self
                                  withTag:nil];
}

- (void)request:(WBHttpRequest *)request didFinishLoadingWithResult:(NSString *)result
{
    NSString *title = nil;
    UIAlertView *alert = nil;

    title = @"成功しました。";
    alert = [[UIAlertView alloc] initWithTitle:title
                                       message:[NSString stringWithFormat:@"%@",result]
                                      delegate:nil
                             cancelButtonTitle:@"OK"
                             otherButtonTitles:nil];
    [alert show];
}

- (void)request:(WBHttpRequest *)request didFailWithError:(NSError *)error;
{
    NSString *title = nil;
    UIAlertView *alert = nil;

    title = @"失敗しました。";
    alert = [[UIAlertView alloc] initWithTitle:title
                                       message:[NSString stringWithFormat:@"%@",error]
                                      delegate:nil
                             cancelButtonTitle:@"OK"
                             otherButtonTitles:nil];
    [alert show];
}

@end
```


上記のコードはGithubにもUP。 &rArr; [kuman/ios-weibo-test](https://github.com/kuman/ios-weibo-test)


### テスト

シミュレーターを起動し、「ログイン」ボタンを押すとWebioのブラウザベースのWeiboログインフォームが表示される。ログイン後に「つぶやく」ボタンをタッチするとWeibo上に"Hello World!"とツイートされる。


### MEMO

* ドキュメントが中国語が辛い。
* API操作はWeiboWikiのドキュメントを見れればまぁいける。
* ログイン後にコールバックでアプリに戻ってくれず少しはまる。(Weibo管理画面のバンドルID/コールバック設定やXcode上のpListなど見直して解決)
* Google ChromeだとWeiboの新規登録ができなかったのでFirefoxで登録した。

### 参考

* [http://open.weibo.com/wiki/SDK](http://open.weibo.com/wiki/SDK)
* [https://github.com/sinaweibosdk/weibo_ios_sdk](https://github.com/sinaweibosdk/weibo_ios_sdk)