一.微信原生的分享--准備工作.
1. 需要申請微信AppId.
2. 導入系統架包.
SDK文件包括 libWeChatSDK.a,WXApi.h,WXApiObject.h,WechatAuthSDK.四個.
3.導入必要的系統庫.
SystemConfiguration.framework,
libz.dylib,
libsqlite3.0.dylib,
libc++.dylib,
CoreTelephoy.framework (坑一: 這個庫是必要的,但是微信官方文檔中沒有說到要導入)
4. 該項目中的Bundle Identifier 應該填向微信注冊的Bundle Identifier
5. 注冊微信 (回調的時候用到,告訴微信,從微信返回到哪個APP)
Target --> info --> URL Types --> +按鈕 --> 填寫identifier 和 URL Schemes. 前一個是標識符,一般填@"weixin".后一個是注冊的微信appId. 比如"wx19a984b788a8a0b1".(注釋: 假的appid)
6. 添加微信白名單
info.plist --> 右擊 --> open as --> source Code --> 添加白名單
我是在<key>CFBundleVersion</key>這一行上面添加的. 注意保持正確的鍵值對.別插錯了.
二. 代碼部分.
1.
AppDelegate.h中
(1) 導入
#import "WXApi.h"
(2) 遵守協議
WXApiDelegate
2. WXApiDelegate.m中
1.注冊微信
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. // 注冊微信 [WXApi registerApp:@"wxbbf0646591e4a6d0" withDescription:@"測試"]; return YES; }
2.跳轉處理
//被廢棄的方法. 但是在低版本中會用到.建議寫上 - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { return [WXApi handleOpenURL:url delegate:self]; } //被廢棄的方法. 但是在低版本中會用到.建議寫上 - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url { return [WXApi handleOpenURL:url delegate:self]; } //新的方法 - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options { return [WXApi handleOpenURL:url delegate:self]; }
3.微信回調
- (void)onResp:(BaseResp *)resp
{
/*
WXSuccess = 0, 成功
WXErrCodeCommon = -1, 普通錯誤類型
WXErrCodeUserCancel = -2, 用戶點擊取消並返回
WXErrCodeSentFail = -3, 發送失敗
WXErrCodeAuthDeny = -4, 授權失敗
WXErrCodeUnsupport = -5, 微信不支持
*/
NSString * strMsg = [NSString stringWithFormat:@"errorCode: %d",resp.errCode];
NSLog(@"strMsg: %@",strMsg);
NSString * errStr = [NSString stringWithFormat:@"errStr: %@",resp.errStr];
NSLog(@"errStr: %@",errStr);
NSString * strTitle;
//判斷是微信消息的回調 --> 是支付回調回來的還是消息回調回來的.
if ([resp isKindOfClass:[SendMessageToWXResp class]])
{
// 判斷errCode 進行回調處理
if (resp.errCode == 0)
{
strTitle = [NSString stringWithFormat:@"分享成功"];
}
}
//發出通知 從微信回調回來之后,發一個通知,讓請求支付的頁面接收消息,並且展示出來,或者進行一些自定義的展示或者跳轉
NSNotification * notification = [NSNotification notificationWithName:@"WXShare" object:resp.errStr];
[[NSNotificationCenter defaultCenter] postNotification:notification];
}
3.在分享按鈕的控制器.m頁面
(1) 導入
#import "WXApi.h"
#import "WechatAuthSDK.h"
#import "WXApiObject.h"
/**
scene: 發送的目標場景,可以選擇發送到會話(WXSceneSession)或者朋友圈(WXSceneTimeline),默認發送到會話.
1.分享或收藏的目標場景,通過修改scene場景值實現。
2.發送到聊天界面——WXSceneSession
3.發送到朋友圈——WXSceneTimeline
4.添加到微信收藏——WXSceneFavorite
*/
/** bText:
發送消息的類型.包括文本消息和多媒體消息兩種.兩者只能選擇其一.不能同時發送文本和多媒體消息.
*/
// 接收分享完成回調通知
// 接收分享回調通知 //監聽通知 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(getOrderPayResult:) name:@"WXShare" object:nil]; [self basicSetting]; // AppID:wxbbf0646591e4a6d0 // 檢查是否裝了微信 if ([WXApi isWXAppInstalled]) { }
(2) 分享文字
- (void)buttonClciked { SendMessageToWXReq * req = [[SendMessageToWXReq alloc] init]; req.text = @"分享的內容"; req.bText = YES; req.scene = WXSceneSession; [WXApi sendReq:req]; }
(3)分享圖文
- (void)ButtonOneClciked { // WXMediaMessage * message = [WXMediaMessage message]; [message setThumbImage:[UIImage imageNamed:@"seeall@1x"]]; WXImageObject * imageObject = [WXImageObject object]; NSString * filePath = [[NSBundle mainBundle] pathForResource:@"seeall@1x" ofType:@"png"]; imageObject.imageData = [NSData dataWithContentsOfFile:filePath]; message.mediaObject = imageObject; SendMessageToWXReq * req = [[SendMessageToWXReq alloc] init]; req.bText = NO; req.message = message; req.scene = WXSceneTimeline; [WXApi sendReq:req]; }
(4)分享鏈接
- (void)buttonTwoClciked { WXMediaMessage * message = [WXMediaMessage message]; message.title = @"標題"; message.description = @"副標題"; [message setThumbImage:[UIImage imageNamed:@"seeall@1x"]]; WXWebpageObject * webpageObject = [WXWebpageObject object]; webpageObject.webpageUrl = @"www.baidu.com"; message.mediaObject = webpageObject; SendMessageToWXReq * req = [[SendMessageToWXReq alloc] init]; req.bText = NO; req.message = message; req.scene = WXSceneSession; [WXApi sendReq:req]; }
三.代碼
1. Appdelegate.h
#import <UIKit/UIKit.h> #import "WXApi.h" @interface AppDelegate : UIResponder <UIApplicationDelegate,WXApiDelegate> @property (strong, nonatomic) UIWindow *window; @end
2.Appdelegate.m
#import "AppDelegate.h" @interface AppDelegate () @end @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. // 注冊微信 [WXApi registerApp:@"wxbbf0646591e4a6d0" withDescription:@"測試"]; return YES; } #pragma mark 跳轉處理 //被廢棄的方法. 但是在低版本中會用到.建議寫上 - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { return [WXApi handleOpenURL:url delegate:self]; } //被廢棄的方法. 但是在低版本中會用到.建議寫上 - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url { return [WXApi handleOpenURL:url delegate:self]; } //新的方法 - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options { return [WXApi handleOpenURL:url delegate:self]; } #pragma mark 微信回調方法 - (void)onResp:(BaseResp *)resp { /* WXSuccess = 0, 成功 WXErrCodeCommon = -1, 普通錯誤類型 WXErrCodeUserCancel = -2, 用戶點擊取消並返回 WXErrCodeSentFail = -3, 發送失敗 WXErrCodeAuthDeny = -4, 授權失敗 WXErrCodeUnsupport = -5, 微信不支持 */ NSString * strMsg = [NSString stringWithFormat:@"errorCode: %d",resp.errCode]; NSLog(@"strMsg: %@",strMsg); NSString * errStr = [NSString stringWithFormat:@"errStr: %@",resp.errStr]; NSLog(@"errStr: %@",errStr); NSString * strTitle; //判斷是微信消息的回調 --> 是支付回調回來的還是消息回調回來的. if ([resp isKindOfClass:[SendMessageToWXResp class]]) { // 判斷errCode 進行回調處理 if (resp.errCode == 0) { strTitle = [NSString stringWithFormat:@"分享成功"]; } } //發出通知 從微信回調回來之后,發一個通知,讓請求支付的頁面接收消息,並且展示出來,或者進行一些自定義的展示或者跳轉 NSNotification * notification = [NSNotification notificationWithName:@"WXShare" object:resp.errStr]; [[NSNotificationCenter defaultCenter] postNotification:notification]; } @end
3. ViewController.h
#import <UIKit/UIKit.h> @interface ViewController : UIViewController @end
4. ViewController.m
#import "ViewController.h" #import "WXApi.h" #import "WechatAuthSDK.h" #import "WXApiObject.h" @interface ViewController () @end @implementation ViewController #pragma mark - 生命周期 #pragma mark viewDidLoad - (void)viewDidLoad { [super viewDidLoad]; // 接收分享回調通知 //監聽通知 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(getOrderPayResult:) name:@"WXShare" object:nil]; [self basicSetting]; // AppID:wxbbf0646591e4a6d0 // 檢查是否裝了微信 if ([WXApi isWXAppInstalled]) { } UIButton * button = [UIButton buttonWithType:UIButtonTypeCustom]; button.backgroundColor = [UIColor redColor]; button.frame = CGRectMake(100, 100, 100, 100); [button addTarget:self action:@selector(buttonClciked) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:button]; UIButton * button1 = [UIButton buttonWithType:UIButtonTypeCustom]; button1.backgroundColor = [UIColor redColor]; button1.frame = CGRectMake(100, 210, 100, 100); [button1 addTarget:self action:@selector(ButtonOneClciked) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:button1]; UIButton * button2 = [UIButton buttonWithType:UIButtonTypeCustom]; button2.backgroundColor = [UIColor redColor]; button2.frame = CGRectMake(100, 320, 100, 100); [button2 addTarget:self action:@selector(buttonTwoClciked) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:button2]; } - (void)getOrderPayResult:(NSNotification *)notification { // 注意通知內容類型的匹配 if (notification.object == 0) { NSLog(@"分享成功"); } } /** scene: 發送的目標場景,可以選擇發送到會話(WXSceneSession)或者朋友圈(WXSceneTimeline),默認發送到會話. 1.分享或收藏的目標場景,通過修改scene場景值實現。 2.發送到聊天界面——WXSceneSession 3.發送到朋友圈——WXSceneTimeline 4.添加到微信收藏——WXSceneFavorite */ /** bText: 發送消息的類型.包括文本消息和多媒體消息兩種.兩者只能選擇其一.不能同時發送文本和多媒體消息. */ #pragma mark - 系統代理 #pragma mark - 點擊事件 #pragma mark 文字類型分享 - (void)buttonClciked { /** SendMessageToWXReq 文字分享內容的類 1. text 文字分享的內容 2. bText 發送消息的類型 3. scene 發送的目標場景 */ SendMessageToWXReq * req = [[SendMessageToWXReq alloc] init]; req.text = @"分享的內容"; req.bText = YES; req.scene = WXSceneSession; [WXApi sendReq:req]; } #pragma mark 圖片類型分享 - (void)ButtonOneClciked { /** WXMediaMessage 多媒體分享的類 1. setThumbImage 設置縮略圖 */ WXMediaMessage * message = [WXMediaMessage message]; [message setThumbImage:[UIImage imageNamed:@"black"]]; WXImageObject * imageObject = [WXImageObject object]; NSString * filePath = [[NSBundle mainBundle] pathForResource:@"seeall@1x" ofType:@"png"]; imageObject.imageData = [NSData dataWithContentsOfFile:filePath]; message.mediaObject = imageObject; SendMessageToWXReq * req = [[SendMessageToWXReq alloc] init]; req.bText = NO; req.message = message; req.scene = WXSceneSession; [WXApi sendReq:req]; } #pragma mark 網頁類型分享 - (void)buttonTwoClciked { WXMediaMessage * message = [WXMediaMessage message]; message.title = @"標題"; message.description = @"副標題"; [message setThumbImage:[UIImage imageNamed:@"seeall@1x"]]; WXWebpageObject * webpageObject = [WXWebpageObject object]; webpageObject.webpageUrl = @"www.baidu.com"; message.mediaObject = webpageObject; SendMessageToWXReq * req = [[SendMessageToWXReq alloc] init]; req.bText = NO; req.message = message; req.scene = WXSceneSession; [WXApi sendReq:req]; } #pragma mark - 實現方法 #pragma mark 基本設置 - (void)basicSetting { self.title = @""; } #pragma mark - setter & getter @end