我剛將應用程序提交給Apple Store,由於以下問題而無法提交,因此我對如何解決此問題感到十分困惑。使用CloudKit/iCloud時Apple Store構建被拒絕
從蘋果 - 17.2細節 - 我們注意到,您的應用要求用戶 登記的個人信息訪問非基於帳戶的 功能。應用程序在允許 訪問應用程序內容之前不需要用戶註冊,並且不會將 專用於用戶。
後續步驟 - 需要共享個人信息 的用戶註冊信息必須是可選的或與帳戶特定的 功能綁定。此外,請求的信息必須是 與功能相關。
我的應用使用CloudKit保存,檢索和共享記錄。但該應用程序本身不會要求提供任何個人信息,也不會分享任何個人信息,例如電子郵件,姓名,出生日期等等,它只是要求用戶在設備上啓用iCloud帳戶。然後,CloudKit使用iCloud憑據來工作。
它變得撲朔迷離,因爲:
1 - 我不能改變的方式CloudKit作品和停止要求用戶登錄在iCloud上。每個使用CloudKit的應用都需要用戶登錄iCloud。
2 - 如果您沒有登錄應用程序,其他應用程序(facebookas示例)無法從根本上發揮作用。所以登錄不是綁定到特定的功能,而是綁定到應用程序的整個功能。
每次應用程序啓動時都會在初始屏幕(在進入應用程序功能區域之前)調用代碼示例bellow,以確保用戶使用iCloud。如果用戶擁有iCloud,我會將他帶到應用程序中。如果沒有,我會阻止他並要求他將iCloud分類。但我想這就是他們在這裏抱怨的 - 「需要共享個人信息的用戶註冊必須是可選的或與帳戶特定的功能綁定在一起的,此外,所請求的信息必須與這些功能相關。」
這使我處於一個相當混亂的境地。不知道如何解決這個問題。有沒有人與CloudKit/iCloud/AppStore提交有類似的問題?任何見解?
iCloud的校驗碼波紋管:
func cloudKitCheckIfUserIsAuthenticated (result: (error: NSError?, tryAgain: Bool, takeUserToiCloud: Bool) -> Void){
let container = CKContainer.defaultContainer()
container.fetchUserRecordIDWithCompletionHandler{
(recordId: CKRecordID?, error: NSError?) in
dispatch_async(dispatch_get_main_queue()) {
if error != nil
{
if error!.code == CKErrorCode.NotAuthenticated.rawValue
{
// user not on icloud, taki him there
print("-> cloudKitCheckIfUserIsAuthenticated - error fetching ID - not on icloud")
// ERROR, USER MUST LOGIN TO ICLOUD - LOCK HIM OUTSIDE THE APP
result(error: error, tryAgain: false, takeUserToiCloud: true)
}
print("-> cloudKitCheckIfUserIsAuthenticated - error fetching ID - other error \(error?.description)")
// OTHER ERROR, TRY AGAIN
result(error: error, tryAgain: true, takeUserToiCloud: false)
}
else
{
let publicDatabase = CKContainer.defaultContainer().publicCloudDatabase
publicDatabase.fetchRecordWithID(recordId!,
completionHandler: {(record: CKRecord?, error: NSError?) in
if error != nil
{
// error getting user ID, try again
print("-> cloudKitCheckIfUserIsAuthenticated - error fetching user record - Error \(error)")
// ERROR, TRY AGAIN
result(error: error, tryAgain: true, takeUserToiCloud: false)
}
else
{
if record!.recordType == CKRecordTypeUserRecord
{
// valid record
print("-> cloudKitCheckIfUserIsAuthenticated - fetching user record - valid record found)")
// TAKE USER INSIDE APP
result(error: error, tryAgain: false, takeUserToiCloud: false)
}
else
{
// not valid record
print("-> cloudKitCheckIfUserIsAuthenticated - fetching user record - The record that came back is not a user record")
// ERROR, TRY AGAIN
result(error: error, tryAgain: true, takeUserToiCloud: false)
}
}
})
}
}
}
}
您應該考慮用戶明確關閉iCloud的場景。她無法使用您的應用,也無法登錄您的應用。在Facebook等應用中,未註冊的用戶可以選擇註冊。國際海事組織除了iCloud之外,還應該考慮添加其他機制(例如社交網絡),在您的應用程序中添加1-2個功能(無需使用iCloud),以便該功能可用於該用戶子集。 – Vin
'每個使用CloudKit的應用程序都需要一位用戶登錄了iCloud。' - 對於容器的公共數據庫端來說這不是真的。只有在開發和測試過程中,您才需要登錄到iCloud才能訪問公共數據庫。您的應用程序應提供對公用數據庫的訪問權限,而無需登錄。也許這是蘋果17.2暗示的 - (只是一個推測性的想法。) – Bamsworld
@Vin我遵循了你的建議,並且該應用程序被批准。無需使用其他機制登錄。我讓用戶在應用程序的靜態屏幕上導航,但爲了保存或加載需要數據庫用戶必須使用iCloud簽名的屏幕。基本上,用戶進入應用程序,但可以做幾乎沒有什麼,直到安裝iCloud。看起來對他們來說很好。 – GuiSoySauce