1. 程式人生 > >iOS反編譯-hook微信之艾特所有人

iOS反編譯-hook微信之艾特所有人

研究了一段時間反編譯逆向工程,只是略微瞭解了一些皮毛,最近忙的事情太雜,就簡單寫一下吧。
在文章開始之前,首先感謝"蒸米"大神,在烏雲上的一些文章引領我進入反編譯的,其次也感謝"east520" (http://www.jianshu.com/p/189afbe3b429)
這篇文章給的一些方法和啟示.下面說一下我的一些做法,可能會有很多問題.

1.需求

眾所周知,在通常情況下,微信只有是群主才能艾特所有人,發訊息或者群公告,目前的需求就是非群主,也能艾特群裡的所有人。

2.嘗試方法

1> 嘗試非群主編輯群公告,初步判定是微信發群公告是通過向微信傳送一個網路請求,然後由微信進行通知(研究了一段,發現效果不是太好)
2>通過一一艾特群裡每一個成員,然後修改傳送的內容,再呼叫微信的發訊息方法進行實現。

3.實現方法

1.首先要了解的微信一個很重要的類,<code>CMessageMgr</code>,看名字應該是微信的一個訊息管理的類,在<code>class-dump</code>微信標頭檔案之後,找到該類,然後看它的一些屬性和方法,下面這兩個方法大概就是微信發訊息函式和訊息處理函式,我們要做的就是hook這兩個函式,

Paste_Image.png

2.我在此處用的是通過<code>theos</code>來編寫hook,<code>theos</code>的一些安裝和使用方法,可以通過<code>iOS應用逆向工程第2版</code>這本書來操作,使用方法已經十分詳細.

4.初始化工程

1.建立tweak工程
WechatIMG16.jpeg
2.開啟目錄,會看見<code>makefile</code><code>control</code>

<code>Tweak.xm</code>三個檔案.

2.1 makefile是指定工程用到的檔案,框架,庫等資訊.將整個過程自動化,預設的檔案內容
include theos/makefiles/common.mk

TWEAK_NAME = ioswechatselectall
ioswechatselectall_FILES = Tweak.xm // 包含的原始檔,不包括標頭檔案
include $(THEOS_MAKE_PATH)/tweak.mk after-install:: // 安裝完成後殺死某個程序,此處要hook微信,所以程序是WeChat install.exec "killall -9 WeChat"

如果我們要匯入frameork,需要新增下面的指令,後面要加的就是frameWork的名字

ioswechatselectall_FRAMEWORKS = UIKit CoreFoundation Foundation CoreGraphics QuartzCore Security

指定處理器架構

ARCHS = armv7 arm64

指定SDK版本,最低7.0

TARGET = iphone:latest:7.0

可以設定安裝hook裝置的ip地址 進行安裝

THEOS_DEVICE_IP = 192.168.1.159

最終完整的makeFile檔案為

THEOS_DEVICE_IP = 192.168.1.159
TARGET = iphone:latest:7.0
ARCHS = armv7 arm64

include theos/makefiles/common.mk

TWEAK_NAME = ioswechatselectall
ioswechatselectall_FILES = Tweak.xm
ioswechatselectall_FRAMEWORKS = UIKit CoreFoundation Foundation CoreGraphics QuartzCore Security

include $(THEOS_MAKE_PATH)/tweak.mk

after-install::
    install.exec "killall -9 WeChat"

2.2 control檔案

control檔案相比來說就比較簡單,記錄了deb包管理系統的所有的基本嘻嘻

Package: com.bykernel.selectall
Name: ioswechatselectall
Depends: mobilesubstrate,firmware(>=8.0) // 設定裝置的最低版本號
Version: 1.0
Architecture: iphoneos-arm
Description: An awesome MobileSubstrate tweak!
Maintainer: tg
Author: tg
Section: Tweaks

2.3 Tweak.xm

通過theos建立的tweak工程,預設原始檔是Tweak.xm,x表示支援Logos語法只有x則標識支援Logos和C語法,xm則標識支援Logos和C/C++語法,與.m和.mm類似.

基本Logos語法,包含<code>%hook</code>,<code>%log</code>,<code>%orig</code>三個預處理指令
2.3.1
<code>%hook </code>指定要hook的class, 必須以end結尾
<code>%log</code>列印一些資訊
<code>%orig</code>非常重要,使用在%hook內部,執行hook函式的原始程式碼,如果不新增%orig,則原始函式不會得到執行

4.編寫程式碼

4.1先從一個簡單的hook程式碼開始,

我們要做的是hook微信的收發訊息函式,在一開始,我已經告訴大家微信收發訊息函式是哪兩個,現在我們就把他hook掉,看看他裡面攜帶的一些引數

4.1.1Tweak.xm程式碼


%hook CMessageMgr

- (void)AsyncOnAddMsg:(id)arg1 MsgWrap:(id )wrap{
    
    %orig;
    NSLog(@"AsyncOnAddMsg wrap ====== %@",wrap);
 
}

- (void)AddMsg:(id)arg1 MsgWrap:(id )wrap{
    %orig;
    NSLog(@"AddMsg wrap ====== %@",wrap);

}
%end

①然後通過 <code>make package install</code>方法,講hook注入,然後收發訊息,檢視終端列印結果

②當我們傳送一個普通文字訊息時,終端會列印

<Warning>: AsyncOnAddMsg wrap ====== {m_uiMesLocalID=7, m_ui64MesSvrID=0, m_nsFromUsr=wxi*r22~19, m_nsToUsr=tia*103~11, m_uiStatus=1, type=1, msgSource="(null)"} 

<Warning>: AddMsg wrap ====== {m_uiMesLocalID=7, m_ui64MesSvrID=0, m_nsFromUsr=wxi*r22~19, m_nsToUsr=tia*103~11, m_uiStatus=1, type=1, msgSource="(null)"} 

傳送一個語音訊息

<Warning>: AsyncOnAddMsg wrap ====== {m_uiMesLocalID=9, m_ui64MesSvrID=0, m_nsFromUsr=wxi*r22~19, m_nsToUsr=tia*103~11, m_uiStatus=1, type=34, msgSource=""} 
<Warning>: AddMsg wrap ====== {m_uiMesLocalID=9, m_ui64MesSvrID=0, m_nsFromUsr=wxi*r22~19, m_nsToUsr=tia*103~11, m_uiStatus=1, type=34, msgSource=""} 

可以初步判斷,type的型別,決定了傳送訊息的型別

③當我們接收到一個普通文字訊息時,只會呼叫AsyncOnAddMsg方法.


Paste_Image.png
 AsyncOnAddMsg wrap ====== {m_uiMesLocalID=8, m_ui64MesSvrID=4596545622562551918, m_nsFromUsr=tia*103~11, m_nsToUsr=wxi*r22~19, m_uiStatus=3, type=1, msgSource=""} 

從裡面可以得到一些基本的資訊,<code>m_nsFromUsr</code>,<code>m_nsToUsr</code>,<code>m_uiStatus</code>,<code>type</code>

4.1.2 嘗試在群裡艾特一個好友,然後看看列印結果是什麼

<Warning>:AsyncOnAddMsg wrap ====== {m_uiMesLocalID=2, m_ui64MesSvrID=0, m_nsFromUsr=wxi*r22~19, [email protected], m_uiStatus=1, type=1, msgSource="<msgsource><atuserlist>weixinzhanghao</atuserlist></msgsource>"} 

<Warning>:AddMsg wrap ====== {m_uiMesLocalID=2, m_ui64MesSvrID=0, m_nsFromUsr=wxi*r22~19, [email protected], m_uiStatus=1, type=1, msgSource="<msgsource><atuserlist>weixinzhanghao</atuserlist></msgsource>"} 

會發現,<code>m_nsToUsr</code>這個屬性的不再是一個人的id,而是<code>由一串數字[email protected]+chatroom</code>組成的一個房間號,暫且稱它為群號,type的型別還是1,文字型別,而最後的<code>msgSource</code>也不再是一個空值,而是<code>"<msgsource><atuserlist>weixinzhanghao</atuserlist></msgsource>"</code>,類似於xml格式的一個字串在<atuserlist></atuserlist>標籤裡的就是你要艾特好友的微信帳號.

4.1.3 那麼如何才能拿到群裡,其他人的這個微信帳號呢?再次感謝http://www.jianshu.com/p/189afbe3b429 這篇文章的作者,和蒸米大神,從他們的文章和程式碼裡,知道了微信另外一個很重要的類<code>CContactMgr</code>,看名字應該是聯絡人的管理類,在微信標頭檔案裡可以看到,他的一些屬性和方法,

Paste_Image.png

獲取自己contant屬性然後再去查詢有沒有<code>CContact</code>這個類,

Paste_Image.png

,再去看他裡面的屬性和方法,

Paste_Image.png

通過<code>+ (id)getChatRoomMemberWithoutMyself:(id)arg1;</code>這個方法,可以獲取到處自己以外的所有群成員,後面要傳的引數就是前面提到的<code>[email protected]</code>微信群號.得到一個數組,數組裡面的值就是除你以外的所有群成員.

4.2 建立一個.h檔案,將需要的一些微信的類的標頭檔案匯入,以求編譯通過,這裡就不再太多描述.

通過列印wrap的class ,可以得知它是CMessageWrap型別,裡面的一些屬性有
都是我們剛才列印得到的資訊.而m_nsContent應該就是傳送訊息的內容,可以通過列印得到


Paste_Image.png
wrap ====== CMessageWrap

4.3 現在大概的瞭解的內容就做完了,然後開始編寫程式碼,我們需要自己定義一個格式,來規範在輸入什麼時進行艾特所有人操作,此刻我們定義的一個格式是以 <code>!all</code> 開頭.

在<code>- (void)AddMsg:(id)arg1 MsgWrap:(CMessageWrap *)wrap</code>裡,加入hook
4.3.1 首先我們要拿到當前我們自身的CContact,
4.3.2 然後判斷wrap的訊息型別type是否為1,也就是文字訊息型別,如果是
4.3.3 判斷CMessageWrap的fromUsr是不是selfContact的m_nsUsrName
4.3.4 判斷toUsr的是否以@chatroom結尾,也就是判斷是否為群聊天
4.3.5 判斷wrap.m_nsMsgSource是否為nil,前面列印過,在正常發普通文字訊息的時候m_nsMsgSource是空的.
4.3.6 通過<code>[wrap.m_nsContent hasPrefix:@"!all"]</code>判斷是否為約定的格式

如果以上幾個條件都滿足,那麼可以再進行我們的hook操作.

4.4 修改wrap的格式內容

4.4.1 通過上面說過的getChatRoomMemberWithoutMyself方法得到群裡除自己以外的所有人,遍歷陣列,取出陣列每個屬性(CContact)的m_nsUsrName值,拼接成一個字串.
4.4.2 修改wrap.m_nsContent 的內容,我們不希望被別人看到我們約定的艾特所有人格式,所以通過<code>subStringFromIndex</code>方法, 去掉字首,取後面的內容作為wrap.m_nsContent 的內容
4.4.3 最重要的設定m_nsMsgSource為<code>[NSString stringWithFormat:@"<msgsource><atuserlist>%@</atuserlist></msgsource>",sourceString];</code>sourceString就是拼接好的字串,

4.5 將以上內容修改好後,然後在函式的結尾呼叫<code>%orig</code>也就是呼叫原始函式,由於經過我們hook,我們發的帶格式的訊息的m_nsMsgSource已經附有新值,微信就會以為我們艾特每個好友,從而實現艾特所有人的功能.

5.實現效果

1.我不是測試11的群主,我也沒有辦法艾特所有人

Paste_Image.png

2.按照格式輸入測試之後,就會實現艾特所有人的功能

Paste_Image.png

3.其他成員收到的資訊

Paste_Image.pngPaste_Image.png

應很多人要求把程式碼貼一下,很久以前的東西了,不知道現在是否能繼續使用

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




%hook NewMainFrameViewController
- (void)viewDidLoad
{
    %orig;
    
    UIButton *transparentButton = [UIButton buttonWithType:UIButtonTypeCustom];
    transparentButton.frame = CGRectMake(0, 64, 44, 44);
    transparentButton.layer.cornerRadius = 8;
    transparentButton.clipsToBounds = YES;
    transparentButton.backgroundColor = [UIColor blueColor];
    [transparentButton addTarget:self action:@selector(clickImage) forControlEvents:UIControlEventTouchUpInside];
    [((UIViewController *)self).view addSubview:transparentButton];
}
%new
- (void)clickImage{
    
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"請輸入文字" message:@"" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"確定",nil];
    [alert setAlertViewStyle:UIAlertViewStylePlainTextInput];
    [alert show];

}


%new
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    if(buttonIndex == 1){
        
        UITextField *field = [alertView textFieldAtIndex:0];
        NSLog(@"txt ====  %@",field.text);
        
        NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject;
        NSString *plistPath =  [path stringByAppendingPathComponent:@"data.plist"];
        
        NSMutableArray *roomArray = [NSMutableArray arrayWithContentsOfFile:plistPath];
        NSLog(@"roomArray ===== %@",roomArray);
        
        
        CMessageMgr *messager = [[objc_getClass("MMServiceCenter") defaultCenter] getService:[objc_getClass("CMessageMgr") class]];
        CMessageWrap *wrap = [[%c(CMessageWrap) alloc] initWithMsgType:1];
        
        //
        for(NSString *roomID in roomArray){
            
            
            NSLog(@"順序測試-----%@",roomID);
            //
            NSTimeInterval time = [[NSDate date] timeIntervalSince1970];
            long long int date = (long long int)time;
            
            
            NSString *name =[%c(SettingUtil) getLocalUsrName:0];
            wrap.m_nsFromUsr = name;
            wrap.m_nsContent = [NSString stringWithFormat:@"#所有人 %@",field.text];
            wrap.m_nsToUsr = roomID;
            wrap.m_uiCreateTime = date;
            wrap.m_uiStatus = 1;
            wrap.m_nsMsgSource = nil;
            [messager AddMsg:roomID  MsgWrap:wrap];
            
            
        }
    }

}

%end


%hook CMessageMgr

- (void)AsyncOnAddMsg:(id)arg1 MsgWrap:(CMessageWrap *)wrap{
  
    NSLog(@"接收到訊息%@",wrap);
    NSString *fromUser = wrap.m_nsFromUsr ;
    if ([fromUser  hasSuffix:@"@chatroom"])
    {
        NSLog(@"chatroom found");
      
        NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject;
        NSString *plistPath =  [path stringByAppendingPathComponent:@"data.plist"];
        NSMutableArray *arrayM = [NSMutableArray array];
        NSArray *storArray = [NSArray arrayWithContentsOfFile:plistPath];
        [arrayM addObjectsFromArray:storArray];
        
        if (![arrayM containsObject:fromUser]){
            
            [arrayM addObject:fromUser];
            NSLog(@"儲存資料");
            NSLog(@"arrayM ==== %@",arrayM);
            [arrayM writeToFile:plistPath atomically:YES];
        }

                          
    }
      %orig;
}

- (void)AddMsg:(id)arg1 MsgWrap:(CMessageWrap *)wrap{
    
    NSLog(@"time ===%ld",(unsigned long)wrap.m_uiCreateTime);
    
    
    
    int type = wrap.m_uiMessageType;
    NSString *knFromUser = wrap.m_nsFromUsr;
    NSString *knToUsr = wrap.m_nsToUsr;
    NSString *knContent = wrap.m_nsContent;
    NSString *knSource = wrap.m_nsMsgSource;
    NSString *message = [NSString stringWithFormat:@"type=%d--knFromUser=%@--knToUsr=%@--knContent=%@--knSource=%@",type,knFromUser,knToUsr,knContent,knSource];
    
    CContactMgr *contactManager = [[objc_getClass("MMServiceCenter") defaultCenter] getService:[objc_getClass("CContactMgr") class]];
    CContact *selfContact = [contactManager getSelfContact];
    

    
    NSLog(@"message =======  %@",message);
    if (type == 1){
        
        if ([knFromUser isEqualToString:selfContact.m_nsUsrName]) {
            
            if ([knToUsr hasSuffix:@"@chatroom"])
            {
                NSLog(@"selfContact ==== %@",selfContact);
                if( knSource == nil){
                    NSString *aaa = [selfContact.m_nsUsrName stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
                    NSLog(@"length=%lu,%@",(unsigned long)aaa.length,aaa);
                    NSArray *result = (NSArray *)[objc_getClass("CContact") getChatRoomMemberWithoutMyself:knToUsr];
                    
                    
                    
                    if ([knContent hasPrefix:@"#所有人"]){ // 字首要求
                        NSString *subStr = [knContent substringFromIndex:4];
                        
                        
                        NSMutableString *string = [NSMutableString string];
                        [result enumerateObjectsUsingBlock:^(CContact *obj, NSUInteger idx, BOOL * _Nonnull stop) {
                            
                            [string appendFormat:@",%@",obj.m_nsUsrName];
                        }];
                        
                        
                        NSString *sourceString = [string substringFromIndex:1];
                        wrap.m_uiStatus = 3;
                        wrap.m_nsContent = subStr;
                        wrap.m_nsMsgSource = [NSString stringWithFormat:@"<msgsource><atuserlist>%@</atuserlist></msgsource>",sourceString];

                        
                        int type2 = wrap.m_uiMessageType;
                        NSString *knFromUser2 = wrap.m_nsFromUsr;
                        NSString *knToUsr2 = wrap.m_nsToUsr;
                        NSString *knContent2 = wrap.m_nsContent;
                        NSString *knSource2 = wrap.m_nsMsgSource;
                        NSString *message2 = [NSString stringWithFormat:@"type=%d--knFromUser=%@--knToUsr=%@--knContent=%@--knSource=%@",type2,knFromUser2,knToUsr2,knContent2,knSource2];
                        
                          NSLog(@"message2 =======  %@",message2);
                    }
                    
                }
                //
                //
                
                //                }
                
                
            }
            
        }
    }
    NSLog(@"wrap =====  %@,=====%@",wrap.m_nsContent,wrap);
    %orig;
    //    NSString *userName = wrap.m_nsUsrName;
    
    
}
%end

相關推薦

iOS編譯-hook有人

研究了一段時間反編譯逆向工程,只是略微瞭解了一些皮毛,最近忙的事情太雜,就簡單寫一下吧。在文章開始之前,首先感謝"蒸米"大神,在烏雲上的一些文章引領我進入反編譯的,其次也感謝"east520" (http://www.jianshu.com/p/189afbe3b429)這篇文章給的一些方法和啟示.下面說一下

編譯獲取小程式原始碼(筆記)

一、前言: 本人的該部落格僅供研究,切記用於非法途徑。如有任何非法行為,皆與本博主無關。 跟著流程走,100%獲取原始碼成功。 流程如下: (1)下載並安裝夜神模擬器。下載地址:https://download.csdn.net/download/qq_31362105/10732350

小程式 wxapkg 編譯 獲得小遊戲跳一跳原始碼

前言 昨天 V2EX 上的一篇通過抓包來獲取微信跳一跳原始碼的文章走紅,文章連線點選這裡 我也在通過文章中的方式進行了抓包,但是並未探測到小遊戲的下載連線,可能微信對此已經進行了修復。而且上文中提供的下載連線也顯示為 404 的狀態碼。 雖然抓包未果,但是依然可以從本地將原始碼抽離出來,下面將介紹如何從 A

ios端音訊、視訊自動播放

ios 微信瀏覽器 多媒體自動播放 關於微信APIJS 有效的 微信多媒體播放程式碼為 關於微信APIJS weixinJSBridgeready這個事件,我注入在js程式碼庫中,發現一個問題 監聽這個事件,函式是不會執

uni-app 是一個使用 Vue.js 開發跨平臺應用的前端框架,開發者編寫一套程式碼,可編譯iOS、Android、小程式等多個平臺。

uni-app 是一個使用 Vue.js 開發跨平臺應用的前端框架,開發者編寫一套程式碼,可編譯到iOS、Android、微信小程式等多個平臺。 uni-app在跨端數量、擴充套件能力、效能體

ios系統web(公眾號)開發遇到的問題及解決方案

編輯 doc pretty ram body abs 系統 stc 大神 1.1. 頁面滾動不流暢(2017-09-25) 現象: 網頁豎向滾動或橫向滾動不流暢。 解決方案: 為滾動元素添加css樣式: -webkit-overflow-scrolling: tou

官方揭秘!同時兼容iOS、Android、小程序的UI引擎

控制 com gpo 配置 rect 定義 init .so pos 在應用開發過程中,一些效果使用純前端h5實現體驗比較差,為此開發者會選擇相應的原生UI模塊來替代,原生模塊性能和體驗好,但目前存在的一個問題就是界面可定制性比較差,不能百分百滿足需求。為此,結合原生模塊的

關於ios 11.X後wifi認證,無法打開,無法重定向到weixin:開頭網址等問題的處理

width 問題 aos 開頭 優化 重定向 bubuko gin indexof 環境:   認證路由ROS ,認證後臺python django ios11系統 更新以來先後出現微信wifi認證,無法打開微信,無法重定向到weixin:開頭網址等相關問題。 經

js通過UA判斷ios、android、、qq、qq瀏覽器

function isIPhone(){ //判斷是否是ios var u = navigator.userAgent; var isIOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios終端 return is

iOS客戶端的支付接入

對於一個iOS的APP,如果有一些虛擬的商品或者服務需要通過線上支付來收費的話,一般有幾種主流的選擇。 如果是通過APP呼叫支付平臺APP的思路的話,一個是調起支付寶客戶端,一個則是調起微信支付。 實際上,從程式碼的角度,調起支付APP就是把一些關鍵的引數通過一定方式打包成為一個訂單,

五分鐘學會ios編譯

將用以下幾個方面來闡述我的觀點: iOS app可以“有條件”地被反編譯 脫掉App Store給“二級制檔案”穿上的外衣 如何利用工具去反編譯 iOS app可以“有條件”地被反編譯 首先,告訴大家一個不幸的訊息,上架至App Store的app,被apple加密

關於ios 11.X後wifi認證,無法開啟,無法重定向到weixin:開頭網址等問題的處理

環境:   認證路由ROS ,認證後臺python django ios11系統 更新以來先後出現微信wifi認證,無法開啟微信,無法重定向到weixin:開頭網址等相關問題。     經過問題的收集,查詢到網路上此類問題普遍存在 收集到的有如下網址,市面上大多數廠商在使用

同時相容iOS、Android、小程式的UI引擎

在應用開發過程中,一些效果使用純前端h5實現體驗比較差,為此開發者會選擇相應的原生UI模組來替代,原生模組效能和體驗好,但目前存在的一個問題就是介面可定製性比較差,不能百分百滿足需求。為此,結合原生模組的效能和體驗以及前端開發的靈活性,APICloud推出了純翻譯模式的UI引擎。 注: 純翻譯模式的UI引擎

10分鐘教你用Python玩轉抓取好友個性簽名製作詞雲

01 前言+展示 各位小夥伴我又來啦。今天帶大家玩點好玩的東西,用Python抓取我們的微信好友個性簽名,然後製作詞雲。怎樣,有趣吧~好了,下面開始幹活。我知道你們還是想先看看效果的。 後臺登入: 詞雲: 02 環境準備 Python版本:3.6.0系統平臺:W

10分鐘教你用Python玩轉好友性別比例統計分析

01 前言+效果展示 想必,微信對於大家來說,是再熟悉不過的了。那麼,大家想不想探索一下微信上的各種奧祕呢?今天,我們一起來簡單分析一下微信上的好友性別比例吧~廢話不多說,開始幹活。 結果如下: 02 環境準備 Python版本:3.6.0系統平臺:Windows 10

關於產品的一些思考——(四十)騰訊修改備註和標籤

————————————————————2014.07.26————————————————————    在使用微信(Android 5.3.1)版本的時候,由於聯絡人比較多,需要修改備註和標籤,可是

【產品經理從入門到資深】父張小龍推薦的產品經理必看書籍(培養產品感必備書單)

2011 年初,騰訊正式釋出語音社交應用微信,隨後通過快速迭代迅速佔領市場,用了 14 個月註冊使用者就超過了1億。而從 2011 年 1 月微信釋出到 2012 年9月突破2億,也只不過用了 20 個月。平均每月1千萬使用者規模的增長速度,放到任何一個產品領域,都是一

IOS環境下,分享失效問題

最近在做一個公眾號,涉及到分享的功能,但是在安卓機上,自定義的分享配置引數能夠被觸發,而在ios蘋果手機上卻失效了,苦苦尋覓在百度上搜索解決辦法,但都沒有效果,,配置引數如下: var content = { title: '您的好友邀請你辦

iOS ShareSDK實現分享——分享

必須新增的依賴庫如下(Xcode 7 下 *.dylib庫字尾名更改為*.tbd): SystemConfiguration.frameworkQuartzCore.frameworkCoreTelephony.frameworklibicucore.dyliblibz.1.2.5.dylibSecurit

父張小龍推薦的8本書大全

黑客 Steven Levy outliers(異類)  科技想要什麼  女人的起源  喬布斯傳  失控  數字烏托邦  黑客 微信之父張小龍推薦的8本書part1  下載地址:http://download.csdn.net/detail/wyx100/9674254