2016-04-22 50 views
2

我剛將應用程序提交給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) 
           } 
          } 
        }) 
       } 
      } 
     } 
    } 
+1

您應該考慮用戶明確關閉iCloud的場景。她無法使用您的應用,也無法登錄您的應用。在Facebook等應用中,未註冊的用戶可以選擇註冊。國際海事組織除了iCloud之外,還應該考慮添加其他機制(例如社交網絡),在您的應用程序中添加1-2個功能(無需使用iCloud),以便該功能可用於該用戶子集。 – Vin

+2

'每個使用CloudKit的應用程序都需要一位用戶登錄了iCloud。' - 對於容器的公共數據庫端來說這不是真的。只有在開發和測試過程中,您才需要登錄到iCloud才能訪問公共數據庫。您的應用程序應提供對公用數據庫的訪問權限,而無需登錄。也許這是蘋果17.2暗示的 - (只是一個推測性的想法。) – Bamsworld

+0

@Vin我遵循了你的建議,並且該應用程序被批准。無需使用其他機制登錄。我讓用戶在應用程序的靜態屏幕上導航,但爲了保存或加載需要數據庫用戶必須使用iCloud簽名的屏幕。基本上,用戶進入應用程序,但可以做幾乎沒有什麼,直到安裝iCloud。看起來對他們來說很好。 – GuiSoySauce

回答

0

最初我的應用程序會要求用戶登錄到iCloud推出屏幕上。如果用戶沒有iCloud帳戶功能,他們將無法進入應用程序。

解決方案

讓用戶獲取應用程序內,點擊主要部分。事實上,該應用程序完全沒用,但用戶可以看到它是奇怪的空屏幕,沒有保存或加載任何東西的能力。當他們試圖加載或保存東西時,我會提示他們需要在iCloud上登錄以使應用程序可用。

實際成果

我不認爲蘋果公司的變更請求增加值的UX東西。事實上,它增加了用戶理解他能做什麼和不能做什麼的複雜性。

作爲一個例子,如果用戶沒有提供他的個人信息,因爲沒有這些數據,這個應用程序絕對沒有用處,這就是我的情況......你可以說,用戶應該能夠得到在裏面,但他會看到或做什麼?然後,您必須迎合UX構建的所有例外情況,並提醒用戶在煩人的警告模式上隨處解決帳戶問題。

所以我不確定Facebook如何獲得批准,但我不能。

雖然我獲得了應用程序的批准,但我不同意蘋果的反饋以任何方式改進了應用程序。