系統(tǒng)權(quán)限設(shè)置 PermissionScope的使用方式及坑

這篇文章主要在吐槽bug莽使,還有直接上代碼的凑懂,
如果你剛要用腥椒,請(qǐng)轉(zhuǎn)至簡(jiǎn)友入門(mén)基礎(chǔ)篇:http://www.reibang.com/p/c9aa0a0ae2c4
然后再來(lái)看這篇哦!

有些第三方庫(kù)并不是完美的敌蚜,甚至還有很多坑在等著你桥滨,比如 PermissionScope!
但雖然不完善,原理還有開(kāi)源是非常值得我們?nèi)W(xué)習(xí)的弛车!

先 pod 'PermissionScope',然后 ...

不多說(shuō)了齐媒,直接上馬了,先上二張圖纷跛!


5DD41039-4329-4F21-BE70-81E97CBC0F36.png
C45A0C5E-2A84-433E-967F-F5001F17E538.png

首先千千萬(wàn)萬(wàn)記得在 //using weak var by apiapia on 07/08/2017
不然喻括,資源一下子就會(huì)節(jié)節(jié)往上的喔!

FIXME: on PermissionScope -> PermissionScope.swift

weak var weakSelf = self
viewControllerForAlerts = weakSelf

第一次裝完APP贫奠,并進(jìn)入通知設(shè)置viewController


不ALLOW.png

如果用戶(hù)不同意唬血,下次再進(jìn)行設(shè)置時(shí),直接引導(dǎo)用戶(hù)到設(shè)置頁(yè)面


allow.png

用戶(hù)點(diǎn)擊稍后唤崭,原生是nil的拷恨,下面是代碼補(bǔ)充!
 let alert = UIAlertController(title: "前往開(kāi)啟\(permission.prettyDescription)權(quán)限".localized,
            message: "請(qǐng)點(diǎn)擊·前往設(shè)置·開(kāi)啟 \(permission.prettyDescription) 權(quán)限".localized,
            preferredStyle: .alert)
        alert.addAction(UIAlertAction(title: "稍后".localized,style: .cancel,
                                      handler: { action in
                                        NotificationCenter.default.post(name: NSNotification.Name(rawValue: "NSNotificationNameAlert"), object: nil, userInfo: ["permission":permission.prettyDescription])
        }))

接收通知

        // 觀察者
        weak var weakSelf = self
        NotificationCenter.default.addObserver(forName: NSNotification.Name(rawValue: "NSNotificationNameAlert"), object: nil, queue: OperationQueue.main) { (key) in
            let permission = key.userInfo?["permission"] as! String
            print ("permission",permission)
            if permission == "Notifications" {
                print("關(guān)閉推送")
                weakSelf?.swtichAnnounce.isOn = false
            }else {
                print("關(guān)閉地理位置")
                weakSelf?.switchK3.isOn = false
            }
            
        }

記得移除通知

    deinit {
        NotificationCenter.default.removeObserver(self, name: NSNotification.Name(rawValue: "NSNotificationNameAlert"), object: nil)
    }
vc.png

以下是代碼

import UIKit
import MJRefresh
import SVProgressHUD
import Kingfisher
import PermissionScope
import CoreLocation

class MeVC:UITableViewController,ShareProtocol{
    
    fileprivate var permissionScopeManager:PermissionScope!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        setTableView()
      
        // 觀察者
        weak var weakSelf = self
        NotificationCenter.default.addObserver(forName: NSNotification.Name(rawValue: "NSNotificationNameAlert"), object: nil, queue: OperationQueue.main) { (key) in
            let permission = key.userInfo?["permission"] as! String
            print ("permission",permission)
            if permission == "Notifications" {
                print("關(guān)閉推送")
                weakSelf?.swtichAnnounce.isOn = false
            }else {
                print("關(guān)閉地理位置")
                weakSelf?.switchK3.isOn = false
            }
            
        }
    }

    @IBOutlet weak var swtichAnnounce: UISwitch!
    @IBOutlet weak var switchK3: UISwitch!
    // 推送設(shè)置
    @IBAction func switchAnounceTap(_ sender: UISwitch) {
         weak var weakSelf = self
         // print("switch推送位置開(kāi)關(guān):\(sender)")
        if sender.isOn {
            /// 請(qǐng)求通知權(quán)限
            permissionScopeManager.viewControllerForAlerts = weakSelf
            permissionScopeManager.requestNotifications()
            /// 監(jiān)控通知權(quán)限谢肾,一旦用戶(hù)點(diǎn)擊允許或者拒絕腕侄,都會(huì)執(zhí)行以下方法
            permissionScopeManager.onAuthChange =  { (finished, results) in
                
                print("通知:",weakSelf?.permissionScopeManager.statusNotifications() ?? "")
                let status = "\((weakSelf?.permissionScopeManager.statusNotifications())!)"
                switch status {
                case "Unauthorized" :
                    weakSelf?.swtichAnnounce.isOn = false
                    weakSelf?.swtichAnnounce.isEnabled = true
                    
                case "Authorized" :
                    weakSelf?.swtichAnnounce.isOn = true
                    weakSelf?.swtichAnnounce.isEnabled = false
                default :
                    print("")
                }
                
                weakSelf?.permissionScopeManager.viewControllerForAlerts?.dismiss(animated: false, completion: nil)
            }
            /// 獲取當(dāng)前的發(fā)送通知的權(quán)限狀態(tài)
            let status = permissionScopeManager.statusNotifications()
            permissionScopeManager.onDisabledOrDenied = { results in
                print ("拒絕時(shí)候的results:\(results)")
                print ("通知權(quán)限被拒絕:\(status.description)")
                weakSelf?.swtichAnnounce.isOn = false
                weakSelf?.swtichAnnounce.isEnabled = true
            }
            if status == .authorized {
                weakSelf?.swtichAnnounce.isOn = true
                weakSelf?.swtichAnnounce.isEnabled = false
                UIApplication.shared.registerForRemoteNotifications()
            }
        }
        else {
            // FIXME:調(diào)用系統(tǒng)設(shè)置 關(guān)閉權(quán)限
            
        }
    }
    // 地址位置分享
    @IBAction func switchK3Tap(_ sender: UISwitch) {
         weak var weakSelf = self
        // print("switch地址位置開(kāi)關(guān):\(sender)")
        if sender.isOn {
           permissionScopeManager.viewControllerForAlerts = weakSelf
           permissionScopeManager.requestLocationAlways()
            permissionScopeManager.onAuthChange =  { (finished,results) in
                print ("地理位置:\(weakSelf?.permissionScopeManager.statusLocationAlways())")
              
                let status = "\((weakSelf?.permissionScopeManager.statusLocationAlways())!)"
                switch status {
                case "Unauthorized" :
                    weakSelf?.switchK3.isOn = false
                    weakSelf?.switchK3.isEnabled = true
                    
                case "Authorized" :
                    weakSelf?.switchK3.isOn = true
                    weakSelf?.switchK3.isEnabled = false
                default :
                    print("返回地理位置")
                }
                
                weakSelf?.permissionScopeManager.viewControllerForAlerts?.dismiss(animated: false, completion: nil)
            }
            let status = permissionScopeManager.statusLocationAlways()
            if status == .authorized {
                weakSelf?.switchK3.isOn = true
                weakSelf?.switchK3.isEnabled = false 
            }
            permissionScopeManager.onDisabledOrDenied = { result in
                weakSelf?.switchK3.isOn = false
                weakSelf?.switchK3.isEnabled = true
            print ("地理位置權(quán)限被拒絕:\(status.description)")
            }
        }else {
            
        }
    }
    
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        //   navigationItem.rightBarButtonItem = UIBarButtonItem(imageName: "mine_settingIcon2", highlightedImage: "mine_settingIcon2_press", target: self, action: #selector(MeVC.settingClick))
        permissionScopeManager = PermissionScope.init(backgroundTapCancels:true)
        /// 設(shè)置彈出提示框的底層視圖控制器
        initNotifications()

       
        
    }
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        NotificationCenter.default.removeObserver(self, name: NSNotification.Name(rawValue: "NSNotificationNameAlert"), object: nil)
    }
//    deinit {
//        NotificationCenter.default.removeObserver(self, name: NSNotification.Name(rawValue: "NSNotificationNameAlert"), object: nil)
//    }
    // 通告 權(quán)限
    func initNotifications() {
        /// 初始化權(quán)限管理對(duì)象
        
        // 判斷通知是否已開(kāi)啟
        switch permissionScopeManager.statusNotifications() {
        case .unknown:
            swtichAnnounce.isOn = false
            swtichAnnounce.isEnabled = true
           
        case .unauthorized,.disabled:
            swtichAnnounce.isOn = false
            swtichAnnounce.isEnabled = true
            //return
        case .authorized:
            swtichAnnounce.isOn = true
            swtichAnnounce.isEnabled = false
            //return
        }
        print ("PermissionScope().statusNotifications():\(permissionScopeManager.statusNotifications())")
        
        // 判斷地理位置是否已開(kāi)啟
        switch permissionScopeManager.statusLocationAlways() {
        case .unknown :
            switchK3.isOn = false
            switchK3.isEnabled = true
           
        case .unauthorized,.disabled:
            switchK3.isOn = false
            switchK3.isEnabled = true
           // return
        case .authorized :
            switchK3.isOn = true
            switchK3.isEnabled = false
            //return
        }
        print ("PermissionScope().statusLocationAlways():\(permissionScopeManager.statusLocationAlways())")

    }
    
    // MARK: - 設(shè)置tableView
    func setTableView() {
        self.tableView.showsHorizontalScrollIndicator = false
        self.tableView.showsVerticalScrollIndicator = false
        self.tableView.sectionHeaderHeight = 0
        self.tableView.sectionFooterHeight = 10
        self.tableView.contentInset = UIEdgeInsetsMake(-25, 0, 0, 0)
        self.tableView.tableFooterView = UIView(frame: .zero)
        
    }

    // MARK: - 點(diǎn)擊設(shè)置按鈕
    func settingClick() {
        let settingVC = UIStoryboard(name: "SettingVC", bundle: nil).instantiateInitialViewController()!
        navigationController?.pushViewController(settingVC, animated: true)
    }
    
    override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    }
    
    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        
        tableView.deselectRow(at: indexPath, animated: true)
        
        let section = indexPath.section
        let row = indexPath.row
        if section == 0 {
              // getAuthWithUserInfo(.sina) // print("新浪登陸")
                 getAuthWithUserInfo(.QQ) // 成功獲取
                //getAuthWithUserInfo(UMSocialPlatformType.wechatSession)
  
        } else if section == 1 {
            
            if row == 0 {
                print("意見(jiàn)反饋")
            } else if row == 1 {
               // FIXME: 接入環(huán)信客服,服務(wù)器會(huì)保留信息芦疏,直接用電話(huà)兜挨? /* 聯(lián)系客服*/
                 print("聯(lián)系客服")
                let nextVC = UIStoryboard(name: "MySB", bundle: nil).instantiateViewController(withIdentifier: "KFSB")
                navigationController?.pushViewController(nextVC)
            }
            
        } else if section == 2 {
            /*protocoal 邀請(qǐng)好友*/
            if row == 0 { self.umengShareToAnother() }
            if row == 1 {print("商務(wù)合作")}
            if row == 2 {print("關(guān)于布袋")}
            
            
        } else if section == 3 {
            
        }
    }
 
}


// FIXME: -  第三方登錄需把APP上傳到官方進(jìn)行審核,才可以接入眯分,待營(yíng)業(yè)執(zhí)照來(lái)進(jìn)行修復(fù)!
extension MeVC {
    func getAuthWithUserInfo(_ platformType:UMSocialPlatformType){
        UMSocialManager.default().getUserInfo(with: platformType, currentViewController: self) { (result, error) in
            if (error != nil) {
                print(error ?? "")
            }else{
                let resp: UMSocialUserInfoResponse? = result as! UMSocialUserInfoResponse?
                let uid = resp?.uid
                let username = resp?.name
                let iconurl = resp?.iconurl
                let gender  = resp?.gender
                print("第三方平臺(tái)\(platformType),唯一ID:\(uid)昵稱(chēng):\(username)頭像:\(iconurl)性別\(gender)")
            }
            
        }
    }
 
}

重要的事情說(shuō)三遍柒桑,最重要的一個(gè)BUG弊决,最重要的一個(gè)BUG,最重要的一個(gè)BUG就是:有時(shí)點(diǎn)擊后跳到設(shè)置頁(yè)面魁淳,打開(kāi)通知飘诗,返回APP ,會(huì)自動(dòng)啟動(dòng)頁(yè)廣告界逛,然后到了APP首頁(yè)昆稿!

上面這個(gè)還沒(méi)有修復(fù)...

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市息拜,隨后出現(xiàn)的幾起案子溉潭,更是在濱河造成了極大的恐慌净响,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件喳瓣,死亡現(xiàn)場(chǎng)離奇詭異馋贤,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)畏陕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)配乓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人惠毁,你說(shuō)我怎么就攤上這事犹芹。” “怎么了鞠绰?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵腰埂,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我洞豁,道長(zhǎng)盐固,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任丈挟,我火速辦了婚禮刁卜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘曙咽。我一直安慰自己蛔趴,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布例朱。 她就那樣靜靜地躺著孝情,像睡著了一般。 火紅的嫁衣襯著肌膚如雪洒嗤。 梳的紋絲不亂的頭發(fā)上箫荡,一...
    開(kāi)封第一講書(shū)人閱讀 49,079評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音渔隶,去河邊找鬼羔挡。 笑死,一個(gè)胖子當(dāng)著我的面吹牛间唉,可吹牛的內(nèi)容都是我干的绞灼。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼呈野,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼低矮!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起被冒,我...
    開(kāi)封第一講書(shū)人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤军掂,失蹤者是張志新(化名)和其女友劉穎轮蜕,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體良姆,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡肠虽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了玛追。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片税课。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖痊剖,靈堂內(nèi)的尸體忽然破棺而出韩玩,到底是詐尸還是另有隱情,我是刑警寧澤陆馁,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布找颓,位于F島的核電站,受9級(jí)特大地震影響叮贩,放射性物質(zhì)發(fā)生泄漏击狮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一益老、第九天 我趴在偏房一處隱蔽的房頂上張望彪蓬。 院中可真熱鬧,春花似錦捺萌、人聲如沸档冬。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)酷誓。三九已至,卻和暖如春态坦,著一層夾襖步出監(jiān)牢的瞬間盐数,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工伞梯, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留娘扩,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓壮锻,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親涮阔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子猜绣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

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

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件敬特、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,029評(píng)論 4 62
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,516評(píng)論 25 707
  • 什么是表單重復(fù)提交表單的重復(fù)提交:若刷新表單頁(yè)面, 再提交表單不算重復(fù)提交.在不刷新表單頁(yè)面的前提下:多次點(diǎn)擊提交...
    MPPC閱讀 426評(píng)論 1 2
  • 今年暑假,我的大二生涯結(jié)束辣之。 因?yàn)榇笕蠈W(xué)期去波蘭交換留學(xué)的面試表現(xiàn)不盡人意掰伸,我只能延遲一學(xué)期再申請(qǐng)。 就像所有的...
    嚕嚕是只豬閱讀 317評(píng)論 3 3
  • 維朵已經(jīng)在情人港邊的咖啡廳里坐了一整個(gè)下午怀估,涂著時(shí)下流行的南瓜紅的口紅顏色早已經(jīng)跟著第三杯咖啡一起下肚了...
    貓君VV閱讀 242評(píng)論 0 0