美文网首页前端文章收集
微信分享实践-2019

微信分享实践-2019

作者: 勇往直前888 | 来源:发表于2019-03-22 15:13 被阅读20次

方案选择

这个方案的好处是经过了友盟的二次开发,将微信分心,QQ分享,新浪分享等各种各样的分享综合在一起考虑,经过包装,提供了相对统一的接口。另外,友盟统计,友盟崩溃收集等一般都要用的,统一一套,相对比较省心。

这个方案的好处是链路短了,复杂度降低了。另外,微信提供的接口也挺简单好用的,并没有比友盟提供的接口复杂。

选择: 经过评估,本次项目组决定采用方案2,直接集成微信API。根据网上的说明文档,用起来很方便。这里根据实际情况,选择了一种相对比较简单的方法。

接入方式

  • 使用CocoaPods的方式,比较省心。只要在工程的Podfile里面添加pod 'WechatOpenSDK'就可以了。在使用的地方,只要#import <WXApi.h>就可以了

  • 是否需要添加URL scheme? ===》 因为这里的需求是只要分享出去就可以,不需要额外的交互,所以就没有必要添加了。这里添加的URL scheme作用,是让微信反过来调用我们的APP

  • 是否需要“重写AppDelegatehandleOpenURLopenURL方法”?
    ===》 大多数情况下没有必要。这里的作用是微信拉起我们的APP,向我们传递的数据可以在这两个方法里面拿到。
    我们当前的需求只是分享出去,并不要求微信回传的信息,所以在我们的项目里面就不需要了。

因为我们的需求只需要分享出去就可以,并不关心微信的反馈,所以可以很简单,不需要做很多额外的工作(微信接入文档中几乎80%的工作不需要做)

注册

这个是免不了的,在微信开发者注册之后,就会拿到一个appId,(在友盟中叫appKey)。在程序开始的时候注册一下,或者在使用的时候再注册,都是可以的。

/*! @brief WXApi的成员函数,向微信终端程序注册第三方应用。
 *
 * 需要在每次启动第三方应用程序时调用。第一次调用后,会在微信的可用应用列表中出现,默认开启MTA数据上报。
 * iOS7及以上系统需要调起一次微信才会出现在微信的可用应用列表中。
 * @attention 请保证在主线程中调用此函数
 * @param appid 微信开发者ID
 * @param typeFlag 应用支持打开的文件类型
 * @return 成功返回YES,失败返回NO。
 */
+ (BOOL)registerApp:(NSString *)appid;

检查是否安装了微信

/*! @brief 检查微信是否已被用户安装
 *
 * @return 微信已安装返回YES,未安装返回NO。
 */
+ (BOOL)isWXAppInstalled;

检查微信版本是否支持分享。微信版本太低,是不能分享的。

/*! @brief 判断当前微信的版本是否支持OpenApi
 *
 * @return 支持返回YES,不支持返回NO。
 */
+ (BOOL)isWXAppSupportApi;

分享网页

需要额外提供的信息包括网页的url,标题,描述内容,图标等。可以对开发者网站上的例子代码做简单封装,就可以直接用了。

// 网页分享
+ (void)shareWebpage:(NSString *)url title:(NSString *)title content:(NSString *)content icon:(nullable NSString *)icon scene:(int)scene {
    // 分享出去,没有返回信息
    WXWebpageObject *webpageObject = [WXWebpageObject object];
    webpageObject.webpageUrl = url;
    
    WXMediaMessage *message = [WXMediaMessage message];
    message.title = title;
    message.description = content;
    [message setThumbImage:[UIImage imageNamed: icon]];
    message.mediaObject = webpageObject;
    
    SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init];
    req.bText = NO;
    req.message = message;
    req.scene = scene;
    [WXApi sendReq:req];
}
  • 可以再简单一点,分享时的图标一般都是用app的图标代替的。这里的icon参数可以去掉,固定写成app的图标名称。

  • 这里的scene参数,表示分享的地方,常用的就是对话框和朋友圈。这里,给了一个枚举值,但是没有自定义类型,所以要用int

/*! @brief 请求发送场景
 *
 */
enum WXScene {
    WXSceneSession          = 0,   /**< 聊天界面    */
    WXSceneTimeline         = 1,   /**< 朋友圈     */
    WXSceneFavorite         = 2,   /**< 收藏       */
    WXSceneSpecifiedSession = 3,   /**< 指定联系人  */
};

分享文本

这个比较简单,只要将文本内容抽出来就可以了

// 文本分享
+ (void)shareText:(NSString *)text scene:(int)scene {
    SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init];
    req.bText = YES;
    req.text = text;
    req.scene = scene;
    [WXApi sendReq:req];
}

分享图片

图片名称,图标名称

// 图片分享
+ (void)shareImage:(NSString *)imageName icon:(nullable NSString *)iconName scene:(int)scene {
    WXImageObject *imageObject = [WXImageObject object];
    UIImage *image = [UIImage imageNamed:imageName];
    imageObject.imageData = UIImageJPEGRepresentation(image, 0.7);
    
    WXMediaMessage *message = [WXMediaMessage message];
    [message setThumbImage:[UIImage imageNamed: iconName]];
    message.mediaObject = imageObject;
    
    SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init];
    req.bText = NO;
    req.message = message;
    req.scene = scene;
    [WXApi sendReq:req];
}

分享音乐、视频、小程序暂时没有需求,不封装。

用到的一些数据对象

  • 分享动作发起对象;或者说是消息发送对象
#pragma mark - SendMessageToWXReq
/*! @brief 第三方程序发送消息至微信终端程序的消息结构体
 *
 * 第三方程序向微信发送信息需要传入SendMessageToWXReq结构体,信息类型包括文本消息和多媒体消息,
 * 分别对应于text和message成员。调用该方法后,微信处理完信息会向第三方程序发送一个处理结果。
 * @see SendMessageToWXResp
 */
@interface SendMessageToWXReq : BaseReq
/** 发送消息的文本内容
 * @note 文本长度必须大于0且小于10K
 */
@property (nonatomic, copy) NSString *text;
/** 发送消息的多媒体内容
 * @see WXMediaMessage
 */
@property (nonatomic, strong) WXMediaMessage *message;
/** 发送消息的类型,包括文本消息和多媒体消息两种,两者只能选择其一,不能同时发送文本和多媒体消息 */
@property (nonatomic, assign) BOOL bText;
/** 发送的目标场景,可以选择发送到会话(WXSceneSession)或者朋友圈(WXSceneTimeline)。 默认发送到会话。
 * @see WXScene
 */
@property (nonatomic, assign) int scene;
/** 指定发送消息的人
 * @note WXSceneSpecifiedSession时有效
 */
@property (nonatomic, copy, nullable) NSString *toUserOpenId;
@end
  • 多媒体消息对象
#pragma mark - WXMediaMessage

/*! @brief 多媒体消息结构体
 *
 * 用于微信终端和第三方程序之间传递消息的多媒体消息内容
 */
@interface WXMediaMessage : NSObject

+ (WXMediaMessage *)message;

/** 标题
 * @note 长度不能超过512字节
 */
@property (nonatomic, copy) NSString *title;
/** 描述内容
 * @note 长度不能超过1K
 */
@property (nonatomic, copy) NSString *description;
/** 缩略图数据
 * @note 大小不能超过32K
 */
@property (nonatomic, strong, nullable) NSData *thumbData;
/**
 * @note 长度不能超过64字节
 */
@property (nonatomic, copy, nullable) NSString *mediaTagName;
/**
 *
 */
@property (nonatomic, copy, nullable) NSString *messageExt;
@property (nonatomic, copy, nullable) NSString *messageAction;
/**
 * 多媒体数据对象,可以为WXImageObject,WXMusicObject,WXVideoObject,WXWebpageObject等。
 */
@property (nonatomic, strong) id mediaObject;

/*! @brief 设置消息缩略图的方法
 *
 * @param image 缩略图
 * @note 大小不能超过64K
 */
- (void)setThumbImage:(UIImage *)image;

@end
  • 网页对象
#pragma mark - WXWebpageObject
/*! @brief 多媒体消息中包含的网页数据对象
 *
 * 微信终端和第三方程序之间传递消息中包含的网页数据对象。
 * @see WXMediaMessage
 */
@interface WXWebpageObject : NSObject
/*! @brief 返回一个WXWebpageObject对象
 *
 * @note 返回的WXWebpageObject对象是自动释放的
 */
+ (WXWebpageObject *)object;

/** 网页的url地址
 * @note 不能为空且长度不能超过10K
 */
@property (nonatomic, copy) NSString *webpageUrl;

@end
  • 图片对象
#pragma mark - WXImageObject
/*! @brief 多媒体消息中包含的图片数据对象
 *
 * 微信终端和第三方程序之间传递消息中包含的图片数据对象。
 * @note imageData成员不能为空
 * @see WXMediaMessage
 */
@interface WXImageObject : NSObject
/*! @brief 返回一个WXImageObject对象
 *
 * @note 返回的WXImageObject对象是自动释放的
 */
+ (WXImageObject *)object;

/** 图片真实数据内容
 * @note 大小不能超过25M
 */
@property (nonatomic, strong) NSData *imageData;

@end

另外还有音乐对象,视频对象,小程序对象,这次没有封装,就不列举了。

小结

  • 从数据对象的设计来看,整体还是非常清晰的。
    发送对象包含多媒体消息对象;
    多媒体消息对象包含具体的内容对象,比如网页,图片,音乐,视频,小程序等等。

  • 这次只需要分享就可以了,所以比较简洁

  • 如果要知道分享是否成功,那么要设置代理,在代理函数中取结果,就相对复杂一点了。

#pragma mark - WXApiDelegate
/*! @brief 接收并处理来自微信终端程序的事件消息
 *
 * 接收并处理来自微信终端程序的事件消息,期间微信界面会切换到第三方应用程序。
 * WXApiDelegate 会在handleOpenURL:delegate:中使用并触发。
 */
@protocol WXApiDelegate <NSObject>
@optional

/*! @brief 收到一个来自微信的请求,第三方应用程序处理完后调用sendResp向微信发送结果
 *
 * 收到一个来自微信的请求,异步处理完成后必须调用sendResp发送处理结果给微信。
 * 可能收到的请求有GetMessageFromWXReq、ShowMessageFromWXReq等。
 * @param req 具体请求内容,是自动释放的
 */
- (void)onReq:(BaseReq*)req;



/*! @brief 发送一个sendReq后,收到微信的回应
 *
 * 收到一个来自微信的处理结果。调用一次sendReq后会收到onResp。
 * 可能收到的处理结果有SendMessageToWXResp、SendAuthResp等。
 * @param resp具体的回应内容,是自动释放的
 */
- (void)onResp:(BaseResp*)resp;

@end

响应基类中有错误码和错误信息

#pragma mark - BaseResp
/*! @brief 该类为微信终端SDK所有响应类的基类
 *
 */
@interface BaseResp : NSObject
/** 错误码 */
@property (nonatomic, assign) int errCode;
/** 错误提示字符串 */
@property (nonatomic, copy) NSString *errStr;
/** 响应类型 */
@property (nonatomic, assign) int type;

@end
  • 至于自己的APP和微信之间要相互调用,相互传数据,那么就要设置URL Scheme等内容。

相关文章

网友评论

    本文标题:微信分享实践-2019

    本文链接:https://www.haomeiwen.com/subject/ustqvqtx.html