专栏名称: 3033
iOS开发
目录
相关文章推荐
51好读  ›  专栏  ›  3033

轻量级社会化分享openShare源码解析

3033  · 掘金  ·  · 2017-12-14 00:35

正文

请到「今天看啥」查看全文


      * @param self  需要添加关联的对象
     *  @param UIButtonHandlerKey     添加的唯一标识符
     *  @param handler   关联的对象
     *  @param OBJC_ASSOCIATION_COPY_NONATOMIC  关联的策略,是个枚举

这句话可以理解为,以OBJC_ASSOCIATION_COPY_NONATOMIC的关联策略为自己添加一个标识符为UIButtonHandlerKey的handler对象。 点进这句话我们可以看到系统对应的关联策略的枚举,有以下几种形式

    typedef OBJC_ENUM(uintptr_t, objc_AssociationPolicy) {
     OBJC_ASSOCIATION_ASSIGN = 0,           //< Specifies a weak reference to the associated object.
    OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1, //< Specifies a strong reference to the associated object.
                                               The association is not made atomically.
    OBJC_ASSOCIATION_COPY_NONATOMIC = 3,   //< Specifies that the associated object is copied.
                                              The association is not made atomically.
    OBJC_ASSOCIATION_RETAIN = 01401,       //< Specifies a strong reference to the associated object.
                                              The association is made atomically.
    OBJC_ASSOCIATION_COPY = 01403          //< Specifies that the associated object is copied.
                                              The association is made atomically.
};

OK,接下来在看对应的添加的callActionHandler事件中的代码

ActionBlock handler = (ActionBlock)objc_getAssociatedObject(self, &UIButtonHandlerKey);
  if (handler) {//判断block是否为null 防止crash
        handler(sender);
    }

ActionBlock通过标示符UIButtonHandlerKey,得到的之前的管理属性,然后判断如果block不为空,进行下一步的操作。

#####OpenShare+Weibo 我们从调用处着手开始分析一下源码中的一些方法。登录和分享,最先调起的两个方法分别为: 登录

+(void)WeiboAuth:(NSString*)scope redirectURI:(NSString*)redirectURI Success:(authSuccess)success Fail:(authFail)fail;

分享调起方法

+(void)shareToWeibo:(OSMessage*)msg Success:(shareSuccess)success Fail:(shareFail)fail;

点击这两个方法我们首先进入到的是OpenShare+Weibo,一个专门用来处理微博的分类中,我们可以看到一共有以下4个方法:

+(void)connectWeiboWithAppKey:(NSString *)appKey;
+(BOOL)isWeiboInstalled;
/**
 *  分享到微博,微博只支持三种类型:文本/图片/链接。根据OSMessage自动判定想分享的类型。
 *
 *  @param msg     要分享的msg
 *  @param success 分享成功回调
 *  @param fail    分享失败回调
 */
+(void)shareToWeibo:(OSMessage*)msg Success:(shareSuccess)success Fail:(shareFail)fail;

/**
 *  微博登录OAuth
 *
 *  @param scope       scope,如果不填写,默认是all
 *  @param redirectURI 必须填写,可以通过http://open.weibo.com/apps/402180334/info/advanced编辑(后台不验证,但是必须填写一致)
 *  @param success     登录成功回调
 *  @param fail        登录失败回调
 */
+(void)WeiboAuth:(NSString*)scope redirectURI:(NSString*)redirectURI Success:(authSuccess)success Fail:(authFail)fail;

分别用来注册微博相关的key,判断是否安装以及主要的分享登录。 平台和key的设置

每个分类中设置不同的schema,区分平台
+(void)connectWeiboWithAppKey:(NSString *)appKey{
    [self set:schema Keys:@{@"appKey":appKey}];
}
调用openShare的设置方法
+(void)set:(NSString*)platform Keys:(NSDictionary *)key{
    if (!keys) {
        keys=[[NSMutableDictionary alloc] init];
    }
    keys[platform]=key;
}
  • 分享的方法 下面通过分享方法,介绍一下核心的分享的实现方式
+(void)shareToWeibo:(OSMessage*)msg Success:(shareSuccess)success Fail:(shareFail)fail{
    if (![self beginShare:schema Message:msg Success:success Fail:fail]) {
        return;
    }
    NSDictionary *message;
    //根据不同的分享形式 设置不同的字典格式 
    if ([msg isEmpty:@[@"link" ,@"image"] AndNotEmpty:@[@"title"] ]) {
        //text类型分享
        message= @{
                   @"__class" : @"WBMessageObject",
                   @"text" :msg.title
                   };
    }else if ([msg isEmpty:@[@"link" ] AndNotEmpty:@[@"title",@"image"] ]) {
        //图片类型分享
        message=@{
                  @"__class" : @"WBMessageObject",
                  @"imageObject":@{
                          @"imageData":[self dataWithImage:msg.image]
                          },
                  @"text" : msg.title
                  };
        
    }else if ([msg isEmpty:nil AndNotEmpty:@[@"title",@"link" ,@"image"] ]) {
        //链接类型分享
        message=@{
                  @"__class" : @"WBMessageObject",
                  @"mediaObject":@{
                          @"__class" : @"WBWebpageObject",
                          @"description": msg.desc?:msg.title,
                          @"objectID" : @"identifier1",
                          @"thumbnailData":msg.thumbnail ? [self dataWithImage:msg.thumbnail] : [self dataWithImage:msg.image  scale:CGSizeMake(100, 100)],    //三目运算
                          @"title"






请到「今天看啥」查看全文


推荐文章
画啦啦少儿美术  ·  学画画后,孩子身上的哪些能力更强大了?
8 年前
儿童摄影引导技巧  ·  这组负能量照片 一夜之间刷爆朋友圈!
8 年前
台海军事热点  ·  惊人的社会定律,百读不厌,太精辟!
8 年前