iOS开发之Accounts框架详解

iOS开发之Accounts框架详解

    Accounts框架是iOS原生提供的一套帐户管理框架,其支持Facebook,新浪微博,腾讯微博,Twitter和领英帐户管理的功能。须要注意,在iOS 11及以上系统中,将此功能已经删除,所以Accounts.framework实际上已经没有太大的意义,其只在iOS 11以前的系统上可用。数据库

1、Accounts框架概览

从上图能够看出,Accounts框架中最重要的3个类是ACAccountCredential类、ACAccount类和ACAccountStore类。后面咱们着重介绍这3个类。安全

      首先先来看ACAccountType类,这个类用来定义帐户类型,以下:app

@interface ACAccountType : NSObject
//类型描述
@property (readonly, nonatomic) NSString *accountTypeDescription;
//标识符
@property (readonly, nonatomic) NSString *identifier;
//此类帐户是否已经受权
@property (readonly, nonatomic) BOOL     accessGranted;
@end

须要注意,这个类中的属性都是只读的,这也就是说,开发者不可以直接使用这个类进行对象的构建,须要借助ACAccountStore类来建立ACAccountType实例,后面会介绍。框架

      ACErrorCode定义了错误码的意义,以下:async

typedef enum ACErrorCode {
    ACErrorUnknown = 1,//未知错误
    ACErrorAccountMissingRequiredProperty,  // 缺乏必选属性错误
    ACErrorAccountAuthenticationFailed,     // 受权失败
    ACErrorAccountTypeInvalid,              // 受权无效
    ACErrorAccountAlreadyExists,            // 帐户已经存在
    ACErrorAccountNotFound,                 // 帐户未找到
    ACErrorPermissionDenied,                // 没有权限
    ACErrorAccessInfoInvalid,               // 信息失效
    ACErrorClientPermissionDenied,          // 客户端没有权限
    ACErrorAccessDeniedByProtectionPolicy,  // 没法取得证书
    ACErrorCredentialNotFound,              // 证书未找到
    ACErrorFetchCredentialFailed,           // 请求证书失败
    ACErrorStoreCredentialFailed,           // 存储证书失败
    ACErrorRemoveCredentialFailed,          // 删除证书失败
    ACErrorUpdatingNonexistentAccount,      // 更新失败
    ACErrorInvalidClientBundleID,           // 无效的BundleID
    ACErrorDeniedByPlugin,                  // 权限被阻止
    ACErrorCoreDataSaveFailed,              // 数据库存储失败
    ACErrorFailedSerializingAccountInfo,    //序列化数据失败
    ACErrorInvalidCommand,                  //无效的命令
    ACErrorMissingTransportMessageID,       //缺乏安全信息
    ACErrorCredentialItemNotFound,          // 证书缺乏字段
    ACErrorCredentialItemNotExpired,        // 证书字段失效
} ACErrorCode;

2、进行帐户操做

    在iOS 11如下的系统中,在设置中能够找到帐户管理选项,以下图:ide

点击相应的社交平台,经过帐号密码能够进行登陆。这里一旦设置登陆,那么在第三方应用程序中即可以经过Accounts框架来获取受权信息。ui

    首先,要使用Accounts框架,须要导入相应头文件,以下:atom

#import <Accounts/Accounts.h>

但应用程序首次使用用户社交平台的帐户时,须要获取用户的受权,示例代码以下:spa

//建立操做对象
ACAccountStore *accountStore = [[ACAccountStore alloc] init];
//经过操做对象 构建社交平台类型示例  这里采用的新浪微博
ACAccountType *accountType = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierSinaWeibo];
//进行用户受权请求
[accountStore requestAccessToAccountsWithType: accountType options:nil completion:^(BOOL granted, NSError *error) {
   if (error) {
        NSLog(@"error = %@", [error localizedDescription]);
   }      
   dispatch_async(dispatch_get_main_queue(), ^{
      if(granted){
         NSLog(@"受权经过了");
    });
}];

获取用户受权界面以下图所示:code

一旦用户受权经过,可使用以下方法获取到用户的社交平台帐户信息:

ACAccountStore *accountStore = [[ACAccountStore alloc] init];
ACAccountType *accountType = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierSinaWeibo];
NSArray *twitterAccounts = [accountStore accountsWithAccountType:accountType];

Accounts框架支持的社交平台类型ID以下:

NSString * const ACAccountTypeIdentifierTwitter;//Twitter
NSString * const ACAccountTypeIdentifierFacebook;//Facebook
NSString * const ACAccountTypeIdentifierSinaWeibo;//新浪微博
NSString * const ACAccountTypeIdentifierTencentWeibo;//腾讯微博
NSString * const ACAccountTypeIdentifierLinkedIn;//领英

在调用requestAccessToAccountsWithType方法时,能够传入一个字典参数,某些社交平台的受权须要配置一些额外参数,例如:

//facebook相关
NSString * const ACFacebookAppIdKey;//设置appid
NSString * const ACFacebookPermissionsKey;//设置权限key
NSString * const ACFacebookAudienceKey; //权限key
NSString * const ACFacebookAudienceEveryone;//公开权限
NSString * const ACFacebookAudienceFriends;//好友权限
NSString * const ACFacebookAudienceOnlyMe;//私人权限
//领英相关
NSString * const ACLinkedInAppIdKey;//领英appid
NSString * const ACLinkedInPermissionsKey; //设置权限key
//腾讯微博
NSString *const ACTencentWeiboAppIdKey; //设置appid

3、用户信息相关类解析

ACAccount类解析以下:

@interface ACAccount : NSObject
- (instancetype)initWithAccountType:(ACAccountType *)type;//构造方法
@property (readonly, weak, NS_NONATOMIC_IOSONLY) NSString      *identifier;//标识符
@property (strong, NS_NONATOMIC_IOSONLY)   ACAccountType       *accountType;//帐户类型
@property (copy, NS_NONATOMIC_IOSONLY)     NSString            *accountDescription;//帐户描述
@property (copy, NS_NONATOMIC_IOSONLY)     NSString            *username;//用户名
@property (readonly, NS_NONATOMIC_IOSONLY)  NSString           *userFullName;//完整名称
@property (strong, NS_NONATOMIC_IOSONLY)   ACAccountCredential *credential;//受权凭证
@end

ACAccountCredential类解析以下:

@interface ACAccountCredential : NSObject
//构造方法
- (instancetype)initWithOAuthToken:(NSString *)token tokenSecret:(NSString *)secret;
- (instancetype)initWithOAuth2Token:(NSString *)token 
                       refreshToken:(NSString *)refreshToken
                         expiryDate:(NSDate *)expiryDate;
//token
@property (copy, nonatomic) NSString *oauthToken;
@end

4、ACAccountStore类解析

@interface ACAccountStore : NSObject
//全部帐户列表
@property (readonly, weak, NS_NONATOMIC_IOSONLY) NSArray *accounts;
//根据id获取帐户
- (ACAccount *)accountWithIdentifier:(NSString *)identifier;
//根据id获取帐户类型对象
- (ACAccountType *)accountTypeWithAccountTypeIdentifier:(NSString *)typeIdentifier;
//获取指定类型的全部帐户
- (NSArray *)accountsWithAccountType:(ACAccountType *)accountType;
//进行帐户存储
- (void)saveAccount:(ACAccount *)account withCompletionHandler:(ACAccountStoreSaveCompletionHandler)completionHandler;
//进行帐户使用权限申请
- (void)requestAccessToAccountsWithType:(ACAccountType *)accountType
                  withCompletionHandler:(ACAccountStoreRequestAccessCompletionHandler)handler NS_DEPRECATED(NA, NA, 5_0, 6_0);
- (void)requestAccessToAccountsWithType:(ACAccountType *)accountType
                                options:(NSDictionary *)options
                             completion:(ACAccountStoreRequestAccessCompletionHandler)completion;
//若是帐户权限已通过期 调用此方法进行刷新
- (void)renewCredentialsForAccount:(ACAccount *)account completion:(ACAccountStoreCredentialRenewalHandler)completionHandler;
//删除帐户
- (void)removeAccount:(ACAccount *)account withCompletionHandler:(ACAccountStoreRemoveCompletionHandler)completionHandler;
@end

千里之遥始于足下,冰冻三尺非一日之寒

——共勉

相关文章
相关标签/搜索