这个我选择的是开了通道调用原生,开通道的方法网上搜一下就有这个我就不详叙述了,主要说一下点击按钮之后调用oc代码以及获取成功之后返回fluter用户信息的过程。
oc端:
- (void)hehe:(CompletionBlock)completion{
if(@available(iOS13.0,*)){
_completion= completion;
ASAuthorizationAppleIDProvider *appleIDProvider = [[ASAuthorizationAppleIDProvider alloc] init];
ASAuthorizationAppleIDRequest*appleIDRequest = appleIDProvider.createRequest;
appleIDRequest.requestedScopes = @[ASAuthorizationScopeEmail,ASAuthorizationScopeFullName];
ASAuthorizationController*appleIDController = [[ASAuthorizationControlleralloc]initWithAuthorizationRequests:@[appleIDRequest]];
appleIDController.delegate=self;
appleIDController.presentationContextProvider=self;
[appleIDController performRequests];
}else{
//请尽快升级版本
}
}
这里是两个注意点,一个是需要创建一个block回调保证自己在获取到了用户信息的时候能够通过flutter开启的通道把用户信息返回到flutter代码中,一个是需要我们在进行代理签订之后一定要走代理方法进行代理方法获取用户信息。下面给出代理方法的实现:
- (void)authorizationController:(ASAuthorizationController *)controller didCompleteWithAuthorization:(ASAuthorization *)authorization API_AVAILABLE(ios(13.0)){
if(@available(iOS13.0,*)){
if([authorization.credentialisKindOfClass:[ASAuthorizationAppleIDCredentialclass]]) {
ASAuthorizationAppleIDCredential*credential = authorization.credential;
NSString*user = credential.user;
NSData*identityToken = credential.identityToken;
NSLog(@"用户名称:%@ ---- 用户token:%@ 用户email:%@ ---用户密码:%@",user,identityToken,credential.email,credential.fullName);
self.appleLoginDic=@{@"appleId":user};
_completion(@{@"appleId":user});
}elseif([authorization.credentialisKindOfClass:[ASPasswordCredentialclass]]){
ASPasswordCredential*psdCredential = authorization.credential;
NSString*user = psdCredential.user;
NSString*password = psdCredential.password;
NSLog(@"用户名称:%@ ---- 用户token:%@",user,password);
}
}else{ }
}
这里执行的时候分为两种类型 一个是用户通过appleID进行验证的方式,第二个是通过用户名和密码进行验证的方式(这个没细究,个人猜测有可能是类似于Mac开机登陆的时候那种用户名密码的形式),一般手机上我们选择第一个就可以。但是要记住我们通过Apple ID进行验证时只有第一次可以获取到用户的信息,后续再次登陆的时候我们只能获取到用户的user属性,这个是一个类似于unionID的东西,具有唯一性的,拿他来绑定用户就可以。