Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ios检查用户是否登录到icloud,如果未登录,则将用户发送到设置_Ios_Swift_Xcode9.4 - Fatal编程技术网

ios检查用户是否登录到icloud,如果未登录,则将用户发送到设置

ios检查用户是否登录到icloud,如果未登录,则将用户发送到设置,ios,swift,xcode9.4,Ios,Swift,Xcode9.4,我检查用户是否已登录iCloud,如果未登录,则设置警报。但我想将用户发送到适当的设置,用户可以实际登录到iCloud,一旦登录完成,就会重定向到当前视图控制器 如何修改此代码 var iCloudStatus:Bool = false func ifUserLoggedinToICloud() -> Bool { let alertController = UIAlertController(title: "Alert", message: "iCloud Status

我检查用户是否已登录iCloud,如果未登录,则设置警报。但我想将用户发送到适当的设置,用户可以实际登录到iCloud,一旦登录完成,就会重定向到当前视图控制器

如何修改此代码

var iCloudStatus:Bool = false
func ifUserLoggedinToICloud() -> Bool {

        let alertController = UIAlertController(title: "Alert", message: "iCloud Status", preferredStyle: .alert)
        defaultContainer.accountStatus(completionHandler: { (accountStatus, error) in
            if (accountStatus == .available) {
                print("iCloud is available")
                iCloudStatus = true
            }
            else {

                print("iCloud is not available, log into iCloud")
                alertController.message = "iCloud not available, log into iCloud"
                alertController.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))
                self.present(alertController, animated: true, completion: nil)
            }

        })


        return iCloudStatus
    }

帐户状态检查是异步的,因此正如瓦迪安评论的那样,如果用户日志改为云,函数将始终返回false。您应该在完成闭包中运行代码

您可以使用以下命令引导用户进行设置:

defaultContainer.accountStatus(completionHandler: { (accountStatus, error) in
    switch accountStatus {
    case .noAccount, .restricted:
        guard let settingsUrl = URL(string: UIApplicationOpenSettingsURLString) else { return }
        if UIApplication.shared.canOpenURL(settingsUrl) {
        UIApplication.shared.open(settingsUrl, completionHandler: { (success) in
            // Completion handler when settings opened
        })
    case .available:
        print("Account available")
    case .couldNotDerermine:
        print("Error")
    }
})
无法将用户从“设置”页面重定向回。由用户导航回您的应用程序


有一些私有API可以重定向到特定的iOS设置页面(例如
“App Prefs:root=CASTLE”
URL),但苹果不允许使用这些API。

我在AppDelegate中尝试过这样做。我尝试了UIApplication.shared.open(URL(字符串:UIApplication.opensetingsurlstring)!,选项:[:],completionHandler:nil)。给出错误类型“UIApplication”没有成员“openSettingsURLString”。如果用户登录到云,正确的方法是什么?不相关,但请注意
ifUserLoggedinToICloud
总是返回
false
。这会因为是同步的而起作用吗?如果FileManager.default.ubiquityIdentityToken!=nil{iCloudStatus=true}else{guard let settingsUrl=URL(字符串:UIApplicationOpenSettingsURLString)else{return false}如果UIApplication.shared.canOpenURL(settingsUrl){UIApplication.shared.open(settingsUrl,completionHandler:{(成功)在//Completion handler when settings opened})}}中,也在Completion handler when settings open中,我应该做什么?捕获状态并返回,让用户导航回原始视图控制器?@vrao这是异步的-它应该在帐户检查完成关闭后运行。我已经编辑了答案,并为不同的帐户状态枚举案例添加了一个switch语句。好的,因为它在完成处理程序中,当处理程序返回时,如果设置一个boolen并从函数返回它,那么返回值是否为true?case.available:print(“Account available”)self.iCloudStatus=true returniCloudStatus@vrao如果完成处理程序位于函数内部(如您的示例),则函数将始终在完成处理程序之前返回(因为iCloud帐户检查涉及延迟的网络请求)。任何依赖于该值的代码都应该在完成处理程序中。在这种情况下,代码的执行顺序是不同的。当然,您也可以从完成处理程序调用其他函数,或者为全局布尔值指定一个
didSet
函数(该函数在值更改时调用)。