iOS-微信-分享


一.微信原生的分享--准備工作.

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM