当前位置:首页 » 电脑基础知识

iOS:开放平台引用(二)--微信分享

2014-10-10 16:10 本站整理 浏览(14769)

iOS:开放平台引用(二)--微信分享,有需要的朋友可以参考下。


API说明
类说明:
微信分享sdk文件:libWeChatSDK.a , WXApi.h , WXApiObject.h

WXApi.h文件内容主要是调用微信分享的相关方法、接口;

WXApiObject.h文件内容主要是app跟微信通信时,请求、回应时的信息对象。

具体参考网址:微信开放平台中的分享收藏功能,ios开发手册

// WXApiObject.h 文件对象
BaseReq	               该类为微信终端SDK所有请求类的基类
BaseResp	       该类为微信终端SDK所有响应类的基类
GetMessageFromWXReq	微信终端向第三方程序请求提供内容请求类型。
GetMessageFromWXResp	微信终端向第三方程序请求提供内容,第三方程序向微信终端返回处理结果类型。
LaunchFromWXReq	        微信终端打开第三方程序请求类型
SendMessageToWXReq	第三方程序发送消息至微信终端程序的接口
SendMessageToWXResp	第三方程序发送SendMessageToWXReq至微信,微信处理完成后返回的处理结果类型。
ShowMessageFromWXReq	微信通知第三方程序,要求第三方程序显示的消息结构体。
ShowMessageFromWXResp	微信通知第三方程序,要求第三方程序显示或处理某些消息,第三方程序处理完后向微信终端发送的处理结果。
WXApi	                微信Api接口函数类
<WXApiDelegate>	接收并处理来自微信终端程序的事件消息
WXAppExtendObject	多媒体消息中包含的App扩展数据对象
WXEmoticonObject	多媒体消息中包含的表情数据对象
WXFileObject	多媒体消息中包含的文件数据对象
WXImageObject	多媒体消息中包含的图片数据对象
WXMediaMessage	多媒体消息结构体
WXMusicObject	多媒体消息中包含的音乐数据对象
WXVideoObject	多媒体消息中包含的视频数据对象
WXWebpageObject	多媒体消息中包含的网页数据对象

使用过程

准备过程:
1.登记并选择移动应用进行设置后,将获得AppID

2.下载相关sdk文件、添加到项目中(注:如果使用XCode 4.3及以下版本,使用libWeChatSDK.a;如果使用XCode 4.5及以上版本,使用libWeChatSDK_armv7_v7s.a);

3.设置项目的URL Scheme,详见《respond to a custom URL scheme》

代码调用:
a.向微信注册:

[WXApi registerApp:@"wxd930ea5d5a258f4f" withDescription:@"demo 2.0"];

说明:

1.在做微信、微博分享时,需要先想他们官方申请AppKey,AppKey对他们来说,就相当iOS里的UDID一样,是他们唯一区分注册了的应用的key,微信或微博官方可以通过AppKey可以查询所注册的App的信息;
2.这段代码,其作用是告诉微信是这个AppKey相关联的应用发起的分享,同时它的另一个作用就相当于在系统里面注册一个地址,别的应用可以通过这个地址打开这个应用;就像微信分享成功以后回调到自己的应用,就是通过这个AppKey回调的

b.处理微信通过URL启动App时传递的数据
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
    BOOL isSuc = [WXApi handleOpenURL:url delegate:self];
    NSLog(@"url %@ isSuc %d",url,isSuc == YES ? 1 : 0);
    return  isSuc;
}
说明:

--[WXApi handleOpenURL:url delegate:self]; 中delegate,<WXApiDelegate>对象,用来接收微信触发的消息;

--这方法在app发送信息到微信,或者微信求情app,都用到,必须实现;

c.app---->微信

1.分享到会话/朋友圈/收藏
// 2. 分享到不同场景,对应SendMessageToWXReq不同场景scene  
WXSceneSession = 0, //回话
WXSceneTimeline = 1, //朋友圈
WXSceneFavorite = 2, //收藏

2.分享内容到微信,

对象:发送:SendMessageToWXReq + WX...Object,回复:SendMessageToWXResp

方法:发送:sendReq: 回复:onResp

// 1. 向微信分享内容对象是SendMessageToWXReq 、分享完收到回复的是对象SendMessageToWXResp
//  例子.分享文本到朋友圈
- (void) sendTextContent
{
SendMessageToWXReq* req = [[[SendMessageToWXReq alloc] init]autorelease];
req.text = @"文本内容";
req.bText = YES;
req.scene = _scene;

[WXApi sendReq:req];
}
// 例子 分享图片到朋友圈
WXMediaMessage *message = [WXMediaMessage message];
[message setThumbImage:[UIImage imageNamed:@"res5thumb.png"]];

WXImageObject *ext = [WXImageObject object];
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"res5thumb" ofType:@"png"];
ext.imageData = [NSData dataWithContentsOfFile:filePath];
UIImage* image = [UIImage imageWithData:ext.imageData];
ext.imageData = UIImagePNGRepresentation(image);
message.mediaObject = ext;

SendMessageToWXReq* req = [[[SendMessageToWXReq alloc] init]autorelease];
req.bText = NO;
req.message = message;
req.scene = _scene;

[WXApi sendReq:req];
}
// 分享其他类型内容,只是把WXImageObject 换成WXWebpageObject(链接)、WXMusicObject、WXVideoObject……等

// 微信回复
// 微信操作完,app收到的回复,SendMessageToWXResp对象
-(void) onResp:(BaseResp*)resp
{
if([resp isKindOfClass:[SendMessageToWXResp class]])
{
NSString *strTitle = [NSString stringWithFormat:@"发送媒体消息结果"];
NSString *strMsg = [NSString stringWithFormat:@"errcode:%d", resp.errCode];

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:strTitle message:strMsg delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
[alert show];
[alert release];
}
}
d.微信---->app

在使用微信聊天的过程中我们会发现,当你通过“加号”呼出更多功能时,界面会出现更多操作导航,然而最后一个按钮并非某是个功能,而是添加操作,通过该功能你可以添加更多第三方平台工具,例如熟悉的大众点评,团购大全,爱奇艺,墨迹天气等,添加后你可以直接在微信中快速跳转(目前版本的微信没有发现这种跳转到别的app功能)

1.处理收到来自微信的请求:

方法:onReq收到微信请求,若需要回复之后调用sendResp
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    if (alertView.tag == 1000) {
        RespForWeChatViewController* controller = [[RespForWeChatViewController alloc]autorelease];
        controller.delegate = self;
        [self.viewController presentModalViewController:controller animated:YES];
    }
}
if([req isKindOfClass:[GetMessageFromWXReq class]])
    {
        // 微信请求App提供内容, 需要app提供内容后使用sendRsp返回
        NSString *strTitle = [NSString stringWithFormat:@"微信请求App提供内容"];
        NSString *strMsg = @"微信请求App提供内容,App要调用sendResp:GetMessageFromWXResp返回给微信";
        
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:strTitle message:strMsg delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
        alert.tag = 1000;
        [alert show];
        [alert release];
    }
    else if([req isKindOfClass:[ShowMessageFromWXReq class]])
    {
        ShowMessageFromWXReq* temp = (ShowMessageFromWXReq*)req;
        WXMediaMessage *msg = temp.message;
        
        //显示微信传过来的内容
        WXAppExtendObject *obj = msg.mediaObject;
        
        NSString *strTitle = [NSString stringWithFormat:@"微信请求App显示内容"];
        NSString *strMsg = [NSString stringWithFormat:@"标题:%@ \n内容:%@ \n附带信息:%@ \n缩略图:%u bytes\n\n", msg.title, msg.description, obj.extInfo, msg.thumbData.length];
        
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:strTitle message:strMsg delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
        [alert show];
        [alert release]; 
    }
    else if([req isKindOfClass:[LaunchFromWXReq class]])
    {
        //从微信启动App
        NSString *strTitle = [NSString stringWithFormat:@"从微信启动"];
        NSString *strMsg = @"这是从微信启动的消息";
        
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:strTitle message:strMsg delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
        [alert show];
        [alert release];
    }
3.回复微信请求:


对象:请求:GetMessageFromWXReq回复:GetMessageFromWXResp+ WX...Objec

方法:请求:onReq: 回复:sendResp

-(void) RespTextContent
{
    GetMessageFromWXResp* resp = [[[GetMessageFromWXResp alloc] init] autorelease];
    resp.text = @"文本内容";
    resp.bText = YES;
    
    [WXApi sendResp:resp];
}
- (void) RespImageContent
{
    WXMediaMessage *message = [WXMediaMessage message];
    [message setThumbImage:[UIImage imageNamed:@"res5thumb.png"]];
    
    WXImageObject *ext = [WXImageObject object];
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"res5thumb" ofType:@"png"];
    ext.imageData = [NSData dataWithContentsOfFile:filePath];
    message.mediaObject = ext;
    
    GetMessageFromWXResp* resp = [[[GetMessageFromWXResp alloc] init] autorelease];
    resp.message = message;
    resp.bText = NO;
    
    [WXApi sendResp:resp];
}
// 其他格式内容回复类似上文,只不过对象不同