APP/擴充套件( Extension )之間資料共享空間_APPGroup
讓我們開始吧
appgroup用於兩個app之間共享檔案,開擴了一塊共同的儲存區域!
此外擴充套件( Extension )也需要使用appgroup的相關知識
此方法只能使用於同一個開發者賬號,如果不同開發者賬號請考慮剪下板 UIPasteboard
1.建立APPGroup
1.登入開發者賬號
點選APPGroup那欄:
右上方新增APPGroup:
然後確認就行了
2.專案中配置
開啟你的xcode專案工程,先選中根目錄,在target中選中你的工程–>Capabilites
3.程式碼中使用
1.NSUserDefaults
//初始化一個供App Groups使用的NSUserDefaults物件
NSUserDefaults *userDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.company.appGroupName"];
//寫入資料
[userDefaults setValue:@"value" forKey:@"key"];
//讀取資料
NSLog(@"%@", [userDefaults valueForKey:@"key"]);
2.NSFileManager
//獲取分組的共享目錄
NSURL *groupURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.company.appGroupName" ];
NSURL *fileURL = [groupURL URLByAppendingPathComponent:@"demo.txt"];
//寫入檔案
[@"abc" writeToURL:fileURL atomically:YES encoding:NSUTF8StringEncoding error:nil];
//讀取檔案
NSString *str = [NSString stringWithContentsOfURL:fileURL encoding:NSUTF8StringEncoding error:nil];
NSLog(@"str = %@", str);
利用NSFileManager我們可以存取各種檔案,資料庫檔案(.db),json檔案,framework等等;我們可以複製各種檔案到APPGroup的存取區域,在另一個app中拿出來
static NSString * const group = @"group.company.appGroupName";
- (BOOL)saveDataFromPath:(NSString *)originPath toFile:(NSString *)filename;
{
self.url = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:group];
NSURL *fileURL = [self.url URLByAppendingPathComponent:filename];
return [[NSFileManager defaultManager] copyItemAtPath:originPath toPath:[fileURL path] error:nil];
}
在第一塊程式碼中,NSFileManager是以NSURL來操作的,同樣,我們可以以path進行操作,這是沒問題的,path可由URL的[fileURL path]方式取到
3.CoreData使用
//獲取分組的共享專案
NSURL *containerURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.cn.vimfung.ShareExtensionDemo"];
NSURL *storeURL = [containerURL URLByAppendingPathComponent:@"DataModel.sqlite"];
//初始化持久化儲存排程器
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"DataModel" withExtension:@"momd"];
NSManagedObjectModel *model = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
[coordinator addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil
URL:storeURL
options:nil
error:nil];
//建立受控物件上下文
NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[context performBlockAndWait:^{
[context setPersistentStoreCoordinator:coordinator];
}];
我沒有深入用過,所以這裡不做詳細闡述;
另外添上封裝的AppGroupManager類,如需要可以使用:
AppGroupManager
#import <Foundation/Foundation.h>
@interface AppGroupManager : NSObject
@property (nonatomic, strong) NSString *identifier;//your apple appgroup id eg:"group.com.hyb.ms"
@property (nonatomic, strong) NSURL *url;//appgroup file's url
@property (nonatomic, strong) NSUserDefaults * userDefaultes;
#pragma init
+ (instancetype)defaultManager;//singleton method
- (instancetype)initWithGroupIdentifier:(NSString*)group;//init
#pragma write normal data - string dic data array
- (BOOL)writeToFile:(NSString *)filename withJson:(NSString *)jsonStr;//寫入jsonStr字串到Json檔案中
- (BOOL)writeToFile:(NSString *)filename withDictionary:(NSDictionary *)dic;//同上只是將字典轉換成字串存入
- (BOOL)writeToFile:(NSString *)filename withData:(NSData *)data;
- (BOOL)writeToFile:(NSString *)filename withArray:(NSArray *)array;
#pragma file
- (BOOL)saveDataFromPath:(NSString *)originPath toFile:(NSString *)filename;//copy file
- (BOOL)saveData:(NSData *)data toFile:(NSString *)filename;//根據data型別寫入對應型別的檔案中
- (NSData *)dataFromFile:(NSString *)filename;//get data (image,file...) from "(appgroup url)/filename"
- (BOOL)deleteFile:(NSString *)filename;//delete File
#pragma read
- (NSString *)JsonFromFile:(NSString *)filename;//read json string from file that name is filename
- (NSDictionary *)dictionaryFormFile:(NSString *)filename;//as same as upon, just turn string to dictionary
#pragma other
- (BOOL)isExistFile:(NSString *)filename;//judge file is exist;
#pragma - NSUserDefaults
#pragma -- save
- (BOOL)setObject:(nullable id)value forKey:(NSString *_Nullable)defaultName;
#pragma -- take out
- (nullable id)objectForKey:(NSString *_Nullable)defaultName;
#import "AppGroupManager.h"
staticNSString * const mhjgroup = @"group.com.hyb.ms";//預設的appgroup
@implementation AppGroupManager
#pragma mark init
staticAppGroupManager *manager = nil;
+ (instancetype)defaultManager
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
manager = [[AppGroupManageralloc]initWithGroupIdentifier:mhjgroup];
});
returnmanager;
}
- (instancetype)initWithGroupIdentifier:(NSString*)group
{
if (self = [super init]) {
self = [[AppGroupManager alloc]init];
self.identifier = group;
self.url = [[NSFileManagerdefaultManager] containerURLForSecurityApplicationGroupIdentifier:group];
self.userDefaultes = [[NSUserDefaults alloc] initWithSuiteName:group];
}
returnself;
}
#pragma mark write normal data - string dic data array
- (BOOL)writeToFile:(NSString *)filename withJson:(NSString*)jsonStr
{
NSURL *fileURL = [self.url URLByAppendingPathComponent:filename];
return [jsonStr writeToURL:fileURL atomically:YESencoding:NSUTF8StringEncodingerror:nil];
}
- (BOOL)writeToFile:(NSString *)filename withDictionary:(NSDictionary*)dic
{
NSString *jsonStr = [AppGroupManager dictionaryToJson:dic];
return [self writeToFile:filename withJson:jsonStr];
}
- (BOOL)writeToFile:(NSString *)filename withData:(NSData *)data
{
NSURL *fileURL = [self.url URLByAppendingPathComponent:filename];
return [data writeToURL:fileURL atomically:YES];
}
- (BOOL)writeToFile:(NSString *)filename withArray:(NSArray *)array
{
NSURL *fileURL = [self.url URLByAppendingPathComponent:filename];
return [array writeToURL:fileURL atomically:YES];
}
#pragma file save
- (BOOL)saveDataFromPath:(NSString *)originPath toFile:(NSString *)filename;
{
NSURL *fileURL = [self.url URLByAppendingPathComponent:filename];
return [[NSFileManagerdefaultManager] copyItemAtPath:originPath toPath:[fileURL path] error:nil];
}
- (BOOL)saveData:(NSData *)data toFile:(NSString *)filename
{
NSURL *fileURL = [self.url URLByAppendingPathComponent:filename];
return [[NSFileManagerdefaultManager] createFileAtPath:[fileURL path] contents:data attributes:nil];
}
- (NSData *)dataFromFile:(NSString *)filename
{
NSURL *fileURL = [self.url URLByAppendingPathComponent:filename];
return [[NSFileManagerdefaultManager] contentsAtPath:[fileURL path]];
}
- (BOOL)deleteFile:(NSString *)filename;
{
NSURL *fileURL = [self.url URLByAppendingPathComponent:filename];
return [[NSFileManagerdefaultManager] removeItemAtPath:[fileURL path] error:nil];
}
#pragma mark read
- (NSString*)JsonFromFile:(NSString *)filename
{
NSURL *fileURL = [self.url URLByAppendingPathComponent:filename];
BOOL isExist = [[NSFileManagerdefaultManager] isExecutableFileAtPath:[fileURL path]];
if (isExist) {
NSString *str = [NSStringstringWithContentsOfURL:fileURL encoding:NSUTF8StringEncodingerror:nil];
returnstr;
}else{
NSLog(@"檔案不存在");
return nil;
}
}
- (NSDictionary *)dictionaryFormFile:(NSString *)filename
{
NSURL *fileURL = [self.url URLByAppendingPathComponent:filename];
NSString *str = [NSStringstringWithContentsOfURL:fileURL encoding:NSUTF8StringEncodingerror:nil];
if (str) {
return [AppGroupManagerdictionaryWithJsonString:str];
}else{
return nil;
}
}
#pragma mark other
- (BOOL)isExistFile:(NSString *)filename;
{
NSURL *fileURL = [self.url URLByAppendingPathComponent:filename];
NSString *path = [fileURL path];
BOOL isExist = [[NSFileManagerdefaultManager] fileExistsAtPath:path];
return isExist;
}
#pragma mark private methods
+ (NSDictionary *)dictionaryWithJsonString:(NSString *)jsonString {
if (jsonString == nil) {
return nil;
}
NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
NSError *err;
NSDictionary *dic = [NSJSONSerializationJSONObjectWithData:jsonData
options:NSJSONReadingMutableContainers
error:&err];
if(err) {
NSLog(@"json解析失敗:%@",err);
return nil;
}
return dic;
}
+ (NSString*)dictionaryToJson:(NSDictionary *)dic
{
NSError *parseError = nil;
NSData *jsonData = [NSJSONSerializationdataWithJSONObject:dic options:NSJSONWritingPrettyPrintederror:&parseError];
return [[NSStringalloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
}
#pragma NSUserDefaults
- (BOOL)setObject:(nullable id)value forKey:(NSString *_Nullable)defaultName
{
if (!value || !defaultName) return false;
[self.userDefaultes setObject:value forKey:defaultName];
returntrue;
}
- (nullable id)objectForKey:(NSString *_Nullable)defaultName
{
if (!defaultName) return nil;
return [self.userDefaultes objectForKey:defaultName];
}
@end