iOS-新浪微博,QQ,微信分享原生接入記錄

MY BLOG--->

為什么我用原生的分享?

主要一個原因是如果不想把自己的appKey暴露給第三方

第二一個就是如果用第三方的app的體積會比原生接入的大那么10MB左右吧(我當初在公司用過,記得用友盟的分享打包出來,比用原生接入的app體積大了10MB左右.)

<br />
下面是集成微博,微信,qq具體步奏,和一些坑點
<br />

demo下載地址

demo下載

一.材料準備

首先我們需要調料有 (點擊鏈接下載~)
新浪微博sdk
騰訊sdk
微信sdk

  • 新浪微微博我們需要的文件如圖箭頭所指


    Snip20160702_1.png
  • 微信我們需要的文件如下圖箭頭所指


    Snip20160702_2.png
  • QQ分享我們需要的文件如下

Snip20160702_3.png

二.將我們需要的文件放到工程中去

1.進入工程文件文件夾

Snip20160702_5.png

2.新建Lib文件夾

說明:</br>1.下載下來的微信Sdk中我們需要的"OpenSDK1.7.1"文件下面的所有文件我們將"OpenSDK1.7.1"文件直接復制到我們新建的Lib文件,但是為了區分我會將文件夾名稱修改為"WeChatSDK_1.7.1" </br>2.QQ的分享我們只需要"TencentOpenAPI.framework"這個文件,但是我們還是要給他新建一個自己的文件夾"Tencent3.1.0" </br>3.新浪微博我們就直接將libWeiboSDK文件夾復制到Lib文件夾下面就ok了!

如圖

Snip20160702_6.png

3.將Lib文件夾添加到工程中去

Snip20160702_7.png
Snip20160702_8.png
Snip20160702_9.png

三.添加SDK依賴的系統庫文件

"3333"表示新浪微博,qq,微信都依賴的

1.微博依賴的系統庫文件

"1"QuartzCore.framework // 獨有
"2"ImageIO.framework // 獨有
"3"SystemConfiguration.framework "3333"
"4"Security.framework "共同------QQ和微博"
"5"CoreTelephony.framework "共同------QQ和微博"
"6"CoreText.framework
"7"CoreGraphics.framework "共同------QQ和微博"
"8"libz.dylib "33333"
"9"libsqlite3.dylib "33333"

2.微信

SystemConfiguration.framework,"333"
libz.dylib,"3333"
libsqlite3.0.dylib,"3333"
libc++.dylib。// 獨有

3.QQ

"1"”Security.framework”, "共同-----QQ和微博"
"2"“libiconv.dylib”,// 獨有
"3"“SystemConfiguration.framework”,"共同-----3"
"4"“CoreGraphics.Framework”、"共同------QQ和微博"
"5"“libsqlite3.dylib”、"共同-------3"
"6"“CoreTelephony.framework”、"共同-----QQ和微博"
"7"“libstdc++.dylib”、// 獨有
"8"“libz.dylib”"共同-----3"

4.總共我們需要添加的系統庫文件

"1"”Security.framework”
"2"“libiconv.dylib”
"3"“SystemConfiguration.framework”,
"4"“CoreGraphics.Framework”、
"5"“libsqlite3.dylib”
"6"“CoreTelephony.framework”
"7"“libstdc++.dylib”
"8"“libz.dylib”
"9"libc++.dylib
"10"QuartzCore.framework
"11"ImageIO.framework
"12"CoreText.framework

5.添加系統庫文件例子

  • 以添加CoreText.framework為例,如下圖
Snip20160702_10.png
Snip20160702_11.png

6.新建framework文件夾

  • 添加到項目中的系統庫文件會自動放在工程文件的最頂上面如圖
Snip20160702_12.png
  • 新建framework文件將所有系統庫文件放在里面
Snip20160702_13.png

四.添加 -ObjC,編譯選項

在工程中引入靜態庫之后,需要在編譯時添加 -ObjC,編譯選項避免靜態庫中類加載不全造成程序崩潰. </br>方法:Target->Build Settings->Linking下 Other Linker Flags 項添加 -ObjC

Snip20160702_14.png

五.添加白名單

iOS 9開始系統策略更新,限制了http協議的訪問,此外應用需要在“Info.plist”中將要使用的URL Schemes列為白名單,才可正常檢查其他應用是否安裝。</br> 所以為了正常跳轉到微信,微博,qq,我們需要在Info.plist,中添加如下代碼

<key>LSApplicationQueriesSchemes</key>
    <array>
        <string>sinaweibohd</string>
        <string>sinaweibo</string>
        <string>sinaweibosso</string>
        <string>weibosdk</string>
        <string>weibosdk2.5</string>
        <string>mqqapi</string>
        <string>mqq</string>
        <string>mqqOpensdkSSoLogin</string>
        <string>mqqconnect</string>
        <string>mqqopensdkdataline</string>
        <string>mqqopensdkgrouptribeshare</string>
        <string>mqqopensdkfriend</string>
        <string>mqqopensdkapi</string>
        <string>mqqopensdkapiV2</string>
        <string>mqqopensdkapiV3</string>
        <string>mqzoneopensdk</string>
        <string>wtloginmqq</string>
        <string>wtloginmqq2</string>
        <string>mqqwpa</string>
        <string>mqzone</string>
        <string>mqzonev2</string>
        <string>mqzoneshare</string>
        <string>wtloginqzone</string>
        <string>mqzonewx</string>
        <string>mqzoneopensdkapiV2</string>
        <string>mqzoneopensdkapi19</string>
        <string>mqzoneopensdkapi</string>
        <string>mqzoneopensdk</string>
        <string>alipay</string>
        <string>alipayshare</string>
    </array>

流程圖如下

Snip20160702_18.png
Snip20160702_19.png
Snip20160702_20.png
  • 如果沒有添加白名單,就可能出現,明明手機上已經安裝了微博,分享時卻說:"未安裝微博客戶端,是否現在去下載?" 如下圖.
sddsds.jpg

添加白名單,文案參考

六.添加 URL Tyes

添加這個主要作用是告訴QQ,微信,微博到時候分享完了,返回哪個應用
1.微信的話就是 Indentifer:weixin URL Schemes: 微信id
2.微博是 Indentifer:weibo URL Schemes: wb+微博id
3.QQ Indentifer: idtencentopenapi URL Schemes: tencent + quid
上面說的xxxid是你們公司在各個開放平臺上申請的應用id,問你們老大要賬號然后進去看就行了

  • demo里面的,如圖
Snip20160702_23.png

七.代碼實現

我是用一個WTShareManager 統一管理微信,微博,QQ三者的分享 </br> 在WTShareManager 里面統一注冊三者的app,并遵守三者的代理協議,然后三者分享時所需要的Image, title,url,summary, 用WTShareContentItem管理.外界根據WTShareManager 的WTShareType,然后傳入WTShareContentItem進行各渠道的分享.

  • WTShareManager.h
//
//  WTShareManager.h
//  WTShare
//
//  Created by Mac on 16/7/1.
//  Copyright ? 2016年 wutong. All rights reserved.
//

#import <Foundation/Foundation.h>

#import "WeiboSDK.h"
#import "WXApi.h"
#import <TencentOpenAPI/TencentOAuth.h>
#import <TencentOpenAPI/QQApiInterfaceObject.h>
#import <TencentOpenAPI/QQApiInterface.h>

@class WTShareContentItem;

typedef NS_ENUM(NSInteger, WTShareType) {
    WTShareTypeWeiBo = 0,   // 新浪微博
    WTShareTypeQQ,          // QQ好友
    WTShareTypeQQZone,      // QQ空間
    WTShareTypeWeiXinTimeline,// 朋友圈
    WTShareTypeWeiXinSession,// 微信朋友
    WTShareTypeWeiXinFavorite,// 微信收藏
};

typedef NS_ENUM(NSInteger, WTShareWeiXinErrCode) {
    WTShareWeiXinErrCodeSuccess = 0,   // 新浪微博
    WTShareWeiXinErrCodeCancel = -2,          // QQ好友
    
};

typedef void(^WTShareResultlBlock)(NSString * shareResult);

@interface WTShareManager : NSObject <WBHttpRequestDelegate,WeiboSDKDelegate,WXApiDelegate,TencentSessionDelegate>



+ (instancetype)shareWTShareManager;
// 判斷QQ分享是否成功
+ (void)didReceiveTencentUrl:(NSURL *)url;
+ (void)wt_shareWithContent:(WTShareContentItem *)contentObj shareType:(WTShareType)shareType shareResult:(WTShareResultlBlock)shareResult;


@end

  • WTShareManager.m
//
//  WTShareManager.m
//  WTShare
//
//  Created by Mac on 16/7/1.
//  Copyright ? 2016年 wutong. All rights reserved.
//

#import "WTShareManager.h"
#import "WTShareContentItem.h"



#define kAppKey         @"2045436852"
#define kRedirectURI    @"http://www.sina.com"
#define kWeixinAppId    @"wxd930ea5d5a258f4f"
#define kTencentAppId   @"222222"

#define kWTShareQQSuccess @"0"
#define kWTShareQQFail      @"-4"

@interface WTShareManager ()
{
    TencentOAuth *_tencentOAuth;
}
@property (nonatomic, copy)WTShareResultlBlock shareResultlBlock;
@end

@implementation WTShareManager

static WTShareManager * _instence;

+ (instancetype)allocWithZone:(struct _NSZone *)zone
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _instence = [super allocWithZone:zone];
        [_instence setRegisterApps];
    });
    return _instence;
}
+ (instancetype)shareWTShareManager
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _instence = [[self alloc]init];
        [_instence setRegisterApps];
    });
    return _instence;
}
- (id)copyWithZone:(NSZone *)zone
{
    return _instence;
}


// 注冊appid
- (void)setRegisterApps
{
    // 注冊Sina微博
    [WeiboSDK registerApp:kAppKey];
    // 微信注冊
    [WXApi registerApp:kWeixinAppId];
    
    // 注冊QQ
    _tencentOAuth = [[TencentOAuth alloc]initWithAppId:kTencentAppId andDelegate:self];
}



#pragma mark - 分享方法------
+ (void)wt_shareWithContent:(WTShareContentItem *)contentObj shareType:(WTShareType)shareType shareResult:(WTShareResultlBlock)shareResult
{
    WTShareManager * shareManager = [WTShareManager shareWTShareManager];
    shareManager.shareResultlBlock = shareResult;
    
    [self wt_shareWithContent:contentObj shareType:shareType];
}
+ (void)wt_shareWithContent:(WTShareContentItem *)contentObj shareType:(WTShareType)shareType
{
    [WTShareManager shareWTShareManager];
    
    switch (shareType) {
        case WTShareTypeWeiBo:
        {
            WBMessageObject *message = [WBMessageObject message];
            message.text = contentObj.sinaSummary;
            
            if(contentObj.bigImage){
                WBImageObject *webpage = [WBImageObject object];
                webpage.imageData =  UIImageJPEGRepresentation(contentObj.bigImage, 1.0f);
                
                message.imageObject = webpage;
            }
            
            WBSendMessageToWeiboRequest *request = [WBSendMessageToWeiboRequest requestWithMessage:message];
            
            [WeiboSDK sendRequest:request];
            break;
        }
        case WTShareTypeQQ:
        {
            NSString * shareTitle = [NSString string];
            shareTitle = contentObj.qqTitle ? contentObj.qqTitle : contentObj.title;
            
            //分享跳轉URL
            NSString *urlt = contentObj.urlString;
            QQApiNewsObject * newsObj ;
            
            if (contentObj.urlImageString) {
                newsObj   = [QQApiNewsObject objectWithURL:[NSURL URLWithString:urlt] title:shareTitle description:contentObj.summary previewImageURL:[NSURL URLWithString:contentObj.urlImageString]];
            }else if(contentObj.thumbImage){
                // 如果分享的是圖片的話 不能太大所以如果后臺過來的的圖片太大的話 可以調節如下的倍數
                NSData *imageData = UIImageJPEGRepresentation(contentObj.thumbImage, 1.0);
                newsObj = [QQApiNewsObject objectWithURL:[NSURL URLWithString:urlt] title:shareTitle description:contentObj.summary previewImageData:imageData];
            }
            
            SendMessageToQQReq *req = [[SendMessageToQQReq alloc]init];
            req.message = newsObj;
            req.type = ESENDMESSAGETOQQREQTYPE;
            //將內容分享到qq
            [QQApiInterface sendReq:req];
            
            
            break;
            
        }
        case WTShareTypeQQZone:
        {
            //分享跳轉URL
            NSString *urlt = contentObj.urlString;
            
            QQApiNewsObject * newsObj ;
            if (contentObj.urlImageString) {
                newsObj   = [QQApiNewsObject objectWithURL:[NSURL URLWithString:urlt] title:contentObj.title description:contentObj.summary previewImageURL:[NSURL URLWithString:contentObj.urlImageString]];
            }else if(contentObj.thumbImage){
                
                NSData * imageData = UIImagePNGRepresentation(contentObj.thumbImage);
                
                newsObj = [QQApiNewsObject objectWithURL:[NSURL URLWithString:urlt] title:contentObj.title description:contentObj.summary previewImageData:imageData];
            }
            
            SendMessageToQQReq *req = [[SendMessageToQQReq alloc]init];
            req.message = newsObj;
            req.type = ESENDMESSAGETOQQREQTYPE;
        
            [QQApiInterface SendReqToQZone:req];
            break;
            
            break;
        }
        case WTShareTypeWeiXinTimeline: // 微信朋友圈
        {
            WXMediaMessage * message = [WXMediaMessage message];
            message.title = contentObj.weixinPyqtitle.length >0 ? contentObj.weixinPyqtitle : contentObj.title;
            [message setThumbImage:contentObj.thumbImage];
            message.description = contentObj.summary;
            WXWebpageObject * ext = [WXWebpageObject object];
            ext.webpageUrl = contentObj.urlString;
            message.mediaObject = ext;
            SendMessageToWXReq * req = [[SendMessageToWXReq alloc]init];
            req.bText = NO;
            req.message = message;
            req.scene = WXSceneTimeline;
            [WXApi sendReq:req];

            
            break;
        }
        case WTShareTypeWeiXinSession:
        {
            WXMediaMessage * message = [WXMediaMessage message];
            message.title = contentObj.title;
            
            [message setThumbImage:contentObj.thumbImage];
            message.description = contentObj.summary;
            WXWebpageObject * ext = [WXWebpageObject object];
            ext.webpageUrl = contentObj.urlString;
            message.mediaObject = ext;
            
            SendMessageToWXReq *req = [[SendMessageToWXReq alloc]init];
            req.bText = NO;
            req.message = message;
            req.scene = WXSceneSession;
            [WXApi sendReq:req];
            
            break;
        }
        case WTShareTypeWeiXinFavorite:
        {
            WXMediaMessage * message = [WXMediaMessage message];
            message.title = contentObj.title;
            
            [message setThumbImage:contentObj.thumbImage];
            message.description = contentObj.summary;
            WXWebpageObject * ext = [WXWebpageObject object];
            ext.webpageUrl = contentObj.urlString;
            message.mediaObject = ext;
            
            SendMessageToWXReq *req = [[SendMessageToWXReq alloc]init];
            req.bText = NO;
            req.message = message;
            req.scene = WXSceneFavorite;
            [WXApi sendReq:req];
            break;
        }
    
        default:
            break;
    }
}


#pragma mark - WeiboSDKDelegate 從新浪微博那邊分享過來傳回一些數據調用的方法
/**
 收到一個來自微博客戶端程序的請求
 
 收到微博的請求后,第三方應用應該按照請求類型進行處理,處理完后必須通過 [WeiboSDK sendResponse:] 將結果回傳給微博
 @param request 具體的請求對象
 */
- (void)didReceiveWeiboRequest:(WBBaseRequest *)request{}
/**
 收到一個來自微博客戶端程序的響應
 
 收到微博的響應后,第三方應用可以通過響應類型、響應的數據和 WBBaseResponse.userInfo 中的數據完成自己的功能
 @param response 具體的響應對象
 */
- (void)didReceiveWeiboResponse:(WBBaseResponse *)response
{
    /**
     
     WeiboSDKResponseStatusCodeSuccess               = 0,//成功
     WeiboSDKResponseStatusCodeUserCancel            = -1,//用戶取消發送
     WeiboSDKResponseStatusCodeSentFail              = -2,//發送失敗
     WeiboSDKResponseStatusCodeAuthDeny              = -3,//授權失敗
     WeiboSDKResponseStatusCodeUserCancelInstall     = -4,//用戶取消安裝微博客戶端
     WeiboSDKResponseStatusCodePayFail               = -5,//支付失敗
     WeiboSDKResponseStatusCodeShareInSDKFailed      = -8,//分享失敗 詳情見response UserInfo
     WeiboSDKResponseStatusCodeUnsupport             = -99,//不支持的請求
     WeiboSDKResponseStatusCodeUnknown               = -100,
     */
    
    if (response.statusCode == WeiboSDKResponseStatusCodeSuccess) {
        //NSLog(@"微博----分享成功!!!");
        self.shareResultlBlock(@"微博----分享成功!!!");
        
    }else if(response.statusCode == WeiboSDKResponseStatusCodeUserCancel)
    {
//        NSLog(@"微博----用戶取消發送");
        self.shareResultlBlock(@"微博----用戶取消發送");
    }else if (response.statusCode == WeiboSDKResponseStatusCodeSentFail){
//        NSLog(@"微博----發送失敗!");
        self.shareResultlBlock(@"微博----發送失敗!");
    }
    
     
//    NSLog(@"%@", response);
}


#pragma mark - WXApiDelegate 從微信那邊分享過來傳回一些數據調用的方法


/*! @brief 發送一個sendReq后,收到微信的回應
 *
 * 收到一個來自微信的處理結果。調用一次sendReq后會收到onResp。
 * 可能收到的處理結果有SendMessageToWXResp、SendAuthResp等。
 * @param resp具體的回應內容,是自動釋放的
 */
-(void) onResp:(BaseResp*)resp
{
    
    // 成功回來
    // errCode  0
    // type     0
    
    // 取消分享回來
    // errCode -2
    // type 0
    
    if (resp.errCode == WTShareWeiXinErrCodeSuccess) {
//        NSLog(@"微信----分享成功!!");
        self.shareResultlBlock(@"微信----分享成功!!");
    }else{
//        NSLog(@"微信----用戶取消分享!!");
        self.shareResultlBlock(@"微信----用戶取消分享!!");
    }
//    NSLog(@"%@", resp);
     
}

#pragma mark - 判斷qq是否分享成功
+ (void)didReceiveTencentUrl:(NSURL *)url
{
    NSString * urlStr = url.absoluteString;
    NSArray * array = [urlStr componentsSeparatedByString:@"error="];
    if (array.count > 1) {
        NSString * lastStr = [array lastObject];
        NSArray * lastStrArray = [lastStr componentsSeparatedByString:@"&"];
        
        NSString * resultStr = [lastStrArray firstObject];
        if ([resultStr isEqualToString:kWTShareQQSuccess]) {
//            NSLog(@"QQ------分享成功!");
            [WTShareManager shareWTShareManager].shareResultlBlock(@"QQ------分享成功!");
        }else if ([resultStr isEqualToString:kWTShareQQFail]){
//            NSLog(@"QQ------分享失敗!");
            [WTShareManager shareWTShareManager].shareResultlBlock(@"QQ------分享失敗!");
        }
        
    }
     
}

@end

WTShareContentItem.h

//
//  WTShareContentItem.h
//  WTShare
//
//  Created by Mac on 16/7/1.
//  Copyright ? 2016年 wutong. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

@interface WTShareContentItem : NSObject
@property (strong, nonatomic) UIImage *thumbImage;
@property (strong, nonatomic) UIImage *bigImage;
@property (strong, nonatomic) NSString *imageType;
@property (strong, nonatomic) NSString *title;

@property (strong, nonatomic) NSString *weixinPyqtitle;
@property (strong, nonatomic) NSString *qqTitle;

@property (strong, nonatomic) NSString *urlString;//
@property (strong, nonatomic) NSString *urlImageString;// QQ,QQ空間分享加載圖片用的
@property (strong, nonatomic) NSURL *url;
@property (strong, nonatomic) NSString *summary;
@property (strong, nonatomic) NSString *type;

@property (nonatomic, assign)BOOL isImageShareQQ; // yes 代表用圖片 NO代表用URL
@property (nonatomic, strong)NSString * sinaSummary;


+ (WTShareContentItem *)shareWTShareContentItem;

@end

WTShareContentItem.m

//
//  WTShareContentItem.m
//  WTShare
//
//  Created by Mac on 16/7/1.
//  Copyright ? 2016年 wutong. All rights reserved.
//

#import "WTShareContentItem.h"

@implementation WTShareContentItem


+ (WTShareContentItem *)shareWTShareContentItem
{
    WTShareContentItem * item = [[WTShareContentItem alloc]init];
    item.title = @"分享測試";
    item.thumbImage = [UIImage imageNamed:@"tu"];
    item.bigImage = [UIImage imageNamed:@"tu"];
    item.summary = @"哈哈哈哈哈哈哈哈哈2!!!";
    item.urlString = @"https://www.baidu.com";
    item.sinaSummary = @"一般情況新浪微博的Summary和微信,QQ的是不同的,新浪微博的是一般帶鏈接的,而且總共字數不能超過140字";
    return item;
}


@end


AppDelegate.m

//
//  AppDelegate.m
//  WTShare
//
//  Created by Mac on 16/6/30.
//  Copyright ? 2016年 wutong. All rights reserved.
//

#import "AppDelegate.h"
#import "WTShareManager.h"

@interface AppDelegate ()

@end

@implementation AppDelegate


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    return YES;
}


#pragma mark - 從別的應用回來

// iOS9 以上用這個方法接收
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options
{
    NSDictionary * dic = options;
    NSLog(@"%@", dic);
    if ([options[UIApplicationOpenURLOptionsSourceApplicationKey] isEqualToString:@"com.sina.weibo"]) {
        NSLog(@"新浪微博~");
    
        return [WeiboSDK handleOpenURL:url delegate:[WTShareManager shareWTShareManager]];
    }else if ([options[UIApplicationOpenURLOptionsSourceApplicationKey] isEqualToString:@"com.tencent.xin"]){
        
        return [WXApi handleOpenURL:url delegate:[WTShareManager shareWTShareManager]];
    }else if ([options[UIApplicationOpenURLOptionsSourceApplicationKey] isEqualToString:@"com.tencent.mqq"]){
        
        [WTShareManager didReceiveTencentUrl:url];
        return [TencentOAuth HandleOpenURL:url];
    }
    return YES;
}
// iOS9 以下用這個方法接收
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
    NSLog(@"%@",url);
    
    
    if ([sourceApplication isEqualToString:@"com.sina.weibo"]) {
        
        return [WeiboSDK handleOpenURL:url delegate:[WTShareManager shareWTShareManager]];
        
    }else if ([sourceApplication isEqualToString:@"com.tencent.xin"]){
        
        return [WXApi handleOpenURL:url delegate:[WTShareManager shareWTShareManager]];
        
    }else if ([sourceApplication isEqualToString:@"com.tencent.mqq"]){
     
        [WTShareManager didReceiveTencentUrl:url];
        return [TencentOAuth HandleOpenURL:url];
    }
    
    
    return YES;
}





- (void)applicationWillResignActive:(UIApplication *)application {
    // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
    // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
}

- (void)applicationDidEnterBackground:(UIApplication *)application {
    
    
}

- (void)applicationWillEnterForeground:(UIApplication *)application {
    // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
}

- (void)applicationDidBecomeActive:(UIApplication *)application {
    // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
}

- (void)applicationWillTerminate:(UIApplication *)application {
    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}




@end

八.坑點

  • QQ錯誤, 說找不到TencentApiInterfaceDelegate代理
    Undefined symbols for architecture armv7:
    "l_OBJC_PROTOCOL
    $TencentApiInterfaceDelegate", referenced from:
    l_OBJC
    $_PROTOCOL_REFS_TencentSessionDelegate in WTShareManager.o
    ld: symbol(s) not found for architecture armv7
    clang: error: linker command failed with exit code 1 (use -v to see invocation)
Snip20160702_16.png
Snip20160702_15.png
  • 解決辦法

在TencentOpenAPI.framework 里面找到TencentOAuth.h文件,然后在里面包含#import "TencentApiInterface.h" 文件OK了.


Snip20160702_17.png

答案出處. 感謝大神"月子木"

demo下載地址

demo下載



最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容