2015-01-11 2 views
7

Я пытаюсь открыть родительское приложение моего приложения Apple Watch.Как открыть родительское приложение на iPhone из моего приложения WatchKit?

В Xcode Beta 2 мы могли бы использовать этот код:

WKInterFaceController.openParentApplication 

Однако в Xcode бета 3 я мог бы не нашел этот код больше. Теперь я не знаю, как открыть родительское приложение из приложения watch. Пожалуйста помоги.

ответ

15

The Objective-C method является:

+ (BOOL)openParentApplication:(NSDictionary *)userInfo 
        reply:(void (^)(NSDictionary *replyInfo, 
            NSError *error))reply 

The Swift method является:

class func openParentApplication(_ userInfo: [NSObject : AnyObject]!, 
        reply reply: (([NSObject : AnyObject]!, 
            NSError!) -> Void)!) -> Bool 

Таким образом, вы должны передать приложение iPhone ответ() блок для того, чтобы иметь активировать его от расширения WatchKit. Вот один из способов это может быть реализовано, например: AppDelegate

NSString *requestString = [NSString stringWithFormat:@"executeMethodA"]; // This string is arbitrary, just must match here and at the iPhone side of the implementation. 
NSDictionary *applicationData = [[NSDictionary alloc] initWithObjects:@[requestString] forKeys:@[@"theRequestString"]]; 

[WKInterfaceController openParentApplication:applicationData reply:^(NSDictionary *replyInfo, NSError *error) { 
    NSLog(@"\nReply info: %@\nError: %@",replyInfo, error); 
    }]; 

вашего iPhone приложения необходимо реализовать следующий метод:

- (void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void(^)(NSDictionary *replyInfo))reply { 
NSString * request = [userInfo objectForKey:@"requestString"]; 

if ([request isEqualToString:@"executeMethodA"]) { 
    // Do whatever you want to do when sent the message. For instance... 
    [self executeMethodABC]; 
} 

// This is just an example of what you could return. The one requirement is 
// you do have to execute the reply block, even if it is just to 'reply(nil)'. 
// All of the objects in the dictionary [must be serializable to a property list file][3]. 
// If necessary, you can covert other objects to NSData blobs first. 
NSArray * objects = [[NSArray alloc] initWithObjects:myObjectA, myObjectB, myObjectC, nil]; 
NSArray * keys = [[NSArray alloc] initWithObjects:@"objectAName", @"objectBName", @"objectCName", nil]; 
NSDictionary * replyContent = [[NSDictionary alloc] initWithObjects:objects forKeys:keys]; 

reply(replyContent); 
} 

WKInterfaceController метод openParentApplication: ответ: запускает содержащее приложение в фоновом режиме когда iPhone (или iOS Simulator) разблокирован или заблокирован. Обратите внимание, что заявления Apple показывают, что расширение WatchKit всегда предназначалось для запуска вашего iPhone-приложения в фоновом режиме, и это была всего лишь деталь реализации симулятора, которая, по-видимому, запустила ваше приложение iPhone на переднем плане в предыдущих бета-версиях.

Если вы хотите протестировать приложение WatchKit и приложение для iPhone в одно и то же время, просто запустите приложение WatchKit из Xcode в меню «Схемы», а затем вручную запустите приложение iPhone в симуляторе, щелкнув значок своего трамплина ,

+0

я не видел эту функцию в Xcode 6 бета3. ты это проверил? –

+2

Hieu, говоря «вы проверили это» на человека, отвечающего на ваш вопрос, не проверив его самостоятельно, не является большой практикой переполнения стека. Поскольку ясно, что вы не проверяли это: https://developer.apple.com/library/prerelease/ios/documentation/WatchKit/Reference/WKInterfaceController_class/index.html # // apple_ref/occ/clm/WKInterfaceController/openParentApplication: reply: –

+1

@DuncanBabbage Этот ответ неверен. 'openParentApplication' не будет запускать приложение на телефоне на переднем плане, только в фоновом режиме. Вы не отвечаете на исходный вопрос. –

5

Если вам нужно открыть родительское приложение на переднем плане, используйте Handoff!

Пример:

Где-то общие для обоих:

static let sharedUserActivityType = "com.yourcompany.yourapp.youraction" 
static let sharedIdentifierKey = "identifier" 

на часы:

updateUserActivity(sharedUserActivityType, userInfo: [sharedIdentifierKey : 123456], webpageURL: nil) 

на вашем iPhone в App Делегат:

func application(application: UIApplication, willContinueUserActivityWithType userActivityType: String) -> Bool { 
    if (userActivityType == sharedUserActivityType) { 
     return true 
    } 
    return false 
} 

func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]!) -> Void) -> Bool { 
    if (userActivity.activityType == sharedUserActivityType) { 
     if let userInfo = userActivity.userInfo as? [String : AnyObject] { 
      if let identifier = userInfo[sharedIdentifierKey] as? Int { 
       //Do something 
       let alert = UIAlertView(title: "Handoff", message: "Handoff has been triggered for identifier \(identifier)" , delegate: nil, cancelButtonTitle: "Thanks for the info!") 
       alert.show() 
       return true 
      } 
     } 
    } 
    return false 
} 

И, наконец, (этот шаг важен !!!): В вашем Info.plist (ы)

enter image description here

+0

вы можете предоставить демонстрационный проект, чтобы открыть родительское приложение на переднем плане, используя Handoff! –

Смежные вопросы