diff --git a/Classes_cocos/AppleSignIn.h b/Classes_cocos/AppleSignIn.h new file mode 100644 index 0000000..3849a70 --- /dev/null +++ b/Classes_cocos/AppleSignIn.h @@ -0,0 +1,27 @@ +// +// AppleSignIn.h +// Unity-iPhone +// +// Created by zhl on 2022/11/28. +// + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +typedef void (^AppleSignInCompletion)(NSString *_Nullable idToken, NSError *_Nullable error); + +@interface AppleSignIn : NSObject + +@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 diff --git a/Classes_cocos/AppleSignIn.m b/Classes_cocos/AppleSignIn.m new file mode 100644 index 0000000..31aeedf --- /dev/null +++ b/Classes_cocos/AppleSignIn.m @@ -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 diff --git a/Classes_cocos/JcWallet.mm b/Classes_cocos/JcWallet.mm index d1cd760..60e9a5c 100644 --- a/Classes_cocos/JcWallet.mm +++ b/Classes_cocos/JcWallet.mm @@ -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; } diff --git a/Classes_cocos/NSData+Base64.h b/Classes_cocos/NSData+Base64.h new file mode 100644 index 0000000..cd3ceeb --- /dev/null +++ b/Classes_cocos/NSData+Base64.h @@ -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 + +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 diff --git a/Classes_cocos/NSData+Base64.m b/Classes_cocos/NSData+Base64.m new file mode 100644 index 0000000..ebdbed4 --- /dev/null +++ b/Classes_cocos/NSData+Base64.m @@ -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 diff --git a/Classes_cocos/UIViewController+Wallet.h b/Classes_cocos/UIViewController+Wallet.h index b61ce4a..c86726f 100644 --- a/Classes_cocos/UIViewController+Wallet.h +++ b/Classes_cocos/UIViewController+Wallet.h @@ -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; diff --git a/Classes_cocos/UIViewController+Wallet.mm b/Classes_cocos/UIViewController+Wallet.mm index bc861de..8fa15cf 100644 --- a/Classes_cocos/UIViewController+Wallet.mm +++ b/Classes_cocos/UIViewController+Wallet.mm @@ -13,15 +13,14 @@ #import #include "KeyChain/DataManager.h" #import "NSString+Customer.h" -#import +#import "NSData+Base64.h" +#import "AppleSignIn.h" @import GoogleSignIn; static NSString * const kClientID = @"53206975661-0d6q9pqljn84n9l63gm0to1ulap9cbk4.apps.googleusercontent.com"; -@interface UIViewController (Wallet) -@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]) { diff --git a/Unity-iPhone.xcodeproj/project.pbxproj b/Unity-iPhone.xcodeproj/project.pbxproj index 1d8f2b0..251c114 100644 --- a/Unity-iPhone.xcodeproj/project.pbxproj +++ b/Unity-iPhone.xcodeproj/project.pbxproj @@ -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 = ""; }; D5608AF729348B83007F146A /* NSString+Customer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "NSString+Customer.h"; sourceTree = ""; }; D5608AF829348B83007F146A /* NSString+Customer.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "NSString+Customer.m"; sourceTree = ""; }; + D5608AFB2934A75E007F146A /* NSData+Base64.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "NSData+Base64.h"; sourceTree = ""; }; + D5608AFC2934A75E007F146A /* NSData+Base64.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "NSData+Base64.m"; sourceTree = ""; }; + D5608AFE2934C90B007F146A /* AppleSignIn.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppleSignIn.h; sourceTree = ""; }; + D5608AFF2934C90B007F146A /* AppleSignIn.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppleSignIn.m; sourceTree = ""; }; D56436402930AAF700E2B633 /* UIView+Toast.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "UIView+Toast.h"; sourceTree = ""; }; D56436412930AAF700E2B633 /* UIView+Toast.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "UIView+Toast.m"; sourceTree = ""; }; D56436442930ABAB00E2B633 /* UIUtils.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UIUtils.h; sourceTree = ""; }; @@ -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 */, diff --git a/Unity-iPhone.xcworkspace/xcuserdata/zhl.xcuserdatad/UserInterfaceState.xcuserstate b/Unity-iPhone.xcworkspace/xcuserdata/zhl.xcuserdatad/UserInterfaceState.xcuserstate index e6db2a4..e98ed19 100644 Binary files a/Unity-iPhone.xcworkspace/xcuserdata/zhl.xcuserdatad/UserInterfaceState.xcuserstate and b/Unity-iPhone.xcworkspace/xcuserdata/zhl.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/Unity-iPhone.xcworkspace/xcuserdata/zhl.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/Unity-iPhone.xcworkspace/xcuserdata/zhl.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist index 3ed37f8..1c2db93 100644 --- a/Unity-iPhone.xcworkspace/xcuserdata/zhl.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ b/Unity-iPhone.xcworkspace/xcuserdata/zhl.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -68,21 +68,5 @@ landmarkType = "9"> - - - - diff --git a/js/main.js b/js/main.js index 596d078..03e1800 100644 --- a/js/main.js +++ b/js/main.js @@ -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 {