CDVWeiboSDK.m 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314
  1. #import "CDVWeiboSDK.h"
  2. NSString *WEBIO_APP_ID = @"weibo_app_id";
  3. NSString *WEBIO_REDIRECT_URI = @"redirecturi";
  4. NSString *WEBIO_DEFUALT_REDIRECT_URI = @"https://api.weibo.com/oauth2/default.html";
  5. NSString *WEIBO_CANCEL_BY_USER = @"cancel by user";
  6. NSString *WEIBO_SHARE_INSDK_FAIL = @"share in sdk failed";
  7. NSString *WEIBO_SEND_FAIL = @"send failed";
  8. NSString *WEIBO_UNSPPORTTED = @"Weibo unspport";
  9. NSString *WEIBO_AUTH_ERROR = @"Weibo auth error";
  10. NSString *WEIBO_UNKNOW_ERROR = @"Weibo unknow error";
  11. NSString *WEIBO_TOKEN_EMPTY = @"Weibo token is empty";
  12. NSString *WEIBO_USER_CANCEL_INSTALL = @"user cancel install weibo";
  13. @implementation CDVWeiboSDK
  14. /**
  15. * 插件初始化主要用于appkey的注册
  16. */
  17. - (void)pluginInitialize {
  18. NSString *weiboAppId = [[self.commandDelegate settings] objectForKey:WEBIO_APP_ID];
  19. self.weiboAppId = weiboAppId;
  20. [WeiboSDK registerApp:weiboAppId];
  21. NSString *redirectURI = [[self.commandDelegate settings] objectForKey:WEBIO_REDIRECT_URI];
  22. if (nil == redirectURI) {
  23. self.redirectURI = WEBIO_DEFUALT_REDIRECT_URI;
  24. } else {
  25. self.redirectURI = redirectURI;
  26. }
  27. }
  28. /**
  29. * 检查微博官方客户端是否安装
  30. *
  31. * @param command CDVInvokedUrlCommand
  32. */
  33. - (void)checkClientInstalled:(CDVInvokedUrlCommand *)command {
  34. if ([WeiboSDK isWeiboAppInstalled]) {
  35. CDVPluginResult *result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK];
  36. [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
  37. } else {
  38. CDVPluginResult *result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR];
  39. [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
  40. }
  41. }
  42. /**
  43. * 微博单点登录
  44. *
  45. * @param command CDVInvokedUrlCommand
  46. */
  47. - (void)ssoLogin:(CDVInvokedUrlCommand *)command {
  48. self.callbackId = command.callbackId;
  49. WBAuthorizeRequest *request = [WBAuthorizeRequest request];
  50. request.redirectURI = self.redirectURI;
  51. request.scope = @"all";
  52. request.userInfo = @{ @"SSO_From" : @"CDVWeiboSDK",
  53. @"Other_Info_1" : [NSNumber numberWithInt:123],
  54. @"Other_Info_2" : @[ @"obj1", @"obj2" ],
  55. @"Other_Info_3" : @{@"key1" : @"obj1", @"key2" : @"obj2"} };
  56. [WeiboSDK sendRequest:request];
  57. }
  58. /**
  59. * 微博登出
  60. *
  61. * @param command CDVInvokedUrlCommand
  62. */
  63. - (void)logout:(CDVInvokedUrlCommand *)command {
  64. NSUserDefaults *saveDefaults = [NSUserDefaults standardUserDefaults];
  65. NSString *token = [saveDefaults objectForKey:@"access_token"];
  66. [saveDefaults removeObjectForKey:@"userId"];
  67. [saveDefaults removeObjectForKey:@"access_token"];
  68. [saveDefaults removeObjectForKey:@"expires_time"];
  69. [saveDefaults synchronize];
  70. if (token) {
  71. [WeiboSDK logOutWithToken:token delegate:self withTag:nil];
  72. self.callbackId = command.callbackId;
  73. } else {
  74. CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:WEIBO_TOKEN_EMPTY];
  75. [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
  76. }
  77. }
  78. /**
  79. * 分享网页到微博
  80. *
  81. * @param command CDVInvokedUrlCommand
  82. */
  83. - (void)shareToWeibo:(CDVInvokedUrlCommand *)command {
  84. self.callbackId = command.callbackId;
  85. WBAuthorizeRequest *authRequest = [WBAuthorizeRequest request];
  86. authRequest.redirectURI = self.redirectURI;
  87. authRequest.scope = @"all";
  88. NSDictionary *params = [command.arguments objectAtIndex:0];
  89. WBMessageObject *message = [WBMessageObject message];
  90. WBWebpageObject *webpage = [WBWebpageObject object];
  91. webpage.objectID = [NSString stringWithFormat:@"%f", [[NSDate date] timeIntervalSince1970]];
  92. webpage.title = [self check:@"title" in:params];
  93. webpage.description = [NSString stringWithFormat:[self check:@"description" in:params], [[NSDate date] timeIntervalSince1970]];
  94. webpage.webpageUrl = [self check:@"url" in:params];
  95. NSString *image = [self check:@"image" in:params];
  96. NSData *imageData = [self processImage:image];
  97. webpage.thumbnailData = imageData;
  98. message.mediaObject = webpage;
  99. NSUserDefaults *saveDefaults = [NSUserDefaults standardUserDefaults];
  100. NSString *token = [saveDefaults objectForKey:@"access_token"];
  101. WBSendMessageToWeiboRequest *request = [WBSendMessageToWeiboRequest requestWithMessage:message authInfo:authRequest access_token:token];
  102. request.userInfo = @{ @"ShareMessageFrom" : @"CDVWeiboSDK",
  103. @"Other_Info_1" : [NSNumber numberWithInt:123],
  104. @"Other_Info_2" : @[ @"obj1", @"obj2" ],
  105. @"Other_Info_3" : @{@"key1" : @"obj1", @"key2" : @"obj2"} };
  106. [WeiboSDK sendRequest:request];
  107. }
  108. /**
  109. * 分享图片到微博
  110. *
  111. * @param command CDVInvokedUrlCommand
  112. */
  113. - (void)shareImageToWeibo:(CDVInvokedUrlCommand *)command {
  114. self.callbackId = command.callbackId;
  115. WBAuthorizeRequest *authRequest = [WBAuthorizeRequest request];
  116. authRequest.redirectURI = self.redirectURI;
  117. authRequest.scope = @"all";
  118. NSDictionary *params = [command.arguments objectAtIndex:0];
  119. WBMessageObject *message = [WBMessageObject message];
  120. WBImageObject *imageObject = [WBImageObject object];
  121. NSString *image = [self check:@"image" in:params];
  122. NSData *imageData = [self processImage:image];
  123. imageObject.imageData = imageData;
  124. message.imageObject = imageObject;
  125. NSUserDefaults *saveDefaults = [NSUserDefaults standardUserDefaults];
  126. NSString *token = [saveDefaults objectForKey:@"access_token"];
  127. WBSendMessageToWeiboRequest *request = [WBSendMessageToWeiboRequest requestWithMessage:message authInfo:authRequest access_token:token];
  128. request.userInfo = @{ @"ShareMessageFrom" : @"CDVWeiboSDK",
  129. @"Other_Info_1" : [NSNumber numberWithInt:123],
  130. @"Other_Info_2" : @[ @"obj1", @"obj2" ],
  131. @"Other_Info_3" : @{@"key1" : @"obj1", @"key2" : @"obj2"} };
  132. [WeiboSDK sendRequest:request];
  133. }
  134. /**
  135. * 分享文字到微博
  136. *
  137. * @param command CDVInvokedUrlCommand
  138. */
  139. - (void)shareTextToWeibo:(CDVInvokedUrlCommand *)command {
  140. self.callbackId = command.callbackId;
  141. WBAuthorizeRequest *authRequest = [WBAuthorizeRequest request];
  142. authRequest.redirectURI = self.redirectURI;
  143. authRequest.scope = @"all";
  144. NSDictionary *params = [command.arguments objectAtIndex:0];
  145. WBMessageObject *message = [WBMessageObject message];
  146. NSString *text = [self check:@"text" in:params];
  147. message.text = text;
  148. NSUserDefaults *saveDefaults = [NSUserDefaults standardUserDefaults];
  149. NSString *token = [saveDefaults objectForKey:@"access_token"];
  150. WBSendMessageToWeiboRequest *request = [WBSendMessageToWeiboRequest requestWithMessage:message authInfo:authRequest access_token:token];
  151. request.userInfo = @{ @"ShareMessageFrom" : @"CDVWeiboSDK",
  152. @"Other_Info_1" : [NSNumber numberWithInt:123],
  153. @"Other_Info_2" : @[ @"obj1", @"obj2" ],
  154. @"Other_Info_3" : @{@"key1" : @"obj1", @"key2" : @"obj2"} };
  155. [WeiboSDK sendRequest:request];
  156. }
  157. /**
  158. * 处理URL
  159. *
  160. * @param notification cordova传递的消息对象
  161. */
  162. - (void)handleOpenURL:(NSNotification *)notification {
  163. NSURL *url = [notification object];
  164. if ([url isKindOfClass:[NSURL class]] && [url.absoluteString hasPrefix:[@"wb" stringByAppendingString:self.weiboAppId]]) {
  165. [WeiboSDK handleOpenURL:url delegate:self];
  166. }
  167. }
  168. #pragma mark - WeiboSDKDelegate
  169. - (void)didReceiveWeiboResponse:(WBBaseResponse *)response {
  170. if ([response isKindOfClass:WBSendMessageToWeiboResponse.class]) {
  171. if (response.statusCode == WeiboSDKResponseStatusCodeSuccess) {
  172. WBSendMessageToWeiboResponse *sendMessageToWeiboResponse = (WBSendMessageToWeiboResponse *)response;
  173. NSString *accessToken = [sendMessageToWeiboResponse.authResponse accessToken];
  174. NSString *userId = [sendMessageToWeiboResponse.authResponse userID];
  175. NSString *expirationTime = [NSString stringWithFormat:@"%f", [sendMessageToWeiboResponse.authResponse.expirationDate timeIntervalSince1970] * 1000];
  176. if (accessToken && userId && expirationTime) {
  177. NSUserDefaults *saveDefaults = [NSUserDefaults standardUserDefaults];
  178. [saveDefaults setValue:accessToken forKey:@"access_token"];
  179. [saveDefaults setValue:userId forKey:@"userId"];
  180. [saveDefaults setValue:expirationTime forKey:@"expires_time"];
  181. [saveDefaults synchronize];
  182. }
  183. CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK];
  184. [self.commandDelegate sendPluginResult:pluginResult callbackId:self.callbackId];
  185. } else if (response.statusCode == WeiboSDKResponseStatusCodeUserCancel) {
  186. CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:WEIBO_CANCEL_BY_USER];
  187. [self.commandDelegate sendPluginResult:pluginResult callbackId:self.callbackId];
  188. } else if (response.statusCode == WeiboSDKResponseStatusCodeSentFail) {
  189. CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:WEIBO_SEND_FAIL];
  190. [self.commandDelegate sendPluginResult:pluginResult callbackId:self.callbackId];
  191. } else if (response.statusCode == WeiboSDKResponseStatusCodeShareInSDKFailed) {
  192. CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:WEIBO_SHARE_INSDK_FAIL];
  193. [self.commandDelegate sendPluginResult:pluginResult callbackId:self.callbackId];
  194. } else if (response.statusCode == WeiboSDKResponseStatusCodeUnsupport) {
  195. CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:WEIBO_UNSPPORTTED];
  196. [self.commandDelegate sendPluginResult:pluginResult callbackId:self.callbackId];
  197. } else if (response.statusCode == WeiboSDKResponseStatusCodeUnknown) {
  198. CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:WEIBO_UNKNOW_ERROR];
  199. [self.commandDelegate sendPluginResult:pluginResult callbackId:self.callbackId];
  200. } else if (response.statusCode == WeiboSDKResponseStatusCodeAuthDeny) {
  201. CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:WEIBO_AUTH_ERROR];
  202. [self.commandDelegate sendPluginResult:pluginResult callbackId:self.callbackId];
  203. } else if (response.statusCode == WeiboSDKResponseStatusCodeUserCancelInstall) {
  204. CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:WEIBO_USER_CANCEL_INSTALL];
  205. [self.commandDelegate sendPluginResult:pluginResult callbackId:self.callbackId];
  206. }
  207. } else if ([response isKindOfClass:WBAuthorizeResponse.class]) {
  208. if (response.statusCode == WeiboSDKResponseStatusCodeSuccess) {
  209. NSMutableDictionary *Dic = [NSMutableDictionary dictionaryWithCapacity:2];
  210. [Dic setObject:[(WBAuthorizeResponse *)response userID] forKey:@"userId"];
  211. [Dic setObject:[(WBAuthorizeResponse *)response accessToken] forKey:@"access_token"];
  212. [Dic setObject:[NSString stringWithFormat:@"%f", [(WBAuthorizeResponse *)response expirationDate].timeIntervalSince1970 * 1000] forKey:@"expires_time"];
  213. NSUserDefaults *saveDefaults = [NSUserDefaults standardUserDefaults];
  214. [saveDefaults setValue:[(WBAuthorizeResponse *)response userID] forKey:@"userId"];
  215. [saveDefaults setValue:[(WBAuthorizeResponse *)response accessToken] forKey:@"access_token"];
  216. [saveDefaults setValue:[NSString stringWithFormat:@"%f", [(WBAuthorizeResponse *)response expirationDate].timeIntervalSince1970 * 1000] forKey:@"expires_time"];
  217. [saveDefaults synchronize];
  218. CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:Dic];
  219. [self.commandDelegate sendPluginResult:pluginResult callbackId:self.callbackId];
  220. } else if (response.statusCode == WeiboSDKResponseStatusCodeUserCancel) {
  221. CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:WEIBO_CANCEL_BY_USER];
  222. [self.commandDelegate sendPluginResult:pluginResult callbackId:self.callbackId];
  223. } else if (response.statusCode == WeiboSDKResponseStatusCodeSentFail) {
  224. CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:WEIBO_SEND_FAIL];
  225. [self.commandDelegate sendPluginResult:pluginResult callbackId:self.callbackId];
  226. } else if (response.statusCode == WeiboSDKResponseStatusCodeShareInSDKFailed) {
  227. CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:WEIBO_SHARE_INSDK_FAIL];
  228. [self.commandDelegate sendPluginResult:pluginResult callbackId:self.callbackId];
  229. } else if (response.statusCode == WeiboSDKResponseStatusCodeUnsupport) {
  230. CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:WEIBO_UNSPPORTTED];
  231. [self.commandDelegate sendPluginResult:pluginResult callbackId:self.callbackId];
  232. } else if (response.statusCode == WeiboSDKResponseStatusCodeUnknown) {
  233. CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:WEIBO_UNKNOW_ERROR];
  234. [self.commandDelegate sendPluginResult:pluginResult callbackId:self.callbackId];
  235. } else if (response.statusCode == WeiboSDKResponseStatusCodeAuthDeny) {
  236. CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:WEIBO_AUTH_ERROR];
  237. [self.commandDelegate sendPluginResult:pluginResult callbackId:self.callbackId];
  238. } else if (response.statusCode == WeiboSDKResponseStatusCodeUserCancelInstall) {
  239. CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:WEIBO_USER_CANCEL_INSTALL];
  240. [self.commandDelegate sendPluginResult:pluginResult callbackId:self.callbackId];
  241. }
  242. }
  243. }
  244. - (void)didReceiveWeiboRequest:(WBBaseRequest *)request {
  245. }
  246. #pragma mark - WBHttpRequestDelegate
  247. - (void)request:(WBHttpRequest *)request didFinishLoadingWithResult:(NSString *)result {
  248. CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK];
  249. [self.commandDelegate sendPluginResult:pluginResult callbackId:self.callbackId];
  250. }
  251. - (void)request:(WBHttpRequest *)request didFailWithError:(NSError *)error {
  252. CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR];
  253. [self.commandDelegate sendPluginResult:pluginResult callbackId:self.callbackId];
  254. }
  255. /**
  256. 图片处理
  257. @param image 图片数据
  258. @return 图片NSdata数据
  259. */
  260. - (NSData *)processImage:(NSString *)image {
  261. if ([self isBase64Data:image]) {
  262. return [[NSData alloc] initWithBase64EncodedString:image options:0];
  263. } else if ([image hasPrefix:@"http://"] || [image hasPrefix:@"https://"]) {
  264. NSURL *url = [NSURL URLWithString:image];
  265. return [NSData dataWithContentsOfURL:url];
  266. } else {
  267. return [NSData dataWithContentsOfFile:image];
  268. }
  269. }
  270. /**
  271. 检查图片是不是Base64
  272. @param data 图片数据
  273. @return 结果true or false
  274. */
  275. - (BOOL)isBase64Data:(NSString *)data {
  276. data = [[data componentsSeparatedByCharactersInSet:
  277. [NSCharacterSet whitespaceAndNewlineCharacterSet]]
  278. componentsJoinedByString:@""];
  279. if ([data length] % 4 == 0) {
  280. static NSCharacterSet *invertedBase64CharacterSet = nil;
  281. if (invertedBase64CharacterSet == nil) {
  282. invertedBase64CharacterSet = [[NSCharacterSet characterSetWithCharactersInString:@"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="] invertedSet];
  283. }
  284. return [data rangeOfCharacterFromSet:invertedBase64CharacterSet options:NSLiteralSearch].location == NSNotFound;
  285. }
  286. return NO;
  287. }
  288. /**
  289. 检查参数是否存在
  290. @param param 要检查的参数
  291. @param args 参数字典
  292. @return 参数
  293. */
  294. - (NSString *)check:(NSString *)param in:(NSDictionary *)args {
  295. NSString *data = [args objectForKey:param];
  296. return data?data:@"";
  297. }
  298. @end