Запустить приложение-хост из приложения-наблюдателя

Я знаю, что расширение openParentApplication api в расширении набора часов может открыть хост-приложение в фоновом режиме, но не на переднем плане.

Я также попытался использовать openUrl() api NSExtensionContext, как показано ниже:

NSExtensionContext *ctx = [[NSExtensionContext alloc] init];

NSURL *url = [NSURL URLWithString:@"myScheme://today"];
[ctx openURL:url completionHandler:^(BOOL success) {
    NSLog(@"fun=%s after completion. success=%d", __func__, success);
}];
[ctx completeRequestReturningItems:ctx.inputItems completionHandler:nil];

Здесь также не запускается приложение-хост. Я что-то упускаю? или невозможно запустить приложение-хост из расширения набора часов?

Ответ 1

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

https://developer.apple.com/handoff/

Пример:

Где-то поделились обоими:

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

на часах:

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

на вашем iPhone в App Delegate:

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(s)

enter image description here

Ответ 2

Начиная с Beta 3 iOS 8.2 в настоящее время невозможно открыть приложение iOS на переднем плане. Как вы сказали, openParentApplication может открыть приложение в фоновом режиме. К сожалению, API для открытия приложения на iPhone отсутствует.

Несколько сообщений на форумах Apple Dev сообщили, что это невозможно

https://devforums.apple.com/message/1076125#1076125

Правильно, уведомление все равно может объявить фоновое действие, которое будет обрабатывать приложение iPhone, поэтому в этом смысле оно может запустить приложение для iPhone. Но приложение iPhone не может быть представлено на переднем плане приложением WatchKit.

И другое сообщение

https://devforums.apple.com/message/1082620#1082620

На устройстве это приложение [Watch] не будет - вывести приложение iOS на передний план.

Ответ 3

Я надеюсь, что Apple предоставит API для запуска родительского приложения из приложения часов в будущей бета-версии, но на данный момент мне удалось добиться этого, выполнив следующие...

Вызвать openParentApplication:reply: как обычно:

- (void)openPhoneApp {
    [WKInterfaceController openParentApplication:[NSDictionary new] reply:nil];
}

Внедрите application:handleWatchKitExtensionRequest:reply: в AppDelegate и запустите его с помощью специальной схемы URL:

- (void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void(^)(NSDictionary *replyInfo))reply {
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"myappscheme://open"]];
}