|
@@ -0,0 +1,398 @@
|
|
|
|
+//
|
|
|
|
+// UMManager.swift
|
|
|
|
+// RainbowPlanet
|
|
|
|
+//
|
|
|
|
+// Created by 南鑫林 on 2019/3/7.
|
|
|
|
+// Copyright © 2019 南鑫林. All rights reserved.
|
|
|
|
+//
|
|
|
|
+
|
|
|
|
+import UIKit
|
|
|
|
+
|
|
|
|
+public enum ShareType {
|
|
|
|
+ case text
|
|
|
|
+ case image
|
|
|
|
+ case webPage
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+public var _entity : UMessageRegisterEntity?
|
|
|
|
+
|
|
|
|
+public class UMManager: NSObject {
|
|
|
|
+ private static let sharedInstance = UMManager()
|
|
|
|
+ private override init() {} // 私有化init方法
|
|
|
|
+
|
|
|
|
+ /// 单例
|
|
|
|
+ ///
|
|
|
|
+ /// - Returns: UMShareManager对象
|
|
|
|
+ public class func shared() -> UMManager {
|
|
|
|
+ return sharedInstance
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /// 友盟初始化
|
|
|
|
+ public func initUM(launchOptions:[UIApplication.LaunchOptionsKey: Any]?) -> Void {
|
|
|
|
+ //公共
|
|
|
|
+ common()
|
|
|
|
+ //推送
|
|
|
|
+ push(launchOptions: launchOptions)
|
|
|
|
+ //分享
|
|
|
|
+ share()
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// MARK: 公共
|
|
|
|
+public extension UMManager {
|
|
|
|
+ ///公共
|
|
|
|
+ func common() -> Void {
|
|
|
|
+
|
|
|
|
+ //将自动采集页面信息
|
|
|
|
+ // MobClick.setAutoPageEnabled(true)
|
|
|
|
+ //开发者需要显式的调用此函数,日志系统才能工作
|
|
|
|
+ UMCommonLogManager.setUp()
|
|
|
|
+ //打开加密传输
|
|
|
|
+ UMConfigure.setEncryptEnabled(true)
|
|
|
|
+ //设置打开日志
|
|
|
|
+ UMConfigure.setLogEnabled(false)
|
|
|
|
+ //设置Key
|
|
|
|
+ UMConfigure.initWithAppkey(kUMengAppKey, channel: "App Store")
|
|
|
|
+
|
|
|
|
+ //开启Crash收集
|
|
|
|
+ MobClick.setCrashReportEnabled(true)
|
|
|
|
+ //默认为普通应用场景,目前还支持游戏统计场景
|
|
|
|
+ MobClick.setScenarioType(eScenarioType.E_UM_NORMAL)
|
|
|
|
+ //获得集成测试需要device_id
|
|
|
|
+ let deice_id = UMConfigure.deviceIDForIntegration()
|
|
|
|
+ if deice_id != nil {
|
|
|
|
+ NXLLog("服务器端成功返回deviceID:\(deice_id!)");
|
|
|
|
+ }else {
|
|
|
|
+ NXLLog("服务器端还没有返回deviceID");
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// MARK: 推送
|
|
|
|
+public extension UMManager {
|
|
|
|
+
|
|
|
|
+ ///推送
|
|
|
|
+ func push(launchOptions:[UIApplication.LaunchOptionsKey: Any]?) -> Void {
|
|
|
|
+
|
|
|
|
+ _entity = UMessageRegisterEntity.init()
|
|
|
|
+ //type是对推送的几个参数的选择,可以选择一个或者多个。默认是三个全部打开,即:声音,弹窗,角标
|
|
|
|
+ _entity?.types = Int(UInt8(UMessageAuthorizationOptions.badge.rawValue)|UInt8(UMessageAuthorizationOptions.alert.rawValue)|UInt8(UMessageAuthorizationOptions.sound.rawValue))
|
|
|
|
+
|
|
|
|
+ if #available(iOS 8.0, *) {
|
|
|
|
+ if #available(iOS 10.0, *) {
|
|
|
|
+
|
|
|
|
+ let action1_ios10 = UNNotificationAction(identifier: "action1_identifier", title: "打开应用", options: UNNotificationActionOptions.foreground)
|
|
|
|
+ let action2_ios10 = UNNotificationAction(identifier: "action2_identifier", title: "忽略", options: UNNotificationActionOptions.foreground)
|
|
|
|
+
|
|
|
|
+ let category1_ios10 = UNNotificationCategory(identifier: "category1", actions: [action1_ios10,action2_ios10], intentIdentifiers: [], options: UNNotificationCategoryOptions.customDismissAction)
|
|
|
|
+ //UNNotificationCategoryOptionNone
|
|
|
|
+ //UNNotificationCategoryOptionCustomDismissAction 清除通知被触发会走通知的代理方法
|
|
|
|
+ //UNNotificationCategoryOptionAllowInCarPlay 适用于行车模式
|
|
|
|
+ let categories = NSSet(objects: category1_ios10)
|
|
|
|
+ _entity?.categories = (categories as! Set<AnyHashable>)
|
|
|
|
+ UNUserNotificationCenter.current().delegate = self
|
|
|
|
+
|
|
|
|
+ } else {
|
|
|
|
+ let action1 = UIMutableUserNotificationAction.init()
|
|
|
|
+ action1.identifier = "action1_identifier"
|
|
|
|
+ action1.title = "打开应用"
|
|
|
|
+ action1.activationMode = UIUserNotificationActivationMode.foreground;//当点击的时候启动程序
|
|
|
|
+
|
|
|
|
+ let action2 = UIMutableUserNotificationAction.init()
|
|
|
|
+ action2.identifier = "action2_identifier"
|
|
|
|
+ action2.title = "忽略"
|
|
|
|
+ action2.activationMode = UIUserNotificationActivationMode.background;//当点击的时候不启动程序,在后台处理
|
|
|
|
+ action2.isAuthenticationRequired = true;//需要解锁才能处理,如果action.activationMode = UIUserNotificationActivationModeForeground;则这个属性被忽略;
|
|
|
|
+ action2.isDestructive = true;
|
|
|
|
+
|
|
|
|
+ let actionCategory1 = UIMutableUserNotificationCategory.init()
|
|
|
|
+ actionCategory1.identifier = "category1"//这组动作的唯一标示
|
|
|
|
+ actionCategory1.setActions([action1,action2], for: UIUserNotificationActionContext.default)
|
|
|
|
+ let categories = NSSet(objects: actionCategory1)
|
|
|
|
+ _entity?.categories = (categories as! Set<AnyHashable>)
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ UMessage.registerForRemoteNotifications(launchOptions: launchOptions, entity: _entity) { (granted, error) in
|
|
|
|
+
|
|
|
|
+ if granted {
|
|
|
|
+
|
|
|
|
+ }else {
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ UMessage.setBadgeClear(true)//设置是否允许SDK自动清空角标
|
|
|
|
+ UMessage.openDebugMode(true)
|
|
|
|
+ UMessage.setWebViewClassString("UMWebViewController")
|
|
|
|
+ UMessage.addLaunch()
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// MARK: 分享
|
|
|
|
+public extension UMManager {
|
|
|
|
+ /// 分享设置
|
|
|
|
+ func share() -> Void {
|
|
|
|
+ /*
|
|
|
|
+ 设置微信的appKey和appSecret
|
|
|
|
+ [微信平台从U-Share 4/5升级说明]http://dev.umeng.com/social/ios/%E8%BF%9B%E9%98%B6%E6%96%87%E6%A1%A3#1_1
|
|
|
|
+ */
|
|
|
|
+ UMSocialManager.default().setPlaform(UMSocialPlatformType.wechatSession, appKey: kWeiXinAppKey, appSecret: kWeiXinAppSecret, redirectURL: nil)
|
|
|
|
+ /* 设置分享到QQ互联的appID
|
|
|
|
+ * U-Share SDK为了兼容大部分平台命名,统一用appKey和appSecret进行参数设置,而QQ平台仅需将appID作为U-Share的appKey参数传进即可。
|
|
|
|
+ 100424468.no permission of union id
|
|
|
|
+ [QQ/QZone平台集成说明]http://dev.umeng.com/social/ios/%E8%BF%9B%E9%98%B6%E6%96%87%E6%A1%A3#1_3
|
|
|
|
+ */
|
|
|
|
+ UMSocialManager.default().setPlaform(UMSocialPlatformType.QQ, appKey: kQQAppKey, appSecret: kQQAppSecret, redirectURL: nil)
|
|
|
|
+ /*
|
|
|
|
+ 设置新浪的appKey和appSecret
|
|
|
|
+ [新浪微博集成说明]http://dev.umeng.com/social/ios/%E8%BF%9B%E9%98%B6%E6%96%87%E6%A1%A3#1_2
|
|
|
|
+ */
|
|
|
|
+ UMSocialManager.default().setPlaform(UMSocialPlatformType.sina, appKey: kWeiboAppKey, appSecret: kWeiboAppSecret, redirectURL: "https://sns.whalecloud.com/sina2/callback")
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * 移除相应平台的分享,如微信收藏
|
|
|
|
+ */
|
|
|
|
+ UMSocialManager.default()?.removePlatformProvider(with: UMSocialPlatformType.alipaySession)
|
|
|
|
+ UMSocialManager.default()?.removePlatformProvider(with: UMSocialPlatformType.yixinSession)
|
|
|
|
+ UMSocialManager.default()?.removePlatformProvider(with: UMSocialPlatformType.yixinTimeLine)
|
|
|
|
+ UMSocialManager.default()?.removePlatformProvider(with: UMSocialPlatformType.laiWangSession)
|
|
|
|
+ UMSocialManager.default()?.removePlatformProvider(with: UMSocialPlatformType.sms)
|
|
|
|
+ UMSocialManager.default()?.removePlatformProvider(with: UMSocialPlatformType.email)
|
|
|
|
+ UMSocialManager.default()?.removePlatformProvider(with: UMSocialPlatformType.renren)
|
|
|
|
+ UMSocialManager.default()?.removePlatformProvider(with: UMSocialPlatformType.facebook)
|
|
|
|
+ UMSocialManager.default()?.removePlatformProvider(with: UMSocialPlatformType.twitter)
|
|
|
|
+ UMSocialManager.default()?.removePlatformProvider(with: UMSocialPlatformType.douban)
|
|
|
|
+ UMSocialManager.default()?.removePlatformProvider(with: UMSocialPlatformType.kakaoTalk)
|
|
|
|
+ UMSocialManager.default()?.removePlatformProvider(with: UMSocialPlatformType.pinterest)
|
|
|
|
+ UMSocialManager.default()?.removePlatformProvider(with: UMSocialPlatformType.line)
|
|
|
|
+ UMSocialManager.default()?.removePlatformProvider(with: UMSocialPlatformType.linkedin )
|
|
|
|
+ UMSocialManager.default()?.removePlatformProvider(with: UMSocialPlatformType.flickr)
|
|
|
|
+ UMSocialManager.default()?.removePlatformProvider(with: UMSocialPlatformType.tumblr)
|
|
|
|
+ UMSocialManager.default()?.removePlatformProvider(with: UMSocialPlatformType.instagram)
|
|
|
|
+ UMSocialManager.default()?.removePlatformProvider(with: UMSocialPlatformType.whatsapp)
|
|
|
|
+ UMSocialManager.default()?.removePlatformProvider(with: UMSocialPlatformType.dingDing)
|
|
|
|
+ UMSocialManager.default()?.removePlatformProvider(with: UMSocialPlatformType.youDaoNote)
|
|
|
|
+ UMSocialManager.default()?.removePlatformProvider(with: UMSocialPlatformType.everNote)
|
|
|
|
+ UMSocialManager.default()?.removePlatformProvider(with: UMSocialPlatformType.googlePlus)
|
|
|
|
+ UMSocialManager.default()?.removePlatformProvider(with: UMSocialPlatformType.pocket)
|
|
|
|
+
|
|
|
|
+ UMSocialManager.default()?.removePlatformProvider(with: UMSocialPlatformType.dropBox)
|
|
|
|
+ UMSocialManager.default()?.removePlatformProvider(with: UMSocialPlatformType.vKontakte)
|
|
|
|
+ UMSocialManager.default()?.removePlatformProvider(with: UMSocialPlatformType.faceBookMessenger)
|
|
|
|
+ UMSocialManager.default()?.removePlatformProvider(with: UMSocialPlatformType.tim)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /// 分享面板
|
|
|
|
+ ///
|
|
|
|
+ /// - Parameters:
|
|
|
|
+ /// - shareType: 平台
|
|
|
|
+ /// - viewController: 控制器
|
|
|
|
+ /// - text: 分享文本
|
|
|
|
+ /// - thumbImage: 缩略图
|
|
|
|
+ /// - shareImage: 分享图
|
|
|
|
+ /// - title: 标题
|
|
|
|
+ /// - descr: 内容描述
|
|
|
|
+ /// - webpageUrl: 链接地址
|
|
|
|
+ func UMSocialUI(shareType:ShareType, viewController:UIViewController,text:String,thumbImage:Any,shareImage:Any,title:String,descr:String,webpageUrl:String) -> Void {
|
|
|
|
+
|
|
|
|
+ UMSocialUIManager.showShareMenuViewInWindow(platformSelectionBlock: {[weak self] platformType, userInfo in
|
|
|
|
+ switch shareType {
|
|
|
|
+ case .text:
|
|
|
|
+ self?.shareText(to: platformType, viewController: viewController,text: text)
|
|
|
|
+ break
|
|
|
|
+ case .image:
|
|
|
|
+ self?.shareImage(to: platformType, viewController: viewController,thumbImage: thumbImage,shareImage: shareImage)
|
|
|
|
+ break
|
|
|
|
+ case .webPage:
|
|
|
|
+ self?.shareWebPage(to: platformType, viewController: viewController,title: title,descr: descr, thumbImage: thumbImage,webpageUrl: webpageUrl)
|
|
|
|
+ break
|
|
|
|
+ }
|
|
|
|
+ })
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /// 分享文本
|
|
|
|
+ ///
|
|
|
|
+ /// - Parameters:
|
|
|
|
+ /// - platformType: 平台
|
|
|
|
+ /// - viewController: 控制器
|
|
|
|
+ /// - text: 分享文本
|
|
|
|
+ func shareText(to platformType: UMSocialPlatformType,viewController:UIViewController,text:String) {
|
|
|
|
+ //创建分享消息对象
|
|
|
|
+ let messageObject = UMSocialMessageObject()
|
|
|
|
+ //设置文本
|
|
|
|
+ messageObject.text = text
|
|
|
|
+
|
|
|
|
+ //调用分享接口
|
|
|
|
+ UMSocialManager.default().share(to: platformType, messageObject: messageObject, currentViewController: viewController) { data, error in
|
|
|
|
+ if error != nil {
|
|
|
|
+ if let anError = error {
|
|
|
|
+ NXLLog("************Share fail with error \(anError)*********")
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ if let aData = data {
|
|
|
|
+ NXLLog("response data is \(aData)")
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /// 分享图片
|
|
|
|
+ ///
|
|
|
|
+ /// - Parameters:
|
|
|
|
+ /// - platformType: 平台
|
|
|
|
+ /// - viewController: 控制器
|
|
|
|
+ /// - thumbImage: 缩略图
|
|
|
|
+ /// - shareImage: 分享图
|
|
|
|
+ func shareImage(to platformType: UMSocialPlatformType,viewController:UIViewController,thumbImage:Any,shareImage:Any) {
|
|
|
|
+ //创建分享消息对象
|
|
|
|
+ let messageObject = UMSocialMessageObject()
|
|
|
|
+
|
|
|
|
+ //创建图片内容对象
|
|
|
|
+ let shareObject = UMShareImageObject()
|
|
|
|
+ //如果有缩略图,则设置缩略图
|
|
|
|
+ shareObject.thumbImage = thumbImage
|
|
|
|
+ shareObject.shareImage = shareImage
|
|
|
|
+
|
|
|
|
+ //分享消息对象设置分享内容对象
|
|
|
|
+ messageObject.shareObject = shareObject
|
|
|
|
+
|
|
|
|
+ //调用分享接口
|
|
|
|
+ UMSocialManager.default().share(to: platformType, messageObject: messageObject, currentViewController: viewController) { data, error in
|
|
|
|
+ if error != nil {
|
|
|
|
+ if let anError = error {
|
|
|
|
+ NXLLog("************Share fail with error \(anError)*********")
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ if let aData = data {
|
|
|
|
+ NXLLog("response data is \(aData)")
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /// 分享网页
|
|
|
|
+ ///
|
|
|
|
+ /// - Parameters:
|
|
|
|
+ /// - platformType: 平台
|
|
|
|
+ /// - viewController: 控制器
|
|
|
|
+ /// - title: 标题
|
|
|
|
+ /// - descr: 内容描述
|
|
|
|
+ /// - thumbImage: 缩略图
|
|
|
|
+ /// - webpageUrl: 链接地址
|
|
|
|
+ func shareWebPage(to platformType: UMSocialPlatformType,viewController:UIViewController,title:String,descr:String,thumbImage:Any,webpageUrl:String) {
|
|
|
|
+ //创建分享消息对象
|
|
|
|
+ let messageObject = UMSocialMessageObject()
|
|
|
|
+
|
|
|
|
+ //创建网页内容对象
|
|
|
|
+ let shareObject = UMShareWebpageObject.shareObject(withTitle: title, descr: descr, thumImage: thumbImage)
|
|
|
|
+ //设置网页地址
|
|
|
|
+ shareObject!.webpageUrl = webpageUrl
|
|
|
|
+
|
|
|
|
+ //分享消息对象设置分享内容对象
|
|
|
|
+ messageObject.shareObject = shareObject
|
|
|
|
+
|
|
|
|
+ //调用分享接口
|
|
|
|
+ UMSocialManager.default().share(to: platformType, messageObject: messageObject, currentViewController: viewController) { data, error in
|
|
|
|
+ if error != nil {
|
|
|
|
+ if let anError = error {
|
|
|
|
+ NXLLog("************Share fail with error \(anError)*********")
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ if let aData = data {
|
|
|
|
+ NXLLog("response data is \(aData)")
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// MARK: 第三方登录
|
|
|
|
+extension UMManager {
|
|
|
|
+ /// 第三方登录
|
|
|
|
+ ///
|
|
|
|
+ /// - Parameter platformType: 平台
|
|
|
|
+ func loginGetUserInfo(platformType: UMSocialPlatformType,callBack: @escaping (UMLoginModel) -> (Void)) {
|
|
|
|
+
|
|
|
|
+ let isInstall = UMSocialManager.default()?.isInstall(platformType)
|
|
|
|
+ if isInstall! { //验证
|
|
|
|
+ UMSocialManager.default().getUserInfo(with: platformType, currentViewController: nil) { result, error in
|
|
|
|
+
|
|
|
|
+ if error != nil {
|
|
|
|
+ SwiftProgressHUD.shared().showText("授权失败,请重新登录")
|
|
|
|
+ } else {
|
|
|
|
+
|
|
|
|
+ let resp = result as? UMSocialUserInfoResponse
|
|
|
|
+
|
|
|
|
+ let loginModel = UMLoginModel()
|
|
|
|
+ // 第三方登录数据(为空表示平台未提供)
|
|
|
|
+ // 授权数据
|
|
|
|
+ if let anUid = resp?.uid {
|
|
|
|
+ NXLLog(" uid: \(anUid)")
|
|
|
|
+ loginModel.union_id = anUid
|
|
|
|
+ }
|
|
|
|
+ if let anOpenid = resp?.openid {
|
|
|
|
+ NXLLog(" openid: \(anOpenid)")
|
|
|
|
+ loginModel.open_id = anOpenid
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 用户数据
|
|
|
|
+ if let aName = resp?.name {
|
|
|
|
+ NXLLog(" name: \(aName)")
|
|
|
|
+ loginModel.username = aName
|
|
|
|
+ }
|
|
|
|
+ if let anIconurl = resp?.iconurl {
|
|
|
|
+ NXLLog(" iconurl: \(anIconurl)")
|
|
|
|
+ loginModel.avatar = anIconurl
|
|
|
|
+ }
|
|
|
|
+ if let aGender = resp?.unionGender {
|
|
|
|
+ NXLLog(" gender: \(aGender)")
|
|
|
|
+ if aGender == "男" {
|
|
|
|
+ loginModel.gender = 1
|
|
|
|
+ }else if aGender == "女" {
|
|
|
|
+ loginModel.gender = 2
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ callBack(loginModel)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ if platformType == .wechatSession {
|
|
|
|
+ SwiftProgressHUD.shared().showText("微信未安装/n请您安装微信程序")
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+@available(iOS 10.0, *)
|
|
|
|
+// MARK: - UNUserNotificationCenterDelegate
|
|
|
|
+extension UMManager:UNUserNotificationCenterDelegate {
|
|
|
|
+ public func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
|
|
|
|
+ let userInfo = notification.request.content.userInfo
|
|
|
|
+
|
|
|
|
+ if (notification.request.trigger?.isKind(of: UNPushNotificationTrigger.self))! {
|
|
|
|
+ UMessage.setAutoAlert(true)
|
|
|
|
+ //应用处于前台时的远程推送接受
|
|
|
|
+ //必须加这句代码
|
|
|
|
+ UMessage.didReceiveRemoteNotification(userInfo)
|
|
|
|
+
|
|
|
|
+ }else {
|
|
|
|
+ //应用处于前台时的本地推送接受
|
|
|
|
+ }
|
|
|
|
+ completionHandler(UNNotificationPresentationOptions(rawValue: UNNotificationPresentationOptions.sound.rawValue|UNNotificationPresentationOptions.alert.rawValue|UNNotificationPresentationOptions.badge.rawValue))
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
|
|
|
|
+ let userInfo = response.notification.request.content.userInfo
|
|
|
|
+ if (response.notification.request.trigger?.isKind(of: UNPushNotificationTrigger.self))! {
|
|
|
|
+ UMessage.setAutoAlert(true)
|
|
|
|
+ //应用处于前台时的远程推送接受
|
|
|
|
+ //必须加这句代码
|
|
|
|
+ UMessage.didReceiveRemoteNotification(userInfo)
|
|
|
|
+ }else {
|
|
|
|
+ //应用处于前台时的本地推送接受
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|