Skip to content

Instantly share code, notes, and snippets.

@ghawkgu
Last active December 13, 2015 23:48
Show Gist options
  • Save ghawkgu/4993925 to your computer and use it in GitHub Desktop.
Save ghawkgu/4993925 to your computer and use it in GitHub Desktop.
QQ iOS SDK Manual (v1.3)

QQ ログイン iOS SDK マニュアル

APIバージョン:1.3
中国語版へのリンク

使い方

  1. iOS SDKのダウンロード
    SDKのダウンロードページ

  2. SDKの構成
    iOS SDK v1.3は下記の二つから構成されている。

    1. TecentOpenAPI.framework SDKのフレームワーク本体
    2. TencentApi_iOS_Bundle.bundle SDK用のリソースファイル
  3. SDKをプロジェクトに埋め込む

    1. TecentOpenAPI.frameworkTencentApi_iOS_Bundle.bundleを依存フレームワークとしてプロジェクトにコピーする。

    2. アプリのターゲットを開き、依存フレームワークとライブラリを設定する。

      • 下記の通りに4つのライブラリを追加する。

        SystemConfiguration.framework
        CoreGraphics.framework
        TencentOpenAPI.framework
        libiconv.dylib
        

      • __Build Phases__の__Copy Bundle Resources__にTencentOpenApi_iOS_Bundle.bundleを追加する。

      • Build Settings > Linking > Other Linker Flags-ObjCを追加する。

  4. app_idの設定

    1. ログイン用のURL Shemesを追加する。スキームの構成ルールは「tencent」+ 「app_id」です。

    2. AppDelegateにてhandleOpenURLopenURLにコールバックロジックを追加する。

      // openURL
      - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
          return [TencentOAuth HandleOpenURL:url];
      }
      
      // handleOpenURL
      - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url{
          return [TencentOAuth HandleOpenURL:url];
      } 
      
    3. TencentSessionDelegateのプロトコルを実装する。 具体的には、TencentOpenAPI/TencentOAuth.h を参照してください。

    4. 認証オブジェクトのインスタンス初期化と設定。

      1. 初期化

        self.tencentOAuth = [[TencentOAuth alloc] initWithAppId:@"app_id", andDelegate:self];
        //selfはTencentSessionDelegateのインスタンスです。
        
      2. redirectURIの設定(redirectURIはこのアプリをTensentに登録する時のリダイレクトURIです。略してもOKなので、登録しないほうがよい。)

        self.tencentOAuth.redirectURI = @"uri";
        
      3. ユーザーに許可させたいAPIの配列を設定する。 APIの一覧はこちら

        self.permissions = @[@"get_user_info", @"add_share"];
        
  5. SDKでのログインフロー

    1. authorizeを呼び出す。すると、アプリはログイン画面に遷移する。

      [self.tentcentOAuth authorize:self.permissions inSafari:NO];
      
    2. 認証された後、認証結果によって、デリゲートメソッドが呼び出される。

      • 正常に終った場合

        @protocol TencentSessionDelegate <NSObject>
        - (void)tencentDidLogin
        {
            //ログイン成功
            
            if (self.tencentOAuth.accessToken && 0 != [self.tencentOAuth.accessToken length]) {
                // ユーザーID、accesstoken、有効期限を取得
                NSString *openId = self.tencentOAuth.openId;
                NSString *accessToken = self.tencentOAuth.accessToken;
                NSDate *expirationDate = self.tencentOAuth.expirationDate;
            } else {
            //access tokenが取得できないため、ログイン失敗になる
            }
        }
        
      • 認証失敗した場合

        @protocol TencentSessionDelegate <NSObject>
        -(void)tencentDidNotLogin:(BOOL)cancelled
        {
            if (cancelled) {
                //ユーザーがキャンセルした
            } else {
                //ログイン失敗した
            }
        }
        
      • 認証の時にネットワーク通信エラーの場合

        @protocol TencentSessionDelegate <NSObject>
        -(void)tencentDidNotNetWork
        {
            //ネットワーク通信エラー
        }
        

    要注意のところ

    • 認証中はユーザーの操作のため、デリゲートメソッドが呼び出されない可能性もあるので、デリゲートメソッドをずっと待つことをしないでください。

    • access tokenの有効期間は3ヶ月なので、期間切れたら、ユーザーに再ログインさせるロジックが必要です。

    • アプリ側はユーザーID、accesstoken、有効期限を保存できるが、期間切れる前に、保存された情報を使って、認証用のオブジェクトを初期化してもいいです。

      [this.tencentOAuth setAccessToken:accessToken];
      [this.tencentOAuth setOpenId:openId];
      [this.tencentOAuth setExpirationDate:expirationDate];
      
    • ユーザー体験を一致にするために、ユーザーがログインしてから、getUserInfo APIを使って、ユーザーの画像、ニックネームなどを更新して、表示させたほうがよい。

  6. 他のAPIの呼び出し方
    APIの一覧はこちら 以下、ユーザーアバター画像を設定するAPIを例として、説明する。

    1. 各APIを呼び出すときに、パラメーターをNSDictionaryのインスタンスに入れる必要なので、ヘルパークラスを使うなら、便利になります。そのヘルパークラスの名は「TC{API名}Dic」となる。
      例えば、コンテンツをシェアするAPIのメソッドは- addShareWithParams:paramsです。それに応じて、パラメーターのヘルパークラスの名はTCAddShareDicです。

      各ヘルパーでは下記のようなプロパティ定義があります:
      @property (nonatomic, retain) TCRequiredStr paramTitle;

      そのデータタイプのパタンは下記の通りです。

      • TCRequiredStr 必須で、文字列パラメーター
      • TCOptionalStr オプションで、文字列パラメーター
    2. setUserHeadpic(ユーザーアバターの設定)の呼び出す例

      TCSetUserHeadpic *params = [TCSetUserHeadpic dictionary];
      params.paramImage = image;
      params.paramFileName = @"make";
      [self.tencentOAuth setUserHeadpic:params]
      

      結果が帰って来たら、- setUserHeadpicResponseというデリゲートメソッドが呼び出される

      @protocol TencentSessionDelegate <NSObject>
       - (void)setUserHeadpicResponse:(APIResponse*) response
       {
           if (nil == response) {
               return;
           }
           
           if (URLREQUEST_FAILED == response.retCode
           && kOpenSDKErrorUserHeadPicLarge == response.detailRetCode) {
               UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"失敗した" message:[NSString stringWithFormat:@"ファイルはサイズ制限を超えました。)"]
               delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil];
               [alert show];
               [alert release];
           }
       }
      
    3. 返却値の説明
      APIResponseのプロバティ

    4. retCode

      • 0 操作成功
      • 1 操作失敗、原因は下記のdetailRetCodeから調べられる
    5. detailRetCode

      • kOpenSDKInvalid API無効

      共通エラーコード

      • kOpenSDKErrorSuccess - 操作成功
      • kOpenSDKErrorUnknown - 未知エラー
      • kOpenSDKErrorUserCancel - ユーザーが操作をキャンセルした
      • kOpenSDKErrorReLogin - tokenが無効になったため、再認証が必要
      • kOpenSDKErrorOperationDeny - 権限無し(認証の時に、permission未指定)

      ネットワーク通信に関してのエラーコード

      • kOpenSDKErrorNetwork - 通信エラー、サーバーへアクセスできなかった
      • kOpenSDKErrorURL - URLフォマートかプロトコルエラー
      • kOpenSDKErrorDataParse - サーバー側はパラメーター解析できなかった
      • kOpenSDKErrorParam - パラメーター不正
      • kOpenSDKErrorConnTimeout - http接続タイムアウト
      • kOpenSDKErrorSecurity - セキュリティに問題があった
      • kOpenSDKErrorIO - ファイルダウンロードにIOエラーが発生した
      • kOpenSDKErrorServer - サーバー側はエラーが発生した

      ウェブビューにおけるエラーコード

      • kOpenSDKErrorWebPage - ウェブページエラー

      ユーザーアバター専用のエラーコード

      • kOpenSDKErrorUserHeadPicLarge - 画像サイズが大きすぎる
  7. QZoneでのシングルサインオン
    SDK v1.3より、iOSのQZone(TencentのiOSポータルアプリ)を対応している。実装上の手間掛からなくて、QZoneのシングルサインオン機能が使えるようになる。ユーザーの端末ではQZoneがインストールされているなら、自動的にQZoneのログイン画面に遷移するが、QZoneがない端末では、普通のウェブビューログイン画面が開く。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment