2016-04-29 6 views
3

Попытка обновить мое приложение Watch OS1 для просмотра ОС 2. Создала новую цель для Watch OS 2. И используя sendMessage:replyHandler:errorHandler для отправки/получения ответов от приложения IOS. Он работает нормально, если только приложение IOS запущено. Если приложение Watch попробует связаться, когда приложение iOS находится в неактивном состоянии (Killed State), получив сообщение об ошибке 7001. Как отключить приложение IOS от приложения Watch (Watch OS 2)?Как общаться неактивное приложение IOS из приложения Watch (Watch OS 2)

Этот метод sendMessage:replyHandler:errorHandler от приложения часов пробуждает соответствующее приложение iOS в фоновом режиме и делает его доступным?

Спасибо.

Edit1: -

IOS приложения App Делегат:

- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions{ 

    if ([WCSession isSupported]) { 
     WCSession *session = [WCSession defaultSession]; 
     session.delegate = self; 
     [session activateSession]; 
    } 
return YES; 
} 
- (void)session:(nonnull WCSession *)session didReceiveMessage:(nonnull NSDictionary<NSString *,id> *)message replyHandler:(nonnull void (^)(NSDictionary<NSString *,id> * __nonnull))replyHandler { 

     UIApplication *application = [UIApplication sharedApplication]; 
     __block UIBackgroundTaskIdentifier identifier = UIBackgroundTaskInvalid; 
     dispatch_block_t endBlock =^{ 
      if (identifier != UIBackgroundTaskInvalid) { 
       [application endBackgroundTask:identifier]; 
      } 
      identifier = UIBackgroundTaskInvalid; 
     }; 
     identifier = [application beginBackgroundTaskWithExpirationHandler:endBlock]; 

     if (replyHandler!=nil) { 
      replyHandler(resultContainer); // my data dictionary from Iphone app to watch os as reply. 
     } 

     if (identifier!=UIBackgroundTaskInvalid) { 
      [application endBackgroundTask:identifier]; 
      identifier = UIBackgroundTaskInvalid; 
     } 
} 

Часы App:

- (void)applicationDidFinishLaunching { 
    // Perform any final initialization of your application. 
    if ([WCSession isSupported]) { 
     WCSession *session = [WCSession defaultSession]; 
     session.delegate = self; 
     [session activateSession]; 
    } 
     NSDictionary *context = @{@"APP_LOADING":@"LOADING"}; 
     [WKInterfaceController reloadRootControllersWithNames:@[WATCH_INTERFACE_LOADING] contexts:@[context]]; 


     NSDictionary *request = //My Request data; 
     [[WCSession defaultSession] sendMessage:request 
            replyHandler:^(NSDictionary *reply) { 
             //handle reply from iPhone app here 

             NSDictionary *resultDict = [reply objectForKey:WATCH_REQUEST_RESULT]; 
// Use reply from Phone app 
            } 
            errorHandler:^(NSError *error) { 
             //catch any errors here 
// Getting error here 7001 Error. 
            } 
     ]; 

} 

ответ

0

Поскольку Activate метод является асинхронным использование его в метод делегата, как следующее:

public func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?){ 
    print("activationDidCompleteWith") 
    if activationState == WCSessionActivationState.activated { 
     NSLog("Activated") 
     if(WCSession.default().isReachable){ 

      do { 
       try session.updateApplicationContext(
        [WatchRequestKey : "updateData"] 
       ) 
      } 
      catch let error as NSError { 
       print("\(error.localizedDescription)") 
      } 
     } 
    } 

    if activationState == WCSessionActivationState.inactive { 
     NSLog("Inactive") 
    } 

    if activationState == WCSessionActivationState.notActivated { 
     NSLog("NotActivated") 
    } 
}