2015-09-01 63 views
18

有沒有辦法讓我檢查用戶是否在打開應用程序時登錄到iCloud?我希望能夠引導他們進入設置頁面,如果他們沒有登錄,並且他們已經登錄到iCloud並且之前已經使用了該應用程序 - 我想跳過登錄頁面....檢查用戶是否登錄到iCloud? Swift/iOS

I看着蘋果的iCloud和Cloudkits文檔,但無法找到任何有幫助的東西!這甚至有可能做到嗎?

+0

http://stackoverflow.com/questions/11509601/how-to-detect-if-a-user-is-signed-in-to-icloud 這讓我覺得對此沒有解決辦法。 – pmoney13

回答

27

你在這裏 - 希望自我解釋。欲瞭解更多關於下面的NSFileManager函數的Apple文檔。

func isICloudContainerAvailable()->Bool { 
     if let currentToken = NSFileManager.defaultManager().ubiquityIdentityToken { 
      return true 
     } 
     else { 
      return false 
     } 
    } 

見下文提取: 一個不透明的標記表示當前用戶的身份的iCloud(只讀) 當icloud是目前可用的,這個屬性包含表示當前用戶的身份的不透明對象。如果iCloud由於任何原因不可用或者沒有登錄用戶,則此屬性的值爲零。

+1

非常感謝! – pmoney13

+3

這可能是從我自己的應用程序調用iCloud登錄?例如,如果'isICloudContainerAvailable'返回false,則打開登錄。 – baquiax

+0

沒有爲我工作。我使用了2個不同設備的一個iCloud帳戶。希望爲兩個設備獲得1個相同的密鑰,但獲得了2個不同的密鑰。 –

8

我認爲這個異步方法是首選,所以你不要在你檢查時阻塞。

 CKContainer.defaultContainer().accountStatusWithCompletionHandler { (accountStat, error) in 
      if (accountStat == .Available) { 
       print("iCloud is available") 
      } 
      else { 
       print("iCloud is not available") 
      } 
     } 
+0

默認情況下不在async中?我覺得是這樣的。 – durazno

+0

@Duranzo接受的答案是同步。這個答案是異步的。 – RawMean

+1

來自Apple文檔的ubiquityIdentityToken:「訪問此屬性的值相對較快,因此您可以在啓動時從應用程序的主線程檢查值。」 – Morgan

20

如果你只是想知道,如果用戶在到iCloud登錄,可以使用同步方法:

if NSFileManager.defaultManager().ubiquityIdentityToken != nil { 
    print("iCloud Available") 
} else { 
    print("iCloud Unavailable") 
} 

不過,如果你想知道爲什麼的iCloud ISN 「T啓用後,您可以使用異步方法:

CKContainer.defaultContainer().accountStatusWithCompletionHandler { (accountStatus, error) in 
    switch accountStatus { 
    case .available: 
     print("iCloud Available") 
    case .noAccount: 
     print("No iCloud account") 
    case .restricted: 
     print("iCloud restricted") 
    case .couldNotDetermine: 
     print("Unable to determine iCloud status") 
    } 
} 

如果你想使用異步方法,但不關心爲什麼,你應該檢查accountStatusavailable,而不是檢查,這不是noAccount

CKContainer.defaultContainer().accountStatusWithCompletionHandler { (accountStatus, error) in 
    if case .available = accountStatus { 
     print("iCloud Available") 
    } else { 
     print("iCloud Unavailable") 
    } 
} 

注意,這個答案是寫在斯威夫特3.在斯威夫特版本使用超過3使用舊:

CKContainer.defaultContainer().accountStatusWithCompletionHandler { (accountStatus, error) in 
    switch accountStatus { 
    case .Available: 
     print("iCloud Available") 
    case .NoAccount: 
     print("No iCloud account") 
    case .Restricted: 
     print("iCloud restricted") 
    case .CouldNotDetermine: 
     print("Unable to determine iCloud status") 
    } 
} 

CKContainer.defaultContainer().accountStatusWithCompletionHandler { (accountStatus, error) in 
    if case .Available = accountStatus { 
     print("iCloud Available") 
    } else { 
     print("iCloud Unavailable") 
    } 
}