Accounts框架是iOS原生提供的一套帐户管理框架,其支持Facebook,新浪微博,腾讯微博,Twitter和领英帐户管理的功能。须要注意,在iOS 11及以上系统中,将此功能已经删除,所以Accounts.framework实际上已经没有太大的意义,其只在iOS 11以前的系统上可用。数据库
从上图能够看出,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;
在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
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
@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
千里之遥始于足下,冰冻三尺非一日之寒
——共勉