#import "WeiboKitPlugin.h" #import @interface WeiboKitPlugin () @end @implementation WeiboKitPlugin { FlutterMethodChannel *_channel; } + (void)registerWithRegistrar:(NSObject *)registrar { FlutterMethodChannel *channel = [FlutterMethodChannel methodChannelWithName:@"v7lin.github.io/weibo_kit" binaryMessenger:[registrar messenger]]; WeiboKitPlugin *instance = [[WeiboKitPlugin alloc] initWithChannel:channel]; [registrar addApplicationDelegate:instance]; [registrar addMethodCallDelegate:instance channel:channel]; } - (instancetype)initWithChannel:(FlutterMethodChannel *)channel { self = [super init]; if (self) { _channel = channel; } return self; } - (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result { if ([@"registerApp" isEqualToString:call.method]) { NSString *appKey = call.arguments[@"appKey"]; NSString *universalLink = call.arguments[@"universalLink"]; [WeiboSDK registerApp:appKey universalLink:universalLink]; result(nil); } else if ([@"isInstalled" isEqualToString:call.method]) { result([NSNumber numberWithBool:[WeiboSDK isWeiboAppInstalled]]); } else if ([@"isSupportMultipleImage" isEqualToString:call.method]) { result([NSNumber numberWithBool:YES]); } else if ([@"auth" isEqualToString:call.method]) { [self handleAuthCall:call result:result]; } else if ([@"shareText" isEqualToString:call.method] || [@"shareImage" isEqualToString:call.method] || [@"shareMultiImage" isEqualToString:call.method] || [@"shareVideo" isEqualToString:call.method] || [@"shareWebpage" isEqualToString:call.method]) { [self handleShareCall:call result:result]; } else { result(FlutterMethodNotImplemented); } } - (void)handleAuthCall:(FlutterMethodCall *)call result:(FlutterResult)result { WBAuthorizeRequest *request = [WBAuthorizeRequest request]; request.scope = call.arguments[@"scope"]; request.redirectURI = call.arguments[@"redirectUrl"]; request.shouldShowWebViewForAuthIfCannotSSO = YES; request.shouldOpenWeiboAppInstallPageIfNotInstalled = NO; [WeiboSDK sendRequest:request completion:^(BOOL success){ // do nothing }]; result(nil); } - (void)handleShareCall:(FlutterMethodCall *)call result:(FlutterResult)result { WBMessageObject *message = [WBMessageObject message]; if ([@"shareText" isEqualToString:call.method]) { message.text = call.arguments[@"text"]; } else if ([@"shareImage" isEqualToString:call.method]) { message.text = call.arguments[@"text"]; WBImageObject *object = [WBImageObject object]; FlutterStandardTypedData *imageData = call.arguments[@"imageData"]; if (imageData != nil) { object.imageData = imageData.data; } else { NSString *imageUri = call.arguments[@"imageUri"]; NSURL *imageUrl = [NSURL URLWithString:imageUri]; object.imageData = [NSData dataWithContentsOfFile:imageUrl.path]; } message.imageObject = object; } else if ([@"shareMultiImage" isEqualToString:call.method]) { message.text = call.arguments[@"text"]; WBImageObject *object = [WBImageObject object]; NSArray *imageUris = call.arguments[@"imageUris"]; NSMutableArray* images = [[NSMutableArray alloc] init]; for (NSString *imageUri in imageUris) { NSURL *imageUrl = [NSURL URLWithString:imageUri]; [images addObject:[UIImage imageWithContentsOfFile:imageUrl.path]]; } [object addImages:images]; message.imageObject = object; } else if ([@"shareVideo" isEqualToString:call.method]) { message.text = call.arguments[@"text"]; WBNewVideoObject *object = [WBNewVideoObject object]; NSString *videoUri = call.arguments[@"videoUri"]; [object addVideo:[NSURL URLWithString:videoUri]]; message.videoObject = object; } else if ([@"shareWebpage" isEqualToString:call.method]) { WBWebpageObject *object = [WBWebpageObject object]; object.objectID = [[NSUUID UUID].UUIDString stringByReplacingOccurrencesOfString:@"-" withString:@""]; object.title = call.arguments[@"title"]; object.description = call.arguments[@"description"]; FlutterStandardTypedData *thumbData = call.arguments[@"thumbData"]; if (thumbData != nil) { object.thumbnailData = thumbData.data; } object.webpageUrl = call.arguments[@"webpageUrl"]; message.mediaObject = object; } WBSendMessageToWeiboRequest *request = [WBSendMessageToWeiboRequest request]; request.message = message; [WeiboSDK sendRequest:request completion:^(BOOL success){ // do nothing }]; result(nil); } #pragma mark - AppDelegate - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url { return [WeiboSDK handleOpenURL:url delegate:self]; } - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { return [WeiboSDK handleOpenURL:url delegate:self]; } - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary *)options { return [WeiboSDK handleOpenURL:url delegate:self]; } - (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray *_Nonnull))restorationHandler { return [WeiboSDK handleOpenUniversalLink:userActivity delegate:self]; } #pragma mark - WeiboSDKDelegate - (void)didReceiveWeiboRequest:(WBBaseRequest *)request { } - (void)didReceiveWeiboResponse:(WBBaseResponse *)response { NSMutableDictionary *dictionary = [NSMutableDictionary dictionary]; [dictionary setValue:[NSNumber numberWithInteger:response.statusCode] forKey:@"errorCode"]; if ([response isKindOfClass:[WBAuthorizeResponse class]]) { if (response.statusCode == WeiboSDKResponseStatusCodeSuccess) { WBAuthorizeResponse *authorizeResponse = (WBAuthorizeResponse *)response; NSString *userId = authorizeResponse.userID; NSString *accessToken = authorizeResponse.accessToken; NSString *refreshToken = authorizeResponse.refreshToken; long long expiresIn = ceil(authorizeResponse.expirationDate.timeIntervalSinceNow); // ε‘δΈŠε–ζ•΄ [dictionary setValue:userId forKey:@"userId"]; [dictionary setValue:accessToken forKey:@"accessToken"]; [dictionary setValue:refreshToken forKey:@"refreshToken"]; [dictionary setValue:[NSNumber numberWithLongLong:expiresIn] forKey:@"expiresIn"]; } [_channel invokeMethod:@"onAuthResp" arguments:dictionary]; } else if ([response isKindOfClass:[WBSendMessageToWeiboResponse class]]) { if (response.statusCode == WeiboSDKResponseStatusCodeSuccess) { WBSendMessageToWeiboResponse *sendMessageToWeiboResponse = (WBSendMessageToWeiboResponse *)response; } [_channel invokeMethod:@"onShareMsgResp" arguments:dictionary]; } } @end