2014-06-05 61 views
8

是否可以使用NSUserDefaults在Today Extension上保存和加載數據? 關閉通知中心後,小部件的行爲就像終止的應用程序,因此任何數據結果都會丟失。我怎麼能解決這個問題?在今日擴展上保存和加載數據(iOS 8)

這是我的代碼:

NSUserDefaults *defaults; 

- (void)viewDidLoad { 

[super viewDidLoad]; 

defaults = [NSUserDefaults standardUserDefaults]; 
NSArray *loadStrings = [defaults stringArrayForKey:@"savedStrings"]; 

if ([loadStrings objectAtIndex:0] != nil) { 
    [display setText:[NSString stringWithFormat:@"%@", [loadStrings objectAtIndex:0]]]; 
} 
if ([loadStrings objectAtIndex:1] != nil) { 
    calculatorMemory = [NSString stringWithFormat:@"%@", [loadStrings objectAtIndex:1]].doubleValue; 
} 

} 


- (IBAction)saveData:(id)sender { 

NSString *displayString; 
NSString *memoryString; 

NSArray *saveStrings = [[NSArray alloc] initWithObjects: displayString, memoryString, nil]; 


defaults = [NSUserDefaults standardUserDefaults]; 
[defaults setObject:saveStrings forKey:@"savedStrings"]; 
[defaults synchronize]; 


} 
+0

[應用程序組之間的應用程序之間的數據通信和持久性](http://stackoverflow.com/questions/24015506/communicating-and-persisting-data-between-apps-with-app-groups) –

回答

19

你需要使用的應用程序組標識符,而不是COM的* 例如:

NSUserDefaults *shared = [[NSUserDefaults alloc]initWithSuiteName:@"group.company.appgroup"]; 

不要忘了,當你存儲同步數據

[shared synchronize]; 
+0

謝謝,但是在閱讀更深入的文檔後,前兩天我解決了問題! –

+0

@MassimoPiazza我已經按照步驟,這不起作用。我正在使用鍵盤應用程序擴展。思考? – Spentak

+0

@Spentak是否在包含應用程序和鍵盤擴展的xcode項目功能中啓用了應用程序組? – BenjG37

2

您需要添加應用程序組的東西詳細under here,然後,如果它實際工作(下測試很玄乎)它應該讓你分享像之間的正常NSUserDefault數據主機和小部件。

編輯:正常NSUserDefaults 不是工作。蘋果已經實施了一種新方法。使用時,只需重新定義您的實例NSUserDefaults的像這樣:

NSUserDefaults *shared = [[NSUserDefaults alloc]initWithSuiteName:@"com.you.app.container"]; 
+0

I嘗試過,但它仍然不起作用 –

+0

在這裏不起作用。 – BalestraPatrick

+0

@BalestraPatrick確保應用組配置正確,併爲您的應用定位和擴展目標以及您的應用ID和配置文件配置了正確的權利。 –

1

首先,您需要的應​​用程序組設置了兩個目標(應用的訊號分配延長錫永)。

然後,使用

NSUserDefaults *shared = [[NSUserDefaults alloc]initWithSuiteName:@"group.company.myapp"]; 

獲得默認值對象,它可以從讀/寫如常。

如果您希望收到更改默認值的通知,請在您的小部件(或應用程序)中使用NSUserDefaultsDidChangeNotification

有關解釋所有這些問題的分步教程,請看blog post

+0

後面的教程,並不適用於鍵盤應用程序擴展 – Spentak

+0

@Spentak這很奇怪。什麼不工作?此外,教程(以及這個SO問題)是關於今日擴展,鍵盤的更多有限 - 也許他們有NSUserDefaults或某些限制。 –

+0

Lukas - 您可以在鍵盤擴展上使用用戶默認設置嗎?我已經測試過它,不能做出成功的測試用例。 – Spentak

2

對於任何人想知道如何在世界上保存和獲取值,然後看看這段代碼。

在您的常規應用程序中添加此項以保存任何您喜歡的* .m文件。

NSUserDefaults *shared = [[NSUserDefaults alloc]initWithSuiteName:@"group.yourcompanyname.TodayExtensionSharingDefaults"]; 

    //save dic 
    [shared setObject:dictionary2 forKey:@"dicForTodayWidget"]; 

    //save array 
    [shared setObject:tempArray2 forKey:@"arrayForTodayWidget"]; 

    //save some value 
    [shared setObject:@"1234" forKey:@"myValForTodayWidget"]; 

    [shared synchronize]; 

在你今天的窗口部件下的viewDidLoad中的TodayViewController.m中添加這個。

NSUserDefaults *shared = [[NSUserDefaults alloc]initWithSuiteName:@"group.yourcompanyname.TodayExtensionSharingDefaults"]; 

    //get dic 
    NSMutableDictionary *dictionary = [shared objectForKey:@"dicForTodayWidget"]; 
+1

這是一流的! –

-2

@edukulele 今天擴展和主應用程序在兩個進程上運行。 Today Extension無法接收NSUserDefaultsDidChangeNotifications。我嘗試使用MMWormhole。這很棒。

+0

雖然這個鏈接可能回答這個問題,但最好在這裏包含答案的基本部分,並提供參考鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效。 - [來自評論](/ review/low-quality-posts/12773697) – Kara

+0

我的答案包括這個庫。如何使用圖書館必須訪問此鏈接。我認爲非常容易。現在我已經刪除了該鏈接。 –