日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

iOS 系统分享UIActivityViewController,自定义分享预览UI

發布時間:2023/12/8 windows 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 iOS 系统分享UIActivityViewController,自定义分享预览UI 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

UIActivityViewController繼承自UIViewController,是一個系統分享組件,它提供了一些通用的標準服務(AirDrop、Messages,Mail)等,類似于照片里點擊分享功能。 國內App可能用的相對較少,一般都是對接友盟分享之類的。網上針對UIActivityViewController的使用介紹雖然有不少,但是卻很少有介紹分享預覽時的Header區域UI定制,筆者最后在stackoverflow上找到了答案,還參考了國外大神的寫法,寫下了這篇文章,希望能幫助到大家。

先看一下實現效果:

首先,iOS13.0以前是不支持顯示Header區域的,那么可以使用下面方法,也是網上最容易查詢到的方法。

// 分享的標題 NSString *title = @"百度"; // 分享的圖片 UIImage *image = [UIImage imageNamed:@"icon_logo.png"]; // 分享的url NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];NSArray *activityItems = @[title, image, url];UIActivityViewController *activityVC = [[UIActivityViewController alloc]initWithActivityItems:activityItems applicationActivities:nil]; activityVC.excludedActivityTypes = @[UIActivityTypePrint, UIActivityTypeAssignToContact]; [self presentViewController:activityVC animated:YES completion:nil];// 分享之后的回調 activityVC.completionWithItemsHandler = ^(UIActivityType _Nullable activityType, BOOL completed, NSArray * _Nullable returnedItems, NSError * _Nullable activityError) {if (completed) {// 分享 成功} else {// 分享 取消} };

注意:這里的title,image并不會對Header區域生效,activityVC會把他們和url一起拼接起來,生成分享內容。excludedActivityTypes是我們需要排除的activity; activityItems中的對象類型是可變的,可以是String、Image、URL,也可以是實現UIActivityItemSource的對象

那么iOS13.0以后究竟如何自定義Header區域,我創建了一個分享的類,專門用于處理項目中分享相關的功能,方便拓展,并優化了異常處理方案。核心代碼

import UIKit import LinkPresentation@available(iOS 13.0, *)@objcMembers class SDShareActivity: NSObject, UIActivityItemSource {var metadata: LPLinkMetadata?func inviteShare(_ urlString: String, sender: UIViewController) -> Void {let url = URL(string: urlString)!let provider = LPMetadataProvider()provider.shouldFetchSubresources = falseprovider.timeout = 0.5provider.startFetchingMetadata(for: url) { linkMetadata, _ in//linkMetadata?.iconProvider = linkMetadata?.imageProvider//linkMetadata?.url = url;//如果0.5s的超時時間內,沒有獲取到網頁元素,走本地配置//這樣即使是網絡很差,或者斷網,也都會再0.5s彈出系統分享,優化用戶體驗let metadata = linkMetadata != nil ? linkMetadata : LPLinkMetadata()metadata?.iconProvider = NSItemProvider(object: UIImage(named: "icon_logo")!)metadata?.title = NSLocalizedString("Let’s chat on Tanka!", comment: "")metadata?.originalURL = urlself.metadata = metadatalet activityVc = UIActivityViewController(activityItems: [self], applicationActivities: nil)DispatchQueue.main.async {sender.present(activityVc, animated: true)}}}// The placeholder the share sheet will use while metadata loadsfunc activityViewControllerPlaceholderItem(_ activityViewController: UIActivityViewController) -> Any {return ""}// The item we want the user to act on.// In this case, it's the URL to the Wikipedia pagefunc activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivity.ActivityType?) -> Any? {return NSLocalizedString("Invite Template", comment: "")}// The metadata we want the system to represent as a rich linkfunc activityViewControllerLinkMetadata(_ activityViewController: UIActivityViewController) -> LPLinkMetadata? {return metadata}}

LinkPresentation是iOS13.0新增的框架,它能夠以一致的方式表示內容豐富的URL。從URL檢索元數據,在應用程序中顯示豐富的鏈接內容,并在iOS中提供共享表單體驗的鏈接元數據。也就是說:LinkPresentation能獲取URL的元數據,包括它的標題、圖標和圖像或視頻鏈接。想深入了解LinkPresentation可以參考這篇文章:LinkPresentation框架詳細解析

參考國外大神寫法:Composing Rich Link Previews Using LinkPresentation in Swift

總結

以上是生活随笔為你收集整理的iOS 系统分享UIActivityViewController,自定义分享预览UI的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。