Is there an official way to pass data between Apple Watch and iPhone?

I was wondering if there is any other way besides MMWormhole to pass basic data between iPhone and Apple Watch. Do you know if any existing official Apple framework allows this?

Upvotes: 0

Views: 2358

Answers (5)

RichIntellect
RichIntellect

Reputation: 281

Use watch Connectivity.

// 1. In .m viewcontroller on phone & interface controller on iwatch
#import <WatchConnectivity/WatchConnectivity.h> 

@interface IController()<WCSessionDelegate>

@end

if ([WCSession isSupported]) {
    WCSession *session = [WCSession defaultSession];
    session.delegate = self;
    [session activateSession];}


// 2. Send Message  - Phone or iWatch:

[[WCSession defaultSession] sendMessage:response
                           replyHandler:^(NSDictionary *reply) {
                               NSLog(@"%@",reply);
                           }
                           errorHandler:^(NSError *error) {
                               NSLog(@"%@",error);
                           }
 ];

// 3. Receive Message - Phone or iWatch

- (void)session:(WCSession *)session didReceiveMessage: (NSDictionary<NSString *, id> *)message

 {

 }

Upvotes: 0

pbc
pbc

Reputation: 525

As stated above, I have used a shared app group and placed the core data files in that group. Using this technique, both the phone app and the watch can read and write the same data and all is good when they are run discretely. As each process is running in a separate sandbox, you run into the classic distributed database problem of potentially overwriting data from different sources.

To overcome this, you need to put data observers in place. I resorted to using the NSDistributedNotificationCenter to pass some custom messages between the app and the watch extension, but there may be a more elegant solution. Any ideas from others?

Upvotes: 0

bgilham
bgilham

Reputation: 5939

If you check the docs for WKInterfaceController, you'll find a method called openParentApplication:reply: that allows you to communicate with your host app in the background.

Upvotes: 2

Tejas Ardeshna
Tejas Ardeshna

Reputation: 4371

We can pass the data between iPhone & iWatch using groups.

Basically We can share data using the NSUserDefaults.

But for that you need to enable that see steps below: 1)open capabilities section in both your project target

2)open App Groups from that section

3)add container by click on + button with name group.test.demo

sample code to achieve that.

In your iphone app code

NSUserDefaults *myDefaults = [[NSUserDefaults alloc]initWithSuiteName:@"group.test.demo"];

[myDefaults setObject:@"tejas" forKey:@"name"];

now value "tejas" is set for key "name"

code to retrieve that

 NSUserDefaults *myDefaults = [[NSUserDefaults alloc]initWithSuiteName:@"group.test.demo"];

[myDefaults objectForKey:@"name"];

best of luck :)

Upvotes: 3

Naughty_Ottsel
Naughty_Ottsel

Reputation: 1103

It is possible.

Looking at: The WatchKit Doc's

There is a paragraph on sharing data between the watch app and the extension on the iPhone.

To quote the first paragraph.

Sharing Data with Your Containing iOS App

If your iOS app and WatchKit extension rely on the same data, use a shared app group to store that data. An app group is a secure container that multiple processes can access. Because your WatchKit extension and iOS app run in separate sandbox environments, they normally do not share files or communicate directly with one another. An app group lets the two processes share files or user defaults information between them.

From what I understand MMWormhole is handy for as close to realtime data changes between the 2 binaries. Whereas this method allows for accessing data used saved by the iPhone app that can be read by the Watch App and Vice Versa.

Upvotes: 3

Related Questions