Chia sẻ dữ liệu giữa hai hoặc nhiều ứng dụng iPhone


79

Điều này có thể chia sẻ dữ liệu giữa hai ứng dụng trên cùng một thiết bị không?

Hoặc tôi có thể cho phép một số ứng dụng khác sử dụng thông tin / dữ liệu của ứng dụng của tôi hoặc theo bất kỳ cách nào khác không?

Ví dụ: ứng dụng đầu tiên dành cho quản lý sự kiện và tôi sử dụng nó để lưu một số sự kiện. Ứng dụng thứ hai dành cho lời nhắc, sẽ lấy dữ liệu từ ứng dụng khác để nhắc tôi về sự kiện.

Đây chỉ là một ví dụ đơn giản, không phải là một kịch bản thực tế.

Câu trả lời:


38

Trước đây, iPhone đã cố gắng ngăn chặn việc chia sẻ dữ liệu giữa các ứng dụng. Ý tưởng là nếu bạn không thể truy cập dữ liệu của ứng dụng khác, bạn không thể làm gì xấu với ứng dụng đó.

Trong các bản phát hành gần đây của IOS, họ đã nới lỏng điều đó một chút. Ví dụ: hướng dẫn lập trình iOS hiện có phần chuyển dữ liệu giữa các ứng dụng bằng cách yêu cầu một ứng dụng yêu cầu một tiền tố URL nhất định, sau đó yêu cầu các ứng dụng khác tham chiếu đến URL đó. Vì vậy, có lẽ bạn đặt ứng dụng sự kiện của mình để trả lời các URL "event: //" giống như cách máy chủ web trả lời cho các URL "http: //".

Tài liệu của Apple về cách tiếp cận đó ở đây .

Xem qua "Triển khai lược đồ URL tùy chỉnh".


Cảm ơn đây là chính xác tôi đang tìm kiếm.
Kamleshwar

Dữ liệu lớn có thể được chia sẻ theo cách đó, chẳng hạn như các tệp?
AlikElzin-kilaka

2
Nếu bạn đang đọc đến đây, hãy đảm bảo rằng bạn kiểm tra phản hồi của @siejkowski bên dưới, vì nó được cập nhật nhiều hơn.
mahboudz

1
Phản hồi từ @ chintan-maddy-ramani cũng đáng được ghi nhận.
mahboudz

2
Có, đã có nhiều cách tốt hơn được thêm vào kể từ khi tôi viết câu trả lời này. Câu hỏi cũ có câu trả lời cũ!
baudot

102

Trong thế giới hộp cát của việc phát triển iOS, chia sẻ dữ liệu giữa các ứng dụng có thể khó khăn Vì các nhà phát triển iOS không thể chia sẻ dữ liệu trực tiếp thông qua hệ thống tệp , họ cần tìm các giải pháp thay thế cho ứng dụng của mình. Một số giải pháp phổ biến bao gồm:

  • UIDocumentInteractionController

  • UIActivityViewController

  • Quyền truy cập chuỗi khóa được chia sẻ

  • Lược đồ URL tùy chỉnh

  • Dịch vụ web

  • API iCloud


UIDocumentInteractionController:

Cho phép người dùng mở tài liệu trong bất kỳ ứng dụng nào khác đăng ký khả năng xử lý một tài liệu cụ thể Mã định danh loại đồng nhất (UTI) .

Trước đây, UIDocumentInteractionController đã được sử dụng như một phương tiện để mở tài liệu trong các ứng dụng khác trên thiết bị, chẳng hạn như mở tệp đính kèm email từ ứng dụng Thư.

UIDocumentInteractionController

Thật không may, giao diện người dùng của UIDocumentInteractionController chỉ hiển thị sáu ứng dụng .

Bạn không thể đảm bảo rằng ứng dụng của bạn sẽ xuất hiện trong danh sách. Mặc dù UIDocumentInteractionController không còn được dùng nữa, UIActivityViewController cung cấp sự thay thế linh hoạt hơn kể từ iOS 6.0.

Khả dụng: iOS 3.2+

Ưu điểm:

  • Cho phép chia sẻ các kiểu dữ liệu chung với nhiều loại ứng dụng.

Nhược điểm:

  • Cho phép kiểm soát loại dữ liệu được gửi đến UIDocumentInteractionController, nhưng không cho phép các đích.

  • Yêu cầu người dùng tương tác bổ sung.

  • Số lượng đích dữ liệu hạn chế có thể khiến ứng dụng của bạn không hiển thị trong danh sách.


UIActivityViewController:

Cho phép người dùng thực hiện một số hành động với một mảng dữ liệu.

Ví dụ: họ có thể in, gửi email, sao chép, đăng lên mạng xã hội hoặc mở trong một ứng dụng khác.

Bạn có thể tạo các lớp con UIActivity của riêng mình để cung cấp các dịch vụ tùy chỉnh cho người dùng.

UIActivityController

Khả dụng: iOS 6.0+

Ưu điểm:

  • Tuyệt vời để chia sẻ các kiểu dữ liệu phổ biến với nhiều ứng dụng và phương tiện truyền thông xã hội.

  • Có thể cung cấp một loạt các mục cho ứng dụng cho một hoạt động. Các đối tượng phải tuân theo giao thức UIActivityItemSource.

  • Có khả năng đặt các loại hoạt động bị loại trừ.

  • Giao diện người dùng phân trang cho phép nhiều đích dữ liệu hơn UIDocumentInteractionController.

Nhược điểm:

  • Bạn phải xác định loại hoạt động tùy chỉnh để hạn chế đích đến “Mở trong…” của các loại dữ liệu phổ biến.

  • Yêu cầu người dùng tương tác bổ sung.


Quyền truy cập chuỗi khóa được chia sẻ:

Cho phép bạn lưu trữ dữ liệu một cách an toàn vào chuỗi khóa dùng chung mà các ứng dụng khác nằm trong bộ ứng dụng có thể truy cập.

Tất cả các ứng dụng chia sẻ quyền truy cập chuỗi khóa phải sử dụng cùng một tiền tố ID ứng dụng.

Ví dụ về truy cập chuỗi khóa được chia sẻ trong thực tế. Xem mã mẫu GenericKeychain của Apple .

Chuỗi chìa khóa dùng chung

Khả dụng: iOS 3.0+

Ưu điểm:

  • Truy cập an toàn vào dữ liệu.

Nhược điểm:

  • Bạn chỉ có thể chia sẻ dữ liệu giữa các ứng dụng có chung tiền tố ID ứng dụng.

  • API chuỗi khóa trên Trình mô phỏng iOS đến từ OS X, có API khác với API của thiết bị iOS.


Lược đồ URL tùy chỉnh:

Cho phép dữ liệu chuyển giữa các ứng dụng bằng các URL đơn giản.

Lược đồ URL tùy chỉnh

Khả dụng: iOS 3.0+

Ưu điểm:

  • Không cần kết nối mạng.
  • Tuyệt vời cho một lượng nhỏ dữ liệu mà bạn có thể dễ dàng mã hóa thành một URL hợp pháp, thoát.

Nhược điểm:

  • Bạn phải mã hóa dữ liệu thành một URL hợp pháp thoát.

    Lưu ý: mã hóa base64 được sử dụng phổ biến biến dữ liệu có thể tuần tự hóa thành giá trị chuỗi. Tuy nhiên, chuỗi base64 có thể bao gồm các ký tự không hợp lệ để sử dụng trong URL. Bạn có thể cân nhắc sử dụng base64url. Xem Mã hóa Cơ sở 64 với URL và Tên tệp Bảng chữ cái An toàn để biết thêm thông tin.


API iCloud:

Mọi người đều biết về iCloud là gì, Ưu và Nhược điểm nên không cần giải thích thêm cho điều đó.

Nhưng người ta có thể hỏi làm thế nào để có thể chia sẻ dữ liệu giữa các ứng dụng bên trong một thiết bị, có một số cách giải quyết để đạt được điều đó.

iCloud

Có thể do số nhận dạng được sử dụng cho iCloud khác với số nhận dạng gói nên có thể chia sẻ hình ảnh, video và các tài liệu khác.

Để biết thêm, hãy xem cuộc thảo luận về chủ đề này


Dịch vụ Web:

Đồng bộ hóa dữ liệu thông qua bên thứ ba (ví dụ: Dropbox) hoặc dịch vụ web được xây dựng tùy chỉnh.

dịch vụ web

Khả dụng: iOS 2.0+

Ưu điểm:

  • Hữu ích cho việc chia sẻ và phân phối một lượng lớn dữ liệu.

Nhược điểm:

  • Yêu cầu kết nối mạng.
  • Chi phí triển khai dịch vụ web.

Tài liệu tham khảo


3
như câu trả lời sâu rộng và sử dụng đồ họa
coolharsh55

1
Bạn cũng nên đề cập đến UIPasteboardAPI.
Evgeny Karkan

@EvgenyKarkan - Vui lòng chỉnh sửa bài đăng :)
Durai Amuthan.H

54

Từ iOS 8, tôi đã truy cập thành công Thư mục tương tự bằng cách sử dụng " Chức năng nhóm ứng dụng " . Tôi đang mở rộng câu trả lời của @siejkowski.

Lưu ý: Nó sẽ chỉ hoạt động từ cùng một tài khoản nhà phát triển.

Đối với điều đó, bạn phải làm theo các bước dưới đây.

  1. đầu tiên Bật "Nhóm ứng dụng" từ tài khoản nhà phát triển của bạn.
  2. Tạo hồ sơ cấp phép. và sử dụng nó.

Bây giờ bạn phải tạo Hai ứng dụng. Tên mẫu

  1. Demo_Share_One
  2. Demo_Share_Two

Bây giờ Chúng tôi đang sao chép hình ảnh từ Demo_Share_One vào thư mục Chia sẻ được tạo theo mặc định khi bạn bật Nhóm ứng dụng và chạy ứng dụng. và sẽ truy cập tất cả những hình ảnh đó từ Demo_Share_Two .

Bạn phải Lấy Tên nhóm đã được đặt cho tài khoản nhà phát triển của bạn .lets nói group.filesharingdemo.

Thêm phương thức Dưới đây trong Cả hai ứng dụng để nhận đường dẫn tương đối của url thư mục chia sẻ.

- (NSString *) getSharedLocationPath:(NSString *)appGroupName {
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSURL *groupContainerURL = [fileManager containerURLForSecurityApplicationGroupIdentifier:appGroupName];
    return [groupContainerURL relativePath];
}

Bây giờ chúng tôi đang sao chép hình ảnh từ gói từ Demo_Share_One

-(IBAction)writeImage:(id)sender
{
    for (int i = 0; i<15; i++) 
    {
        NSString *strSourcePath = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"hd%d",i+1] ofType:@"jpg"];
        NSString *strDestinationPath = [[self getSharedLocationPath:@"group.filesharingdemo"] stringByAppendingPathComponent:[NSString stringWithFormat:@"hd%d",i+1]] ;

        BOOL filewrite = [[NSFileManager defaultManager]copyItemAtPath:strSourcePath toPath:strDestinationPath error:nil];
        if (filewrite)
            NSLog(@"File write");
        else
            NSLog(@"can not write file");
    }
}

Bây giờ trong Demo_Share_Two để truy cập những hình ảnh đó

NSString *pathShared = [[self getSharedLocationPath:@"group.filesharingdemo"] stringByAppendingPathComponent:[NSString stringWithFormat:@"hd%d.jpg",number]];
NSLog(@"%@",pathShared);
//BOOL fileExist = [[NSFileManager defaultManager] fileExistsAtPath:pathShared];
imgView.image = [UIImage imageWithContentsOfFile:pathShared];

Và Bây giờ Bạn sẽ nhận được tất cả các hình ảnh mà bạn viết từ Demo_Share_One .

Vì vậy, từ bây giờ trở đi nếu bạn muốn chia sẻ thư mục này hai ứng dụng thứ ba của bạn. chỉ cần thêm ứng dụng đó vào nhóm của bạn. Vì vậy, quá dễ dàng để truy cập các phần tử giống nhau trong Nhiều ứng dụng của bạn.

nếu bạn không bật Nhóm ứng dụng trong AppID của mình thì bạn sẽ nhận được [self getSharedLocationPath: @ "group.filesharingdemo"] là trống.

Cảm ơn Apple đã chia sẻ Phần tử từ chức năng ứng dụng của riêng bạn . Chúc bạn mã hóa vui vẻ. :)


s / getSharedLocationPath: / sharedLocationPathForAppGroup: / :-)
Ivan Vučica 29/05

1
@ChintaN -Maddy- Ramani có thể chia sẻ đường dẫn vị trí chứa một sqlLite hoặc db cảnh giới không? Phần mở rộng có cần thiết cho việc này không?
user2363025,

@ user2363025 Có thể có. Bạn co thể thử. Tôi chỉ thử với hình ảnh. có thể bạn có thể sao chép cơ sở dữ liệu ở đó.
ChintaN -Maddy- Ramani

@ ChintaN-Maddy-Ramani. Tôi gặp lỗi bên dưới: Tên miền = NSCocoaErrorDomain Code = 512 "Không thể lưu tệp“ 1FAA9B86-E775-4A2D-A2D6-A442C8A9A8FA ”trong thư mục“ Nhóm ứng dụng ”." UserInfo = {NSFilePath = / private / var / mobile / Container / Shared / AppGroup / 1FAA9B86-E775-4A2D-A2D6-A442C8A9A8FA, NSUnderlyingError = 0x282202250 {Lỗi miền = NSPOSIXErrorDomain Mã = 21 "có phải là một thư mục"}}
Anand Prakash


18

Kể từ iOS 8, bạn có thể dễ dàng chia sẻ dữ liệu giữa các ứng dụng miễn là chúng nằm trong Nhóm ứng dụng chung.

Tài liệu của Apple giải thích tốt nhất về nó trong bối cảnh Tiện ích mở rộng: https://developer.apple.com/library/prerelease/ios/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html

Về cơ bản, bạn cần:

  1. Xác định ID nhóm ứng dụng (trong phần Chứng chỉ, số nhận dạng & hồ sơ của Trung tâm thành viên cho Chương trình nhà phát triển Apple của bạn.
  2. Bật tính năng Nhóm ứng dụng chỉ định ID Nhóm ứng dụng ở trên cho từng ứng dụng cần giao tiếp (có thể thực hiện trong Xcode: Target -> Capabilities hoặc tại Trung tâm thành viên ).
  3. Sử dụng một trong hai API để truy cập vùng chứa được chia sẻ.

API đầu tiên dựa trên NSUserDefaults:

NSString *appGroupId = @"group.my.group.id";

NSUserDefaults *myDefaults = [[NSUserDefaults alloc] 
                    initWithSuiteName:appGroupId];

[myDefaults setObject:@"foo" forKey:@"bar"];

API thứ hai dựa trên NSFileManager. Nó chỉ đơn giản là một thư mục được chia sẻ mà bạn có thể truy cập sau khi có được url của nó:

NSString *appGroupId = @"group.my.group.id";

NSURL *sharedFolderURL = [[NSFileManager defaultManager] 
                           containerURLForSecurityApplicationGroupIdentifier:appGroupId];

Bất kỳ thứ gì bạn đặt bên trong myDefaultshoặc thư mục được trỏ đến sharedFolderURLsẽ hiển thị và có thể truy cập được đối với tất cả các ứng dụng của bạn.

Trong trường hợp thư mục, vui lòng ghi / đọc nguyên tử chỉ để đảm bảo không có deadlock.


tôi đã thực hiện các bước của bạn và nhận được url được chia sẻ. nhưng làm thế nào để đưa Image vào con đường đó. tôi nối tên hình ảnh của mình và ghi dữ liệu. sau đó tôi cố gắng truy xuất nhưng không thể lấy lại hình ảnh.
ChintaN -Maddy- Ramani

Tôi đã thực hiện thành công việc ghi tất cả hình ảnh từ app1 và truy xuất tất cả hình ảnh từ app2 bằng nhóm ứng dụng. Cảm ơn . +1 :).
ChintaN -Maddy- Ramani

Tôi có thể yêu cầu một ứng dụng của bên thứ ba tham gia nhóm của mình (theo lựa chọn) hay tất cả các ứng dụng phải từ cùng một tài khoản nhà phát triển?
DwarDoh

@DwarDoh nó phải từ cùng một tài khoản nhà phát triển.
ChintaN -Maddy- Ramani

14

Có thể chia sẻ dữ liệu giữa các ứng dụng? Vâng, đúng vậy!

Sử dụng UIPasteBoard có sẵn từ iOS 3.0, tài liệu có sẵn tại đây . Tài liệu của Apple nói:

Lớp UIPasteboard cho phép ứng dụng chia sẻ dữ liệu trong ứng dụng hoặc với một ứng dụng khác bằng cách sử dụng bảng dán toàn hệ thống hoặc dành riêng cho ứng dụng.

Cũng có thể chia sẻ dữ liệu giữa các ứng dụng trong chuỗi khóa, mặc dù dữ liệu chủ yếu là mật khẩu và như vậy, bất kỳ thứ gì có thể tuần tự hóa đều có thể được lưu trữ. Đây là một câu hỏi về Stack Overflow về điều đó.


Tuyệt quá! Đây có vẻ như là một cách khả thi để chia sẻ dữ liệu giữa các ứng dụng.
trusktr

1
UIPasteboard giống như một giải pháp tốt để chia sẻ dữ liệu nhỏ, chẳng hạn như sao chép dán các chuỗi. Có tùy chọn chia sẻ tệp giữa các ứng dụng không?
AlikElzin-kilaka

1
@ AlikElzin-kilaka vâng, nó cũng hỗ trợ NSData.
Evgeny Karkan

4

Bạn có thể sử dụng lược đồ URL tùy chỉnh để truy cập dữ liệu từ ứng dụng này sang ứng dụng khác. Theo dõi liên kết được đề cập bên dưới để biết thêm thông tin -

http://iosdevelopertips.com/cocoa/launching-your-own-application-via-a-custom-url-scheme.html


2
"Dữ liệu truy cập" ở đây là sai lệch. Liên kết đề cập đến một bài viết trong đó một số thông số được chuyển đến một ứng dụng trong chính URL.
DonSteep

3

Đề cập rằng chia sẻ dữ liệu giữa các ứng dụng qua UIPasteBoard chỉ hoạt động đối với các ứng dụng trong cùng một nhóm ứng dụng trong iOS7. Như táo nói:

+ [UIPasteboard pasteboardWithName: create:] và + [UIPasteboard pasteboardWithUniqueName] hiện là duy nhất tên đã cho để chỉ cho phép những ứng dụng trong cùng một nhóm ứng dụng truy cập vào pasteboard. Nếu nhà phát triển cố gắng tạo một bảng dán có tên đã tồn tại và chúng không thuộc cùng một bộ ứng dụng, họ sẽ nhận được bảng dán riêng và độc đáo của riêng mình. Lưu ý rằng điều này không ảnh hưởng đến hệ thống cung cấp pasteboards, chung và tìm.


Apple có nghĩa là gì khi "cùng một nhóm ứng dụng"?
Magic Bullet Dave,

2
@MagicBulletDave các ứng dụng có cùng ID gốc gói.
MasterBeta

Lớp UIPasteboard cho phép một ứng dụng chia sẻ dữ liệu trong ứng dụng và với một ứng dụng khác. Để chia sẻ dữ liệu với bất kỳ ứng dụng nào khác, bạn có thể sử dụng bảng dán toàn hệ thống; để chia sẻ dữ liệu với một ứng dụng khác có cùng ID nhóm với ứng dụng của bạn, bạn có thể sử dụng bảng dán dành riêng cho ứng dụng.
thử nghiệm

2

Nếu bạn không ngại truy cập mạng, bạn có thể triển khai một dịch vụ web tùy chỉnh để làm điều đó hoặc sử dụng một số dịch vụ đám mây. Bản thân iCloud sẽ không được sử dụng nhiều ở đây; nó chỉ cho phép bạn chia sẻ dữ liệu giữa cùng một ứng dụng trên các thiết bị khác nhau. Bạn có thể đọc về iCloud tại đây .

Nếu không sử dụng mạng, bạn có thể khai thác " chuyển đổi ứng dụng nhanh " để chuyển một lượng dữ liệu hạn chế giữa các ứng dụng thông qua mã hóa URL. Tôi không biết số lượng dữ liệu thực tế có thể truyền được, nhưng tôi chắc chắn rằng nó sẽ rất hạn chế.

Câu trả lời của JugsteR và baudot là tốt nhất trong trường hợp này.


Xin chào psoft, bạn có thể ngắn gọn hơn về chia sẻ iCloud mà bạn đã giải thích ở đây trong hai dòng
Vinayaka Karjigi

Tôi đọc rằng ID iCloud không phải khớp với ID gói của ứng dụng và do đó, chia sẻ iCloud sẽ là một tùy chọn.
kiểm tra

Có thể truyền 64kB dữ liệu bên trong một URL chuẩn. Nó thực sự hoạt động tốt. Nếu không có quá nhiều dữ liệu, bạn có thể mã hóa / base64 để bảo mật tốt hơn.
igraczech


-4

Không. Bạn sẽ phải sử dụng một số giải pháp đám mây.


Theo như tôi biết thì iCloud có nghĩa là để Đồng bộ hóa dữ liệu trên một thiết bị với các thiết bị khác. Nếu bạn biết bất kỳ cách nào để chia sẻ dữ liệu giữa các ứng dụng trong một thiết bị, vui lòng chia sẻ nó.
Durai Amuthan.H

2
dbarjkovic bạn nói đúng, chúng tôi có thể sử dụng giải pháp đám mây để đồng bộ dữ liệu giữa các ứng dụng vì số nhận dạng được sử dụng cho iCloud khác với số nhận dạng gói và hoàn toàn có thể xảy ra. đây là một liên kết để xác minh rằng stackoverflow.com/a/8882763/730807 . ủng hộ cho câu trả lời của bạn.
Durai Amuthan.H

Tại sao câu trả lời này bị phản đối? Đây là câu trả lời chính xác nhưng nó cần có thêm chi tiết từ tài liệu và đưa ra một số ví dụ
Basheer_CAD
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.