首先說一下我這個的實現思路,登入支援多個帳號,也就是說可以儲存多個微博帳號登入的時候選擇其中一個登入。多個帳號資訊儲存在sqlite的資料庫中,每一個帳號資訊就是一條記錄, 當使用者啟動微部落格戶端的時候去取儲存在sqlite資料庫中的帳號記錄資訊,然後把這些在介面中以列表的形式展示出來,使用者可以點擊其中的一個帳號進入微博,如果如果啟動微部落格戶端的時候檢查到sqlite資料庫中一個帳號都沒有的時候,程式自動顯示使用者授權認證頁面,本用戶端是基於oauth認證實現的,所以使用新微博帳號前需要進行授權認證,一個帳號只需要第一次做一下授權認證然後會把user_id、Access Token和Access Secret以及使用者名稱稱和頭像小表徵圖一起儲存到sqlite的資料庫中,下次登入的時候可以不在需要輸入帳號和密碼,直接在介面中點擊已經選擇的使用者小表徵圖進入微博。關於Access Token和Access Secret這個我就不解釋了,不懂的可以google一下oauth的知識,其實我前面做android版本的微部落格戶端的時候寫過一篇比較詳細的介紹過關於oauth的隨筆可以翻出來參考一下。
從上面的思路來看使用者登入有兩種可能性,第一種資料庫中尚無任何帳號資訊;第二種資料庫中已經包含了一個或以上的帳號資訊。這兩種情況顯示不同的使用者介面,兩種情況的實現過程看下面的描述。
第一種情況實現過程:1.查詢sqlite資料庫 -->2.無帳號記錄顯示需要進行授權認證的提示資訊介面(6) -->3.在上一步介面中點擊開始按鈕進入使用者授權介面-->4.使用者輸入自己的微博帳號和密碼點擊確定然後關閉使用者授權介面(7)-->5.程式根據使用者的授權擷取這個帳號的資訊儲存到sqlite庫-->6.顯示使用者登入選擇介面預設帳號就是使用者剛剛授權的帳號
第二種情況實現過程:1.查詢sqlite資料庫 -->2.已有帳號記錄擷取所有帳號資訊並且顯示使用者登入選擇介面 -->3.讀取上一次登入的帳號作為介面的預設選擇使用者顯示(如2)-->4.點擊添加按鈕顯示帳號添加介面(如4)-->5.點擊切換按鈕顯示帳號挑選清單介面(如3)-->6.點擊刪除按鈕顯示帳號刪除確認介面(如5)
從上面的實現過程看涉及到的主要知識點:1.sqlite資料庫操作(建立資料庫、建立資料表、插入資料記錄、讀取資料記錄);2、oauth授權認證(已經由sdk實現了調用相關方法即可);3、NSUserDefaults存取(用來記錄上一次的登入帳號)
現在正式開始動手做一一些準備工作:
一、到 http://code.google.com/p/minblog4sina/(關於這個可以參看:iphone開發我的新浪微部落格戶端-開篇)把我的這個sdk項目原始碼checkout到本地,然後用xcode開啟這個工程,在這個sdk工程的基礎上開發微部落格戶端應用。
二、設計sqlite資料庫用來儲存使用者帳號資訊,我是用firefox的一個名為SQLite Manager的外掛程式來建立sqlite資料庫,這個使用非常簡單就不介紹了自己裝起來就知道怎麼使用,我用它建立了一個名為weibo.sqlite的資料庫,然後這這個資料庫中建立了一個名為loginUser的表用來儲存帳號資訊,loginUser表的,這個表包含5個欄位分別用來儲存user_id、帳號暱稱、Access Token、Access Secret、帳號小表徵圖,具體如:
三、用xcode開啟工程,然後把上一步完成的weibo.sqlite檔案添加到工程的Resources檔案夾中.
四、在工程中添加類型為Objective-C class名為Sqlite的類用來負責sqlite庫的建立、記錄的讀取、記錄的添加等操作,同時在Xcode的左邊樹Frameworks右鍵添加名為libsqlite3.dylib的Framework,這個類庫封裝了sqlite庫的操作。
五、開啟Sqlite.h添加如下代碼,在這個檔案中首先import了sqlite3.h,這個就是Frameworks中的libsqlite3.dylib類庫,然後又import了User.h,這個是MinBlog4Sina的sdk中的使用者帳號對象類。又聲明的4個方法分別是資料庫初始化、擷取使用者記錄列表、添加使用者記錄、刪除使用者記錄。
#import <Foundation/Foundation.h>
#import <sqlite3.h>
#import "User.h"
@interface Sqlite : NSObject {
sqlite3 *database;
}
-(Sqlite *)init;
-(NSMutableArray *)getUserList;
-(BOOL)addUser:(User *)user;
-(BOOL)delUser:(NSString *)name;
@end
六、開啟Sqlite.m添加如下代碼,這個檔案裡實現了上述的幾個方法,所謂的資料庫建立其實就是把上面第三個步驟中添加到工程的weibo.sqlite檔案拷貝到本軟體的目錄中,在下面的-(Sqlite *)init方法中進行了拷貝操作。還有就是使用者記錄讀取和添加中關於BLOB類型的資料處理,這裡儲存的是圖片資料了,在添加的時候把圖片轉換成bytes類型,讀取的時候把bytes類型轉換成圖片。
#import "Sqlite.h"
@interface Sqlite(private)
-(void)createDatabaseIfNeeded:(NSString *)filename;-(NSString *)dataFilePath;
-(BOOL)openDatabase;
-(void)closeDatabase;
@end
@implementation Sqlite
//初始化資料庫
-(Sqlite *)init{ if (self= [super init])
{
[self createDatabaseIfNeeded:@"weibo.sqlite"];
}
return self;
}
-(BOOL)delUser:(NSString *)name{ BOOL sucess=[self openDatabase];
if (sucess)
{
NSString *sql=[[NSString alloc] initWithFormat:@"delete from loginUser where screen_name=%@",name];
char *errorMsg;
if (sqlite3_exec(database, [sql UTF8String], NULL, NULL, &errorMsg)!=SQLITE_OK)
{
NSLog(@"del User error:%s",errorMsg);
sqlite3_free(errorMsg);
}
else {
}
[sql release];
}
[self closeDatabase];
return sucess;
}
//添加使用者記錄-(BOOL)addUser:(User *)user
{
BOOL sucess=[self openDatabase];
if (sucess)
{
NSString *sql=[[NSString alloc] initWithFormat:@"insert into loginUser(user_id,screen_name,key,secret,icon)values(?,?,?,?,?)"];
sqlite3_stmt *statement;
if (sqlite3_prepare_v2(database, [sql UTF8String], -1, &statement, nil)==SQLITE_OK) {
NSString *uid=[NSString stringWithFor