xml地图|网站地图|网站标签 [设为首页] [加入收藏]

大致思路,微信近期图片提示功能

来源:http://www.ccidsi.com 作者:呼叫中心培训课程 人气:124 发布时间:2020-04-06
摘要:(instancetype)shareInstanceWithImage:(UIImage *)image{ static ShareView *shareInstance = nil; static dispatch_once_t onceToken; dispatch_once(onceToken, ^{ shareInstance = [[ShareView alloc]initWithImage:image]; }); return shareInstance;}#p
  (instancetype)shareInstanceWithImage:(UIImage *)image{ static ShareView *shareInstance = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ shareInstance = [[ShareView alloc]initWithImage:image]; }); return shareInstance;}

#pragma mark 用户使用了系统截屏操作- didUseScreenShot{ NSLog(@"用户使用了截屏操作"); dispatch_async(dispatch_get_main_queue(), ^{ [[ShareView shareInstanceWithImage:[self getImage]] show]; });}

前言

出品大大提了个必要「方今截屏图片的急速提醒」,开荒早期被 截屏 错误的指导,引致走了歪路。这里记录下支付思路和有关知识点。在此以前也从未开荒过 相册 相关模块,所以借此机遇学习下 PhotoKit 并整合治理了脑图,先立个flag,坐等 PhotoKit 的分享。

从 iOS 7 初叶,苹果提供了监听客户截屏操作的通报:

京东和天涯论坛都有左近的效应:使用系统截屏功用时会弹出截图分享分界面。其实这些功效思路相当的粗略。第一步:注册监听截屏功效的文告,UIApplicationUserDidTakeScreenshotNotification,如下,

代码

  1. 赢得相册权限

    Info.plist 添加 Key: NSPhotoLibraryUsageDescription。 App运营后第一回访谈相册等操作 会呼出如下图的 申请权限 弹窗,客商确认后才干获取权限访问相册。

    图片 1

    报名权限弹窗

  2. 校验权限

    检测 PHPhotoLibrary.authorizationStatus() 状态:

    • authorized 顺序实行后续操作,
    • notDetermined 能够呼出申请权限的弹窗,
    • denied 客商已谢绝授权,那时得以指点客商到安装页面展开权限,
    • restricted 若重回这么些场地,表明第一步未有操作正确,如若还要抑遏操作必然crash。
    func checkPermission(resultHandler: @escaping (Bool) -> Void) {
        let status = PHPhotoLibrary.authorizationStatus()
        switch status {
        case .notDetermined:
            PHPhotoLibrary.requestAuthorization { (status) in
                if status == .authorized {
                    resultHandler(true)
                }
            }
    
        case .authorized:
            resultHandler(true)
    
        default:
            resultHandler(false)
        }
    }
    
  3. 招来截屏相册并获取图片数据

    func getScreenShotRecentlyAdded(resultHandler: @escaping (UIImage?) -> Swift.Void) {
    
        guard let screenshotCollection = PHAssetCollection.fetchAssetCollections(with: .smartAlbum, subtype: .smartAlbumScreenshots, options: nil).firstObject else {
            return
        }
    
        let options = PHFetchOptions()
        options.wantsIncrementalChangeDetails = true
        options.predicate = NSPredicate(format: "creationDate > %@", NSDate().addingTimeInterval(-30))
        options.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]
        guard let screenshot = PHAsset.fetchAssets(in: screenshotCollection, options: options).firstObject else {
            return
        }
    
        PHImageManager.default().requestImage(for: screenshot,
                                              targetSize: PHImageManagerMaximumSize,
                                              contentMode: .aspectFit,
                                              options: nil) { (image, infoDic) in
            resultHandler(image)
        }
    }
    
  4. 优化
    主流程全部走通提测后,提测提了个bug:截屏30s内数十次切换 App 到前后台,同一张截屏图片会唤醒多次,这里也实乃投机思量的不周,加了个 SHA1 去重检查评定。

我们得以行使这些布告来做诸如:截屏弹出分享窗口的功力。

说明:

预研

其一需要具体是这么:

  1. 当客商踏入App主分界面时,检查实验到30s内有截屏操作,进行图纸急忙提醒(样式可参看Wechat发送图片的便捷提醒卡塔尔.
![](https://upload-images.jianshu.io/upload_images/1594730-11431453d608ad8b.jpg)

微信截图
  1. 若顾客未点击提示,3s活动消失。

如前言所说,笔者最伊始被截屏这几个操作错误的指导,去调研截屏相关的文化。领悟到有客户按下 Home 和 Lock 截屏的通报: UIApplicationUserDidTakeScreenshotNotification,感觉监听该布告就足以了。可是那一个供给的运用处景是:顾客在大家的App处于后台的图景下截屏,App处于后台根本不能收到该布告了。所以那个思路肯定不对。

细心体验了Wechat的发送图片唤醒功能后,明确Wechat的贯彻原理应该和截屏未有一毛钱关系!应该是当客户点击

图片 2

增加按键

按键时,去探寻了截屏相册的图样,获取一依时期内最新扩展加的截屏图片。通晓那么些原理就OK了。

// 监听通知
NotificationCenter.default.addObserver(self, selector: #selector(screenShot), name: Notification.Name.UIApplicationUserDidTakeScreenshot, object: nil)

func screenShot() {
        let image = fullScreenShot(tableView)

        let activityVC = UIActivityViewController(activityItems: [image], applicationActivities:  nil)

        self.present(activityVC, animated: true, completion: nil)
 }

// 有时,需要截取 tableView 或 scrollView 的全部内容,使用以下方法:
/// 长截屏
func fullScreenShot(_ scrollView: UIScrollView) -> UIImage {
        // 记录当前 scrollView 的"偏移量"和"坐标"
        let savedContentOffset = scrollView.contentOffset
        let savedScrollViewFrame = scrollView.frame

        scrollView.contentOffset = .zero
        scrollView.frame = CGRect(origin: .zero, size: scrollView.contentSize)

        UIGraphicsBeginImageContextWithOptions(scrollView.contentSize, true, UIScreen.main.scale)
        scrollView.layer.render(in: UIGraphicsGetCurrentContext()!)
        let image = UIGraphicsGetImageFromCurrentImageContext()!

        // 重置
        scrollView.contentOffset = savedContentOffset
        scrollView.frame = savedScrollViewFrame

        UIGraphicsEndImageContext()

        return image
}

本文由68399皇家赌场发布于呼叫中心培训课程,转载请注明出处:大致思路,微信近期图片提示功能

关键词: 68399皇家赌场 日记本 iOS 思路 内截屏

最火资讯