程序內(nèi)分享到微信

今天介紹一個(gè)在程序內(nèi)分享到微信好友或者朋友圈的例子扔涧。

程序內(nèi)部分享方式一:

點(diǎn)擊一個(gè)“分享”按鈕滞乙,彈出一個(gè)微信分享界面蚓聘。點(diǎn)擊朋友圈進(jìn)入“最近聊天好友”選擇界面耗美。

Screen Shot 2017-02-27 at 23.22.28.png

點(diǎn)擊分享京髓,彈出下圖

Screen Shot 2017-02-27 at 23.22.31.png

點(diǎn)擊發(fā)送給朋友,彈出下圖

Screen Shot 2017-02-23 at 10.36.20.png

上述功能是如何實(shí)現(xiàn)的呢商架?請(qǐng)看下面代碼

代碼1-1

NSString *test = @"com.tencent.xin.sharetimeline";

if (![SLComposeViewController isAvailableForServiceType:test]) {

NSLog(@"或者沒(méi)有配置相關(guān)的帳號(hào)");

return;

}

// 2.創(chuàng)建分享的控制器

SLComposeViewController *composeVc = [SLComposeViewController composeViewControllerForServiceType:test];

if (composeVc == nil){

NSLog(@"沒(méi)有安裝微信");

return;

}

// 2.1.添加分享的文字

[composeVc setInitialText:@"balabalabala..."];

// 2.2.添加一個(gè)圖片

[composeVc addImage:[UIImage imageNamed:@"圖片名"]];

// 2.3.添加一個(gè)鏈接

[composeVc addURL:[NSURL URLWithString:@"blog.csdn.net/lincsdnnet"]];

// 3.彈出分享控制器(以Modal形式彈出)

[self presentViewController:composeVc animated:YES completion:nil];

// 4.監(jiān)聽用戶點(diǎn)擊了取消還是發(fā)送

/*

SLComposeViewControllerResultCancelled,

SLComposeViewControllerResultDone

*/

composeVc.completionHandler = ^(SLComposeViewControllerResult result){

if (result == SLComposeViewControllerResultCancelled) {

NSLog(@"點(diǎn)擊了取消");

} else {

NSLog(@"點(diǎn)擊了發(fā)送");

}

};

上面代碼是不是感覺(jué)很熟悉堰怨,不錯(cuò)上面就是我們常用的Social.Framework

如果你仔細(xì)看API,系統(tǒng)只提供了如下幾個(gè)內(nèi)部分享類型蛇摸。

SOCIAL_EXTERN NSString *const SLServiceTypeTwitter NS_AVAILABLE(10_8, 6_0);

SOCIAL_EXTERN NSString *const SLServiceTypeFacebook NS_AVAILABLE(10_8, 6_0);

SOCIAL_EXTERN NSString *const SLServiceTypeSinaWeibo NS_AVAILABLE(10_8, 6_0);

SOCIAL_EXTERN NSString *const SLServiceTypeTencentWeibo NS_AVAILABLE(10_9, 7_0);

SOCIAL_EXTERN NSString *const SLServiceTypeLinkedIn NS_AVAILABLE(10_9, NA);

仔細(xì)看沒(méi)有提供微信的接口氨竿肌?但是上面就是能調(diào)用微信分享(如果你安裝微信并登陸了)赶袄。難道是系統(tǒng)給我們實(shí)現(xiàn)了诬烹,卻沒(méi)有給我們開放API?但是仔細(xì)想想是不是iOS8之后系統(tǒng)推出的Share Extension弃鸦?如果細(xì)看上面彈出微信分享的UI绞吁,我們可以確定這就是一個(gè)Share Extension。這不是系統(tǒng)實(shí)現(xiàn)的微信分享家破,這是微信App的Share Extension汰聋。所以來(lái)說(shuō)這個(gè)不是私有API。現(xiàn)在想想蘋果封裝的Social,真的太棒了酝锅。SLComposeViewController能調(diào)用所有Share Extension蟋字。

下面給大家介紹一個(gè)簡(jiǎn)單獲取手機(jī)中裝的App的所有Share Extension的方法鹊奖。只需調(diào)用下面一句代碼璧尸。

SLComposeViewController *composeVc = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeSinaWeibo];

下面看看控制臺(tái)輸出,手機(jī)內(nèi)所有可用的Share Extension的bundle Id 都出來(lái)了。其中 {id =com.up.2.ShareExtension}是我自己寫的Share Extension。其他所有字符串(Bundle id)都可以當(dāng)做[SLComposeViewController composeViewControllerForServiceType:]的參數(shù)回懦。

2017-02-27 23:59:34.761492 WeixinActivity[6692:2156632] [core] SLComposeViewController initWithServiceType: com.apple.social.sinaweibo

2017-02-27 23:59:34.849563 WeixinActivity[6692:2156679] [core] SLComposeViewController _shareExtensionWithIdentifier: continuous discovery block got extensions (

" {id = com.apple.share.SinaWeibo.post}",

" {id = com.apple.share.TencentWeibo.post}",

" {id = com.taobao.taobao4iphone.ShareExtension}",

" {id = com.tencent.qqmail.shareextension}",

" {id = com.apple.mobilenotes.SharingExtension}",

" {id = com.apple.share.Vimeo.post}",

" {id = com.apple.mobileslideshow.StreamShareService}",

" {id = com.tencent.mqq.ShareExtension}",

" {id = com.tencent.xin.sharetimeline}",

" {id = com.apple.share.Twitter.post}",

" {id = com.apple.share.Flickr.post}",

" {id = com.alipay.iphoneclient.ExtensionSchemeShare}",

" {id = com.apple.Music.MediaSocialShareService}",

" {id = com.apple.share.Facebook.post}",

" {id = com.apple.reminders.RemindersEditorExtension}",

" {id = com.up.2.ShareExtension}",

" {id = com.jianshu.Hugo.Share-Extension}",

" {id = com.apple.Health.HealthShareExtension}"

) error (null)

2017-02-27 23:59:34.853193 WeixinActivity[6692:2156679] [core] SLComposeViewController _shareExtensionWithIdentifier: continuous discovery block did update _identifierToShareExtensionMap {

"com.alipay.iphoneclient.ExtensionSchemeShare" = " {id = com.alipay.iphoneclient.ExtensionSchemeShare}";

"com.apple.Health.HealthShareExtension" = " {id = com.apple.Health.HealthShareExtension}";

"com.apple.Music.MediaSocialShareService" = " {id = com.apple.Music.MediaSocialShareService}";

"com.apple.mobilenotes.SharingExtension" = " {id = com.apple.mobilenotes.SharingExtension}";

"com.apple.mobileslideshow.StreamShareService" = " {id = com.apple.mobileslideshow.StreamShareService}";

"com.apple.reminders.RemindersEditorExtension" = " {id = com.apple.reminders.RemindersEditorExtension}";

"com.apple.share.Facebook.post" = " {id = com.apple.share.Facebook.post}";

"com.apple.share.Flickr.post" = " {id = com.apple.share.Flickr.post}";

"com.apple.share.SinaWeibo.post" = " {id = com.apple.share.SinaWeibo.post}";

"com.apple.share.TencentWeibo.post" = " {id = com.apple.share.TencentWeibo.post}";

"com.apple.share.Twitter.post" = " {id = com.apple.share.Twitter.post}";

"com.apple.share.Vimeo.post" = " {id = com.apple.share.Vimeo.post}";

"com.jianshu.Hugo.Share-Extension" = " {id = com.jianshu.Hugo.Share-Extension}";

"com.taobao.taobao4iphone.ShareExtension" = " {id = com.taobao.taobao4iphone.ShareExtension}";

"com.tencent.mqq.ShareExtension" = " {id = com.tencent.mqq.ShareExtension}";

"com.tencent.qqmail.shareextension" = " {id = com.tencent.qqmail.shareextension}";

"com.tencent.xin.sharetimeline" = " {id = com.tencent.xin.sharetimeline}";

"com.up.2.ShareExtension" = " {id = com.up.2.ShareExtension}";

}

2017-02-27 23:59:34.854222 WeixinActivity[6692:2156632] [core] SLComposeViewController initWithServiceType got extension? {id = com.apple.share.SinaWeibo.post} for identifier com.apple.share.SinaWeibo.post

2017-02-27 23:59:34.854439 WeixinActivity[6692:2156632] [core] SLComposeViewController initWithExtension:? {id = com.apple.share.SinaWeibo.post} requestedServiceType: com.apple.social.sinaweibo

2017-02-27 23:59:34.867423 WeixinActivity[6692:2156632] [core] SLComposeViewController dealloc

當(dāng)然我們要注意型诚,如果手機(jī)沒(méi)有裝微信,你是看不到? ? " {id =com.tencent.xin.sharetimeline}"。

Tips:如果我沒(méi)有裝微信,但是我強(qiáng)制調(diào)用下面代碼

代碼1-2

SLComposeViewController *composeVc = [SLComposeViewController composeViewControllerForServiceType:@"com.tencent.xin.sharetimeline"];

你會(huì)看到下面輸出

SLComposeViewController initWithServiceType failed to get extension for identifier com.tencent.xin.sharetimeline

2017-02-28 00:08:42.124005 WeixinActivity[6704:2158719] [core] SLComposeViewController dealloc

提示你“failed? to get extension”跃脊。SLComposeViewController 內(nèi)部自己釋放了绘雁,返回nil。如果執(zhí)行上面的代碼1-1废酷,就會(huì)發(fā)生奔潰卓研。避免奔潰的一個(gè)辦法就是在調(diào)用代碼1-2后要判斷返回值是不是nil,如果是nil就表示沒(méi)有裝微信奏赘,否則后面會(huì)奔潰(模態(tài)視圖控制器為nil)寥闪。

Tips:如果手機(jī)裝有微信,但是沒(méi)有登錄磨淌。 調(diào)用下面代碼

代碼1-3

if (![SLComposeViewController isAvailableForServiceType:@"com.tencent.xin.sharetimeline"]) {

NSLog(@"或者沒(méi)有配置相關(guān)的帳號(hào)");

return;

}

調(diào)用代碼1-3的時(shí)候疲憋,如果你已經(jīng)安裝了微信但是微信沒(méi)有登錄則返回NO;在未登錄狀態(tài)下梁只,強(qiáng)制調(diào)用微信分享功能缚柳,會(huì)彈出下面這個(gè)界面.

Screen Shot 2017-02-24 at 14.18.14.png

但是如果你沒(méi)有裝微信,這個(gè)方法仍然會(huì)返回YES搪锣。如果想判斷有沒(méi)有安裝微信秋忙,請(qǐng)調(diào)用代碼1-2,并檢測(cè)返回值是否是nil构舟。

程序內(nèi)部分享方式二:

我們網(wǎng)上經(jīng)常遇到用UIActivityViewController來(lái)實(shí)現(xiàn)微信內(nèi)部分享灰追,這個(gè)是可以實(shí)現(xiàn),但是這個(gè)實(shí)現(xiàn)UI太難定制狗超,而且彈出的界面有很多功能不是我們想要的弹澎。而且用UIActivityViewController有一個(gè)問(wèn)題比較棘手,就是彈出的可用分享默認(rèn)沒(méi)有微信努咐。我們需要到下面這個(gè)界面把微信選上苦蒿。

代碼調(diào)用如下:

UIActivityViewController *activityView = [[UIActivityViewController alloc] initWithActivityItems:@[@"這里是標(biāo)題", [UIImage imageNamed:@"Oauth"], [NSURL URLWithString:@"http://www.google.com"]] applicationActivities:activity];

activityView.excludedActivityTypes = @[UIActivityTypeAssignToContact, UIActivityTypeCopyToPasteboard, UIActivityTypePrint];

[self presentViewController:activityView animated:YES completion:nil];

Screen Shot 2017-02-24 at 14.18.24.png

然后在UIActivityViewController中才能看到“微信”分享

Screen Shot 2017-02-27 at 23.50.13.png

這種體驗(yàn)在國(guó)內(nèi)app中很少用。

在這篇博客中主要介紹麦撵,程序內(nèi)實(shí)現(xiàn)分享的兩種方式刽肠。

參看上面程序內(nèi)部分享方式一程序內(nèi)部分享方式二溃肪。

根據(jù)在實(shí)際使用程序內(nèi)部分享方式一中遇到的一些問(wèn)題免胃,后面推出程序內(nèi)分享 之二

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市惫撰,隨后出現(xiàn)的幾起案子羔沙,更是在濱河造成了極大的恐慌,老刑警劉巖厨钻,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扼雏,死亡現(xiàn)場(chǎng)離奇詭異坚嗜,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)诗充,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門苍蔬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人蝴蜓,你說(shuō)我怎么就攤上這事碟绑。” “怎么了茎匠?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵格仲,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我诵冒,道長(zhǎng)凯肋,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任汽馋,我火速辦了婚禮侮东,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘豹芯。我一直安慰自己苗桂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布告组。 她就那樣靜靜地躺著煤伟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪木缝。 梳的紋絲不亂的頭發(fā)上便锨,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音我碟,去河邊找鬼放案。 笑死,一個(gè)胖子當(dāng)著我的面吹牛矫俺,可吹牛的內(nèi)容都是我干的吱殉。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼厘托,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼友雳!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起铅匹,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤押赊,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后包斑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體流礁,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡涕俗,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了神帅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片再姑。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖找御,靈堂內(nèi)的尸體忽然破棺而出询刹,到底是詐尸還是另有隱情,我是刑警寧澤萎坷,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布凹联,位于F島的核電站,受9級(jí)特大地震影響哆档,放射性物質(zhì)發(fā)生泄漏蔽挠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一瓜浸、第九天 我趴在偏房一處隱蔽的房頂上張望澳淑。 院中可真熱鬧,春花似錦插佛、人聲如沸杠巡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)氢拥。三九已至,卻和暖如春锨侯,著一層夾襖步出監(jiān)牢的瞬間嫩海,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工囚痴, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留叁怪,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓深滚,卻偏偏與公主長(zhǎng)得像奕谭,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子痴荐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容

  • 今天介紹一個(gè)在程序內(nèi)分享到微信好友或者朋友圈的例子血柳。 程序內(nèi)部分享方式一: 點(diǎn)擊一個(gè)“分享”按鈕,彈出一個(gè)微信分享...
    西門淋雨閱讀 534評(píng)論 0 1
  • 今天介紹一個(gè)在程序內(nèi)分享到微信好友或者朋友圈的例子蹬昌。 程序內(nèi)部分享方式一: 點(diǎn)擊一個(gè)“分享”按鈕混驰,彈出一個(gè)微信分享...
    upworld閱讀 10,661評(píng)論 24 50
  • PLEASE READ THE FOLLOWING APPLE DEVELOPER PROGRAM LICENSE...
    念念不忘的閱讀 13,433評(píng)論 5 6
  • 社會(huì)化分享作為iOS開發(fā)的必備技能攀隔,這里做一個(gè)方案總結(jié)皂贩,本文只討論系統(tǒng)分享栖榨,不討論第三方的分享方案。 一. UIA...
    flightlessBirdT閱讀 24,604評(píng)論 4 27
  • 忽地寂靜 那一抹穿透了我靈魂的 是你的目光 你深邃的眼眸 讓我原本冰凍的心里泛起了漣漪 那一瞥 心已經(jīng)不屬于我了 ...
    馥裹徐風(fēng)閱讀 164評(píng)論 0 2