在我的应用

时间:2016-09-23 11:30:59

标签: swift3 ios10 emoji custom-keyboard

我最近升级到Xcode 8并将我的代码转换为Swift 3.我正在制作一个自定义键盘(扩展程序),它在iOS 9中运行得非常好,但我在iOS 10中遇到了一些问题。

  1. 自定义键盘的容器应用程序包含一个按钮,用于将用户引导至键盘设置以添加键盘
  2. 问题:此按钮单击在iOS 10中不起作用,但用户未定向到设置。我已在项目中配置了URL Schemes,并尝试了以下代码:

    @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)
     }
    }
    
    1. 自定义键盘还包含表情符号图像。用户需要在设置中启用“允许访问”才能使用表情符号图像。如果用户未启用“允许访问”,则他无法使用表情符号图像。如果未启用“允许访问”并且用户尝试单击表情符号,则会弹出一个吐司,告诉用户转到设置并启用“允许访问”。
    2. 问题:在iOS 10中运行应用时,此吐司不会弹出

      吐司的代码:

      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)
          }
      }
      

      我确实在stackoverflow上查看了一些解决方案,但它们都没有为我工作,正如我之前说的,我的应用程序在除iOS 10之外的所有版本上都能正常运行。 请有人帮帮我吗?

6 个答案:

答案 0 :(得分:5)

Swift 3 iOS 10

let settingsUrl = NSURL(string:UIApplicationOpenSettingsURLString) as! URL
UIApplication.shared.open(settingsUrl, options: [:], completionHandler: nil)

答案 1 :(得分:3)

@persianBlue:这适用于Xcode8 + iOS10。

UIApplication.shared.openURL(URL(string:UIApplicationOpenSettingsURLString)!)

答案 2 :(得分:1)

UIApplicationOpenSettingsURLString提供了应用设置的链接。在iOS10之前,如果应用程序缺少settings.Bundle,它将链接到设置主页。日志会显示:

_BSMachError: (os/kern) invalid capability (20) _BSMachError: (os/kern) invalid name (15)

如果您打算链接到应用的设置,则只需添加设置包即可。 Apple Documentation

我还没有找到一种链接到手机设置主页的方法。

答案 3 :(得分:1)

这在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)
}

答案 4 :(得分:0)

如果您看到像@PersianBlue这样的白色屏幕,您的应用可能会缺少自定义设置。 以下是关于UIApplicationOpenSettingsURLString的文档说明:

  

用于创建可以传递给openURL(_ :)方法的URL。什么时候   你打开从这个字符串构建的URL,系统启动   设置应用并显示应用的自定义设置(如果有)。

答案 5 :(得分:0)

我编写了以下功能,它对我有用。我会帮助你们。

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)") } } }