[
  {
    "path": "README.md",
    "content": "# react-native-open-share\nIntegrate wechat,weibo,qq,alipay [share,payment,login] to your react native application.\n### built from [OpenShare](https://github.com/100apps/openshare) \n## Screen Shot\n\n<img src=\"https://raw.githubusercontent.com/mozillo/react-native-open-share/master/screenshot_1.png\" width=\"276\"/>\n<img src=\"https://raw.githubusercontent.com/mozillo/react-native-open-share/master/screentshot_2.png\" width=\"276\"/>\n\n##Installation\n1.Run `npm install https://github.com/mozillo/react-native-open-share.git --save` in your project directory.\n\n2.Select your project , and find your [ ProjectName ] directory , Select it and right click \"New Group\", and rename it to \"OpenShare\", right click \"Add Files to 'App' ...\", select all files under the ./node_modules/react-native-open-share/src/ directory , and added them to OpenShare group.\n\n3.Edit Info.plist, Open As => Source code, append ***new Info.plist code*** content after \n\n```\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n```\n\nnew Info.plist code:\n```\n  <key>CFBundleURLTypes</key>\n  <array>\n    <dict>\n      <key>CFBundleURLName</key>\n      <string>RNShare</string>\n      <key>CFBundleURLSchemes</key>\n      <array>\n        <!--wechat-->\n        <string>wxd930ea5d5a258f4f</string>\n        <!--qq-->\n        <string>tencent1103194207</string>\n        <string>tencent1103194207.content</string>\n        <string>QQ41C1685F</string>\n        <!--weibo-->\n        <string>wb402180334</string>\n        <!--renren-->\n        <string>renrenshare228525</string>\n        <!--facebook-->\n        <string>fb776442542471056</string>\n        \n      </array>\n    </dict>\n  </array>\n```\n\n4.Edit AppDelegate.m :\nAdd header file:\n```\n#import \"OpenShareHeader.h\"\n```\nAdd these code to \"(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions\" :\n\n```\n[OpenShare connectQQWithAppId:@\"1103194207\"];\n[OpenShare connectWeiboWithAppKey:@\"402180334\"];\n[OpenShare connectWeixinWithAppId:@\"wxd930ea5d5a258f4f\"];\n[OpenShare connectRenrenWithAppId:@\"228525\" AndAppKey:@\"1dd8cba4215d4d4ab96a49d3058c1d7f\"];\n```\n\nand add this method after \"(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions\" block:\n\n```\n-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{\n  //第二步：添加回调\n  if ([OpenShare handleOpenURL:url]) {\n    return YES;\n  }\n  //这里可以写上其他OpenShare不支持的客户端的回调，比如支付宝等。\n  return YES;\n}\n```\n\n###Done.\n\n## Usage\n\nexample: \n\n```\n'use strict';\n\nvar React = require('react-native');\nvar {\n  AppRegistry,\n  StyleSheet,\n  Text,\n  View,\n  TouchableOpacity,\n  DeviceEventEmitter,\n  AlertIOS,\n} = React;\n\nvar openShare = require('react-native-open-share');\n\nvar App = React.createClass({\n\n  _wechatLogin: function() {\n    var _this = this;\n    openShare.wechatLogin();\n\n    if(!_this.wechatLogin) {\n      _this.wechatLogin = DeviceEventEmitter.addListener(\n        'managerCallback',\n        (response) => {\n          AlertIOS.alert(\n            'response',\n            JSON.stringify(response)\n          );\n          \n          _this.wechatLogin.remove();\n          delete _this.wechatLogin;\n        }\n      );\n    }\n  },\n\n  render: function() {\n    return (\n      <View style={styles.container}>\n\n        <TouchableOpacity onPress={this._wechatLogin}>\n          <Text>WeChat Login</Text>\n        </TouchableOpacity>\n\n        <Text style={styles.welcome}>\n          Welcome to React Native!\n        </Text>\n        <Text style={styles.instructions}>\n          To get started, edit index.ios.js\n        </Text>\n        <Text style={styles.instructions}>\n          Press Cmd+R to reload,{'\\n'}\n          Cmd+D or shake for dev menu\n        </Text>\n      </View>\n    );\n  }\n});\n\nvar styles = StyleSheet.create({\n  container: {\n    flex: 1,\n    justifyContent: 'center',\n    alignItems: 'center',\n    backgroundColor: '#F5FCFF',\n  },\n  welcome: {\n    fontSize: 20,\n    textAlign: 'center',\n    margin: 10,\n  },\n  instructions: {\n    textAlign: 'center',\n    color: '#333333',\n    marginBottom: 5,\n  },\n});\n\nAppRegistry.registerComponent('App', () => App);\n\n```\n## current API\n\n```\nopenShare.qqLogin();\nopenShare.wechatLogin();\nopenShare.weiboLogin();\n```\n\n##Other\n```\n\nwechat access token request: \nhttps://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code\n\nwechat user profile request:\nhttps://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID\n\n"
  },
  {
    "path": "index.js",
    "content": "module.exports = require('react-native').NativeModules.SocietyLoginManager\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"react-native-open-share\",\n  \"version\": \"0.1.0\",\n  \"description\": \"\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/mozillo/react-native-open-share.git\"\n  },\n  \"keywords\": [\n    \"share\",\n    \"react-native\"\n  ],\n  \"author\": \"mozillo\",\n  \"license\": \"ISC\",\n  \"bugs\": {\n    \"url\": \"https://github.com/mozillo/react-native-open-share/issues\"\n  },\n  \"homepage\": \"https://github.com/mozillo/react-native-open-share#readme\"\n}\n"
  },
  {
    "path": "src/OpenShare+Alipay.h",
    "content": "//\n//  OpenShare+Alipay.h\n//  openshare\n//\n//  Created by LiuLogan on 15/6/4.\n//  Copyright (c) 2015年 OpenShare <http://openshare.gfzj.us/>. All rights reserved.\n//\n\n#import \"OpenShare.h\"\n\n@interface OpenShare (Alipay)\n+(void)connectAlipay;\n+(void)AliPay:(NSString*)link Success:(paySuccess)success Fail:(payFail)fail;\n@end\n"
  },
  {
    "path": "src/OpenShare+Alipay.m",
    "content": "//\n//  OpenShare+Alipay.m\n//  openshare\n//\n//  Created by LiuLogan on 15/6/4.\n//  Copyright (c) 2015年 OpenShare <http://openshare.gfzj.us/>. All rights reserved.\n//\n\n#import \"OpenShare+Alipay.h\"\n\n@implementation OpenShare (Alipay)\nstatic NSString* schema=@\"Alipay\";\n/**\n *  支付宝支付参数都是从服务器获得的，所以不需要注册key。但是还是需要先connect向OpenShare注册，以便回调。\n */\n+(void)connectAlipay{\n    [self set:schema Keys:@{@\"schema\":schema}];\n}\n\n+(BOOL)isAlipayInstalled{\n    return [self canOpen:@\"alipay://\"];\n}\n+(void)AliPay:(NSString*)link Success:(paySuccess)success Fail:(payFail)fail{\n    [self setPaySuccessCallback:success];\n    [self setPayFailCallback:fail];\n    if ([self isAlipayInstalled]) {\n        //支付宝为了用户体验，会把截屏放在支付的后面当背景，可选项。当然也可以用其他的自己生成的UIImage，比如[NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@\"Default@2x\" ofType:@\"png\"]]\n        UIImage *screenShot= [self screenshot];\n        //获取到fromAppUrlScheme，来设置截屏。\n        NSString *linkStr=[self urlDecode:[link substringFromIndex:NSMaxRange([link rangeOfString:@\"?\"])]];\n        NSDictionary *linkDic=[NSJSONSerialization JSONObjectWithData:[linkStr dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingAllowFragments error:nil];\n        [[UIPasteboard generalPasteboard] setData:[NSKeyedArchiver archivedDataWithRootObject:@{@\"image_data\" :UIImagePNGRepresentation(screenShot),@\"scheme\" :linkDic[@\"fromAppUrlScheme\"]}] forPasteboardType:@\"com.alipay.alipayClient.screenImage\"];\n        //END 设置截屏(可以不设置,注释掉这块代码即可。)。\n        \n        [self openURL:link];\n    }\n}\n+(BOOL)Alipay_handleOpenURL{\n    NSURL* url=[self returnedURL];\n    if ([url.absoluteString rangeOfString:@\"//safepay/\"].location != NSNotFound) {\n        NSError *err;\n        NSDictionary *ret=[NSJSONSerialization JSONObjectWithData:[[self urlDecode:url.query]dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingAllowFragments error:&err];\n        if (err||ret[@\"memo\"]==[NSNull null]||[ret[@\"memo\"][@\"ResultStatus\"] intValue]!=9000) {\n            if ([self payFailCallback]) {\n                [self payFailCallback](ret,err?:[NSError errorWithDomain:@\"alipay_pay\" code:ret[@\"memo\"]!=[NSNull null]?[ret[@\"memo\"][@\"ResultStatus\"] intValue]:-1 userInfo:ret]);\n            }\n        }else{\n            if ([self paySuccessCallback]) {\n                [self paySuccessCallback](ret);\n            }\n        }\n        return YES;\n    }else{\n        return NO;\n    }\n}\n@end\n"
  },
  {
    "path": "src/OpenShare+QQ.h",
    "content": "//\n//  OpenShare+QQ.h\n//  openshare\n//\n//  Created by LiuLogan on 15/5/15.\n//  Copyright (c) 2015年 OpenShare <http://openshare.gfzj.us/>. All rights reserved.\n//\n\n#import \"OpenShare.h\"\n\n@interface OpenShare (QQ)\n/**\n *  连接QQ平台。可以分享到：qq好友／qq空间。只需要appId：http://op.open.qq.com/index.php?mod=appinfo&act=main&appid=1103194207#mobile|center\n *  需要添加CFBundleURLSchemes：\n *  <array>\n *  <string>tencent1103194207</string>\n *  <string>tencent1103194207.content</string>\n *  <string>QQ41C1685F</string> 16进制表示的appid，可以通过new Number(1103194207).toString(16).toUpperCase()获取。\n *  @param appId 所申请的应用的APP ID\n */\n+(void)connectQQWithAppId:(NSString *)appId;\n+(BOOL)isQQInstalled;\n\n+(void)shareToQQFriends:(OSMessage*)msg Success:(shareSuccess)success Fail:(shareFail)fail;\n+(void)shareToQQZone:(OSMessage*)msg Success:(shareSuccess)success Fail:(shareFail)fail;\n+(void)shareToQQFavorites:(OSMessage*)msg Success:(shareSuccess)success Fail:(shareFail)fail;\n+(void)shareToQQDataline:(OSMessage*)msg Success:(shareSuccess)success Fail:(shareFail)fail;\n+(void)QQAuth:(NSString*)scope Success:(authSuccess)success Fail:(authFail)fail;\n/**\n *  打开WPA临时会话\n *\n *  @param qqNumber 要聊天的QQ号\n */\n+(void)chatWithQQNumber:(NSString*)qqNumber;\n/**\n *  打开某个群聊天。QQ客户端登录的QQ号，必须是groupNumber的成员才能聊天。\n *\n *  @param groupNumber 群号码\n */\n+(void)chatInQQGroup:(NSString*)groupNumber;\n/**\n *  是否能处理这个openUrl，如果能就返回YES，并且按照callback处理，否则返回NO，交给下一个处理。\n *\n *  @param url     openURL\n *  @param success success callback\n *  @param fail    fail callback\n *\n *  @return 是否能处理给定的url\n */\n+(BOOL)QQ_handleOpenURL;\n@end\n"
  },
  {
    "path": "src/OpenShare+QQ.m",
    "content": "//\n//  OpenShare+QQ.m\n//  openshare\n//\n//  Created by LiuLogan on 15/5/15.\n//  Copyright (c) 2015年 OpenShare <http://openshare.gfzj.us/>. All rights reserved.\n//\n\n#import \"OpenShare+QQ.h\"\n\n@implementation OpenShare (QQ)\nstatic NSString* schema=@\"QQ\";\nenum\n{\n    kQQAPICtrlFlagQZoneShareOnStart = 0x01,\n    kQQAPICtrlFlagQZoneShareForbid = 0x02,\n    kQQAPICtrlFlagQQShare = 0x04,\n    kQQAPICtrlFlagQQShareFavorites = 0x08, //收藏\n    kQQAPICtrlFlagQQShareDataline = 0x10,  //数据线\n};\n\n+(void)connectQQWithAppId:(NSString *)appId{\n    [self set:schema Keys:@{@\"appid\":appId,@\"callback_name\":[NSString stringWithFormat:@\"QQ%02llx\",[appId longLongValue]]}];\n}\n+(BOOL)isQQInstalled{\n    return [self canOpen:@\"mqqapi://\"];\n}\n+(void)shareToQQFriends:(OSMessage*)msg Success:(shareSuccess)success Fail:(shareFail)fail{\n    if ([self beginShare:schema Message:msg Success:success Fail:fail]) {\n        [self openURL:[self genShareUrl:msg to:0]];\n    }\n}\n+(void)shareToQQZone:(OSMessage*)msg Success:(shareSuccess)success Fail:(shareFail)fail{\n    if ([self beginShare:schema Message:msg Success:success Fail:fail]) {\n        [self openURL:[self genShareUrl:msg to:kQQAPICtrlFlagQZoneShareOnStart]];\n    }\n}\n+(void)shareToQQFavorites:(OSMessage*)msg Success:(shareSuccess)success Fail:(shareFail)fail{\n    if ([self beginShare:schema Message:msg Success:success Fail:fail]) {\n        [self openURL:[self genShareUrl:msg to:kQQAPICtrlFlagQQShareFavorites]];\n    }\n}\n+(void)shareToQQDataline:(OSMessage*)msg Success:(shareSuccess)success Fail:(shareFail)fail{\n    if ([self beginShare:schema Message:msg Success:success Fail:fail]) {\n        [self openURL:[self genShareUrl:msg to:kQQAPICtrlFlagQQShareDataline]];\n    }\n}\n\n+(void)QQAuth:(NSString*)scope Success:(authSuccess)success Fail:(authFail)fail{\n    if ([self beginAuth:schema Success:success Fail:fail]) {\n        NSDictionary *authData=@{@\"app_id\" : [self keyFor:schema][@\"appid\"],\n                                 @\"app_name\" : [self CFBundleDisplayName],\n                                 //@\"bundleid\":[self CFBundleIdentifier],//或者有，或者正确(和后台配置一致)，建议不填写。\n                                 @\"client_id\" :[self keyFor:schema][@\"appid\"],\n                                 @\"response_type\" : @\"token\",\n                                 @\"scope\" : scope,//@\"get_user_info,get_simple_userinfo,add_album,add_idol,add_one_blog,add_pic_t,add_share,add_topic,check_page_fans,del_idol,del_t,get_fanslist,get_idollist,get_info,get_other_info,get_repost_list,list_album,upload_pic,get_vip_info,get_vip_rich_info,get_intimate_friends_weibo,match_nick_tips_weibo\",\n                                 @\"sdkp\" :@\"i\",\n                                 @\"sdkv\" : @\"2.9\",\n                                 @\"status_machine\" : [[UIDevice currentDevice] model],\n                                 @\"status_os\" : [[UIDevice currentDevice] systemVersion],\n                                 @\"status_version\" : [[UIDevice currentDevice] systemVersion]\n                                 };\n        \n        [self setGeneralPasteboard:[@\"com.tencent.tencent\" stringByAppendingString:[self keyFor:schema][@\"appid\"]] Value:authData encoding:OSPboardEncodingKeyedArchiver];\n        [self openURL:[NSString stringWithFormat:@\"mqqOpensdkSSoLogin://SSoLogin/tencent%@/com.tencent.tencent%@?generalpastboard=1\",[self keyFor:schema][@\"appid\"],[self keyFor:schema][@\"appid\"]]];\n    }\n}\n\n/**\n *  把msg分享到shareTO\n *\n *  @param msg     OSmessage\n *  @param shareTo 0是好友／1是QQ空间。\n *\n *  @return 需要打开的url\n */\n+(NSString*)genShareUrl:(OSMessage*)msg to:(int)shareTo{\n    NSMutableString *ret=[[NSMutableString alloc] initWithString:@\"mqqapi://share/to_fri?thirdAppDisplayName=\"];\n    [ret appendString:[self base64Encode:[self CFBundleDisplayName]]];\n    [ret appendString:@\"&version=1&cflag=\"];\n    [ret appendFormat:@\"%d\",shareTo];\n    [ret appendString:@\"&callback_type=scheme&generalpastboard=1\"];\n    [ret appendString:@\"&callback_name=\"];\n    [ret appendString:[self keyFor:schema][@\"callback_name\"]];\n    [ret appendString:@\"&src_type=app&shareType=0&file_type=\"];\n    //修正如果有link，则默认是news分享类型。\n    if (msg.link&&!msg.multimediaType) {\n        msg.multimediaType=OSMultimediaTypeNews;\n    }\n    if ([msg isEmpty:@[@\"image\",@\"link\" ] AndNotEmpty:@[@\"title\"]]) {\n        //纯文本分享。\n        [ret appendString:@\"text&file_data=\"];\n        [ret appendString:[self base64AndUrlEncode:msg.title]];\n    }else if([msg isEmpty:@[@\"link\"] AndNotEmpty:@[@\"title\",@\"image\",@\"desc\"]]){\n        //图片分享\n        NSDictionary *data=@{@\"file_data\":[self dataWithImage:msg.image],\n                             @\"previewimagedata\":msg.thumbnail?  [self dataWithImage:msg.thumbnail] :[self dataWithImage:msg.image scale:CGSizeMake(36, 36)]\n                             };\n        [self setGeneralPasteboard:@\"com.tencent.mqq.api.apiLargeData\" Value:data encoding: OSPboardEncodingKeyedArchiver];\n        [ret appendString:@\"img&title=\"];\n        [ret appendString:[self base64Encode:msg.title]];\n        [ret appendString:@\"&objectlocation=pasteboard&description=\"];\n        [ret appendString:[self base64Encode:msg.desc]];\n    }else  if ([msg isEmpty:nil AndNotEmpty:@[@\"title\",@\"desc\",@\"image\",@\"link\",@\"multimediaType\"]]) {\n        //新闻／多媒体分享（图片加链接）发送新闻消息 预览图像数据，最大1M字节 URL地址,必填，最长512个字符 via QQApiInterfaceObject.h\n        NSDictionary *data=@{@\"previewimagedata\":[self dataWithImage:msg.image]};\n        [self setGeneralPasteboard:@\"com.tencent.mqq.api.apiLargeData\" Value:data encoding: OSPboardEncodingKeyedArchiver];\n        NSString *msgType=@\"news\";\n        if (msg.multimediaType==OSMultimediaTypeAudio) {\n            msgType=@\"audio\";\n        }else if(msg.multimediaType==OSMultimediaTypeVideo){\n            //QQ没有video类型。客户端会自动判断。\n            //            msgType=@\"video\";\n        }\n        [ret appendFormat:@\"%@&title=%@&url=%@&description=%@&objectlocation=pasteboard\",msgType,[self base64AndUrlEncode:msg.title],[self base64AndUrlEncode:msg.link],[self base64AndUrlEncode:msg.desc]];\n    }\n    return ret;\n}\n+(BOOL)QQ_handleOpenURL{\n    NSURL* url=[self returnedURL];\n    if ([url.scheme hasPrefix:@\"QQ\"]) {\n        //分享\n        NSDictionary *dic=[self parseUrl:url];\n        if (dic[@\"error_description\"]) {\n            [dic setValue:[self base64Decode:dic[@\"error_description\"]] forKey:@\"error_description\"];\n        }\n        if ([dic[@\"error\"] intValue]!=0) {\n            NSError *err=[NSError errorWithDomain:@\"response_from_qq\" code:[dic[@\"error\"] intValue] userInfo:dic];\n            if ([self shareFailCallback]) {\n                [self shareFailCallback]([self message],err);\n            }\n        }else{\n            if ([self shareSuccessCallback]) {\n                [self shareSuccessCallback]([self message]);\n            }\n        }\n        return YES;\n    }else if([url.scheme hasPrefix:@\"tencent\"]){\n        //登陆auth\n        NSDictionary *ret=[self generalPasteboardData:[@\"com.tencent.tencent\" stringByAppendingString:[self keyFor:schema][@\"appid\"]] encoding:OSPboardEncodingKeyedArchiver];\n        if (ret[@\"ret\"]&&[ret[@\"ret\"] intValue]==0) {\n            if ( [self authSuccessCallback]) {\n                [self authSuccessCallback](ret);\n            }\n        }else{\n            NSError *err=[NSError errorWithDomain:@\"auth_from_QQ\" code:-1 userInfo:ret];\n            if ([self authFailCallback]) {\n                [self authFailCallback](ret,err);\n            }\n        }\n        return YES;\n    }\n    else{\n        return NO;\n    }\n}\n+(void)chatWithQQNumber:(NSString*)qqNumber{\n    [self openURL:[NSString stringWithFormat:@\"mqqwpa://im/chat?uin=%@&thirdAppDisplayName=%@&callback_name=%@&src_type=app&version=1&chat_type=wpa&callback_type=scheme\",qqNumber,[self base64Encode:[self CFBundleDisplayName]],[self keyFor:schema][@\"callback_name\"]]];\n}\n+(void)chatInQQGroup:(NSString*)groupNumber{\n    [self openURL:[NSString stringWithFormat:@\"mqqwpa://im/chat?uin=%@&thirdAppDisplayName=%@&callback_name=%@&src_type=app&version=1&chat_type=group&callback_type=scheme\",groupNumber,[self base64Encode:[self CFBundleDisplayName]],[self keyFor:schema][@\"callback_name\"]]];\n}\n@end\n"
  },
  {
    "path": "src/OpenShare+Renren.h",
    "content": "//\n//  OpenShare+Renren.h\n//  openshare\n//\n//  Created by LiuLogan on 15/5/19.\n//  Copyright (c) 2015年 OpenShare <http://openshare.gfzj.us/>. All rights reserved.\n//\n\n#import \"OpenShare.h\"\n\n@interface OpenShare (Renren)\n+(void)connectRenrenWithAppId:(NSString *)appId AndAppKey:(NSString*)appKey;\n+(BOOL)isRenrenInstalled;\n\n+(void)shareToRenrenSession:(OSMessage*)msg Success:(shareSuccess)success Fail:(shareFail)fail;\n+(void)shareToRenrenTimeline:(OSMessage*)msg Success:(shareSuccess)success Fail:(shareFail)fail;\n\n@end\n"
  },
  {
    "path": "src/OpenShare+Renren.m",
    "content": "//\n//  OpenShare+Renren.m\n//  openshare\n//\n//  Created by LiuLogan on 15/5/19.\n//  Copyright (c) 2015年 OpenShare <http://openshare.gfzj.us/>. All rights reserved.\n//\n\n#import \"OpenShare+Renren.h\"\n\n@implementation OpenShare (Renren)\nstatic NSString* schema=@\"Renren\";\n+(void)connectRenrenWithAppId:(NSString *)appId AndAppKey:(NSString*)appKey{\n    [self set:schema Keys:@{@\"appid\":appId,@\"appkey\":appKey}];\n}\n+(BOOL)isRenrenInstalled{\n    return [self canOpen:@\"renrenshare://share\"];\n}\n\n+(void)shareToRenrenSession:(OSMessage*)msg Success:(shareSuccess)success Fail:(shareFail)fail{\n    if ([self beginShare:schema Message:msg Success:success Fail:fail]) {\n        [self openURL:[self genRenrenShareUrl:msg to:0]];\n    }\n}\n+(void)shareToRenrenTimeline:(OSMessage*)msg Success:(shareSuccess)success Fail:(shareFail)fail{\n    if ([self beginShare:schema Message:msg Success:success Fail:fail]) {\n        [self openURL:[self genRenrenShareUrl:msg to:1]];\n    }\n}\n+(NSString*)genRenrenShareUrl:(OSMessage*)msg to:(int)shareTo{\n    NSString *msgType=@\"Text\";\n    NSMutableDictionary *dic=[[NSMutableDictionary alloc] initWithDictionary:@{@\"title\":msg.title}];\n    if(msg.multimediaType==OSMultimediaTypeAudio){\n        dic[@\"description\"]=msg.desc?:msg.title;\n        dic[@\"thumbData\"]= msg.thumbnail? [self dataWithImage:msg.thumbnail]:[self dataWithImage:msg.image scale:CGSizeMake(36, 36)];\n        dic[@\"url\"]=msg.link;\n        msgType=@\"Voice\";\n    }else if(msg.multimediaType==OSMultimediaTypeVideo){\n        dic[@\"description\"]=msg.desc?:msg.title;\n        dic[@\"thumbData\"]= msg.thumbnail? [self dataWithImage:msg.thumbnail]:[self dataWithImage:msg.image scale:CGSizeMake(36, 36)];\n        dic[@\"url\"]=msg.link;\n        msgType=@\"Video\";\n    }else{\n        if ([msg isEmpty:nil AndNotEmpty:@[@\"image\",@\"link\"]]) {\n            //图文\n            dic[@\"description\"]=msg.desc?:msg.title;\n            dic[@\"thumbData\"]= msg.thumbnail? [self dataWithImage:msg.thumbnail]:[self dataWithImage:msg.image scale:CGSizeMake(36, 36)];\n            dic[@\"url\"]=msg.link;\n            msgType=@\"ImgText\";\n        }else if ([msg isEmpty:@[@\"link\"] AndNotEmpty:@[@\"image\"]]) {\n            //图片\n            dic[@\"imageData\"]= [self dataWithImage:msg.image];\n            dic[@\"thumbData\"]= msg.thumbnail? [self dataWithImage:msg.thumbnail]:[self dataWithImage:msg.image scale:CGSizeMake(36, 36)];\n            msgType=@\"ImgText\";\n        }else if ([msg isEmpty:@[@\"link\"] AndNotEmpty:@[@\"image\"]]) {\n            //文本\n            dic[@\"text\"]=msg.desc?:msg.title;\n            if (msg.link) {\n                dic[@\"url\"]=msg.link;\n            }\n            msgType=@\"Text\";\n        }\n    }\n    [[UIPasteboard generalPasteboard] setData:[NSPropertyListSerialization dataWithPropertyList:dic format:NSPropertyListBinaryFormat_v1_0 options:0 error:nil] forPasteboardType:@\"renren_share\"];\n    return [NSString stringWithFormat:@\"renrenshare://share?sdk_ver=1.0&app_id=%@&app_key=%@&callback=renrenshare%@&msgType=%@&target=%d&msgVer=1.0&msgData=renren_share\",[self keyFor:schema][@\"appid\"],[self keyFor:schema][@\"appkey\"],[self keyFor:schema][@\"appid\"],msgType,shareTo];\n}\n/**\n *  人人网回调，人人网不传回分享结果。\n *\n *  @return 是否是人人网打开的\n */\n+(BOOL)Renren_handleOpenURL{\n    NSURL* url=[self returnedURL];\n    if ([url.scheme hasPrefix:@\"renrenshare\"]) {\n        if ([self shareSuccessCallback]) {\n            [self shareSuccessCallback]([self message]);\n        }\n        return YES;\n    }else{\n        return NO;\n    }\n}\n\n@end\n"
  },
  {
    "path": "src/OpenShare+Weibo.h",
    "content": "//\n//  OpenShare+Weibo.h\n//  openshare\n//\n//  Created by LiuLogan on 15/5/18.\n//  Copyright (c) 2015年 OpenShare <http://openshare.gfzj.us/>. All rights reserved.\n//\n\n#import \"OpenShare.h\"\n\n@interface OpenShare (Weibo)\n\n/**\n*  可以点击「编辑」修改Bundle ID，要和这里的一致，否则auth的时候会返回error_code=21338\n*\n*  @param appKey 申请到的appKey\n*/\n+(void)connectWeiboWithAppKey:(NSString *)appKey;\n+(BOOL)isWeiboInstalled;\n/**\n *  分享到微博，微博只支持三种类型：文本／图片／链接。根据OSMessage自动判定想分享的类型。\n *\n *  @param msg     要分享的msg\n *  @param success 分享成功回调\n *  @param fail    分享失败回调\n */\n+(void)shareToWeibo:(OSMessage*)msg Success:(shareSuccess)success Fail:(shareFail)fail;\n\n/**\n *  微博登录OAuth\n *\n *  @param scope       scope，如果不填写，默认是all\n *  @param redirectURI 必须填写，可以通过http://open.weibo.com/apps/402180334/info/advanced编辑(后台不验证，但是必须填写一致)\n *  @param success     登录成功回调\n *  @param fail        登录失败回调\n */\n+(void)WeiboAuth:(NSString*)scope redirectURI:(NSString*)redirectURI Success:(authSuccess)success Fail:(authFail)fail;\n@end\n"
  },
  {
    "path": "src/OpenShare+Weibo.m",
    "content": "//\n//  OpenShare+Weibo.m\n//  openshare\n//\n//  Created by LiuLogan on 15/5/18.\n//  Copyright (c) 2015年 OpenShare <http://openshare.gfzj.us/>. All rights reserved.\n//\n\n#import \"OpenShare+Weibo.h\"\n\n@implementation OpenShare (Weibo)\nstatic NSString *schema=@\"Weibo\";\n+(void)connectWeiboWithAppKey:(NSString *)appKey{\n    [self set:schema Keys:@{@\"appKey\":appKey}];\n}\n+(BOOL)isWeiboInstalled{\n    return [self canOpen:@\"weibosdk://request\"];\n}\n+(void)shareToWeibo:(OSMessage*)msg Success:(shareSuccess)success Fail:(shareFail)fail{\n    if (![self beginShare:schema Message:msg Success:success Fail:fail]) {\n        return;\n    }\n    NSDictionary *message;\n    if ([msg isEmpty:@[@\"link\" ,@\"image\"] AndNotEmpty:@[@\"title\"] ]) {\n        //text类型分享\n        message= @{\n                   @\"__class\" : @\"WBMessageObject\",\n                   @\"text\" :msg.title\n                   };\n    }else if ([msg isEmpty:@[@\"link\" ] AndNotEmpty:@[@\"title\",@\"image\"] ]) {\n        //图片类型分享\n        message=@{\n                  @\"__class\" : @\"WBMessageObject\",\n                  @\"imageObject\":@{\n                          @\"imageData\":[self dataWithImage:msg.image]\n                          },\n                  @\"text\" : msg.title\n                  };\n        \n    }else if ([msg isEmpty:nil AndNotEmpty:@[@\"title\",@\"link\" ,@\"image\"] ]) {\n        //链接类型分享\n        message=@{\n                  @\"__class\" : @\"WBMessageObject\",\n                  @\"mediaObject\":@{\n                          @\"__class\" : @\"WBWebpageObject\",\n                          @\"description\": msg.desc?:msg.title,\n                          @\"objectID\" : @\"identifier1\",\n                          @\"thumbnailData\":msg.thumbnail ? [self dataWithImage:msg.thumbnail] : [self dataWithImage:msg.image  scale:CGSizeMake(100, 100)],\n                          @\"title\": msg.title,\n                          @\"webpageUrl\":msg.link\n                          }\n                  \n                  };\n    }\n    NSString *uuid=[[NSUUID UUID] UUIDString];\n    NSArray *messageData=@[\n                           @{@\"transferObject\":[NSKeyedArchiver archivedDataWithRootObject:@{\n                                                                                             @\"__class\" :@\"WBSendMessageToWeiboRequest\",\n                                                                                             @\"message\":message,\n                                                                                             @\"requestID\" :uuid,\n                                                                                             }]},\n                           @{@\"userInfo\":[NSKeyedArchiver archivedDataWithRootObject:@{}]},\n                           \n                           @{@\"app\":[NSKeyedArchiver archivedDataWithRootObject:@{ @\"appKey\" : [self keyFor:schema][@\"appKey\"],@\"bundleID\" : [self CFBundleIdentifier]}]}\n                           ];\n    [UIPasteboard generalPasteboard].items=messageData;\n    [self openURL:[NSString stringWithFormat:@\"weibosdk://request?id=%@&sdkversion=003013000\",uuid]];\n}\n\n+(void)WeiboAuth:(NSString*)scope redirectURI:(NSString*)redirectURI Success:(authSuccess)success Fail:(authFail)fail{\n    if (![self beginAuth:schema Success:success Fail:fail]) {\n        return;\n    }\n    NSString *uuid=[[NSUUID UUID] UUIDString];\n    NSArray *authData=@[\n                        @{@\"transferObject\":[NSKeyedArchiver archivedDataWithRootObject:@{\n                                                                                          @\"__class\" :@\"WBAuthorizeRequest\",\n                                                                                          @\"redirectURI\":redirectURI,\n                                                                                          @\"requestID\" :uuid,\n                                                                                          @\"scope\": scope?:@\"all\"\n                                                                                          }]},\n                        @{@\"userInfo\":[NSKeyedArchiver archivedDataWithRootObject:@{\n                                                                                     @\"mykey\":@\"as you like\",\n                                                                                    @\"SSO_From\" : @\"SendMessageToWeiboViewController\"\n                                                                                    }]\n                          },\n                        \n                        @{@\"app\":[NSKeyedArchiver archivedDataWithRootObject:@{\n                                                                               @\"appKey\" :[self keyFor:schema][@\"appKey\"],\n                                                                               @\"bundleID\" : [self CFBundleIdentifier],\n                                                                               @\"name\" :[self CFBundleDisplayName]\n                                                                               }]\n                          }\n                        ];\n    [UIPasteboard generalPasteboard].items=authData;\n    [self openURL:[NSString stringWithFormat:@\"weibosdk://request?id=%@&sdkversion=003013000\",uuid]];\n}\n\n+(BOOL)Weibo_handleOpenURL{\n    NSURL* url=[self returnedURL];\n    if ([url.scheme hasPrefix:@\"wb\"]) {\n        NSArray *items=[UIPasteboard generalPasteboard].items;\n        NSMutableDictionary *ret=[NSMutableDictionary dictionaryWithCapacity:items.count];\n        for (NSDictionary *item in items) {\n            for (NSString *k in item) {\n                ret[k]=[k isEqualToString:@\"sdkVersion\"]?item[k]:[NSKeyedUnarchiver unarchiveObjectWithData:item[k]];\n            }\n        }\n        NSDictionary *transferObject=ret[@\"transferObject\"];\n        if ([transferObject[@\"__class\"] isEqualToString:@\"WBAuthorizeResponse\"]) {\n            //auth\n            if ([transferObject[@\"statusCode\"] intValue]==0) {\n                if ([self authSuccessCallback]) {\n                    [self authSuccessCallback](transferObject);\n                }\n            }else{\n                if ([self authFailCallback]) {\n                    NSError *err=[NSError errorWithDomain:@\"weibo_auth_response\" code:[transferObject[@\"statusCode\"] intValue] userInfo:transferObject];\n                    [self authFailCallback](transferObject,err);\n                }\n            }\n        }else if ([transferObject[@\"__class\"] isEqualToString:@\"WBSendMessageToWeiboResponse\"]) {\n            //分享回调\n            if ([transferObject[@\"statusCode\"] intValue]==0) {\n                if ([self shareSuccessCallback]) {\n                    [self shareSuccessCallback]([self message]);\n                }\n            }else{\n                if ([self shareFailCallback]) {\n                    NSError *err=[NSError errorWithDomain:@\"weibo_share_response\" code:[transferObject[@\"statusCode\"] intValue] userInfo:transferObject];\n                    [self shareFailCallback]([self message],err);\n                }\n            }\n        }\n        return YES;\n    } else{\n        return NO;\n    }\n}\n\n\n@end\n"
  },
  {
    "path": "src/OpenShare+Weixin.h",
    "content": "//\n//  OpenShare+Weixin.h\n//  openshare\n//\n//  Created by LiuLogan on 15/5/18.\n//  Copyright (c) 2015年 OpenShare <http://openshare.gfzj.us/>. All rights reserved.\n//\n\n#import \"OpenShare.h\"\n\n@interface OpenShare (Weixin)\n/**\n *  https://open.weixin.qq.com 在这里申请\n *\n *  @param appId AppID\n */\n+(void)connectWeixinWithAppId:(NSString *)appId;\n+(BOOL)isWeixinInstalled;\n\n+(void)shareToWeixinSession:(OSMessage*)msg Success:(shareSuccess)success Fail:(shareFail)fail;\n+(void)shareToWeixinTimeline:(OSMessage*)msg Success:(shareSuccess)success Fail:(shareFail)fail;\n+(void)shareToWeixinFavorite:(OSMessage*)msg Success:(shareSuccess)success Fail:(shareFail)fail;\n+(void)WeixinAuth:(NSString*)scope Success:(authSuccess)success Fail:(authFail)fail;\n+(void)WeixinPay:(NSString*)link Success:(paySuccess)success Fail:(payFail)fail;\n@end\n"
  },
  {
    "path": "src/OpenShare+Weixin.m",
    "content": "//\n//  OpenShare+Weixin.m\n//  openshare\n//\n//  Created by LiuLogan on 15/5/18.\n//  Copyright (c) 2015年 OpenShare <http://openshare.gfzj.us/>. All rights reserved.\n//\n\n#import \"OpenShare+Weixin.h\"\n\n@implementation OpenShare (Weixin)\nstatic NSString *schema=@\"Weixin\";\n+(void)connectWeixinWithAppId:(NSString *)appId{\n    [self set:schema Keys:@{@\"appid\":appId}];\n\n}\n+(BOOL)isWeixinInstalled{\n    return [self canOpen:@\"weixin://\"];\n}\n\n+(void)shareToWeixinSession:(OSMessage*)msg Success:(shareSuccess)success Fail:(shareFail)fail{\n    if ([self beginShare:schema Message:msg Success:success Fail:fail]) {\n        [self openURL:[self genWeixinShareUrl:msg to:0]];\n    }\n}\n+(void)shareToWeixinTimeline:(OSMessage*)msg Success:(shareSuccess)success Fail:(shareFail)fail{\n    if ([self beginShare:schema Message:msg Success:success Fail:fail]) {\n        [self openURL:[self genWeixinShareUrl:msg to:1]];\n    }\n}\n+(void)shareToWeixinFavorite:(OSMessage*)msg Success:(shareSuccess)success Fail:(shareFail)fail{\n    if ([self beginShare:schema Message:msg Success:success Fail:fail]) {\n        [self openURL:[self genWeixinShareUrl:msg to:2]];\n    }\n}\n\n\n/**\n *  把msg分享到shareTO\n *\n *  @param msg     OSmessage\n *  @param shareTo 0是好友／1是QQ空间。\n *\n *  @return 需要打开的url\n */\n+(NSString*)genWeixinShareUrl:(OSMessage*)msg to:(int)shareTo{\n    NSMutableDictionary *dic=[[NSMutableDictionary alloc] initWithDictionary:@{@\"result\":@\"1\",@\"returnFromApp\" :@\"0\",@\"scene\" : [NSString stringWithFormat:@\"%d\",shareTo],@\"sdkver\" : @\"1.5\",@\"command\" : @\"1010\"}];\n    if (msg.multimediaType==OSMultimediaTypeNews) {\n        msg.multimediaType=0;\n    }\n    if (!msg.multimediaType) {\n        //不指定类型\n        if ([msg isEmpty:@[@\"image\",@\"link\", @\"file\"] AndNotEmpty:@[@\"title\"]]) {\n            //文本\n            dic[@\"command\"]=@\"1020\";\n            dic[@\"title\"]=msg.title;\n        }else if([msg isEmpty:@[@\"link\"] AndNotEmpty:@[@\"image\"]]){\n            //图片\n            dic[@\"title\"]=msg.title?:@\"\";\n            dic[@\"fileData\"]= [self dataWithImage:msg.image];\n            dic[@\"thumbData\"]=msg.thumbnail ? [self dataWithImage:msg.thumbnail] : [self dataWithImage:msg.image scale:CGSizeMake(100, 100)];\n            dic[@\"objectType\"]=@\"2\";\n        }else if([msg isEmpty:nil AndNotEmpty:@[@\"link\",@\"title\",@\"image\"]]){\n            //有链接。\n            dic[@\"description\"]=msg.desc?:msg.title;\n            dic[@\"mediaUrl\"]=msg.link;\n            dic[@\"objectType\"]=@\"5\";\n            dic[@\"thumbData\"]=msg.thumbnail? [self dataWithImage:msg.thumbnail]:[self dataWithImage:msg.image scale:CGSizeMake(100, 100)];\n            dic[@\"title\"] =msg.title;\n        } else if ([msg isEmpty:@[@\"link\"] AndNotEmpty:@[@\"file\"]]) {\n            //gif\n            dic[@\"fileData\"]= msg.file ? msg.file : [self dataWithImage:msg.image];\n            dic[@\"thumbData\"]=msg.thumbnail ? [self dataWithImage:msg.thumbnail] : [self dataWithImage:msg.image scale:CGSizeMake(100, 100)];\n            dic[@\"objectType\"]=@\"8\";\n        }\n    }else if(msg.multimediaType==OSMultimediaTypeAudio){\n        //music\n        dic[@\"description\"]=msg.desc?:msg.title;\n        dic[@\"mediaUrl\"]=msg.link;\n        dic[@\"mediaDataUrl\"]=msg.mediaDataUrl;\n        dic[@\"objectType\"]=@\"3\";\n        dic[@\"thumbData\"]=msg.thumbnail? [self dataWithImage:msg.thumbnail]:[self dataWithImage:msg.image scale:CGSizeMake(100, 100)];;\n        dic[@\"title\"] =msg.title;\n    }else if(msg.multimediaType==OSMultimediaTypeVideo){\n        //video\n        dic[@\"description\"]=msg.desc?:msg.title;\n        dic[@\"mediaUrl\"]=msg.link;\n        dic[@\"objectType\"]=@\"4\";\n        dic[@\"thumbData\"]=msg.thumbnail? [self dataWithImage:msg.thumbnail]:[self dataWithImage:msg.image scale:CGSizeMake(100, 100)];;\n        dic[@\"title\"] =msg.title;\n    }else if(msg.multimediaType==OSMultimediaTypeApp){\n        //app\n        dic[@\"description\"]=msg.desc?:msg.title;\n        if(msg.extInfo)dic[@\"extInfo\"]=msg.extInfo;\n        dic[@\"fileData\"]=[self dataWithImage:msg.image];\n        dic[@\"mediaUrl\"]=msg.link;\n        dic[@\"objectType\"]=@\"7\";\n        dic[@\"thumbData\"]=msg.thumbnail? [self dataWithImage:msg.thumbnail]:[self dataWithImage:msg.image scale:CGSizeMake(100, 100)];;\n        dic[@\"title\"] =msg.title;\n    }else if(msg.multimediaType==OSMultimediaTypeFile){\n        //file\n        dic[@\"description\"]=msg.desc?:msg.title;\n        dic[@\"fileData\"]=msg.file;\n        dic[@\"objectType\"]=@\"6\";\n        dic[@\"fileExt\"]=msg.fileExt?:@\"\";\n        dic[@\"thumbData\"]=msg.thumbnail? [self dataWithImage:msg.thumbnail]:[self dataWithImage:msg.image scale:CGSizeMake(100, 100)];;\n        dic[@\"title\"] =msg.title;\n    }\n    NSData *output=[NSPropertyListSerialization dataWithPropertyList:@{[self keyFor:schema][@\"appid\"]:dic} format:NSPropertyListBinaryFormat_v1_0 options:0 error:nil];\n    [[UIPasteboard generalPasteboard] setData:output forPasteboardType:@\"content\"];\n    return [NSString stringWithFormat:@\"weixin://app/%@/sendreq/?\",[self keyFor:schema][@\"appid\"]];\n}\n\n\n/**\n *  注意：微信登录权限仅限已获得认证的开发者申请，请先进行开发者认证\n *\n *  @param scope   scope\n *  @param success 登录成功回调\n *  @param fail    登录失败回调\n */\n+(void)WeixinAuth:(NSString*)scope Success:(authSuccess)success Fail:(authFail)fail{\n    if ([self beginAuth:schema Success:success Fail:fail]) {\n        [self openURL:[NSString stringWithFormat:@\"weixin://app/%@/auth/?scope=%@&state=Weixinauth\",[self keyFor:schema][@\"appid\"],scope]];\n    }\n}\n/**\n *  微信支付,不同于分享和登录，由于参数是服务器生成的，所以不需要connect。\n *\n *  @param link    服务器返回的link，以供直接打开\n *  @param success 微信支付成功的回调\n *  @param fail    微信支付失败的回调\n */\n+(void)WeixinPay:(NSString*)link Success:(paySuccess)success Fail:(payFail)fail{\n    [self setPaySuccessCallback:success];\n    [self setPayFailCallback:fail];\n    [self openURL:link];\n}\n\n+(BOOL)Weixin_handleOpenURL{\n    NSURL* url=[self returnedURL];\n    if ([url.scheme hasPrefix:@\"wx\"]) {\n        NSDictionary *retDic=[NSPropertyListSerialization propertyListWithData:[[UIPasteboard generalPasteboard] dataForPasteboardType:@\"content\"]?:[[NSData alloc] init] options:0 format:0 error:nil][[self keyFor:schema][@\"appid\"]];\n        NSLog(@\"retDic\\n%@\",retDic);\n        if ([url.absoluteString rangeOfString:@\"://oauth\"].location != NSNotFound) {\n            //login succcess\n            if ([self authSuccessCallback]) {\n                [self authSuccessCallback]([self parseUrl:url]);\n            }\n        }else if([url.absoluteString rangeOfString:@\"://pay/\"].location != NSNotFound){\n            NSDictionary *urlMap=[self parseUrl:url];\n            if ([urlMap[@\"ret\"] intValue]==0) {\n                if ([self paySuccessCallback]) {\n                    [self paySuccessCallback](urlMap);\n                }\n            }else{\n                if ([self payFailCallback]) {\n                    [self payFailCallback](urlMap,[NSError errorWithDomain:@\"weixin_pay\" code:[urlMap[@\"ret\"] intValue] userInfo:retDic]);\n                }\n            }\n        }else{\n            if (retDic[@\"state\"]&&[retDic[@\"state\"] isEqualToString:@\"Weixinauth\"]&&[retDic[@\"result\"] intValue]!=0) {\n                //登录失败\n                if ([self authFailCallback]) {\n                    [self authFailCallback](retDic,[NSError errorWithDomain:@\"weixin_auth\" code:[retDic[@\"result\"] intValue] userInfo:retDic]);\n                }\n            }else if([retDic[@\"result\"] intValue]==0){\n                //分享成功\n                if ([self shareSuccessCallback]) {\n                    [self shareSuccessCallback]([self message]);\n                }\n            }else{\n                //分享失败\n                if ([self shareFailCallback]) {\n                    [self shareFailCallback]([self message],[NSError errorWithDomain:@\"weixin_share\" code:[retDic[@\"result\"] intValue] userInfo:retDic]);\n                }\n            }\n            \n        }\n        return YES;\n    }else{\n        return NO;\n    }\n}\n@end\n"
  },
  {
    "path": "src/OpenShare.h",
    "content": "//\n//  OpenShare.h\n//  openshare\n//\n//  Created by LiuLogan on 15/5/13.\n//  Copyright (c) 2015年 OpenShare. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n#import <UIKit/UIKit.h>\n/**\n 分享类型，除了news以外，还可能是video／audio／app等。\n */\ntypedef enum : NSUInteger {\n    OSMultimediaTypeNews,\n    OSMultimediaTypeAudio,\n    OSMultimediaTypeVideo,\n    OSMultimediaTypeApp,\n    OSMultimediaTypeFile,\n    OSMultimediaTypeUndefined\n} OSMultimediaType;\n/**\n *  OSMessage保存分享消息数据。\n */\n@interface OSMessage : NSObject\n@property NSString* title;\n@property NSString* desc;\n@property NSString* link;\n@property UIImage *image;\n@property UIImage *thumbnail;\n@property OSMultimediaType multimediaType;\n//for 微信\n@property NSString* extInfo;\n@property NSString* mediaDataUrl;\n@property NSString* fileExt;\n@property (nonatomic, strong) NSData *file;   /// 微信分享gif/文件\n/**\n *  判断emptyValueForKeys的value都是空的，notEmptyValueForKeys的value都不是空的。\n *\n *  @param emptyValueForKeys    空值的key\n *  @param notEmptyValueForKeys 非空值的key\n *\n *  @return YES／NO\n */\n-(BOOL)isEmpty:(NSArray*)emptyValueForKeys AndNotEmpty:(NSArray*)notEmptyValueForKeys;\n@end\n\n\ntypedef void (^shareSuccess)(OSMessage * message);\ntypedef void (^shareFail)(OSMessage * message,NSError *error);\ntypedef void (^authSuccess)(NSDictionary * message);\ntypedef void (^authFail)(NSDictionary * message,NSError *error);\ntypedef void (^paySuccess)(NSDictionary * message);\ntypedef void (^payFail)(NSDictionary * message,NSError *error);\n/**\n 粘贴板数据编码方式，目前只有两种:\n 1. [NSKeyedArchiver archivedDataWithRootObject:data];\n 2. [NSPropertyListSerialization dataWithPropertyList:data format:NSPropertyListBinaryFormat_v1_0 options:0 error:&err];\n */\ntypedef enum : NSUInteger {\n    OSPboardEncodingKeyedArchiver,\n    OSPboardEncodingPropertyListSerialization,\n} OSPboardEncoding;\n@interface OpenShare : NSObject\n\n/**\n *  设置平台的key\n *\n *  @param platform 平台名称\n *  @param key      NSDictionary格式的key\n */\n+(void)set:(NSString*)platform Keys:(NSDictionary *)key;\n/**\n *  获取平台的key\n *\n *  @param platform 平台名称，每个category自行决定。\n *\n *  @return 平台的key(NSDictionary或nil)\n */\n+(NSDictionary *)keyFor:(NSString*)platform;\n\n/**\n *  通过UIApplication打开url\n *\n *  @param url 需要打开的url\n */\n+(void)openURL:(NSString*)url;\n+(BOOL)canOpen:(NSString*)url;\n/**\n *  处理被打开时的openurl\n *\n *  @param url openurl\n *\n *  @return 如果能处理，就返回YES。够则返回NO\n */\n+(BOOL)handleOpenURL:(NSURL*)url;\n+(shareSuccess)shareSuccessCallback;\n\n+(shareFail)shareFailCallback;\n\n+(void)setShareSuccessCallback:(shareSuccess)suc;\n\n+(void)setShareFailCallback:(shareFail)fail;\n\n+(NSURL*)returnedURL;\n\n+(NSDictionary*)returnedData;\n\n+(void)setReturnedData:(NSDictionary*)retData;\n\n+(NSMutableDictionary *)parseUrl:(NSURL*)url;\n\n+(void)setMessage:(OSMessage*)msg;\n\n+(OSMessage*)message;\n\n+(BOOL)beginShare:(NSString*)platform Message:(OSMessage*)msg Success:(shareSuccess)success Fail:(shareFail)fail;\n+(BOOL)beginAuth:(NSString*)platform Success:(authSuccess)success Fail:(authFail)fail;\n\n+(NSString*)base64Encode:(NSString *)input;\n+(NSString*)base64Decode:(NSString *)input;\n+(NSString*)CFBundleDisplayName;\n+(NSString*)CFBundleIdentifier;\n\n+(void)setGeneralPasteboard:(NSString*)key Value:(NSDictionary*)value encoding:(OSPboardEncoding)encoding;\n+(NSDictionary*)generalPasteboardData:(NSString*)key encoding:(OSPboardEncoding)encoding;\n+(NSString*)base64AndUrlEncode:(NSString *)string;\n+(NSString*)urlDecode:(NSString*)input;\n+ (UIImage *)screenshot;\n\n+(authSuccess)authSuccessCallback;\n+(authFail)authFailCallback;\n\n+(void)setPaySuccessCallback:(paySuccess)suc;\n\n+(void)setPayFailCallback:(payFail)fail;\n\n+(paySuccess)paySuccessCallback;\n+(payFail)payFailCallback;\n\n+ (NSData *)dataWithImage:(UIImage *)image;\n+ (NSData *)dataWithImage:(UIImage *)image scale:(CGSize)size;\n\n@end\n\n\n"
  },
  {
    "path": "src/OpenShare.m",
    "content": "//\n//  OpenShare.m\n//  openshare\n//\n//  Created by LiuLogan on 15/5/13.\n//  Copyright (c) 2015年 OpenShare. All rights reserved.\n//\n\n#import \"OpenShare.h\"\n\n@implementation OpenShare\n/**\n *  用于保存各个平台的key。每个平台需要的key／appid不一样，所以用dictionary保存。\n */\nstatic NSMutableDictionary *keys;\n                                  \n+(void)set:(NSString*)platform Keys:(NSDictionary *)key{\n    if (!keys) {\n        keys=[[NSMutableDictionary alloc] init];\n    }\n    keys[platform]=key;\n}\n+(NSDictionary *)keyFor:(NSString*)platform{\n    return [keys valueForKey:platform]?keys[platform]:nil;\n}\n\n+(void)openURL:(NSString*)url{\n    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:url]];\n}\n+(BOOL)canOpen:(NSString*)url{\n    return [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:url]];\n}\n+(BOOL)handleOpenURL:(NSURL*)openUrl{\n    returnedURL=openUrl;\n    for (NSString *key in keys) {\n        SEL sel=NSSelectorFromString([key stringByAppendingString:@\"_handleOpenURL\"]);\n        if ([self respondsToSelector:sel]) {\n            NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:\n                                        [self methodSignatureForSelector:sel]];\n            [invocation setSelector:sel];\n            [invocation setTarget:self];\n            [invocation invoke];\n            BOOL returnValue;\n            [invocation getReturnValue:&returnValue];\n            if (returnValue) {//如果这个url能处理，就返回YES，否则，交给下一个处理。\n                return YES;\n            }\n        }else{\n            NSLog(@\"fatal error: %@ is should have a method: %@\",key,[key stringByAppendingString:@\"_handleOpenURL\"]);\n        }\n    }\n    return NO;\n}\n\n#pragma mark 分享／auth以后，应用被调起，回调。\nstatic NSURL* returnedURL;\nstatic NSDictionary *returnedData; \nstatic shareSuccess shareSuccessCallback;\nstatic shareFail shareFailCallback;\n\nstatic authSuccess authSuccessCallback;\nstatic authFail authFailCallback;\n\nstatic paySuccess paySuccessCallback;\nstatic payFail payFailCallback;\n\nstatic OSMessage *message;\n+(shareSuccess)shareSuccessCallback{\n    return shareSuccessCallback;\n}\n+(shareFail)shareFailCallback{\n    return shareFailCallback;\n}\n+(void)setShareSuccessCallback:(shareSuccess)suc{\n    shareSuccessCallback=suc;\n}\n+(void)setShareFailCallback:(shareFail)fail{\n    shareFailCallback=fail;\n}\n+(void)setPaySuccessCallback:(paySuccess)suc{\n    paySuccessCallback=suc;\n}\n+(void)setPayFailCallback:(payFail)fail{\n    payFailCallback=fail;\n}\n+(paySuccess)paySuccessCallback{\n    return paySuccessCallback;\n}\n+(payFail)payFailCallback{\n    return payFailCallback;\n}\n+(NSURL*)returnedURL{\n    return returnedURL;\n}\n+(NSDictionary*)returnedData{\n    return returnedData;\n}\n+(void)setReturnedData:(NSDictionary*)retData{\n    returnedData=retData;\n}\n+(void)setMessage:(OSMessage*)msg{\n    message=msg;\n}\n+(OSMessage*)message{\n    return message?:[[OSMessage alloc] init];\n}\n+(authSuccess)authSuccessCallback{\n    return authSuccessCallback;\n}\n+(authFail)authFailCallback{\n    return authFailCallback;\n}\n+(BOOL)beginShare:(NSString*)platform Message:(OSMessage*)msg Success:(shareSuccess)success Fail:(shareFail)fail{\n    if ([self keyFor:platform]) {\n        message=msg;\n        shareSuccessCallback=success;\n        shareFailCallback=fail;\n        return YES;\n    }else{\n        NSLog(@\"please connect%@ before you can share to it!!!\",platform);\n        return NO;\n    }\n}\n+(BOOL)beginAuth:(NSString*)platform Success:(authSuccess)success Fail:(authFail)fail{\n    if ([self keyFor:platform]) {\n        authSuccessCallback=success;\n        authFailCallback=fail;\n        return YES;\n    }else{\n        NSLog(@\"please connect%@ before you can share to it!!!\",platform);\n        return NO;\n    }\n}\n\n#pragma mark 公共实用方法\n+(NSMutableDictionary *)parseUrl:(NSURL*)url{\n    NSMutableDictionary *queryStringDictionary = [[NSMutableDictionary alloc] init];\n    NSArray *urlComponents = [[url query] componentsSeparatedByString:@\"&\"];\n    \n    for (NSString *keyValuePair in urlComponents)\n    {\n        NSRange range=[keyValuePair rangeOfString:@\"=\"];\n        [queryStringDictionary setObject:range.length>0?[keyValuePair substringFromIndex:range.location+1]:@\"\" forKey:(range.length?[keyValuePair substringToIndex:range.location]:keyValuePair)];\n    }\n    return queryStringDictionary;\n}\n+(NSString*)base64Encode:(NSString *)input{\n    return  [[input dataUsingEncoding:NSUTF8StringEncoding] base64EncodedStringWithOptions:0];\n}\n+(NSString*)base64Decode:(NSString *)input{\n   return [[NSString alloc ] initWithData:[[NSData alloc] initWithBase64EncodedString:input options:0] encoding:NSUTF8StringEncoding];\n}\n+(NSString*)CFBundleDisplayName{\n    return [[[NSBundle mainBundle] infoDictionary] objectForKey:@\"CFBundleName\"];\n}\n+(NSString*)CFBundleIdentifier{\n    return [[[NSBundle mainBundle] infoDictionary] objectForKey:@\"CFBundleIdentifier\"];\n}\n+(void)setGeneralPasteboard:(NSString*)key Value:(NSDictionary*)value encoding:(OSPboardEncoding)encoding{\n    if (value&&key) {\n        NSData *data=nil;\n        NSError *err;\n        switch (encoding) {\n            case OSPboardEncodingKeyedArchiver:\n                data=[NSKeyedArchiver archivedDataWithRootObject:value];\n                break;\n            case OSPboardEncodingPropertyListSerialization:\n                data=[NSPropertyListSerialization dataWithPropertyList:value format:NSPropertyListBinaryFormat_v1_0 options:0 error:&err];\n            default:\n                NSLog(@\"encoding not implemented\");\n                break;\n        }\n        if (err) {\n            NSLog(@\"error when NSPropertyListSerialization: %@\",err);\n        }else if (data){\n            [[UIPasteboard generalPasteboard] setData:data forPasteboardType:key];\n        }\n    }\n}\n+(NSDictionary*)generalPasteboardData:(NSString*)key encoding:(OSPboardEncoding)encoding{\n    NSData *data=[[UIPasteboard generalPasteboard] dataForPasteboardType:key];\n    NSDictionary *dic=nil;\n    if (data) {\n        NSError *err;\n        switch (encoding) {\n            case OSPboardEncodingKeyedArchiver:\n                dic= [NSKeyedUnarchiver unarchiveObjectWithData:data];\n                break;\n            case OSPboardEncodingPropertyListSerialization:\n                dic=[NSPropertyListSerialization propertyListWithData:data options:0 format:0 error:&err];\n            default:\n                break;\n        }\n        if (err) {\n            NSLog(@\"error when NSPropertyListSerialization: %@\",err);\n        }\n    }\n    return dic;\n}\n+(NSString*)base64AndUrlEncode:(NSString *)string{\n    return  [[self base64Encode:string] stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLHostAllowedCharacterSet]];\n}\n+(NSString*)urlDecode:(NSString*)input{\n   return [[input stringByReplacingOccurrencesOfString:@\"+\" withString:@\" \"]stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];\n}\n/**\n *  截屏功能。via：http://stackoverflow.com/a/8017292/3825920\n *\n *  @return 对当前窗口截屏。（支付宝可能需要）\n */\n+ (UIImage *)screenshot\n{\n    CGSize imageSize = CGSizeZero;\n    \n    UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;\n    if (UIInterfaceOrientationIsPortrait(orientation)) {\n        imageSize = [UIScreen mainScreen].bounds.size;\n    } else {\n        imageSize = CGSizeMake([UIScreen mainScreen].bounds.size.height, [UIScreen mainScreen].bounds.size.width);\n    }\n    \n    UIGraphicsBeginImageContextWithOptions(imageSize, NO, 0);\n    CGContextRef context = UIGraphicsGetCurrentContext();\n    for (UIWindow *window in [[UIApplication sharedApplication] windows]) {\n        CGContextSaveGState(context);\n        CGContextTranslateCTM(context, window.center.x, window.center.y);\n        CGContextConcatCTM(context, window.transform);\n        CGContextTranslateCTM(context, -window.bounds.size.width * window.layer.anchorPoint.x, -window.bounds.size.height * window.layer.anchorPoint.y);\n        if (orientation == UIInterfaceOrientationLandscapeLeft) {\n            CGContextRotateCTM(context, M_PI_2);\n            CGContextTranslateCTM(context, 0, -imageSize.width);\n        } else if (orientation == UIInterfaceOrientationLandscapeRight) {\n            CGContextRotateCTM(context, -M_PI_2);\n            CGContextTranslateCTM(context, -imageSize.height, 0);\n        } else if (orientation == UIInterfaceOrientationPortraitUpsideDown) {\n            CGContextRotateCTM(context, M_PI);\n            CGContextTranslateCTM(context, -imageSize.width, -imageSize.height);\n        }\n        if ([window respondsToSelector:@selector(drawViewHierarchyInRect:afterScreenUpdates:)]) {\n            [window drawViewHierarchyInRect:window.bounds afterScreenUpdates:YES];\n        } else {\n            [window.layer renderInContext:context];\n        }\n        CGContextRestoreGState(context);\n    }\n    \n    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();\n    UIGraphicsEndImageContext();\n    return image;\n}\n\n+ (NSData *)dataWithImage:(UIImage *)image {\n    return UIImageJPEGRepresentation(image, 1);\n}\n\n+ (NSData *)dataWithImage:(UIImage *)image scale:(CGSize)size {\n    UIGraphicsBeginImageContext(size);\n    [image drawInRect:CGRectMake(0,0, size.width, size.height)];\n    UIImage* scaledImage =UIGraphicsGetImageFromCurrentImageContext();\n    UIGraphicsEndImageContext();\n    return UIImageJPEGRepresentation(scaledImage, 1);\n}\n\n- (UIImage *)scaleImage:(UIImage *)image toSize:(CGSize)size{\n       UIGraphicsBeginImageContext(size);\n    [image drawInRect:CGRectMake(0,0, size.width, size.height)];\n    UIImage* scaledImage =UIGraphicsGetImageFromCurrentImageContext();\n    UIGraphicsEndImageContext();\n    return scaledImage;\n}\n\n@end\n\n@implementation OSMessage\n-(BOOL)isEmpty:(NSArray*)emptyValueForKeys AndNotEmpty:(NSArray*)notEmptyValueForKeys{\n    @try {\n        if (emptyValueForKeys) {\n            for (NSString *key in emptyValueForKeys) {\n                if ([self valueForKeyPath:key]) {\n                    return NO;\n                }\n            }\n        }\n        if (notEmptyValueForKeys) {\n            for (NSString *key in notEmptyValueForKeys) {\n                if (![self valueForKey:key]) {\n                    return NO;\n                }\n            }\n        }\n        return YES;\n    }\n    @catch (NSException *exception) {\n        NSLog(@\"isEmpty error:\\n %@\",exception);\n        return NO;\n    }\n}\n\n@end\n"
  },
  {
    "path": "src/OpenShareHeader.h",
    "content": "//\n//  OpenShareHeader.h\n//  openshare\n//\n//  Created by LiuLogan on 15/5/15.\n//  Copyright (c) 2015年 OpenShare <http://openshare.gfzj.us/>. All rights reserved.\n//\n\n#ifndef openshare_OpenShareHeader_h\n#define openshare_OpenShareHeader_h\n#import \"OpenShare+QQ.h\"\n#import \"OpenShare+Weibo.h\"\n#import \"OpenShare+Weixin.h\"\n#import \"OpenShare+Renren.h\"\n#import \"OpenShare+Alipay.h\"\n#endif\n"
  },
  {
    "path": "src/SocietyLoginManager.h",
    "content": "//\n//  CallBackTestManager.h\n//  MarryNovo\n//\n//  Created by Mot on 15/11/4.\n//  Copyright © 2015年 Facebook. All rights reserved.\n//\n\n#import \"RCTBridgeModule.h\"\n\n//重写NSLog,Debug模式下打印日志和当前行数\n#if DEBUG\n#define NSLog(FORMAT, ...) fprintf(stderr,\"\\nfunction:%s line:%d\\n%s\\n\", __FUNCTION__, __LINE__, [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]);\n#else\n#define NSLog(FORMAT, ...) nil\n#endif\n\n#define UIColorFromRGB(rgbValue) [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 green:((float)((rgbValue & 0xFF00) >> 8))/255.0 blue:((float)(rgbValue & 0xFF))/255.0 alpha:1.0]\n\n//DEBUG  模式下打印日志,当前行 并弹出一个警告\n#ifdef DEBUG\n#   define ULog(fmt, ...)  { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:[NSString stringWithFormat:@\"%s\\n [Line %d] \", __PRETTY_FUNCTION__, __LINE__] message:[NSString stringWithFormat:fmt, ##__VA_ARGS__]  delegate:nil cancelButtonTitle:@\"Ok\" otherButtonTitles:nil]; [alert show]; }\n#else\n#   define ULog(...)\n#endif\n\n@interface SocietyLoginManager : NSObject <RCTBridgeModule>\n\n@end\n"
  },
  {
    "path": "src/SocietyLoginManager.m",
    "content": "//\n//  CallBackTestManager.m\n//  MarryNovo\n//\n//  Created by Mot on 15/11/4.\n//  Copyright © 2015年 Facebook. All rights reserved.\n//\n\n#import \"SocietyLoginManager.h\"\n#import \"RCTEventDispatcher.h\"\n#import \"OpenShareHeader.h\"\n\n@implementation SocietyLoginManager\n@synthesize bridge = _bridge;\n\nRCT_EXPORT_MODULE();\n\nRCT_EXPORT_METHOD(call) {\n  [self _callback];\n}\n\nRCT_EXPORT_METHOD(qqLogin) {\n  [self _callQQLogin];\n}\n\nRCT_EXPORT_METHOD(wechatLogin) {\n  [self _callWeichatLogin];\n}\n\nRCT_EXPORT_METHOD(weiboLogin) {\n  [self _callWeiboLogin];\n}\n\n\n- (void)_callback {\n  NSLog(@\"Success call native modules\");\n}\n\n-(void)_callQQLogin {\n  \n  [OpenShare QQAuth:@\"get_user_info\" Success:^(NSDictionary *message) {\n    [self.bridge.eventDispatcher sendDeviceEventWithName:@\"managerCallback\"\n                                                    body:@{\n                                                           @\"title\": @\"QQ登录成功\",\n                                                           @\"res\": message\n                                                           }\n     ];\n    \n  } Fail:^(NSDictionary *message, NSError *error) {\n    [self.bridge.eventDispatcher sendDeviceEventWithName:@\"managerCallback\"\n                                                    body:@{\n                                                           @\"title\": @\"QQ登录失败\",\n                                                           @\"res\": message,\n                                                           @\"error\": error,\n                                                           }\n     ];\n  }];\n}\n\n-(void)_callWeichatLogin {\n  [OpenShare WeixinAuth:@\"snsapi_userinfo\" Success:^(NSDictionary *message) {\n    [self.bridge.eventDispatcher sendDeviceEventWithName:@\"managerCallback\"\n                                                    body:@{\n                                                           @\"title\": @\"微信登录成功\",\n                                                           @\"res\": message\n                                                           }\n     ];\n    \n  } Fail:^(NSDictionary *message, NSError *error) {\n    [self.bridge.eventDispatcher sendDeviceEventWithName:@\"managerCallback\"\n                                                    body:@{\n                                                           @\"title\": @\"微信登录失败\",\n                                                           @\"res\": message,\n                                                           @\"error\": error,\n                                                           }\n     ];\n  }];\n}\n\n//处理 返回数据中的expirationDate值，因为值的格式有问题，转换成 string 后才能符合 json 的格式要求。 ********开始********\n//Commit by Parry at 2016-01-26\n\n- (NSMutableDictionary*)change: (NSDictionary *)message {\n\n  NSMutableDictionary* data = [message mutableCopy];\n  if ([message objectForKey:@\"expirationDate\"]) {\n    \n    NSDateFormatter *dateToStringFormatter = [[NSDateFormatter alloc] init];\n    [dateToStringFormatter setDateFormat:@\"yyyy-MM-dd HH:mm:ss\"];\n    \n    NSDate *date= [data objectForKey:@\"expirationDate\"];\n    NSString *strDate = [dateToStringFormatter stringFromDate:date];\n    \n    data = [message mutableCopy];\n    \n    [data setObject:strDate forKey:@\"expirationDate\"];\n  }\n  return data;\n  \n}\n\n//处理 返回数据中的expirationDate值，因为值的格式有问题，转换成 string 后才能符合 json 的格式要求。 ********结束********\n\n-(void)_callWeiboLogin {\n  [OpenShare WeiboAuth:@\"all\" redirectURI:@\"http://sns.whalecloud.com\" Success:^(NSDictionary *message) {\n    \n    NSMutableDictionary* data = [self change:message];\n    \n    [self.bridge.eventDispatcher sendDeviceEventWithName:@\"managerCallback\"\n                                                    body:@{\n                                                           @\"title\": @\"微博登录成功\",\n                                                           @\"res\": data,\n                                                           }\n     ];\n  } Fail:^(NSDictionary *message, NSError *error) {\n    \n    NSMutableDictionary* data = [self change:message];\n    \n    [self.bridge.eventDispatcher sendDeviceEventWithName:@\"managerCallback\"\n                                                    body:@{\n                                                           @\"title\": @\"微博登录失败\",\n                                                           @\"res\": data,\n                                                           @\"error\": error\n                                                           }\n     ];\n  }];\n}\n\n@end\n"
  }
]