• 本来用图来描述集成全过程和需要注意的地方(作者截了十四张图来说明全过程,本文为小白准备,大牛大神绕道) ...我们在SDK 里找到系统预置了27个社交分享类型,分别是  case sina //新浪

    本来用图来描述集成全过程和需要注意的地方(作者截了十四张图来说明全过程,本文为小白准备,大牛大神绕道)

    准备:

    环境 Xcode Version 8.1 beta (8T47)

    下载的包为 umeng_ios_social_sdk_6.0.3_arm64_custom

    我们在SDK 里找到系统预置了27个社交分享类型,分别是

    •     case sina //新浪<
    •     case wechatSession //微信聊天<
    •     case wechatTimeLine //微信朋友圈
    •     case wechatFavorite //微信收藏
    •     case QQ //QQ聊天页面<
    •     case qzone //qq空间
    •     case tencentWb //腾讯微博
    •     case alipaySession //支付宝聊天页面<

         case yixinSession //易信聊天页面<

         case yixinTimeLine //易信朋友圈

         case yixinFavorite //易信收藏

         case laiWangSession //点点虫(原来往)聊天页面<

         case laiWangTimeLine //点点虫动态

    •     case sms //短信
    •     case email //邮件
    •     case renren //人人
    •     case facebook //Facebook<
    •     case twitter //Twitter<
    •     case douban //豆瓣

        case line //Line

    •     case linkedin //领英<
    •     case flickr //Flickr

        case instagram //Instagram

        case whatsapp //Whatsapp

    case kakaoTalk //KakaoTalk(暂未支持)

    case tumblr //Tumblr(暂未支持)

    case pinterest //Pinterest(暂未支持)<





    <代表作者在AppDelegate.swift的didFinishLaunchingWithOptions中配置

    注1:小圆点是作者手机上第一次跑起来看到有16个分享按钮在面板中,然后加作者在APP Store中下载了易信和点点虫两个App之后,

         case yixinSession //易信聊天页面<

         case yixinTimeLine //易信朋友圈

         case yixinFavorite //易信收藏

         case laiWangSession //点点虫(原来往)聊天页面<

         case laiWangTimeLine //点点虫动态

    这5个分享按钮便加在面板中了,总共加起来有21个,说明最新板是可以根据手机是否下载了相应的APP 来自动呈现面板内容的


    注2:但是作者不在AppDelegate.swift的didFinishLaunchingWithOptions中配置这十行,微信相关的这三个就不会出现


    1、 拖包中的UMSocial到工程中(其包括三个目录,分别是SocialLibraries、UMSocialSDK、UMSocialUI)

    2、设置依赖的库或.a在Build Phases->Link Binary With Libraries(总共有41项目,许多是系统自动加进来的)



    3、Build Settings里设置Linking->Other Linker Flags -ObjC


    4、info.plist 里面加白名单及ATS(跳出去)具体内容见完整的info.plist


    5、info里设置 URL Types里的URL Schemes(分享完后跳回来)


    7、因swift调用OC,所以加bridge.h桥接文件并设置桥接文件

    //
    //  bridge.h
    //  umengtest
    //
    //  Created by targetcloud on 2016/11/21.
    //  Copyright © 2016年 targetcloud. All rights reserved.
    //
    
    #ifndef bridge_h
    #define bridge_h
    
    #import <UMSocialCore/UMSocialCore.h>
    #import "UMSocialUIManager.h"
    #endif /* bridge_h */
    



    8、代码

    //
    //  AppDelegate.swift
    //  umengtest
    //
    //  Created by targetcloud on 2016/11/21.
    //  Copyright © 2016年 targetcloud. All rights reserved.
    //
    
    import UIKit
    
    @UIApplicationMain
    class AppDelegate: UIResponder, UIApplicationDelegate {
    
        var window: UIWindow?
    
        func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
            
            UMSocialManager.default().openLog(true)
            UMSocialManager.default().umSocialAppkey = "57b432afe0f55a9832001a0a"
            print("UMeng social version:\(UMSocialGlobal.umSocialSDKVersion())" );
            
            UMSocialManager.default().setPlaform(UMSocialPlatformType.wechatSession, appKey: "wxdc1e388c3822c80b", appSecret: "3baf1193c85774b3fd9d18447d76cab0", redirectURL: "http://mobile.umeng.com/social")
            UMSocialManager.default().setPlaform(UMSocialPlatformType.QQ, appKey: "100424468", appSecret: nil, redirectURL: "http://mobile.umeng.com/social")
            UMSocialManager.default().setPlaform(UMSocialPlatformType.alipaySession, appKey: "2015111700822536", appSecret: nil, redirectURL: "http://mobile.umeng.com/social")
            UMSocialManager.default().setPlaform(UMSocialPlatformType.yixinSession, appKey: "yx35664bdff4db42c2b7be1e29390c1a06", appSecret: nil, redirectURL: "http://mobile.umeng.com/social")
            UMSocialManager.default().setPlaform(UMSocialPlatformType.laiWangSession, appKey: "8112117817424282305", appSecret: "9996ed5039e641658de7b83345fee6c9", redirectURL: "http://mobile.umeng.com/social")
            UMSocialManager.default().setPlaform(UMSocialPlatformType.sina, appKey: "3921700954", appSecret: "04b48b094faeb16683c32669824ebdad", redirectURL: "http://sns.whalecloud.com/sina2/callback")
            UMSocialManager.default().setPlaform(UMSocialPlatformType.linkedin, appKey: "81t5eiem37d2sc", appSecret: "7dgUXPLH8kA8WHMV", redirectURL: "https://api.linkedin.com/v1/people")
            UMSocialManager.default().setPlaform(UMSocialPlatformType.twitter, appKey: "fB5tvRpna1CKK97xZUslbxiet", appSecret: "YcbSvseLIwZ4hZg9YmgJPP5uWzd4zr6BpBKGZhf07zzh3oj62K", redirectURL: nil)
            UMSocialManager.default().setPlaform(UMSocialPlatformType.facebook, appKey: "506027402887373", appSecret: nil, redirectURL: "http://www.umeng.com/social")
            UMSocialManager.default().setPlaform(UMSocialPlatformType.pinterest, appKey: "4864546872699668063", appSecret: nil, redirectURL: nil)
    
            //        UMSocialManager.default().removePlatformProvider(withPlatformTypes: [UMSocialPlatformType.wechatFavorite])
            return true
        }
        
        func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
            let result = UMSocialManager.default().handleOpen(url)
            if !result{
                
            }
            return result
        }
        
        func application(_ application: UIApplication, handleOpen url: URL) -> Bool {
            let result = UMSocialManager.default().handleOpen(url)
            if !result{
                
            }
            return result
        }
    }
    

    //
    //  ViewController.swift
    //  umengtest
    //
    //  Created by targetcloud on 2016/11/21.
    //  Copyright © 2016年 targetcloud. All rights reserved.
    //
    
    import UIKit
    
    class ViewController: UIViewController {
    
        override func viewDidLoad() {
            super.viewDidLoad()
            
            let shareButton:UIButton = UIButton(frame: CGRect(x: 50, y: 50, width: 200, height: 50))
            shareButton.center = CGPoint(x: self.view.frame.size.width / 2, y: self.view.frame.size.height / 2)
            shareButton.setTitle("Swift分享", for: UIControlState())
            shareButton.addTarget(self, action: #selector(shareAction), for: UIControlEvents.touchUpInside)
            shareButton.setTitleColor(UIColor.blue, for: UIControlState())
            shareButton.backgroundColor = UIColor.clear
            self.view.addSubview(shareButton)
        }
    
        func shareAction (){
            UMSocialUIManager.showShareMenuViewInWindow { (shreMenuView, platformType) -> Void in
                
                let messageObject:UMSocialMessageObject = UMSocialMessageObject.init()
                messageObject.text = "社会化组件UShare将各大社交平台接入您的应用,快速武装App。作者:targetcloud"//分享的文本
                
                
                 //1.分享图片
                 var shareObject:UMShareImageObject = UMShareImageObject.init()
                 shareObject.title = "Umeng分享标题"
                 shareObject.descr = "描述信息描述信息描述信息targetcloud"
                 shareObject.thumbImage = UIImage.init(named: "icon")
                 shareObject.shareImage = "http://dev.umeng.com/images/tab2_1.png"
                 messageObject.shareObject = shareObject;
                
                /*
                //2.分享分享网页
                let shareObject:UMShareWebpageObject = UMShareWebpageObject.init()
                shareObject.title = "分享标题"
                shareObject.descr = "描述信息描述信息描述信息描述信息targetcloud"
                shareObject.thumbImage = UIImage.init(named: "icon")//缩略图
                shareObject.webpageUrl = "http://video.sina.com.cn/p/sports/cba/v/2013-10-22/144463050817.html"
                messageObject.shareObject = shareObject;
                */
                
                UMSocialManager.default().share(to: UMSocialPlatformType.sina, messageObject: messageObject, currentViewController: self, completion: { (shareResponse, error) -> Void in
                    if error != nil {
                        print("Share Fail with error :%@", error)
                    }else{
                        print("Share succeed")
                    }
                })
                
            }
        }
    
    }
    

    最后注意一点就是来往的BitCode会在真机时编绎运行失败,需要改为NO(方法是在Build Settings中查找bitcode后输入No)


    附info.plist

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
    	<key>CFBundleDevelopmentRegion</key>
    	<string>en</string>
    	<key>CFBundleExecutable</key>
    	<string>$(EXECUTABLE_NAME)</string>
    	<key>CFBundleIdentifier</key>
    	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
    	<key>CFBundleInfoDictionaryVersion</key>
    	<string>6.0</string>
    	<key>CFBundleName</key>
    	<string>$(PRODUCT_NAME)</string>
    	<key>CFBundlePackageType</key>
    	<string>APPL</string>
    	<key>CFBundleShortVersionString</key>
    	<string>1.0</string>
    	<key>CFBundleURLTypes</key>
    	<array>
    		<dict>
    			<key>CFBundleTypeRole</key>
    			<string>Editor</string>
    			<key>CFBundleURLSchemes</key>
    			<array>
    				<string>wxdc1e388c3822c80b</string>
    			</array>
    		</dict>
    		<dict>
    			<key>CFBundleTypeRole</key>
    			<string>Editor</string>
    			<key>CFBundleURLSchemes</key>
    			<array>
    				<string>tencent100424468</string>
    			</array>
    		</dict>
    		<dict>
    			<key>CFBundleTypeRole</key>
    			<string>Editor</string>
    			<key>CFBundleURLSchemes</key>
    			<array>
    				<string>QQ05fc5b14</string>
    			</array>
    		</dict>
    		<dict>
    			<key>CFBundleTypeRole</key>
    			<string>Editor</string>
    			<key>CFBundleURLSchemes</key>
    			<array>
    				<string>wb3921700954</string>
    			</array>
    		</dict>
    		<dict>
    			<key>CFBundleTypeRole</key>
    			<string>Editor</string>
    			<key>CFBundleURLName</key>
    			<string>alipayShare</string>
    			<key>CFBundleURLSchemes</key>
    			<array>
    				<string>ap2015111700822536</string>
    			</array>
    		</dict>
    		<dict>
    			<key>CFBundleTypeRole</key>
    			<string>Editor</string>
    			<key>CFBundleURLSchemes</key>
    			<array>
    				<string>yx35664bdff4db42c2b7be1e29390c1a06</string>
    			</array>
    		</dict>
    		<dict>
    			<key>CFBundleTypeRole</key>
    			<string>Editor</string>
    			<key>CFBundleURLName</key>
    			<string>Laiwang</string>
    			<key>CFBundleURLSchemes</key>
    			<array>
    				<string>8112117817424282305</string>
    			</array>
    		</dict>
    	</array>
    	<key>CFBundleVersion</key>
    	<string>1</string>
    	<key>LSApplicationQueriesSchemes</key>
    	<array>
    		<string>wechat</string>
    		<string>weixin</string>
    		<string>sinaweibohd</string>
    		<string>sinaweibo</string>
    		<string>sinaweibosso</string>
    		<string>weibosdk</string>
    		<string>weibosdk2.5</string>
    		<string>mqqapi</string>
    		<string>mqq</string>
    		<string>mqqOpensdkSSoLogin</string>
    		<string>mqqconnect</string>
    		<string>mqqopensdkdataline</string>
    		<string>mqqopensdkgrouptribeshare</string>
    		<string>mqqopensdkfriend</string>
    		<string>mqqopensdkapi</string>
    		<string>mqqopensdkapiV2</string>
    		<string>mqqopensdkapiV3</string>
    		<string>mqqopensdkapiV4</string>
    		<string>mqzoneopensdk</string>
    		<string>wtloginmqq</string>
    		<string>wtloginmqq2</string>
    		<string>mqqwpa</string>
    		<string>mqzone</string>
    		<string>mqzonev2</string>
    		<string>mqzoneshare</string>
    		<string>wtloginqzone</string>
    		<string>mqzonewx</string>
    		<string>mqzoneopensdkapiV2</string>
    		<string>mqzoneopensdkapi19</string>
    		<string>mqzoneopensdkapi</string>
    		<string>mqqbrowser</string>
    		<string>mttbrowser</string>
    		<string>alipay</string>
    		<string>alipayshare</string>
    		<string>renrenios</string>
    		<string>renrenapi</string>
    		<string>renren</string>
    		<string>renreniphone</string>
    		<string>laiwangsso</string>
    		<string>yixin</string>
    		<string>yixinopenapi</string>
    		<string>instagram</string>
    		<string>whatsapp</string>
    		<string>line</string>
    		<string>fbapi</string>
    		<string>fb-messenger-api</string>
    		<string>fbauth2</string>
    		<string>fbshareextension</string>
    		<string>kakaofa63a0b2356e923f3edd6512d531f546</string>
    		<string>kakaokompassauth</string>
    		<string>storykompassauth</string>
    		<string>kakaolink</string>
    		<string>kakaotalk-4.5.0</string>
    		<string>kakaostory-2.9.0</string>
    		<string>pinterestsdk.v1</string>
    	</array>
    	<key>LSRequiresIPhoneOS</key>
    	<true/>
    	<key>NSAppTransportSecurity</key>
    	<dict>
    		<key>NSAllowsArbitraryLoads</key>
    		<true/>
    	</dict>
    	<key>UILaunchStoryboardName</key>
    	<string>LaunchScreen</string>
    	<key>UIMainStoryboardFile</key>
    	<string>Main</string>
    	<key>UIRequiredDeviceCapabilities</key>
    	<array>
    		<string>armv7</string>
    	</array>
    	<key>UISupportedInterfaceOrientations</key>
    	<array>
    		<string>UIInterfaceOrientationPortrait</string>
    		<string>UIInterfaceOrientationLandscapeLeft</string>
    		<string>UIInterfaceOrientationLandscapeRight</string>
    	</array>
    </dict>
    </plist>
    

    运行效果中下

    网页分享

                //分享网页
                let shareObject:UMShareWebpageObject = UMShareWebpageObject.init()
                shareObject.title = "分享标题"
                shareObject.descr = "描述信息描述信息描述信息描述信息targetcloud"
                shareObject.thumbImage = UIImage.init(named: "icon")//缩略图
                shareObject.webpageUrl = "http://video.sina.com.cn/p/sports/cba/v/2013-10-22/144463050817.html"
                messageObject.shareObject = shareObject;


    图片分享

                 var shareObject:UMShareImageObject = UMShareImageObject.init()
                 shareObject.title = "Umeng分享标题"
                 shareObject.descr = "描述信息描述信息描述信息targetcloud"
                 shareObject.thumbImage = UIImage.init(named: "icon")
                 shareObject.shareImage = "http://dev.umeng.com/images/tab2_1.png"
                 messageObject.shareObject = shareObject;



    展开全文
  • 友盟分享二次封装,现有文字分享、图片分享、网页分享功能
  • 第一步:申请友盟的账号http://www.umeng.com/(注册) 之后在首页中找到消息推送模块第二步:创建要推送的应用点击立即使用-》然后新建应用,在程序代码中保存对用的App-Key和APP-Secret(后面发现secret没有用到...

    第一步:申请友盟的账号http://www.umeng.com/(注册)

        之后在首页中找到消息推送模块


    第二步:创建要推送的应用


    点击立即使用-》然后新建应用,在程序代码中保存对用的App-Key和APP-Secret(后面发现secret没有用到,没有关系)

    第四步:下载并集成到对应的SDK(也可以参考官方的集成http://mobile.umeng.com/custom_sdk,我这边主要会写出集成过程中遇到的问题)



    第五步:申请程序的证书,用的是指定APP包名的证书(参考http://blog.csdn.net/yishengzhiai005/article/details/54572498)

    第六步:设置Xcode和设置通知的代码

    采用自选证书


    打开程序的推送通知开关(注意:steps中必须两个都是对号才行,如果能确保证书没有问题的情况下,第一步还是错的,请退出Xcode程序,然后重新打开再试




    第七步:在桥接文件中引用头文件(参考桥接文件的生成:http://blog.csdn.net/qq_25639809/article/details/60878785)


    第八步:在AppDelegate.swift文件中添加推送代码

    // 创建实例变量

    // 友盟推送userInfo

        var umUserInfo: [AnyHashable : Any]?

    // 在didFinishLaunchingWithOptions 方法中添加

    // 设置友盟推送

            UMConfigure.initWithAppkey(UM_SHARE_APP_KEY, channel: "App Store")

            /* appkey: 开发者在友盟后台申请的应用获得(可在统计后台的 “统计分析->设置->应用信息” 页面查看)*/

            UMConfigure.setLogEnabled(true)

            // 统计组件配置

            //MobClick.setScenarioType(.E_UM_NORMAL)

            // Push组件基本功能配置

            if #available(iOS 10.0, *) {

                UNUserNotificationCenter.current().delegate = self

            } else {

                // Fallback on earlier versions

            }

            let entity = UMessageRegisterEntity.init()

            //type是对推送的几个参数的选择,可以选择一个或者多个。默认是三个全部打开,即:声音,弹窗,角标等

            entity.types = Int(UInt8(UMessageAuthorizationOptions.badge.rawValue) | UInt8(UMessageAuthorizationOptions.alert.rawValue))

            UMessage.registerForRemoteNotifications(launchOptions: launchOptions, entity: entity) { (granted, error) in

                if granted {

                    // 用户选择了接收Push消息

                } else {

                    // 用户拒绝接收Push消息

                    myPrint(message: "用户拒绝接收Push消息")

                }

            }


    在增加几个代理方法

    //iOS10以下使用这两个方法接收通知,

        func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {

            //关闭友盟自带的弹出框

            UMessage.setAutoAlert(false)

            if UIDevice.current.systemVersion < "10" {

                UMessage.didReceiveRemoteNotification(userInfo)

                self.umUserInfo = userInfo;

                //定制自定的的弹出框

                if UIApplication.shared.applicationState == UIApplicationState.active {

                    let alertViewVc = UIAlertController.init(title: "通知标题", message: "Test On ApplicationStateActive", preferredStyle: UIAlertControllerStyle.alert)

                    alertViewVc.addAction(UIAlertAction.init(title: "确定", style: UIAlertActionStyle.default, handler: { (alertView) in

                        // sure click

                    }))

                    

                    self.window?.rootViewController?.present(alertViewVc, animated: true, completion: nil)

                }

                

                completionHandler(UIBackgroundFetchResult.newData)

            }

        }

        

        

        //iOS10新增:处理前台收到通知的代理方法

        @available(iOS 10.0, *)

        func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {

            let userInfo = notification.request.content.userInfo

            if notification.request.trigger is UNPushNotificationTrigger {

                //应用处于前台时的远程推送接受

                //关闭友盟自带的弹出框

                UMessage.setAutoAlert(false)

                //必须加这句代码

                UMessage.didReceiveRemoteNotification(userInfo)

            } else {

                //应用处于后台时的本地推送接受

            }

            

            //当应用处于前台时提示设置,需要哪个可以设置哪一个

            completionHandler(UNNotificationPresentationOptions(rawValue: UNNotificationPresentationOptions.RawValue(UInt8(UNNotificationPresentationOptions.sound.rawValue) | UInt8(UNNotificationPresentationOptions.badge.rawValue) | UInt8(UNNotificationPresentationOptions.alert.rawValue))))

        }

        

        

        //iOS10新增:处理后台点击通知的代理方法

        @available(iOS 10.0, *)

        func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {

            let userInfo = response.notification.request.content.userInfo

            if response.notification.request.trigger is UNPushNotificationTrigger {

                //应用处于前台时的远程推送接受

                //关闭友盟自带的弹出框

                UMessage.setAutoAlert(false)

                //必须加这句代码

                UMessage.didReceiveRemoteNotification(userInfo)

            } else {

                //应用处于后台时的本地推送接受

            }

        }

        

        

        func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {

            var token = deviceToken.description.replacingOccurrences(of: "<", with: "")

            token = token.replacingOccurrences(of: ">", with: "")

            token = token.replacingOccurrences(of: " ", with: "")

            myPrint(message: "deviceToken:\(token)")

        }

        

        func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {

            myPrint(message: "error:\(error)")

        }


    第九步:测试是否已经集成成功(只能在真机上测试

    1. 添加测试通知设备的DeviceToken到友盟平台上(http://message.umeng.com/app/577c80b5e0f55a6664002d76/testmode)

    (备注:如何获取设备的DeviceToken, 代码中添加UMConfigure.setLogEnabled(true) //打开日志,)


    2. 发送测试的消息通知


    展开全文
  • Swift 集成友盟推送

    2019-06-11 14:26:43
    集成之前, 请在push.umeng.com/申请开通【友盟+】消息推送服务。 下载UMessage_Sdk_All_x.x.x.zip并解压缩 2、配置 ##2.1.1 引入库文件 增加UserNotifications.framework到项目中。 具体操作如下:点击项目---->...

    1、前期准备

    集成之前, 请在push.umeng.com/申请开通【友盟+】消息推送服务。 下载 UMessage_Sdk_All_x.x.x.zip并解压缩

    2、配置

    ##2.1.1 引入库文件 增加UserNotifications.framework到项目中。 具体操作如下:点击项目---->TARGET---->Build Phases---->Link Binary with Libraries ---->左侧+号---->搜索UserNotifications---->选中UserNotifications.framework---->点击Add

    ##2.1.2 配置(可选) 如果您使用了-all_load,可能需要添加libz的库: TARGETS-->Build Phases-->Link Binary With Libraries--> + -->libz.dylib ##2.1.3 打开推送开关 点击项目---->TARGET ---->Capabilities ,将这里的Push Notification 的开关打开,效果如图所示:

    注意:一定要打开Push Notification,且两个steps都是正确的,否则会报如下错误:Code=3000 "未找到应用程序的“aps-environment”的授权字符串" ###3、开始集成

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
            //推送
            UMessage.start(withAppkey: UMAppKey, launchOptions: launchOptions, httpsEnable: true)
            UMessage.registerForRemoteNotifications()
            
            //iOS10必须添加下面这段代码
            if #available(iOS 10.0, *) {
                let center = UNUserNotificationCenter.current
                center().delegate = self 
                center().requestAuthorization(options:[.badge,.alert,.sound] , completionHandler: { (granted, error) in
                    if granted {
                        //点击允许
                        //这里可以添加一些自己的逻辑
                    }else{
                        //点击不允许
                        //这里可以添加一些自己的逻辑
                    }
                })
                
            } else {
                // Fallback on earlier versions
            }
            //打开日志,方便调试
            UMessage.setLogEnabled(true)
            return true
        }
    
     /**
       UNUserNotificationCenterDelegate
     */
     //iOS10以下使用这个方法接收通知
        func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any]) {
            UMessage.didReceiveRemoteNotification(userInfo)
            
        }
       
        @available(iOS 10.0, *)
        //iOS10新增:处理前台收到通知的代理方法
        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))! {
                let info = userInfo as NSDictionary
                print(info)
                //应用处于前台时的远程推送接受
                UMessage.setAutoAlert(false)
                UMessage.didReceiveRemoteNotification(userInfo)
            }else{
                //应用处于前台时的远程推送接受
            }
            completionHandler([.alert,.sound,.badge])
        }
        
        @available(iOS 10.0, *)
        //iOS10新增:处理后台点击通知的代理方法
        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))! {
                let info = userInfo as NSDictionary
                print(info)
                //应用处于后台时的远程推送接受
                UMessage.didReceiveRemoteNotification(userInfo)
            }else{
                //应用处于前台时的远程推送接受
            }
        }
    
    复制代码

    转载于:https://juejin.im/post/5a31ebdaf265da431876c22c

    展开全文
  • 但并不是每次都想使用这些第三方的服务的, 这里作者整理了微信, QQ, 新浪微博原生第三方的接入:[Swift]原生第三方接入: 微信篇--集成/登录/分享/支付[Swift]原生第三方接入: QQ篇--集成/登录/分享[Swift]原生...

    文章涉及的demo在Github LQThirdParty, 欢迎Star | Fork

    关于第三方登录/分享的接入, 很多时候使用的是友盟或者ShareSDK; 但并不是每次都想使用这些第三方的服务的, 这里作者整理了微信, QQ, 新浪微博原生第三方的接入:

    [Swift]原生第三方接入: 微信篇--集成/登录/分享/支付
    [Swift]原生第三方接入: QQ篇--集成/登录/分享
    [Swift]原生第三方接入: 新浪微博篇--集成/登录/分享

    一. 集成

    1.1 新建应用

    首先, 想要使用腾讯相关的功能, 您必须注册成为腾讯认证的开发者, 并且在腾讯开放平台创建了应用, 即已经获取到了相应的 ** APPID ** 和 ** APPKEY **.

    1.2. 集成SDK

    个人感觉腾讯的文档不太友好, 先给出官方文档地址官方SDK下载地址下载最新的文档及SDK. 将下载后的SDK中的 TencentOpenApi_IOS_Bundle.bundle 和 TencentOpenAPI.framework,添加到项目工程目录.

    添加系统依赖库

    到Build Phases -> Link Binary With Libraries, 添加以下系统库 :

    • Security.framework
    • SystemConfiguration.framework
    • CoreGraphics.Framework
    • CoreTelephony.framework
    • libiconv.dylib
    • libsqlite3.dylib
    • libstdc++.dylib
    • libz.dylib
      后面四个下新版Xcode中为:
    • libiconv.tbd
    • libsqlite3.tbd
    • libstdc++.tbd
    • libz.tbd
    添加 TencentOpenApi_IOS_Bundle.bundle

    然后来到Build Phases -> Copy Bundle Resources
    将 TencentOpenApi_IOS_Bundle.bundle 添加进来(一般会自动添加到这里, 看下有没有即可, 没有的话, 点击 + 添加)

    添加 -fobjc-arc

    来到Build Settings -> Other Linker Flags
    添加 -fobjc-arc
    PS: 如果这里已有其他内容, 加个空格粘贴进去即可, 个人尝试可行.

    添加URL Scheme

    来到Info-> URL Types, 点击左下角的 + 新加一个Scheme

    格式: tencent+AppID
    例如你的AppID为: 123456789
    则你的Scheme为: tencent123456789

    添加URL Scheme
    适配iOS 9+ , 添加Scheme白名单
    • ** 方式一 **

    在Info.plist文件内新加字段: LSApplicationQueriesSchemes, 类型为Array(数组)
    然后添加内容, 类型为String(字符串)
    QQ需要添加以下字段:

    • mqqOpensdkSSoLogin,
    • mqqopensdkapiV2,
    • mqqopensdkapiV3,
    • wtloginmqq2,
    • mqq,
    • mqqapi
    • mqqopensdkdataline

    QZONE 需要添加:

    • mqzoneopensdk,
    • mqzoneopensdkapi,
    • mqzoneopensdkapi19,
    • mqzoneopensdkapiV2,
    • mqqOpensdkSSoLogin,
    • mqqopensdkapiV2,
    • mqqopensdkapiV3,
    • wtloginmqq2,
    • mqqapi,
    • mqqwpa,
    • mqzone,
    • mqq
    • mqqopensdkapiV4
    • mqqopensdkdataline

    如果同时需要QQ和Qzone, 只需要添加Qzone即可;

    • ** 方式二 **

    或者, 在Info.plist文件右键, Open as... -> Source Code, 可打开文件, 进行编辑, 在倒数第三行(即: </dict> 标签的上面)的空白处添加以下代码:

    <key>LSApplicationQueriesSchemes</key>
    <array>
            <string>mqzoneopensdk</string>
            <string>mqzoneopensdkapi</string>
            <string>mqzoneopensdkapi19</string>
            <string>mqzoneopensdkapiV2</string>
            <string>mqqOpensdkSSoLogin</string>
            <string>mqqopensdkapiV2</string>
            <string>mqqopensdkapiV3</string>
            <string>wtloginmqq2</string>
            <string>mqqapi</string>
            <string>mqqwpa</string>
            <string>mqzone</string>
            <string>mqq</string>
            <string>mqqopensdkapiV4</string>
                    <string> mqqopensdkdataline </string>
    </array>
    

    如果还有其他平台的白名单需要添加, 例如微信, 新浪微博, 只需要在<array></array>标签内添加对应的字段即可;

    PS: Info.plist文件显示为Source Code后, 如果还想显示原来的列表格式, 可以: 邮件 -> Open as.. -> Property List 即可.

    适配iOS 9+, 网络请求
    • **方式一: 暂时回退到HTTP请求 **
      在Info.plist文件中添加字段: ** NSAppTransportSecurity , 类型为字典;
      然后添加一个Key:
      NSAllowsArbitraryLoads **, 类型为Boolean, 值为 YES
    回退到HTTP

    或者以Source Code 打开Info.plist文件, 空白处添加以下代码:

    <key>NSAppTransportSecurity</key>
        <dict>
            <key>NSAllowsArbitraryLoads</key>
            <true/>
        </dict>
    
    • ** 方式二: 设置域 **

    在项目的info.plist中添加一个Key:NSAppTransportSecurity,类型为字典类型。
    然后给它添加一个值: NSExceptionDomains,类型为字典类型;
    把需要的支持的域添加給NSExceptionDomains
    其中域作为Key,类型为字典类型。
    每个域下面需要设置3个属性:
    NSIncludesSubdomains、
    NSExceptionRequiresForwardSecrecy、NSExceptionAllowsInsecureHTTPLoads。

    均为Boolean类型,值分别为YES、NO、YES

    QQ需要设置的域为:

    QQ域

    或者以Source Code 打开Info.plist文件, 空白处添加以下代码:

    <key>NSAppTransportSecurity</key>
        <dict>
            <key>NSExceptionDomains</key>
            <dict>
                <key>qq.com</key>
                <dict>
                    <key>NSExceptionAllowsInsecureHTTPLoads</key>
                    <true/>
                    <key>NSExceptionRequiresForwardSecrecy</key>
                    <false/>
                    <key>NSIncludesSubdomains</key>
                    <true/>
                </dict>
            </dict>
        </dict>
    

    PS: 这种方式需要对每个要以HTTP方式访问的域名进行设置, 比较麻烦, 建议使用第一种方式.

    到此, 集成及适配结束...

    PS: 在使用相关API的时候, 需要新建桥接头文件, 或者在已有桥接头文件内引用其头文件:

    #import <TencentOpenAPI/TencentOAuth.h>
    #import <TencentOpenAPI/QQApiInterfaceObject.h>
    #import <TencentOpenAPI/QQApiInterface.h>
    

    二. 登录

    在AppDelegate.swift中注册app:
    QQ在注册App的时候, 和其他的不同, 是要创建一个TencentOAuth对象, 来发起授权申请:

    var tencentAuth: TencentOAuth! 
            
    self. tencentAuth = TencentOAuth(appId: qqAppID, andDelegate: self)
    

    在方法 func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool 中添加回调:

    func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
      let urlKey: String = options[UIApplicationOpenURLOptionsKey.sourceApplication] as! String
       
      if urlKey == "com.tencent.mqq" {
                // QQ 的回调
                return  TencentOAuth.handleOpen(url)
            }
            
            return true
    }
    

    然后, 实现其代理方法:

    func tencentDidLogin() {
            // 登录成功后要调用一下这个方法, 才能获取到个人信息
            self.tencentAuth.getUserInfo()
        }
        
        func tencentDidNotNetWork() {
            // 网络异常
        }
        
        func tencentDidNotLogin(_ cancelled: Bool) {
            
        }
        
        func getUserInfoResponse(_ response: APIResponse!) {
            // 获取个人信息
            if response.retCode == 0 {
                
                if let res = response.jsonResponse {
                                 
                    if let uid = self.tencentAuth.getUserOpenID() {
                       // 获取uid
                    }
                    
                    if let name = res["nickname"] {
                        // 获取nickname
                    }
                    
                    if let sex = res["gender"] {
                        // 获取性别
                    }
                    
                    if let img = res["figureurl_qq_2"] {
                        // 获取头像
                    }
                   
                }
            } else {
               // 获取授权信息异常
            }
        }
    

    最后在需要发起登录的地方添加以下代码来发起登录申请:

    let appDel = UIApplication.shared.delegate as! AppDelegate
    // 需要获取的用户信息
            let permissions = [kOPEN_PERMISSION_GET_USER_INFO, kOPEN_PERMISSION_GET_SIMPLE_USER_INFO]
            appDel.tencentAuth.authorize(permissions)
    

    到此, 一个完整的QQ登录授权流程就完成了,并成功的获取到了QQ用户的相关信息, 即登录成功.
    上面我是在AppDelegate.swift方法内处理的回调, 我们可以完全写在其他的类里面, 只需要将其代理对象设置为需要处理回调的对象即可.

    三. 分享

    一直在吐槽腾讯的开放平台, 找个文档真心不容易, 绕了一些弯路, 最后还是百度搜到了文档地址, 确实很尴尬. 虽然找到了官方文档说明, 但是不是特别详细, 可以下载其详细文档来参考设置.

    PS: 在配置工程的时候需要注意, 如果需要兼容旧版本的手机QQ, 需要额外添加一个 ** URL Scheme ** : QQ + 十六进制的AppID ,不足八位的在首部补0 ; 例如你的AppID为: 123456 , 其十六进制为: 1E240, 则, URL Scheme 为: QQ0001E240


    兼容低版本QQ

    不过, 现在的QQ版本都比较高了, 至于低于哪个版本需要兼容, 官方文档没有提, 如果你的开发中适配低版本QQ时不能成功分享, 不妨添加试试.

    如果是单独集成了分享, 在注册APP的时候依然是使用下面这个方法:

    TencentOAuth(appId: "appid", andDelegate: nil)
    

    如果没有登录, 这里代理传nil即可; 如果有登录, 按登录的设置即可;
    在其代理类中实现代理( QQApiInterfaceDelegate )方法:

    func onReq(_ req: QQBaseReq!) {
            
        }
        
        func onResp(_ resp: QQBaseResp!) {
            
            if resp is SendMessageToQQResp {
                let rs = resp as! SendMessageToQQResp
                if rs.type == 2 {
                    // QQ分享返回的回调
                    if rs.result == "0" {
                        // 分享成功
                        print("分享成功")
                    } else {
                        print("分享失败")
                    }
                }
            }
        }
        
        func isOnlineResponse(_ response: [AnyHashable : Any]!) {
            
        }
    

    虽然我们只用在代理方法 ** func onResp(_ resp: QQBaseResp!) ** 中处理分享的回调, 但其他两个方法也是要实现.

    PS: 这里需要注意, 如果项目中集成了微信, QQ的代理和微信的代理需要分开处理, 不能使用同一个对象, 否则会编译报错:

     Method 'onReq' with Objective-C selector 'onReq:' conflicts with previous declaration with the same Objective-C selector
    

    然后在 ** func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool ** 方法中添加回调:

    func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
            
    return QQApiInterface.handleOpen(url, delegate: LDShareUnit.shared)
        }
    

    最后, 就是在需要分享的地方发起分享了, 在这里我遇到一个坑.

    分享文本

    以分享文本为例. 开始我的代码是这样的:

    let textObj = QQApiTextObject()
            textObj.text = "这是分享到QQ的一段文字"
            textObj.title = "这是分享到QQ的标题"
            textObj.description = "一段描述"
            textObj.shareDestType = ShareDestTypeQQ // 分享到QQ 还是TIM, 必须指定
            
            let req = SendMessageToQQReq()
            req.message = textObj
            
            let code = QQApiInterface.send(req)  
    
            print(code)
    

    这样写, 一直无法吊起QQ客户端, 打印返回的code值, 一直是: ** QQApiSendResultCode(rawValue: -1)**, 发送失败; 查了很多资料, 尝试了各种情况, 都没能解决. 最后搁置了些时间, 一时心血来潮, 换了个初始化的方法, 改成如下这样:

    let textObj = QQApiTextObject(text: "这是分享到QQ的一段文字")
            //        textObj.text = "这是分享到QQ的一段文字"
            textObj?.title = "这是分享到QQ的标题"
            textObj?.description = "一段描述"
            textObj?.shareDestType = ShareDestTypeQQ // 分享到QQ 还是TIM, 必须指定
            
            let req = SendMessageToQQReq(content: textObj)
            req?.message = textObj
            //        QQApiInterface.openQQ()
            let code = QQApiInterface.send(req)
            
            print(code)
    

    奇迹竟然发生了, 就这样, 成功的吊起QQ客户端, 并分享出去了.......

    上面的title和description不需要设置, 设置了也看不到.
    关于 shareDestType 参数, 官方文档指出必须设置, 否则无法正常工作, 我发现即使不设置, 默认也是吊起QQ发起分享的.

    这算是一个比较大, 也是比较坑的一个大坑了, 花了很多时间, 做了一些无用功, 这也算是其API的一个不太友好的地方吧.

    PS: 这里对 QQApiObject 的一个参数 cflag 做一下说明, 这是设置要分享的内容到什么地方, 空间, 收藏, 聊天, 电脑等

    // QQApiObject control flags
    enum
    {
        kQQAPICtrlFlagQZoneShareOnStart = 0x01,
        kQQAPICtrlFlagQZoneShareForbid = 0x02,
        kQQAPICtrlFlagQQShare = 0x04,
        kQQAPICtrlFlagQQShareFavorites = 0x08, //收藏
        kQQAPICtrlFlagQQShareDataline = 0x10,  //数据线
    };
    
    • kQQAPICtrlFlagQQShareDataline
      只分享文字/图片等到电脑
    • kQQAPICtrlFlagQQShareFavorites
      只分享到文字/图片等到收藏
    • kQQAPICtrlFlagQQShare
      分享到QQ, 可以选择到联系人/ 收藏/ 电脑/ 空间等
    • kQQAPICtrlFlagQZoneShareForbid
      禁止分享到QQ空间
    • kQQAPICtrlFlagQZoneShareOnStart
      只分享到QQ空间

    如果想要设置不同的分享目标, 可以设置这个参数.

    分享图片
    • 单图
    func shareImageToQQ() {
            // 原图 最大5M
            let img = UIImage(named: "1.jpg")
            let data = UIImageJPEGRepresentation(img!, 0.8)
            // 预览图 最大 1M
            let thumb = UIImage(named: "qq")
            let thData = UIImagePNGRepresentation(thumb!)
            
            let imgObj = QQApiImageObject(data: data, previewImageData: thData, title: "分享的一张图片", description: "分享图片的描述")
            
            let req = SendMessageToQQReq(content: imgObj)
            // 分享到QQ
            QQApiInterface.send(req)
    // 分享到Qzone
    //        QQApiInterface.sendReq(toQZone: req)
        }
    

    如果要分享到QZone, 可以设置imgObj?.cflag = UInt64(kQQAPICtrlFlagQZoneShareOnStart), 也可以使用QQApiInterface.sendReq(toQZone: req)

    • 多图
      多图只能分享到 QQ收藏
    func shareImagesToQQ() {
            // 多图不支持分享到QQ, 如果设置, 默认分享第一张
            // k可以分享多图到QQ收藏
            let img = UIImage(named: "1.jpg")
            let data = UIImageJPEGRepresentation(img!, 0.8)
            
            let img1 = UIImage(named: "10633861_160536558132_2.jpg")
            let data1 = UIImageJPEGRepresentation(img1!, 0.8)
            
            let thumb = UIImage(named: "qq")
            let thData = UIImagePNGRepresentation(thumb!)
            
            let imgObj = QQApiImageObject(data: data, previewImageData: thData, title: "分享多个图片", description: "描述", imageDataArray: [data!, data1!])
            // 设置分享目标为QQ收藏
            imgObj?.cflag = UInt64(kQQAPICtrlFlagQQShareFavorites)
            let req = SendMessageToQQReq(content: imgObj)
            
            QQApiInterface.send(req)
        }
    

    PS: 这里在设置分享到QQ收藏的时候, 遇到一个错误提示:

     -canOpenURL: failed for URL: "mqqopensdkdataline://" - error: "This app is not allowed to query for scheme mqqopensdkdataline"
    

    这是因为之前配置的工程白名单的时候没有添加** mqqopensdkdataline** , 在第一部分的 适配iOS 9+ , 添加Scheme白名单 中添加** mqqopensdkdataline**即可;

    分享新闻链接

    新闻可以分享到QQ, 也可以只分享到QZone

    func shareNewsToQQ() {
        
            let url = URL(string: "http://www.jianshu.com/u/2846c3d3a974")
            
            let preURL = URL(string: "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1496830989997&di=5ca7528be6f496c6500a436c8775a67d&imgtype=0&src=http%3A%2F%2Fwww.pp3.cn%2Fuploads%2F201502%2F2015021111.jpg")
            
            let obj = QQApiNewsObject(url: url!, title: "关注作者流火绯瞳", description: "这是一个coder, 不是一个美女", previewImageURL: preURL!, targetContentType: QQApiURLTargetTypeNews)
            
            let req = SendMessageToQQReq(content: obj)
            // 分享到QQ
    //        QQApiInterface.send(req)
            // 分享到QZone
            QQApiInterface.sendReq(toQZone: req)
        }
    

    在创建新闻实例对象 QQApiNewsObject 的时候, 可以使用上面的方法, 也可以使用:

    QQApiNewsObject(url: URL!, title: String!, description: String!, previewImageData: Data!, targetContentType: QQApiURLTargetType)
    

    只是参数类型不同, 含义和上面的方法是一致的;

    分享音乐

    音乐可以分享到QQ和QZone

    func shareMusicToQQ() {
            
            let url = URL(string: "http://y.qq.com/i/song.html?songid=432451&source=mobileQQ%23wechat_redirect")
            let preUrl = URL(string: "http://imgcache.qq.com/music/photo/mid_album_300/V/E/000J1pJ50cDCVE.jpg")
            
            let obj = QQApiAudioObject(url: url!, title: "歌曲名:不要说话", description: "专辑名:不想放手歌手名:陈奕迅", previewImageURL: preUrl!, targetContentType: QQApiURLTargetTypeVideo)
            
            let req = SendMessageToQQReq(content: obj)
            
            // 分享到QQ
    //        QQApiInterface.send(req)
            // 分享到QZone
            QQApiInterface.sendReq(toQZone: req)
        }
    

    这里在创建 QQApiAudioObject 实例对象的时候, 可以使用上面的方法, 也可以使用下面的方法, 只是参数类型不同, 其含义一致:

    let obj = QQApiAudioObject(url: URL!, title: String!, description: String!, previewImageData: Data!, targetContentType: QQApiURLTargetType)
    
    分享视频

    视频可以分享到QQ和QZone

    func shareVideoToQQ() {
    
            let url = URL(string: "视频URL地址")
            let preURL = URL(string: "视频预览图片URL地址")
            
            let obj = QQApiVideoObject(url: url!, title: "分享的视频名称", description: "视频内容描述", previewImageURL: preURL!, targetContentType: QQApiURLTargetTypeVideo)
            
            let req = SendMessageToQQReq(content: obj)
            
            // 分享到QQ
    //        QQApiInterface.send(req)
            //分享到QZone
            QQApiInterface.sendReq(toQZone: req)
        }
    

    这里在创建QQApiVideoObject实例的时候, 可以使用上面的方法, 也可以使用下面的方法, 只是参数类型不同, 其含义一致:

    let obj = QQApiVideoObject(url: URL!, title: String!, description: String!, previewImageData: Data!, targetContentType: QQApiURLTargetType
    

    (完)

    以上便是 QQ登录分享的所有内容, 如有不正确的地方, 还请评论指出, 或者私信;

    文章涉及的demo在Github LQThirdParty, 欢迎Star | Fork



    作者:流火绯瞳
    链接:https://www.jianshu.com/p/c8db82d27b11
    來源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    展开全文
  • 接入友盟推送的时候我主要把它分为两步:第一步:sdk的接入,指在官网下载最新的sdk接入到项目中去,这个比较简单,按照步奏来就可以了。下面我按照我的接入说下:我下载的3.1.0的sdk1:解压下载后的sdk,可以看见...

    在接入友盟推送的时候我主要把它分为两步:

    第一步:sdk的接入,指在官网下载最新的sdk接入到项目中去,这个比较简单,按照步奏来就可以了。下面我按照我的接入说下:

    我下载的3.1.0的sdk

    1:解压下载后的sdk,可以看见common/push/thirdparties3个文件夹,把3个文件夹里的.framework放入到项目里并且加入到link FrameWork and Libraries中(点击项目---->TARGET---->Build Phases---->Link Binary with Libraries ---->左侧+号),因为是接入推送所以还需要加入搜索UserNotifications---->选中UserNotifications.framework---->点击Add;

    2:打开推送开关

    点击项目---->TARGET---->Capabilities,将这里的Push Notification的开关打开,效果如图所示

    3:background modes中

    打开Remote notifications background mode

    4:代码的接入在AppController.mm

    4.1:加入头文件:

    #import <UMCommon/UMCommon.h>           // 公共组件是所有友盟产品的基础组件,必选

    #import <UMPush/UMessage.h>             // Push组件

    #import <UserNotifications/UserNotifications.h>  // Push组件必须的系统库

    #import <UMErrorCatch/UMErrorCatch.h>

    4.2加入UNUserNotificationCenterDelegate

    @interface AppController ()<UNUserNotificationCenterDelegate>


    @end


    @implementation AppController


    4.3:友盟的日志

        // open um log

        [UMConfigure setLogEnabled:true];

    4.4友盟推送的初始

        [UMConfigure initWithAppkey:[NSString stringWithUTF8String:"596eeedc5312ddacce000879"] channel: [NSString stringWithUTF8String:""]];


        

       [UMErrorCatch initErrorCatch];

        

        // Push组件基本功能配置

        [UNUserNotificationCenter currentNotificationCenter].delegate = self;

        UMessageRegisterEntity * entity = [[UMessageRegisterEntity alloc] init];

        //type是对推送的几个参数的选择,可以选择一个或者多个。默认是三个全部打开,即:声音,弹窗,角标等

        entity.types = UMessageAuthorizationOptionBadge|UMessageAuthorizationOptionAlert|UMessageAuthorizationOptionSound;

        //[UNUserNotificationCenter currentNotificationCenter].delegate = self;

        [UMessage registerForRemoteNotificationsWithLaunchOptions:launchOptions Entity:entity completionHandler:^(BOOL granted, NSError * _Nullable error) {

            if (granted) {

                // 用户选择了接收Push消息

                CCLOG("===granted=YES===");

            }else{

                // 用户拒绝接收Push消息

                CCLOG("===granted==NO==");


            }

        }];

    4.5

    //获取测试的token

    - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken

    {

         CCLOG("===didRegisterForRemoteNotificationsWithDeviceToken===");

        NSLog(@"%@",[[[[deviceToken description ] stringByReplacingOccurrencesOfString: @"<" withString:@"" ]

                          stringByReplacingOccurrencesOfString: @">" withString:@""]

                        stringByReplacingOccurrencesOfString: @"" withString:@""

                      ]);

        

        //NSLog(@"locError:%s};", NSUserDefaults.kUMessageUserDefaultKeyForParams);

    }


    - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSDictionary *)userInfo

    {


        

    }


    // 收到友盟的消息推送

    -(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler

    {

        CCLOG("===didReceiveRemoteNotification===");

        // 注意:当应用处在前台的时候,是不会弹出通知的,这个时候就需要自己进行处理弹出一个通知的UI

        if (application.applicationState == UIApplicationStateActive) {

        

            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:[[[userInfo objectForKey:@"aps"] objectForKey:@"alert"] objectForKey:@"title"] message:[[[userInfo objectForKey:@"aps"] objectForKey:@"alert"] objectForKey:@"body"]

                                                           delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil];

            [alert show];


      

            return;

        }

        //如果是在后台挂起,用户点击进入是UIApplicationStateInactive这个状态

        else if (application.applicationState == UIApplicationStateInactive){

            //......

        }

        // 这个是友盟自带的前台弹出框

        [UMessage setAutoAlert:NO];

        if([[[UIDevice currentDevice] systemVersion]intValue] < 10){

            [UMessage didReceiveRemoteNotification:userInfo];

            

            completionHandler(UIBackgroundFetchResultNewData);

        }


    }

    //iOS10新增:处理前台收到通知的代理方法

    -(void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler{

        NSDictionary * userInfo = notification.request.content.userInfo;

        CCLOG("===willPresentNotification1===");

        if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {

            //应用处于前台时的远程推送接受

            //关闭U-Push自带的弹出框

            [UMessage setAutoAlert:NO];

            //必须加这句代码

            [UMessage didReceiveRemoteNotification:userInfo];

            CCLOG("===willPresentNotification2===");

        }else{

            //应用处于前台时的本地推送接受

            CCLOG("===willPresentNotification3===");

        }

        //当应用处于前台时提示设置,需要哪个可以设置哪一个

        completionHandler(UNNotificationPresentationOptionSound|UNNotificationPresentationOptionBadge|UNNotificationPresentationOptionAlert);

    }


    //iOS10新增:处理后台点击通知的代理方法

    -(void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler{

        NSDictionary * userInfo = response.notification.request.content.userInfo;

        if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {

    #ifdef UM_Swift

            [UMessageSwiftInterface didReceiveRemoteNotificationWithUserInfo:userInfo];

    #else

            //应用处于后台时的远程推送接受

            //必须加这句代码

            CCLOG("===didReceiveNotificationResponse===");


            [UMessage didReceiveRemoteNotification:userInfo];

    #endif

            

        }else{

            //应用处于后台时的本地推送接受

        }

    }

    以上就是友盟的sdk接入的情况,按照步奏来一般是不会出错的,主要注意几点,lib的导入,和应用在前台的处理;不处理前台的情况下不弹出不是出错了,而是苹果这边没有弹出通知栏,这个可以自己进行本地的推送通知;


    第二步:友盟的后台推送

    1:注册IOS应用

    需要注意的就是开发证书和生产证书的上传,这个按照http://dev.umeng.com/sdk_integate/ios-integrate-guide/push证书配置指南 这个来就可以了;

    开发证书上传后可以进行测试消息的推送,生产证书上传后可以进行正式的推送(正式推送获取token可能需要经过24小时)所以开发和生产证书请都上传好再进行测试;

    在这个链接下的 

    【7.  创建并配置推送证书(开发环境&生产环境)可以查看证书生成方法」】

    2:

     以Ad Hoc方式打包应用可以进行正式消息的推送

    遇到的问题:

    1:证书无效,请重新按照步奏导入证书;

    2:证书不存在,证书无效或者证书忘记上传了;(都要注意证书选择的appid要和本事项目一致)

    3:token无效,证书的问题。也可在前端获取token进行测试

    4:正式环境下的token如果你确定接入和证书都没问题,请24小时后在进行测试,这个按友盟的说话,token缓存需要这个时间进行更新(正式环境测试,需要出Ad Hoc的包才可以,否则就会出现发送失败全部token失败的错误)







    展开全文
  • 友盟微博分享提示“网络不给力分享失败”; 这种报错一看就是版本过低了。我用的友盟库还是4.4的版本现在都到了6.0以上了。 但是微信和qq是好的。下面就是我一天的解决之道。 上午的时候在跟新pod类库;企图把友盟...
  • IOS 开发 友盟-社会化组件SDK v6.0.2-集成指南新版的友盟分享SDK和之前的区别还是挺大的,用习惯了老版本的分享,再次集成新版的分享中间不到了一些坑坑,在这里分享给大家集成友盟社会化组件流程–第三方账号的申请...
  • 关于友盟的推送分享授权等做过了好几遍,每次接入做都还要查文档,看Demo,重新来一遍,友盟自己文档模棱两可,导致很多坑。另外配合后台查推送老是说发了我们接收不了,第三方的账号有时候不是自己直接管理的,导致...
  • 要实现信息分享到QQ空间或者发送消息给好友,我们可以借助第三方的SDK(比如:友盟、shareSDK)。也可以使用腾讯官方提供的SDK。本文介绍后者的配置和使用。 1,腾讯开放平台注册 (1)首先我们要在 ...
  • 在这里就讲如何集成友盟的第三方登录了,因为官方文档已经很详细了。 官方文档: https://developer.umeng.com/docs/128606/detail/129622 这里就主要写下容易遇到的坑~ 1.在AndroidManifest.xml注册QQ登录授权页面 ...
  • 之前项目中接入友盟统计SDK,近一年都没有更新,最近要接入友盟分享功能,发现友盟SDK新增一个库UMCommon.framework,此库为所有业务库必须依赖的基础功能库,为每个业务模块提供初始化功能,数据传输等功能,把老...
  • 但是用swift 接入友盟登陆或分享时,在授权(我使用的QQ)后跳回出现该问题,在Xcode控制台窗口出现 PBItemCollectionServicer connection disconnected. 并在AppDelegate文件开头处出现 Thread 1: EXC_BAD_...
  • cocoaPodspod 'WYShareSDK'集成三大平台的分享登录功能pod 'WYShareSDK/QQSDK'集成QQ分享登录pod 'WYShareSDK/WXSDK'集成微信分享登录pod 'WYShareSDK/WeiboSDK'集成微博分享登录 如果使用cocoaPods...
  • 在项目中集成友盟,腾讯QQ登录,登录授权失败... 在腾讯开放平台中,应用接入——应用管理——iOS应用——选择对应的应用——选择QQ登录——切换到应用调试者,添加调试用的QQ号  注意:添加的调试用的QQ号必须
  • 一键集成推送(极光推送、友盟推送、华为、小米推送等),提供有效的保活机制,支持推送的拓展,充分解耦推送和业务逻辑,解放你的双手! 更多:作者提 Bug官网 标签: 一个轻量级、可插拔的 Android 消息推...
  • swift利用友盟实现新浪微博SSO授权登录 字数1103 阅读821 评论1 喜欢4 1. 获取友盟Appkey 如果你尚未在友盟注册开发者账号,需要先注册,注册之后登录你的账号,点击添加新应用,填写完应用基本信息后...
  • iOS集成友盟统计

    2017-05-10 17:21:24
    一、每个应用对应一个appkey,先到友盟个人中心创建应用http://mobile.umeng.com/apps/setting 二、下载SDKhttp://dev.umeng.com/analytics/ios-doc/sdk-download,并添加到项目中,或者直接用cocoapods导入。SDK...
  • 友盟 腾讯bugly 基础功能集成简单 √ 统计实时性 √ 方便导出 √ 邮件 每日崩溃简报 错误备注 √ 更全设备信息 √ 强大筛选功能 √ 加密日志 √ 自定义标签 √ 自定义事件...
  • 官方文档 配置 Universal Link 创建一个json文件,格式固定,无需更改。 {     "applinks": {         "apps": [],         "details": [{ ... &n
1 2 3 4 5 ... 20
收藏数 434
精华内容 173