完善sign with apple
This commit is contained in:
parent
9e4ddec771
commit
3e92c2f31e
27
Classes_cocos/AppleSignIn.h
Normal file
27
Classes_cocos/AppleSignIn.h
Normal file
@ -0,0 +1,27 @@
|
||||
//
|
||||
// AppleSignIn.h
|
||||
// Unity-iPhone
|
||||
//
|
||||
// Created by zhl on 2022/11/28.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <AuthenticationServices/AuthenticationServices.h>
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
typedef void (^AppleSignInCompletion)(NSString *_Nullable idToken, NSError *_Nullable error);
|
||||
|
||||
@interface AppleSignIn : NSObject<ASAuthorizationControllerDelegate>
|
||||
|
||||
@property(nonatomic, nullable) AppleSignInCompletion completion;
|
||||
@property(nonatomic, nullable) NSString *funid;
|
||||
|
||||
|
||||
+ (instancetype)sharedInstance;
|
||||
|
||||
- (void)signIn:(NSString *)funid presentingViewController:(UIViewController *)presentingViewController completion:(nullable AppleSignInCompletion)completion;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
131
Classes_cocos/AppleSignIn.m
Normal file
131
Classes_cocos/AppleSignIn.m
Normal file
@ -0,0 +1,131 @@
|
||||
//
|
||||
// AppleSignIn.m
|
||||
// Unity-iPhone
|
||||
//
|
||||
// Created by zhl on 2022/11/28.
|
||||
//
|
||||
|
||||
#import "AppleSignIn.h"
|
||||
|
||||
|
||||
static id _instance;
|
||||
|
||||
|
||||
@implementation AppleSignIn
|
||||
|
||||
+ (instancetype)sharedInstance{
|
||||
static dispatch_once_t onceToken;
|
||||
dispatch_once(&onceToken, ^{
|
||||
_instance = [[self alloc] init];
|
||||
});
|
||||
return _instance;
|
||||
}
|
||||
|
||||
+ (instancetype)allocWithZone:(struct _NSZone *)zone {
|
||||
static dispatch_once_t onceToken;
|
||||
dispatch_once(&onceToken, ^{
|
||||
_instance = [super allocWithZone:zone];
|
||||
});
|
||||
return _instance;
|
||||
}
|
||||
|
||||
- (id)copyWithZone:(nullable NSZone *)zone {
|
||||
return _instance;
|
||||
}
|
||||
|
||||
- (void)signIn:(NSString *)funid presentingViewController:(UIViewController *)presentingViewController completion:(nullable AppleSignInCompletion)completion API_AVAILABLE(ios(13.0)){
|
||||
self.completion = completion;
|
||||
self.funid = funid;
|
||||
ASAuthorizationAppleIDProvider *appleIdProvider = [[ASAuthorizationAppleIDProvider alloc] init];
|
||||
ASAuthorizationAppleIDRequest *request = appleIdProvider.createRequest;
|
||||
request.requestedScopes = @[ASAuthorizationScopeEmail, ASAuthorizationScopeFullName];
|
||||
ASAuthorizationController *controller = [[ASAuthorizationController alloc] initWithAuthorizationRequests:@[request]];
|
||||
controller.delegate = self;
|
||||
[controller performRequests];
|
||||
}
|
||||
|
||||
#pragma mark -- ASAuthorizationControllerDelegate
|
||||
- (void)authorizationController:(ASAuthorizationController *)controller didCompleteWithAuthorization:(ASAuthorization *)authorization API_AVAILABLE(ios(13.0)) {
|
||||
if ([authorization.credential isKindOfClass:[ASAuthorizationAppleIDCredential class]]) {
|
||||
ASAuthorizationAppleIDCredential *credential = authorization.credential;
|
||||
NSString *idToken = [[NSString alloc] initWithData:credential.identityToken encoding:NSUTF8StringEncoding];
|
||||
NSLog(@"identityToken: %@",idToken);
|
||||
if (self.completion) {
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
self.completion(idToken, nil);
|
||||
});
|
||||
}
|
||||
// NSString *user = credential.user;
|
||||
// NSString *authStr = [[NSString alloc] initWithData:credential.authorizationCode encoding:NSUTF8StringEncoding];
|
||||
// NSLog(@"fullName: %@",credential.fullName);
|
||||
// NSLog(@"user: %@",user);
|
||||
|
||||
// [self nativeCb:funid hasErr:NO dataStr:idToken];
|
||||
}
|
||||
// else if ([authorization.credential isKindOfClass:[ASPasswordCredential class]]) {
|
||||
// // 用户登录使用现有的密码凭证
|
||||
// ASPasswordCredential *psdCredential = authorization.credential;
|
||||
// // 密码凭证对象的用户标识 用户的唯一标识
|
||||
// NSString *user = psdCredential.user;
|
||||
// NSString *psd = psdCredential.password;
|
||||
// NSLog(@"psduser - %@ %@",psd,user);
|
||||
// }
|
||||
else {
|
||||
NSError *err = [NSError errorWithDomain:@"apple_sign"
|
||||
code:100
|
||||
userInfo:@{
|
||||
NSLocalizedDescriptionKey:@"authorization info mismath"
|
||||
}];
|
||||
[self throwError:err];
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
- (void) throwError:(NSError *) err {
|
||||
if (self.completion) {
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
self.completion(nil, err);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
#pragma mark -- ASAuthorizationControllerDelegate
|
||||
- (void)authorizationController:(ASAuthorizationController *)controller didCompleteWithError:(NSError *)error API_AVAILABLE(ios(13.0)){
|
||||
NSLog(@"错误信息:%@", error);
|
||||
[self throwError:error];
|
||||
// NSString *errorMsg;
|
||||
// switch (error.code) {
|
||||
// case ASAuthorizationErrorCanceled:
|
||||
// errorMsg = @"用户取消了授权请求";
|
||||
// NSLog(@"errorMsg - %@",errorMsg);
|
||||
// break;
|
||||
//
|
||||
// case ASAuthorizationErrorFailed:
|
||||
// errorMsg = @"授权请求失败";
|
||||
// NSLog(@"errorMsg - %@",errorMsg);
|
||||
// break;
|
||||
//
|
||||
// case ASAuthorizationErrorInvalidResponse:
|
||||
// errorMsg = @"授权请求响应无效";
|
||||
// NSLog(@"errorMsg - %@",errorMsg);
|
||||
// break;
|
||||
//
|
||||
// case ASAuthorizationErrorNotHandled:
|
||||
// errorMsg = @"未能处理授权请求";
|
||||
// NSLog(@"errorMsg - %@",errorMsg);
|
||||
// break;
|
||||
//
|
||||
// case ASAuthorizationErrorUnknown:
|
||||
// errorMsg = @"授权请求失败未知原因";
|
||||
// NSLog(@"errorMsg - %@",errorMsg);
|
||||
// break;
|
||||
//
|
||||
// default:
|
||||
// break;
|
||||
// }
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@end
|
@ -340,6 +340,23 @@ bool jsb_signWithGoogle(se::State& s) {
|
||||
}
|
||||
SE_BIND_FUNC(jsb_signWithGoogle)
|
||||
|
||||
bool jsb_signWithApple(se::State& s) {
|
||||
const auto& args = s.args();
|
||||
size_t argc = args.size();
|
||||
if (argc >= 1) {
|
||||
bool ok;
|
||||
std::string funid;
|
||||
ok = seval_to_std_string(args[0], &funid);
|
||||
SE_PRECONDITION2(ok, false, "Error processing arguments");
|
||||
NSString *nfunid = [NSString stringWithCString:funid.c_str() encoding:NSUTF8StringEncoding];
|
||||
UIWindow* window = [[[UIApplication sharedApplication] delegate] window];
|
||||
[window.rootViewController signWithApple:nfunid];
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
SE_BIND_FUNC(jsb_signWithApple)
|
||||
|
||||
bool jsb_signOutGoogle(se::State& s) {
|
||||
const auto& args = s.args();
|
||||
size_t argc = args.size();
|
||||
@ -364,6 +381,7 @@ bool jsb_register_walletevent_modules(se::Object* global) {
|
||||
__jsbObj->defineFunction("scanQRCode", _SE(jsb_scanQRCode));
|
||||
__jsbObj->defineFunction("restoreKey", _SE(JSB_restoreKey));
|
||||
__jsbObj->defineFunction("signWithGoogle", _SE(jsb_signWithGoogle));
|
||||
__jsbObj->defineFunction("signWithApple", _SE(jsb_signWithApple));
|
||||
__jsbObj->defineFunction("signOutGoogle", _SE(jsb_signOutGoogle));
|
||||
return true;
|
||||
}
|
||||
|
45
Classes_cocos/NSData+Base64.h
Normal file
45
Classes_cocos/NSData+Base64.h
Normal file
@ -0,0 +1,45 @@
|
||||
//
|
||||
// NSData+Base64.h
|
||||
// base64
|
||||
//
|
||||
// Created by Matt Gallagher on 2009/06/03.
|
||||
// Copyright 2009 Matt Gallagher. All rights reserved.
|
||||
//
|
||||
// This software is provided 'as-is', without any express or implied
|
||||
// warranty. In no event will the authors be held liable for any damages
|
||||
// arising from the use of this software. Permission is granted to anyone to
|
||||
// use this software for any purpose, including commercial applications, and to
|
||||
// alter it and redistribute it freely, subject to the following restrictions:
|
||||
//
|
||||
// 1. The origin of this software must not be misrepresented; you must not
|
||||
// claim that you wrote the original software. If you use this software
|
||||
// in a product, an acknowledgment in the product documentation would be
|
||||
// appreciated but is not required.
|
||||
// 2. Altered source versions must be plainly marked as such, and must not be
|
||||
// misrepresented as being the original software.
|
||||
// 3. This notice may not be removed or altered from any source
|
||||
// distribution.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
void *NewBase64Decode(
|
||||
const char *inputBuffer,
|
||||
size_t length,
|
||||
size_t *outputLength);
|
||||
|
||||
char *NewBase64Encode(
|
||||
const void *inputBuffer,
|
||||
size_t length,
|
||||
bool separateLines,
|
||||
size_t *outputLength);
|
||||
|
||||
@interface NSData (Base64)
|
||||
|
||||
+ (NSData *)dataFromBase64String:(NSString *)aString;
|
||||
- (NSString *)base64EncodedString;
|
||||
|
||||
// added by Hiroshi Hashiguchi
|
||||
- (NSString *)base64EncodedStringWithSeparateLines:(BOOL)separateLines;
|
||||
|
||||
@end
|
329
Classes_cocos/NSData+Base64.m
Normal file
329
Classes_cocos/NSData+Base64.m
Normal file
@ -0,0 +1,329 @@
|
||||
//
|
||||
// NSData+Base64.m
|
||||
// base64
|
||||
//
|
||||
// Created by Matt Gallagher on 2009/06/03.
|
||||
// Copyright 2009 Matt Gallagher. All rights reserved.
|
||||
//
|
||||
// This software is provided 'as-is', without any express or implied
|
||||
// warranty. In no event will the authors be held liable for any damages
|
||||
// arising from the use of this software. Permission is granted to anyone to
|
||||
// use this software for any purpose, including commercial applications, and to
|
||||
// alter it and redistribute it freely, subject to the following restrictions:
|
||||
//
|
||||
// 1. The origin of this software must not be misrepresented; you must not
|
||||
// claim that you wrote the original software. If you use this software
|
||||
// in a product, an acknowledgment in the product documentation would be
|
||||
// appreciated but is not required.
|
||||
// 2. Altered source versions must be plainly marked as such, and must not be
|
||||
// misrepresented as being the original software.
|
||||
// 3. This notice may not be removed or altered from any source
|
||||
// distribution.
|
||||
//
|
||||
|
||||
#import "NSData+Base64.h"
|
||||
|
||||
//
|
||||
// Mapping from 6 bit pattern to ASCII character.
|
||||
//
|
||||
static unsigned char base64EncodeLookup[65] =
|
||||
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
||||
|
||||
//
|
||||
// Definition for "masked-out" areas of the base64DecodeLookup mapping
|
||||
//
|
||||
#define xx 65
|
||||
|
||||
//
|
||||
// Mapping from ASCII character to 6 bit pattern.
|
||||
//
|
||||
static unsigned char base64DecodeLookup[256] =
|
||||
{
|
||||
xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx,
|
||||
xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx,
|
||||
xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, 62, xx, xx, xx, 63,
|
||||
52, 53, 54, 55, 56, 57, 58, 59, 60, 61, xx, xx, xx, xx, xx, xx,
|
||||
xx, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
|
||||
15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, xx, xx, xx, xx, xx,
|
||||
xx, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
|
||||
41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, xx, xx, xx, xx, xx,
|
||||
xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx,
|
||||
xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx,
|
||||
xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx,
|
||||
xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx,
|
||||
xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx,
|
||||
xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx,
|
||||
xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx,
|
||||
xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx,
|
||||
};
|
||||
|
||||
//
|
||||
// Fundamental sizes of the binary and base64 encode/decode units in bytes
|
||||
//
|
||||
#define BINARY_UNIT_SIZE 3
|
||||
#define BASE64_UNIT_SIZE 4
|
||||
|
||||
//
|
||||
// NewBase64Decode
|
||||
//
|
||||
// Decodes the base64 ASCII string in the inputBuffer to a newly malloced
|
||||
// output buffer.
|
||||
//
|
||||
// inputBuffer - the source ASCII string for the decode
|
||||
// length - the length of the string or -1 (to specify strlen should be used)
|
||||
// outputLength - if not-NULL, on output will contain the decoded length
|
||||
//
|
||||
// returns the decoded buffer. Must be free'd by caller. Length is given by
|
||||
// outputLength.
|
||||
//
|
||||
void *NewBase64Decode(
|
||||
const char *inputBuffer,
|
||||
size_t length,
|
||||
size_t *outputLength)
|
||||
{
|
||||
if (length == -1)
|
||||
{
|
||||
length = strlen(inputBuffer);
|
||||
}
|
||||
|
||||
size_t outputBufferSize =
|
||||
((length+BASE64_UNIT_SIZE-1) / BASE64_UNIT_SIZE) * BINARY_UNIT_SIZE;
|
||||
unsigned char *outputBuffer = (unsigned char *)malloc(outputBufferSize);
|
||||
|
||||
size_t i = 0;
|
||||
size_t j = 0;
|
||||
while (i < length)
|
||||
{
|
||||
//
|
||||
// Accumulate 4 valid characters (ignore everything else)
|
||||
//
|
||||
unsigned char accumulated[BASE64_UNIT_SIZE];
|
||||
size_t accumulateIndex = 0;
|
||||
while (i < length)
|
||||
{
|
||||
unsigned char decode = base64DecodeLookup[inputBuffer[i++]];
|
||||
if (decode != xx)
|
||||
{
|
||||
accumulated[accumulateIndex] = decode;
|
||||
accumulateIndex++;
|
||||
|
||||
if (accumulateIndex == BASE64_UNIT_SIZE)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Store the 6 bits from each of the 4 characters as 3 bytes
|
||||
//
|
||||
// (Uses improved bounds checking suggested by Alexandre Colucci)
|
||||
//
|
||||
if(accumulateIndex >= 2)
|
||||
outputBuffer[j] = (accumulated[0] << 2) | (accumulated[1] >> 4);
|
||||
if(accumulateIndex >= 3)
|
||||
outputBuffer[j + 1] = (accumulated[1] << 4) | (accumulated[2] >> 2);
|
||||
if(accumulateIndex >= 4)
|
||||
outputBuffer[j + 2] = (accumulated[2] << 6) | accumulated[3];
|
||||
j += accumulateIndex - 1;
|
||||
}
|
||||
|
||||
if (outputLength)
|
||||
{
|
||||
*outputLength = j;
|
||||
}
|
||||
return outputBuffer;
|
||||
}
|
||||
|
||||
//
|
||||
// NewBase64Encode
|
||||
//
|
||||
// Encodes the arbitrary data in the inputBuffer as base64 into a newly malloced
|
||||
// output buffer.
|
||||
//
|
||||
// inputBuffer - the source data for the encode
|
||||
// length - the length of the input in bytes
|
||||
// separateLines - if zero, no CR/LF characters will be added. Otherwise
|
||||
// a CR/LF pair will be added every 64 encoded chars.
|
||||
// outputLength - if not-NULL, on output will contain the encoded length
|
||||
// (not including terminating 0 char)
|
||||
//
|
||||
// returns the encoded buffer. Must be free'd by caller. Length is given by
|
||||
// outputLength.
|
||||
//
|
||||
char *NewBase64Encode(
|
||||
const void *buffer,
|
||||
size_t length,
|
||||
bool separateLines,
|
||||
size_t *outputLength)
|
||||
{
|
||||
const unsigned char *inputBuffer = (const unsigned char *)buffer;
|
||||
|
||||
#define MAX_NUM_PADDING_CHARS 2
|
||||
#define OUTPUT_LINE_LENGTH 64
|
||||
#define INPUT_LINE_LENGTH ((OUTPUT_LINE_LENGTH / BASE64_UNIT_SIZE) * BINARY_UNIT_SIZE)
|
||||
#define CR_LF_SIZE 2
|
||||
|
||||
//
|
||||
// Byte accurate calculation of final buffer size
|
||||
//
|
||||
size_t outputBufferSize =
|
||||
((length / BINARY_UNIT_SIZE)
|
||||
+ ((length % BINARY_UNIT_SIZE) ? 1 : 0))
|
||||
* BASE64_UNIT_SIZE;
|
||||
if (separateLines)
|
||||
{
|
||||
outputBufferSize +=
|
||||
(outputBufferSize / OUTPUT_LINE_LENGTH) * CR_LF_SIZE;
|
||||
}
|
||||
|
||||
//
|
||||
// Include space for a terminating zero
|
||||
//
|
||||
outputBufferSize += 1;
|
||||
|
||||
//
|
||||
// Allocate the output buffer
|
||||
//
|
||||
char *outputBuffer = (char *)malloc(outputBufferSize);
|
||||
if (!outputBuffer)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
size_t i = 0;
|
||||
size_t j = 0;
|
||||
const size_t lineLength = separateLines ? INPUT_LINE_LENGTH : length;
|
||||
size_t lineEnd = lineLength;
|
||||
|
||||
while (true)
|
||||
{
|
||||
if (lineEnd > length)
|
||||
{
|
||||
lineEnd = length;
|
||||
}
|
||||
|
||||
for (; i + BINARY_UNIT_SIZE - 1 < lineEnd; i += BINARY_UNIT_SIZE)
|
||||
{
|
||||
//
|
||||
// Inner loop: turn 48 bytes into 64 base64 characters
|
||||
//
|
||||
outputBuffer[j++] = base64EncodeLookup[(inputBuffer[i] & 0xFC) >> 2];
|
||||
outputBuffer[j++] = base64EncodeLookup[((inputBuffer[i] & 0x03) << 4)
|
||||
| ((inputBuffer[i + 1] & 0xF0) >> 4)];
|
||||
outputBuffer[j++] = base64EncodeLookup[((inputBuffer[i + 1] & 0x0F) << 2)
|
||||
| ((inputBuffer[i + 2] & 0xC0) >> 6)];
|
||||
outputBuffer[j++] = base64EncodeLookup[inputBuffer[i + 2] & 0x3F];
|
||||
}
|
||||
|
||||
if (lineEnd == length)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
//
|
||||
// Add the newline
|
||||
//
|
||||
outputBuffer[j++] = '\r';
|
||||
outputBuffer[j++] = '\n';
|
||||
lineEnd += lineLength;
|
||||
}
|
||||
|
||||
if (i + 1 < length)
|
||||
{
|
||||
//
|
||||
// Handle the single '=' case
|
||||
//
|
||||
outputBuffer[j++] = base64EncodeLookup[(inputBuffer[i] & 0xFC) >> 2];
|
||||
outputBuffer[j++] = base64EncodeLookup[((inputBuffer[i] & 0x03) << 4)
|
||||
| ((inputBuffer[i + 1] & 0xF0) >> 4)];
|
||||
outputBuffer[j++] = base64EncodeLookup[(inputBuffer[i + 1] & 0x0F) << 2];
|
||||
outputBuffer[j++] = '=';
|
||||
}
|
||||
else if (i < length)
|
||||
{
|
||||
//
|
||||
// Handle the double '=' case
|
||||
//
|
||||
outputBuffer[j++] = base64EncodeLookup[(inputBuffer[i] & 0xFC) >> 2];
|
||||
outputBuffer[j++] = base64EncodeLookup[(inputBuffer[i] & 0x03) << 4];
|
||||
outputBuffer[j++] = '=';
|
||||
outputBuffer[j++] = '=';
|
||||
}
|
||||
outputBuffer[j] = 0;
|
||||
|
||||
//
|
||||
// Set the output length and return the buffer
|
||||
//
|
||||
if (outputLength)
|
||||
{
|
||||
*outputLength = j;
|
||||
}
|
||||
return outputBuffer;
|
||||
}
|
||||
|
||||
@implementation NSData (Base64)
|
||||
|
||||
//
|
||||
// dataFromBase64String:
|
||||
//
|
||||
// Creates an NSData object containing the base64 decoded representation of
|
||||
// the base64 string 'aString'
|
||||
//
|
||||
// Parameters:
|
||||
// aString - the base64 string to decode
|
||||
//
|
||||
// returns the autoreleased NSData representation of the base64 string
|
||||
//
|
||||
+ (NSData *)dataFromBase64String:(NSString *)aString
|
||||
{
|
||||
NSData *data = [aString dataUsingEncoding:NSASCIIStringEncoding];
|
||||
size_t outputLength;
|
||||
void *outputBuffer = NewBase64Decode([data bytes], [data length], &outputLength);
|
||||
NSData *result = [NSData dataWithBytes:outputBuffer length:outputLength];
|
||||
free(outputBuffer);
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// base64EncodedString
|
||||
//
|
||||
// Creates an NSString object that contains the base 64 encoding of the
|
||||
// receiver's data. Lines are broken at 64 characters long.
|
||||
//
|
||||
// returns an autoreleased NSString being the base 64 representation of the
|
||||
// receiver.
|
||||
//
|
||||
- (NSString *)base64EncodedString
|
||||
{
|
||||
size_t outputLength;
|
||||
char *outputBuffer =
|
||||
NewBase64Encode([self bytes], [self length], true, &outputLength);
|
||||
|
||||
NSString *result =
|
||||
[[NSString alloc]
|
||||
initWithBytes:outputBuffer
|
||||
length:outputLength
|
||||
encoding:NSASCIIStringEncoding];
|
||||
free(outputBuffer);
|
||||
return result;
|
||||
}
|
||||
|
||||
// added by Hiroshi Hashiguchi
|
||||
- (NSString *)base64EncodedStringWithSeparateLines:(BOOL)separateLines
|
||||
{
|
||||
size_t outputLength;
|
||||
char *outputBuffer =
|
||||
NewBase64Encode([self bytes], [self length], separateLines, &outputLength);
|
||||
|
||||
NSString *result =
|
||||
[[NSString alloc]
|
||||
initWithBytes:outputBuffer
|
||||
length:outputLength
|
||||
encoding:NSASCIIStringEncoding];
|
||||
free(outputBuffer);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
@end
|
@ -14,6 +14,7 @@
|
||||
|
||||
+(void)toWallet:(NSString *)url;
|
||||
-(void)signWithGoogle:(NSString *)funid;
|
||||
-(void)signWithApple:(NSString *)funid;
|
||||
-(void)signOutGoogle:(NSString *)funid;
|
||||
-(void)saveKey:(NSString *) account key:(NSString *) key;
|
||||
-(NSString *)loadKey:(NSString *) account;
|
||||
|
@ -13,15 +13,14 @@
|
||||
#import <GoogleSignIn/GoogleSignIn.h>
|
||||
#include "KeyChain/DataManager.h"
|
||||
#import "NSString+Customer.h"
|
||||
#import <AuthenticationServices/AuthenticationServices.h>
|
||||
#import "NSData+Base64.h"
|
||||
#import "AppleSignIn.h"
|
||||
|
||||
@import GoogleSignIn;
|
||||
|
||||
static NSString * const kClientID =
|
||||
@"53206975661-0d6q9pqljn84n9l63gm0to1ulap9cbk4.apps.googleusercontent.com";
|
||||
|
||||
@interface UIViewController (Wallet)<ASAuthorizationControllerDelegate>
|
||||
@end
|
||||
|
||||
@implementation UIViewController (Wallet)
|
||||
|
||||
@ -48,8 +47,9 @@ static NSString * const kClientID =
|
||||
completion:^(GIDGoogleUser *user, NSError *error) {
|
||||
if (error) {
|
||||
NSLog(@"Status: Authentication error: %@", error);
|
||||
[self nativeCb:funid hasErr:YES dataStr: error.localizedDescription];
|
||||
return;
|
||||
}
|
||||
[self refreshUserInfo];
|
||||
[self refreshTokenID: user funid:funid];
|
||||
}];
|
||||
}
|
||||
@ -57,8 +57,14 @@ static NSString * const kClientID =
|
||||
-(void) refreshTokenID:(GIDGoogleUser *)user funid:(NSString*) funid{
|
||||
[user.authentication doWithFreshTokens:^(GIDAuthentication * _Nullable authentication,
|
||||
NSError * _Nullable error) {
|
||||
if (error) { return; }
|
||||
if (authentication == nil) { return; }
|
||||
if (error) {
|
||||
[self nativeCb:funid hasErr:YES dataStr: error.localizedDescription];
|
||||
return;
|
||||
}
|
||||
if (authentication == nil) {
|
||||
[self nativeCb:funid hasErr:YES dataStr: @"empty authenication"];
|
||||
return;
|
||||
}
|
||||
|
||||
NSString *idToken = authentication.idToken;
|
||||
// Send ID token to backend (example below).
|
||||
@ -85,102 +91,23 @@ static NSString * const kClientID =
|
||||
[GIDSignIn.sharedInstance signOut];
|
||||
}
|
||||
|
||||
- (void)reportAuthStatus {
|
||||
GIDGoogleUser *googleUser = [GIDSignIn.sharedInstance currentUser];
|
||||
if (googleUser.authentication) {
|
||||
NSLog(@"Status: Authenticated");
|
||||
} else {
|
||||
// To authenticate, use Google Sign-In button.
|
||||
NSLog(@"Status: Not authenticated");
|
||||
}
|
||||
|
||||
[self refreshUserInfo];
|
||||
}
|
||||
|
||||
- (void)refreshUserInfo {
|
||||
if (GIDSignIn.sharedInstance.currentUser.authentication == nil) {
|
||||
return;
|
||||
}
|
||||
NSLog(@"email: %@", GIDSignIn.sharedInstance.currentUser.profile.email);
|
||||
NSLog(@"username: %@", GIDSignIn.sharedInstance.currentUser.profile.name);
|
||||
NSLog(@"userid: %@", GIDSignIn.sharedInstance.currentUser.userID);
|
||||
NSLog(@"givenName: %@", GIDSignIn.sharedInstance.currentUser.profile.givenName);
|
||||
NSLog(@"familyName: %@", GIDSignIn.sharedInstance.currentUser.profile.familyName);
|
||||
NSLog(@"hostedDomain: %@", GIDSignIn.sharedInstance.currentUser.hostedDomain);
|
||||
}
|
||||
|
||||
#pragma mark- - Sign In With Apple
|
||||
- (void) signWithApple {
|
||||
- (void) signWithApple:(NSString *)funid{
|
||||
if (@available(iOS 13.0, *)) {
|
||||
ASAuthorizationAppleIDProvider *appleIdProvider = [[ASAuthorizationAppleIDProvider alloc] init];
|
||||
ASAuthorizationAppleIDRequest *request = appleIdProvider.createRequest;
|
||||
request.requestedScopes = @[ASAuthorizationScopeEmail, ASAuthorizationScopeFullName];
|
||||
ASAuthorizationController *controller = [[ASAuthorizationController alloc] initWithAuthorizationRequests:@[request]];
|
||||
controller.delegate = self;
|
||||
[controller performRequests];
|
||||
[[AppleSignIn sharedInstance] signIn:funid presentingViewController:self completion:^(NSString *idToken, NSError *error){
|
||||
if (error != nil) {
|
||||
[self nativeCb:funid hasErr:YES dataStr: error.localizedDescription];
|
||||
} else {
|
||||
NSLog(@"signWithApple: %@", idToken);
|
||||
[self nativeCb:funid hasErr:NO dataStr:idToken];
|
||||
}
|
||||
}];
|
||||
} else {
|
||||
NSLog(@"system is lower");
|
||||
[self nativeCb:funid hasErr:YES dataStr: @"system is lower"];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)authorizationController:(ASAuthorizationController *)controller didCompleteWithAuthorization:(ASAuthorization *)authorization API_AVAILABLE(ios(13.0)) {
|
||||
if ([authorization.credential isKindOfClass:[ASAuthorizationAppleIDCredential class]]) {
|
||||
// 用户登录使用ASAuthorizationAppleIDCredential
|
||||
ASAuthorizationAppleIDCredential *credential = authorization.credential;
|
||||
NSString *user = credential.user;
|
||||
NSData *identityToken = credential.identityToken;
|
||||
NSLog(@"fullName - %@",credential.fullName);
|
||||
//授权成功后,你可以拿到苹果返回的全部数据,根据需要和后台交互。
|
||||
NSLog(@"user - %@ %@",user,identityToken);
|
||||
//保存apple返回的唯一标识符
|
||||
[[NSUserDefaults standardUserDefaults] setObject:user forKey:@"userIdentifier"];
|
||||
[[NSUserDefaults standardUserDefaults] synchronize];
|
||||
} else if ([authorization.credential isKindOfClass:[ASPasswordCredential class]]) {
|
||||
// 用户登录使用现有的密码凭证
|
||||
ASPasswordCredential *psdCredential = authorization.credential;
|
||||
// 密码凭证对象的用户标识 用户的唯一标识
|
||||
NSString *user = psdCredential.user;
|
||||
NSString *psd = psdCredential.password;
|
||||
NSLog(@"psduser - %@ %@",psd,user);
|
||||
} else {
|
||||
NSLog(@"授权信息不符");
|
||||
}
|
||||
}
|
||||
|
||||
#pragma mark - 授权回调失败
|
||||
- (void)authorizationController:(ASAuthorizationController *)controller didCompleteWithError:(NSError *)error API_AVAILABLE(ios(13.0)){
|
||||
NSLog(@"错误信息:%@", error);
|
||||
NSString *errorMsg;
|
||||
switch (error.code) {
|
||||
case ASAuthorizationErrorCanceled:
|
||||
errorMsg = @"用户取消了授权请求";
|
||||
NSLog(@"errorMsg - %@",errorMsg);
|
||||
break;
|
||||
|
||||
case ASAuthorizationErrorFailed:
|
||||
errorMsg = @"授权请求失败";
|
||||
NSLog(@"errorMsg - %@",errorMsg);
|
||||
break;
|
||||
|
||||
case ASAuthorizationErrorInvalidResponse:
|
||||
errorMsg = @"授权请求响应无效";
|
||||
NSLog(@"errorMsg - %@",errorMsg);
|
||||
break;
|
||||
|
||||
case ASAuthorizationErrorNotHandled:
|
||||
errorMsg = @"未能处理授权请求";
|
||||
NSLog(@"errorMsg - %@",errorMsg);
|
||||
break;
|
||||
|
||||
case ASAuthorizationErrorUnknown:
|
||||
errorMsg = @"授权请求失败未知原因";
|
||||
NSLog(@"errorMsg - %@",errorMsg);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
-(void)nativeCb:(NSString *)funid hasErr: (BOOL) hasErr dataStr:(NSString *) dataStr {
|
||||
if ([NSString isStringEmpty:funid]) {
|
||||
|
@ -80,6 +80,8 @@
|
||||
D52A8DA1288E6547006574E8 /* libuv_a.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D52A8D9F288E6547006574E8 /* libuv_a.a */; };
|
||||
D5538BA5287E9908000BDFB6 /* WalletEvent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5538BA3287E9908000BDFB6 /* WalletEvent.cpp */; };
|
||||
D5608AF929348B83007F146A /* NSString+Customer.m in Sources */ = {isa = PBXBuildFile; fileRef = D5608AF829348B83007F146A /* NSString+Customer.m */; };
|
||||
D5608AFD2934A75E007F146A /* NSData+Base64.m in Sources */ = {isa = PBXBuildFile; fileRef = D5608AFC2934A75E007F146A /* NSData+Base64.m */; };
|
||||
D5608B002934C90B007F146A /* AppleSignIn.m in Sources */ = {isa = PBXBuildFile; fileRef = D5608AFF2934C90B007F146A /* AppleSignIn.m */; };
|
||||
D56436422930AAF700E2B633 /* UIView+Toast.m in Sources */ = {isa = PBXBuildFile; fileRef = D56436412930AAF700E2B633 /* UIView+Toast.m */; };
|
||||
D56436462930ABAB00E2B633 /* UIUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = D56436452930ABAB00E2B633 /* UIUtils.m */; };
|
||||
D56436492930BC1300E2B633 /* AuthenticationServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D56436472930BC0900E2B633 /* AuthenticationServices.framework */; };
|
||||
@ -379,6 +381,10 @@
|
||||
D5538BA4287E9908000BDFB6 /* WalletEvent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WalletEvent.h; sourceTree = "<group>"; };
|
||||
D5608AF729348B83007F146A /* NSString+Customer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "NSString+Customer.h"; sourceTree = "<group>"; };
|
||||
D5608AF829348B83007F146A /* NSString+Customer.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "NSString+Customer.m"; sourceTree = "<group>"; };
|
||||
D5608AFB2934A75E007F146A /* NSData+Base64.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "NSData+Base64.h"; sourceTree = "<group>"; };
|
||||
D5608AFC2934A75E007F146A /* NSData+Base64.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "NSData+Base64.m"; sourceTree = "<group>"; };
|
||||
D5608AFE2934C90B007F146A /* AppleSignIn.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppleSignIn.h; sourceTree = "<group>"; };
|
||||
D5608AFF2934C90B007F146A /* AppleSignIn.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppleSignIn.m; sourceTree = "<group>"; };
|
||||
D56436402930AAF700E2B633 /* UIView+Toast.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "UIView+Toast.h"; sourceTree = "<group>"; };
|
||||
D56436412930AAF700E2B633 /* UIView+Toast.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "UIView+Toast.m"; sourceTree = "<group>"; };
|
||||
D56436442930ABAB00E2B633 /* UIUtils.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UIUtils.h; sourceTree = "<group>"; };
|
||||
@ -982,6 +988,10 @@
|
||||
D5D9BAF8293477E700F18A7F /* UIViewController+QR.mm */,
|
||||
D5608AF729348B83007F146A /* NSString+Customer.h */,
|
||||
D5608AF829348B83007F146A /* NSString+Customer.m */,
|
||||
D5608AFE2934C90B007F146A /* AppleSignIn.h */,
|
||||
D5608AFF2934C90B007F146A /* AppleSignIn.m */,
|
||||
D5608AFB2934A75E007F146A /* NSData+Base64.h */,
|
||||
D5608AFC2934A75E007F146A /* NSData+Base64.m */,
|
||||
D5F2D105287C12DD003C2B62 /* JcWallet.h */,
|
||||
D5F2D104287C12DD003C2B62 /* JcWallet.mm */,
|
||||
D5538BA4287E9908000BDFB6 /* WalletEvent.h */,
|
||||
@ -1352,10 +1362,12 @@
|
||||
4E090A341F27885B0077B28D /* StoreReview.m in Sources */,
|
||||
8AC74A9519B47FEF00019D38 /* AVCapture.mm in Sources */,
|
||||
D59AB42F292E250500714392 /* UICKeyChainStore.m in Sources */,
|
||||
D5608AFD2934A75E007F146A /* NSData+Base64.m in Sources */,
|
||||
D5F2CF90287BEC0D003C2B62 /* Il2CppCompilerCalculateTypeValues_6Table.cpp in Sources */,
|
||||
D5F2CFA8287BEC0D003C2B62 /* Il2CppCompilerCalculateTypeValues_13Table.cpp in Sources */,
|
||||
D59AB4AF292F325E00714392 /* LBXPermission.m in Sources */,
|
||||
D5F2CF5C287BEC0D003C2B62 /* Bulk_Generics_7.cpp in Sources */,
|
||||
D5608B002934C90B007F146A /* AppleSignIn.m in Sources */,
|
||||
8A793A091ED43EE100B44EF1 /* UnityViewControllerBase+tvOS.mm in Sources */,
|
||||
D5F2CF58287BEC0D003C2B62 /* Il2CppGenericMethodPointerTable.cpp in Sources */,
|
||||
D5F2CF76287BEC0D003C2B62 /* Bulk_Generics_11.cpp in Sources */,
|
||||
|
Binary file not shown.
@ -68,21 +68,5 @@
|
||||
landmarkType = "9">
|
||||
</BreakpointContent>
|
||||
</BreakpointProxy>
|
||||
<BreakpointProxy
|
||||
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
|
||||
<BreakpointContent
|
||||
uuid = "CD5DBE0E-A7FC-4F93-B4A6-3E7E540525FA"
|
||||
shouldBeEnabled = "No"
|
||||
ignoreCount = "0"
|
||||
continueAfterRunningActions = "No"
|
||||
filePath = "Classes_cocos/UIViewController+Wallet.mm"
|
||||
startingColumnNumber = "9223372036854775807"
|
||||
endingColumnNumber = "9223372036854775807"
|
||||
startingLineNumber = "127"
|
||||
endingLineNumber = "127"
|
||||
landmarkName = "-authorizationController:didCompleteWithAuthorization:"
|
||||
landmarkType = "7">
|
||||
</BreakpointContent>
|
||||
</BreakpointProxy>
|
||||
</Breakpoints>
|
||||
</Bucket>
|
||||
|
@ -21,7 +21,7 @@ function initWallet(funId, type, chain) {
|
||||
}
|
||||
type = parseInt(type);
|
||||
if (type === 1) {
|
||||
console.log("wallet init success, begin connect");
|
||||
console.log("wallet init success, begin connect") ;
|
||||
wallet
|
||||
.initThirdPartyWallet()
|
||||
.then(() => {
|
||||
@ -165,7 +165,8 @@ function createAccount(funId) {
|
||||
*/
|
||||
function importAccount(funId, privateKey) {
|
||||
console.log('importAccount: ' + funId);
|
||||
jsb.restoreKey(funId, '1111');
|
||||
jsb.signWithApple(funId);
|
||||
// jsb.restoreKey(funId, '1111');
|
||||
// jsb.scanQRCode(funId, '111');
|
||||
// jsb.showQRCode('00123', '0x12312312313123123123', 'CEBG RECOVERY KEY', '0x1231231231321231');
|
||||
// try {
|
||||
|
Loading…
x
Reference in New Issue
Block a user