Skip to content

Commit

Permalink
第五讲 动态权限申请 封装 iOS权限申请适配
Browse files Browse the repository at this point in the history
  • Loading branch information
zhaolongs committed Dec 9, 2020
1 parent d75cf34 commit 44f88ad
Show file tree
Hide file tree
Showing 3 changed files with 193 additions and 110 deletions.
4 changes: 4 additions & 0 deletions ios/Runner/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -43,5 +43,9 @@
</array>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>

<key>NSCameraUsageDescription</key>
<string>APP需要访问您的相机权限</string>

</dict>
</plist>
141 changes: 31 additions & 110 deletions lib/src/index_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:permission_handler/permission_handler.dart';

import 'pages/common/perlmisson_request_widget.dart';

/// 创建人: Created by zhaolong
/// 创建时间:Created by on 2020/12/7.
///
Expand All @@ -19,32 +21,38 @@ class IndexPage extends StatefulWidget {
}
}

class _IndexPageState extends State with WidgetsBindingObserver {
//页面的初始化函数
class _IndexPageState extends State {
List<String> _list = [
"为您更好的体验应用,所以需要获取您的手机文件存储权限,以保存您的一些偏好设置",
"您已拒绝权限,所以无法保存您的一些偏好设置,将无法使用APP",
"您已拒绝权限,请在设置中心中同意APP的权限请求",
"其他错误"
];

@override
void initState() {
super.initState();

checkPermisson();

//注册观察者
WidgetsBinding.instance.addObserver(this);
}

@override
void didChangeAppLifecycleState(AppLifecycleState state) {
super.didChangeAppLifecycleState(state);
if (state == AppLifecycleState.resumed && _isGoSetting) {
checkPermisson();
}
}

@override
void dispose() {
//注销观察者
WidgetsBinding.instance.removeObserver(this);

super.dispose();
Future.delayed(Duration.zero, () {
Navigator.of(context)
.push(
PageRouteBuilder(
opaque: false,
pageBuilder: (BuildContext context, Animation<double> animation,
Animation<double> secondaryAnimation) {
return PermissionRequestWidget(
permission: Permission.camera,
permissionList: _list,
);
}),
)
.then((value) {
if (value == null || !value) {
//权限请求不通过
} else {
//权限请求通过
}
});
});
}

@override
Expand All @@ -59,91 +67,4 @@ class _IndexPageState extends State with WidgetsBindingObserver {
),
);
}

void checkPermisson({PermissionStatus status}) async {
//权限
Permission permission = Permission.storage;

if (status == null) {
//权限状态
status = await permission.status;
}

if (status.isUndetermined) {
//第一次申请
showPermissonAlert(_list[0], "同意", permission);
} else if (status.isDenied) {
//用户第一次申请拒绝
showPermissonAlert(_list[1], "重试", permission);
} else if (status.isPermanentlyDenied) {
//第二次申请 用户拒绝
showPermissonAlert(_list[2], "去设置中心", permission, isSetting: true);
} else {
//通过
}
}

List<String> _list = [
"为您更好的体验应用,所以需要获取您的手机文件存储权限,以保存您的一些偏好设置",
"您已拒绝权限,所以无法保存您的一些偏好设置,将无法使用APP",
"您已拒绝权限,请在设置中心中同意APP的权限请求",
"其他错误"
];

//是否去设置中心
bool _isGoSetting = false;

void showPermissonAlert(
String message, String rightString, Permission permission,
{bool isSetting = false}) {
showCupertinoDialog(
builder: (BuildContext context) {
return CupertinoAlertDialog(
title: Text("温馨提示"),
content: Container(
padding: EdgeInsets.all(12),
child: Text(message),
),
actions: [
//左边的按钮
CupertinoDialogAction(
child: Text("退出应用"),
onPressed: () {
closeApp();
},
),
//右边的按钮
CupertinoDialogAction(
child: Text("$rightString"),
onPressed: () {
//关闭弹框
Navigator.of(context).pop();
if (isSetting) {
_isGoSetting = true;
//去设置中心
openAppSettings();
} else {
//申请权限
requestPermiss(permission);
}
},
)
],
);
},
context: context);
}

void requestPermiss(Permission permission) async {
//发起权限申请
PermissionStatus status = await permission.request();

//校验
checkPermisson();
}

void closeApp() {
//关闭应用的方法
SystemChannels.platform.invokeMethod("SystemNavigator.pop");
}
}
158 changes: 158 additions & 0 deletions lib/src/pages/common/perlmisson_request_widget.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,158 @@
import 'dart:io';

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:permission_handler/permission_handler.dart';

/// 创建人: Created by zhaolong
/// 创建时间:Created by on 2020/12/9.
///
/// 可关注公众号:我的大前端生涯 获取最新技术分享
/// 可关注网易云课堂:https://study.163.com/instructor/1021406098.htm
/// 可关注博客:https://blog.csdn.net/zl18603543572
///
/// 代码清单
///权限请求模版
class PermissionRequestWidget extends StatefulWidget {
final Permission permission;
final List<String> permissionList;
final bool isCloseApp;
final String leftButtonText;

PermissionRequestWidget(
{@required this.permission,
@required this.permissionList,
this.leftButtonText = "再考虑一下",
this.isCloseApp = false});

@override
_PermissionRequestWidgetState createState() =>
_PermissionRequestWidgetState();
}

class _PermissionRequestWidgetState extends State<PermissionRequestWidget>
with WidgetsBindingObserver {
//页面的初始化函数
@override
void initState() {
super.initState();
checkPermisson();
//注册观察者
WidgetsBinding.instance.addObserver(this);
}

@override
void didChangeAppLifecycleState(AppLifecycleState state) {
super.didChangeAppLifecycleState(state);
if (state == AppLifecycleState.resumed && _isGoSetting) {
checkPermisson();
}
}

void checkPermisson({PermissionStatus status}) async {
//权限
Permission permission = widget.permission;

if (status == null) {
//权限状态
status = await permission.status;
}

if (status.isUndetermined) {
//第一次申请
showPermissonAlert(widget.permissionList[0], "同意", permission);
} else if (status.isDenied) {
if (Platform.isIOS) {
showPermissonAlert(widget.permissionList[2], "去设置中心", permission,
isSetting: true);
return;
}
//用户第一次申请拒绝
showPermissonAlert(widget.permissionList[1], "重试", permission);
} else if (status.isPermanentlyDenied) {
//第二次申请 用户拒绝
showPermissonAlert(widget.permissionList[2], "去设置中心", permission,
isSetting: true);
} else {
//通过
Navigator.of(context).pop(true);
}
}

//是否去设置中心
bool _isGoSetting = false;

void showPermissonAlert(
String message, String rightString, Permission permission,
{bool isSetting = false}) {
showCupertinoDialog(
builder: (BuildContext context) {
return CupertinoAlertDialog(
title: Text("温馨提示"),
content: Container(
padding: EdgeInsets.all(12),
child: Text(message),
),
actions: [
//左边的按钮
CupertinoDialogAction(
child: Text("${widget.leftButtonText}"),
onPressed: () {
if (widget.isCloseApp) {
closeApp();
} else {
Navigator.of(context).pop(false);
}
},
),
//右边的按钮
CupertinoDialogAction(
child: Text("$rightString"),
onPressed: () {
//关闭弹框
Navigator.of(context).pop();
if (isSetting) {
_isGoSetting = true;
//去设置中心
openAppSettings();
} else {
//申请权限
requestPermiss(permission);
}
},
)
],
);
},
context: context);
}

void requestPermiss(Permission permission) async {
//发起权限申请
PermissionStatus status = await permission.request();

//校验
checkPermisson();
}

void closeApp() {
//关闭应用的方法
SystemChannels.platform.invokeMethod("SystemNavigator.pop");
}

@override
void dispose() {
//注销观察者
WidgetsBinding.instance.removeObserver(this);

super.dispose();
}

@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.transparent,
);
}
}

0 comments on commit 44f88ad

Please sign in to comment.