2014-02-07 101 views
1

我的一個iOS應用程序使用Core Data與iCloud一段時間。雖然這在大多數情況下都可以正常工作,但每個人都知道問題並崩潰。問題:我無法通過捕獲異常來解決這些崩潰問題,因爲我不知道在哪裏執行此操作。如何在iOS中捕捉iCloud異常?

對於崩潰的應用程序的異常時,最新的例子是:

2014-02-07 10:23:45.118 MyApp[1410:3707] -[PFUbiquitySwitchboardEntryMetadata setUseLocalStorage:](754): CoreData: Ubiquity: mobile~5508B01E-F77F-4AF1-88DE-2E2F8DC55932:MyAppCloudDB 
Using local storage: 1 

2014-02-07 10:23:45.892 MyApp[1410:3707] -[PFUbiquitySwitchboardEntryMetadata setUseLocalStorage:](754): CoreData: Ubiquity: mobile~5508B01E-F77F-4AF1-88DE-2E2F8DC55932:MyAppCloudDB 
Using local storage: 0 

2014-02-07 10:24:28.632 MyApp[1410:1803] -[_PFUbiquityRecordImportOperation main](731): CoreData: Ubiquity: Error importing transaction log: <PFUbiquityTransactionLog: 0x16177920> 
transactionLogLocation: <PFUbiquityLocation: 0x160c3e80>: /var/mobile/Library/Mobile Documents/M889WYL2LY~com~example~MyApp/MyAppTransactionLogs/User~37B9682D-CED2-5F79-AF06-1FE99E7DEE9E/MyAppCloudDB/SZPp~RKudtVxEBMJzTVTupTv0WjG6i~o9Vj54dlknjc=/8AB09D17-5856-49B9-BE4C-A56451FB1EF4.1.cdt 
transactionNumber: 34 
, exception: *** setObjectForKey: key cannot be nil 
User Info: (null) 

2014-02-07 10:24:28.661 MyApp[1410:1803] -[_PFUbiquityRecordsImporter operation:failedWithError:](1003): CoreData: Ubiquity: Import operation encountered an error: Error Domain=NSCocoaErrorDomain Code=134060 "The operation couldn’t be completed. (Cocoa error 134060.)" UserInfo=0x162a8b20 {exception=*** setObjectForKey: key cannot be nil} 
userInfo: { 
exception = "*** setObjectForKey: key cannot be nil"; 
}. While trying to import the log file at the URL: <PFUbiquityTransactionLog: 0x16177920> 
transactionLogLocation: <PFUbiquityLocation: 0x160c3e80>: /var/mobile/Library/Mobile Documents/M889WYL2LY~com~example~MyApp/MyAppTransactionLogs/User~37B9682D-CED2-5F79-AF06-1FE99E7DEE9E/MyAppCloudDB/SZPp~RKudtVxEBMJzTVTupTv0WjG6i~o9Vj54dlknjc=/8AB09D17-5856-49B9-BE4C-A56451FB1EF4.1.cdt 
transactionNumber: 34 

2014-02-07 10:24:28.686 MyApp[1410:1803] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** setObjectForKey: key cannot be nil' 
*** First throw call stack: 

(0x30b47e83 0x3aea46c7 0x30a82ecb 0x309dd0cb 0x3099f061 0x309a1841 0x31476aa5 0x3151a96d 0x3b38de7b 0x3b38af93 0x3b38e745 0x3b38e9c5 0x3b4b8dff 0x3b4b8cc4) 
libc++abi.dylib: terminating with uncaught exception of type NSException 

看來,有一些錯誤的事務日誌。當然,我想解決這個問題,並保持應用程序運行,而不是隻是崩潰。因此,我必須能夠捕捉並處理異常情況。但我該怎麼做?

我甚至不知道這些異常來自何處。我假設它是由UIManagedDocument或UIManagedObjectContext類拋出的,但我不確定。

即使我知道異常來自這些類之一,我仍然不知道如何捕捉它。某些iCloud相關類在導入事務日誌時在後臺線程中引發異常。我所有的代碼都是對UIManagedDocument實例的引用。當然,我可以將每個調用都封裝在Try-Catch塊中,但是當我使用/調用這個實例時,當這個對象自己做了一些工作時,這個異常不會被拋出。

是否有可能發現類似這樣的異常?

即使無法捕捉並解決異常,也很高興知道拋出異常。這至少會讓我有機會在下次啓動應用程序時處理問題(向用戶顯示消息,從iCloud斷開連接等)。

那麼,處理這些異常的最佳方法是什麼?

非常感謝!

回答

0

我認爲你不太可能找到一種方法來捕捉異常。他們毫無疑問在後臺線程中,你的方法都不在調用堆棧中。你可以調整其中一種蘋果方法,但它變得非常難看,無論如何也不允許在App Store中使用。

不幸的是,Core Data + iCloud的不透明度是對它的評分。你不知道它應該如何工作,當它確實如此失敗時,你實在沒有辦法。

我建議提交雷達,但你也許可以期待的最好的是,它是固定在iOS的8

值得考慮替代的同步框架,如TICDSEnsembles,這與iCloud的兩個工作。這樣做的好處是您至少擁有源代碼,可以看到發生了什麼問題,並在幾個小時內得到修復。

(披露:我創辦了合奏項目)

0

如果您正在使用UIManagedDocument你需要它的子類,並覆蓋了幾個方法來獲取錯誤。特別是這兩個

- (id)contentsForType:(NSString *)typeName error:(NSError *__autoreleasing *)outError 
{ 
    LOG(@"Auto-Saving Document"); 
    return [super contentsForType:typeName error:outError]; 
} 

- (void)handleError:(NSError *)error userInteractionPermitted:(BOOL)userInteractionPermitted 
{ 
    FLOG(@" error: %@", error.localizedDescription); 
    NSArray* errors = [[error userInfo] objectForKey:NSDetailedErrorsKey]; 
    if(errors != nil && errors.count > 0) { 
     for (NSError *error in errors) { 
      FLOG(@" Error: %@", error.userInfo); 
     } 
    } else { 
     FLOG(@" error.userInfo = %@", error.userInfo); 
    } 
} 

不確定這些將拿起您的具體錯誤。

更多關於Core Data和iCloud的整合。

http://ossh.com.au/design-and-technology/software-development/