首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

iOS 整合新浪微博授權登入完整實作指南 (無第三方庫)

     編輯:程式設計綜合問答

前置準備

  1. 註冊成為新浪微博開發者,建立應用獲取 App Key、App Secret、授權回調頁 (Redirect URI)。
  2. 將新浪官方 SDK (SinaWeiboSDK) 導入 Xcode 專案 (建議手動拖入源碼或使用 CocoaPods: pod 'WeiboSDK')。
  3. 在 Info.plist 中配置 LSApplicationQueriesSchemes (添加 sinaweibo, sinaweibohd 等) 及 URL Types (URL Scheme 設為 wb+你的AppKey)。

核心實作步驟

1. 定義常數 (建議獨立 .h 檔或常數類)

#define kAppKey @"你的AppKey"
#define kAppSecret @"你的AppSecret"
#define kRedirectURI @"你的授權回調頁"

2. AppDelegate 中初始化與持久化

// AppDelegate.h
#import <UIKit/UIKit.h>
@class SinaWeibo; // 前向宣告

@interface AppDelegate : UIResponder <UIApplicationDelegate, SinaWeiboDelegate>
@property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic) SinaWeibo *sinaWeibo;
@end

// AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [self _initSinaWeibo];
    return YES;
}

- (void)_initSinaWeibo {
    _sinaWeibo = [[SinaWeibo alloc] initWithAppKey:kAppKey appSecret:kAppSecret redirectURI:kRedirectURI delegate:self];
    
    // 讀取本地儲存的 Token (實現自動登入)
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSDictionary *authData = [defaults objectForKey:@"SinaWeiboAuthData"];
    if (authData[@"accessToken"] && authData[@"expirationDate"] && authData[@"userId"]) {
        _sinaWeibo.accessToken = authData[@"accessToken"];
        _sinaWeibo.expirationDate = authData[@"expirationDate"];
        _sinaWeibo.userId = authData[@"userId"];
        NSLog(@"本地授權信息讀取成功,用戶已自動登入");
    }
}

// 實現 Delegate: 登入成功回調
- (void)sinaweiboDidLogIn:(SinaWeibo *)sinaweibo {
    NSDictionary *authData = @{
        @"accessToken": sinaweibo.accessToken,
        @"expirationDate": sinaweibo.expirationDate,
        @"userId": sinaweibo.userId,
        @"refreshToken": sinaweibo.refreshToken
    };
    [[NSUserDefaults standardUserDefaults] setObject:authData forKey:@"SinaWeiboAuthData"];
    [[NSUserDefaults standardUserDefaults] synchronize];
    NSLog(@"登入成功,Token 已持久化");
}

// 處理 URL Scheme 回調 (iOS 9+)
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary *)options {
    return [_sinaWeibo handleOpenURL:url delegate:_sinaWeibo];
}

// 兼容 iOS 8-
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
    return [_sinaWeibo handleOpenURL:url delegate:_sinaWeibo];
}

3. 視圖控制器中呼叫登入/登出

// 獲取單例
- (SinaWeibo *)sinaWeibo {
    AppDelegate *delegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
    return delegate.sinaWeibo;
}

// 觸發登入 (按鈕點擊事件)
- (IBAction)loginBtnClicked:(id)sender {
    [self.sinaWeibo authorize:[WBAuthorizeRequest requestForAuthorize] withCompletionHandler:^(WBBaseResponse *response) {
        if (response.statusCode == WBResponseStatusCodeSuccess) {
            // 登入成功,UI 更新或跳轉
            NSLog(@"授權成功");
        } else {
            NSLog(@"授權失敗: %@", response.errorMessage);
        }
    }];
}

// 登出功能
- (IBAction)logoutBtnClicked:(id)sender {
    // 清除本地 Token
    [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"SinaWeiboAuthData"];
    [[NSUserDefaults standardUserDefaults] synchronize];
    
    // SDK 登出 (可選)
    [self.sinaWeibo authorize:[WBAuthorizeRequest requestForAuthorize] withCompletionHandler:nil]; 
    // 注意:SDK 可能無直接 logout 方法,通常僅清本地 Token 並重置 sinaWeibo 實例屬性即可視為登出
    self.sinaWeibo.accessToken = nil;
    self.sinaWeibo.userId = nil;
    self.sinaWeibo.expirationDate = nil;
    NSLog(@"已登出");
}

常見坑點提醒

  • Bundle ID 必須一致: 專案的 Bundle Identifier 需與微博開放平台後台設定的完全一致。
  • 白名單機制: 新建應用預設僅開發者帳號可測試,需提交審核通過後所有用戶才可使用。
  • ATS 設定: 若回調頁非 HTTPS,需在 Info.plist 設定 NSAppTransportSecurity 允許 HTTP。
  • SDK 版本差異: 新版 SDK (3.0+) 類名可能為 WBHttpRequest, WBAuthorizeRequest 等,請參考官方 Demo 調整 API 呼叫方式。

總結

不依賴第三方封裝庫,直接整合官方 SDK 是最穩健、可控性最高的方案。核心在於 AppDelegate 統一管理 SinaWeibo 單例生命週期與 Token 持久化,配合 URL Schemes 處理回調,即可實現完整的授權登入流程。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved