在我的应用中单击按钮时打开 phone 设置
Open phone settings when button is clicked in my app
我最近升级到 Xcode 8 并将我的代码转换为 Swift 3。我正在制作一个自定义键盘(扩展),它在 iOS 9 之前工作得很好,但我我在 iOS 10 中遇到了几个问题。
- 自定义键盘的容器应用程序包含一个按钮,可将用户引导至键盘设置以添加键盘
问题:此按钮点击在 iOS10 中不起作用,即用户未被定向到设置。我已经在我的项目中配置了 URL 方案并尝试了以下代码:
@IBAction func btnGetStarted(_ sender: AnyObject) {
let settingsUrl = URL(string: UIApplicationOpenSettingsURLString)
if let url = settingsUrl {
UIApplication.shared.openURL(url)
}
}
也尝试过:
@IBAction func btnGetStarted(_ sender: AnyObject) {
if let settingsURL = URL(string:"prefs:root=General&path=Keyboard/KEYBOARDS") {
UIApplication.shared.openURL(settingsURL)
}
}
- 自定义键盘还包含表情符号图像。用户需要在设置中启用 "Allow Access" 才能使用表情符号图像。如果用户不启用 "Allow access" 那么他就不能使用表情符号图像。如果 "Allow access" 未启用并且用户尝试单击表情符号,则会弹出提示框,告诉用户转到设置并启用 "Allow access"。
问题:当应用程序在 iOS 10
中 运行 时不会弹出此 toast
吐司代码:
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath){
let pbWrapped: UIPasteboard? = UIPasteboard.general
if let pb = pbWrapped {
if currentKeyboard == XXXXXX.emoji {
if let data = UIImagePNGRepresentation(dataEmoji[(indexPath as NSIndexPath).row]) {
pb.setData(data, forPasteboardType: "public.png")
self.makeToast(pasteMessage, duration: 3.0, position: .center)
}
}
} else {
var style = ToastStyle()
style.messageColor = UIColor.red
style.messageAlignment = .center
//style.backgroundColor = UIColor.whiteColor()
self.makeToast("To really enjoy the keyboard, please Allow Full Access in the settings application.", duration: 8.0, position: .center, title: nil, image: UIImage(named: "toast.png"), style: style, completion: nil)
}
}
我确实在 Whosebug 上查看了一些解决方案,但其中 none 对我有用,正如我之前所说,我的应用程序在除 iOS 10 之外的所有版本上都运行良好。
有人可以帮我吗?
@persianBlue:这是在 Xcode8 + iOS10 上工作。
UIApplication.shared.openURL(URL(string:UIApplicationOpenSettingsURLString)!)
UIApplicationOpenSettingsURLString
为应用程序设置提供 link。在 iOS10 之前,如果应用程序缺少 settings.Bundle,它会 link 到设置主页。日志将显示:
_BSMachError: (os/kern) invalid capability (20)
_BSMachError: (os/kern) invalid name (15)
如果您打算 link 应用程序的设置,您只需添加一个设置包。 Apple Documentation
我还没有找到 link 到 phone 设置主页的方法。
如果您看到像@PersianBlue 一样的白屏,您的应用可能缺少自定义设置。
以下是文档中关于 UIApplicationOpenSettingsURLString
的内容:
Used to create a URL that you can pass to the openURL(_:) method. When
you open the URL built from this string, the system launches the
Settings app and displays the app’s custom settings, if it has any.
Swift 3 iOS 10
let settingsUrl = NSURL(string:UIApplicationOpenSettingsURLString) as! URL
UIApplication.shared.open(settingsUrl, options: [:], completionHandler: nil)
我写了下面的函数,它对我有用。我帮助它会帮助你们。
func openLocationSettings(){
let scheme:String = UIApplicationOpenSettingsURLString
if let url = URL(string: scheme) {
if #available(iOS 10, *) {
UIApplication.shared.open(url, options: [:],
completionHandler: {
(success) in
print("Open \(scheme): \(success)")
})
} else {
let success = UIApplication.shared.openURL(url)
print("Open \(scheme): \(success)")
}
}
}
这在 iOS11 中不再可行,我们可以打开设置,例如:
if let url = URL(string:UIApplicationOpenSettingsURLString), UIApplication.shared.canOpenURL(url) {
//iOS 10 +
UIApplication.shared.open(url, options: [:], completionHandler:{ didOpen in
print("Opened \(didOpen)")
})
//iOS 9 +
UIApplication.shared.open(url)
}
我最近升级到 Xcode 8 并将我的代码转换为 Swift 3。我正在制作一个自定义键盘(扩展),它在 iOS 9 之前工作得很好,但我我在 iOS 10 中遇到了几个问题。
- 自定义键盘的容器应用程序包含一个按钮,可将用户引导至键盘设置以添加键盘
问题:此按钮点击在 iOS10 中不起作用,即用户未被定向到设置。我已经在我的项目中配置了 URL 方案并尝试了以下代码:
@IBAction func btnGetStarted(_ sender: AnyObject) {
let settingsUrl = URL(string: UIApplicationOpenSettingsURLString)
if let url = settingsUrl {
UIApplication.shared.openURL(url)
}
}
也尝试过:
@IBAction func btnGetStarted(_ sender: AnyObject) {
if let settingsURL = URL(string:"prefs:root=General&path=Keyboard/KEYBOARDS") {
UIApplication.shared.openURL(settingsURL)
}
}
- 自定义键盘还包含表情符号图像。用户需要在设置中启用 "Allow Access" 才能使用表情符号图像。如果用户不启用 "Allow access" 那么他就不能使用表情符号图像。如果 "Allow access" 未启用并且用户尝试单击表情符号,则会弹出提示框,告诉用户转到设置并启用 "Allow access"。
问题:当应用程序在 iOS 10
中 运行 时不会弹出此 toast吐司代码:
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath){
let pbWrapped: UIPasteboard? = UIPasteboard.general
if let pb = pbWrapped {
if currentKeyboard == XXXXXX.emoji {
if let data = UIImagePNGRepresentation(dataEmoji[(indexPath as NSIndexPath).row]) {
pb.setData(data, forPasteboardType: "public.png")
self.makeToast(pasteMessage, duration: 3.0, position: .center)
}
}
} else {
var style = ToastStyle()
style.messageColor = UIColor.red
style.messageAlignment = .center
//style.backgroundColor = UIColor.whiteColor()
self.makeToast("To really enjoy the keyboard, please Allow Full Access in the settings application.", duration: 8.0, position: .center, title: nil, image: UIImage(named: "toast.png"), style: style, completion: nil)
}
}
我确实在 Whosebug 上查看了一些解决方案,但其中 none 对我有用,正如我之前所说,我的应用程序在除 iOS 10 之外的所有版本上都运行良好。 有人可以帮我吗?
@persianBlue:这是在 Xcode8 + iOS10 上工作。
UIApplication.shared.openURL(URL(string:UIApplicationOpenSettingsURLString)!)
UIApplicationOpenSettingsURLString
为应用程序设置提供 link。在 iOS10 之前,如果应用程序缺少 settings.Bundle,它会 link 到设置主页。日志将显示:
_BSMachError: (os/kern) invalid capability (20)
_BSMachError: (os/kern) invalid name (15)
如果您打算 link 应用程序的设置,您只需添加一个设置包。 Apple Documentation
我还没有找到 link 到 phone 设置主页的方法。
如果您看到像@PersianBlue 一样的白屏,您的应用可能缺少自定义设置。
以下是文档中关于 UIApplicationOpenSettingsURLString
的内容:
Used to create a URL that you can pass to the openURL(_:) method. When you open the URL built from this string, the system launches the Settings app and displays the app’s custom settings, if it has any.
Swift 3 iOS 10
let settingsUrl = NSURL(string:UIApplicationOpenSettingsURLString) as! URL
UIApplication.shared.open(settingsUrl, options: [:], completionHandler: nil)
我写了下面的函数,它对我有用。我帮助它会帮助你们。
func openLocationSettings(){
let scheme:String = UIApplicationOpenSettingsURLString
if let url = URL(string: scheme) {
if #available(iOS 10, *) {
UIApplication.shared.open(url, options: [:],
completionHandler: {
(success) in
print("Open \(scheme): \(success)")
})
} else {
let success = UIApplication.shared.openURL(url)
print("Open \(scheme): \(success)")
}
}
}
这在 iOS11 中不再可行,我们可以打开设置,例如:
if let url = URL(string:UIApplicationOpenSettingsURLString), UIApplication.shared.canOpenURL(url) {
//iOS 10 +
UIApplication.shared.open(url, options: [:], completionHandler:{ didOpen in
print("Opened \(didOpen)")
})
//iOS 9 +
UIApplication.shared.open(url)
}