Краткое руководство: обработка действий для контакта (HTML)
[ Эта статья адресована разработчикам приложений среды выполнения Windows для Windows 8.x и Windows Phone 8.x. При разработке приложений для Windows 10 см. раздел последняя документация]
Через пространства имен Windows.UI.WebUI и Windows.ApplicationModel.Activation вы можете предоставить данные приложению, когда оно активировано для нескольких действий для контакта (Windows.ApplicationModel.Contacts.ContactLaunchActionVerbs). Здесь мы расскажем, как обрабатывать активацию приложения, когда пользователь пытается позвонить контакту, отправить ему сообщение или получить карту с адресом контакта. Эти активирующие приложение действия могут осуществляться с карточки контакта, полученной от взаимодействия Windows Search или из приложения. Карточку контакта можно отобразить из приложения с помощью методов ContactManager.ShowContactCard и ContactManager.ShowDelayLoadedContactCard. Обработка активации приложения при выполнении действий для контакта поддерживается начиная с Windows 8.1.
Мы опираемся на пример обработки действий для контакта. Этот пример показывает, как активировать приложение при действиях для контакта с помощью API пространства имен Windows.UI.WebUI из приложений Магазина Windows.
Пример предлагает три сценария.
- Обработка активации для совершения звонка (ContactLaunchActionVerbs.call)
- Обработка активации для отправки сообщения (ContactLaunchActionVerbs.message)
- Обработка активации для отображения адреса на карте (ContactLaunchActionVerbs.map)
Необходимые условия
- Рекомендуется освоить программу Microsoft Visual Studio и связанные с ней шаблоны.
- Рекомендуется также иметь навыки разработки на языке JavaScript.
Включение регистраций манифеста для каждого действия, которое должно поддерживаться приложением
В файле AppxManifest.xml или Package.appxmanifest обновите элемент Package, чтобы он принимал схему манифеста Windows 8.1, и включите регистрации манифеста для каждого действия, которое должно поддерживаться приложением. Эти регистрации позволяют запускать приложение при возникновении действий для контакта или схем протокола.
<Package xmlns="https://schemas.microsoft.com/appx/2010/manifest" xmlns:m2="https://schemas.microsoft.com/appx/2013/manifest">
.
.
<Extensions>
<Extension Category="windows.protocol">
<Protocol Name="tel"/>
</Extension>
<m2:Extension Category="windows.contact">
<m2:Contact>
<m2:ContactLaunchActions>
<m2:LaunchAction Verb="call">
<m2:ServiceId>telephone</m2:ServiceId>
</m2:LaunchAction>
<m2:LaunchAction Verb="message">
<m2:ServiceId>skype.com</m2:ServiceId>
</m2:LaunchAction>
<m2:LaunchAction Verb="map"/>
</m2:ContactLaunchActions>
</m2:Contact>
</m2:Extension>
</Extensions>
Определение нужного сценария
Приложение запускается, когда происходит активация типа contact или protocol Windows.ApplicationModel.Activation.ActivationKind.
Нужный сценарий определяется выполняемым действием для контакта. Например, если пользователь нажимает кнопку Позвонить на номере телефона контакта, действием события является ContactLaunchActionVerbs.call, а нужным сценарием является S1-Call.
Так как мы рекомендуем, чтобы приложения, реализующие действие Windows.Contact.call, также реализовали поддержку tel: protocol, вам понадобится также действовать по сценарию S1-Call при обнаружении protocol Windows.ApplicationModel.Activation.ActivationKind.
function activated(eventObject) {
var url = null;
var arg = null;
if (eventObject.detail.kind === Windows.ApplicationModel.Activation.ActivationKind.contact) {
// If activated for a contact, launch the appropriate action handling scenario.
arg = eventObject.detail;
if (eventObject.detail.verb === Windows.ApplicationModel.Contacts.ContactLaunchActionVerbs.call) {
url = scenarios[0].url;
} else if (eventObject.detail.verb === Windows.ApplicationModel.Contacts.ContactLaunchActionVerbs.message) {
url = scenarios[1].url;
} else if (eventObject.detail.verb === Windows.ApplicationModel.Contacts.ContactLaunchActionVerbs.map) {
url = scenarios[2].url;
} else {
WinJS.log && WinJS.log("This app can't handle the contact action verb it was activated for.", "sample", "error");
return;
}
} else if (eventObject.detail.kind === Windows.ApplicationModel.Activation.ActivationKind.protocol) {
// If activated for a protocol, launch the call scenario
arg = eventObject.detail;
url = scenarios[0].url;
} else if (eventObject.detail.kind === Windows.ApplicationModel.Activation.ActivationKind.launch) {
// Otherise, navigate to either the first scenario or to the last running scenario
// before suspension or termination.
url = WinJS.Application.sessionState.lastUrl || scenarios[0].url;
}
if (url !== null) {
// Use setPromise to indicate to the system that the splash screen must not be torn down
// until after processAll and navigate complete asynchronously.
eventObject.setPromise(WinJS.UI.processAll().then(function () {
return WinJS.Navigation.navigate(url, arg);
}));
}
}
WinJS.Navigation.addEventListener("navigated", function (eventObject) {
var url = eventObject.detail.location;
var host = document.getElementById("contentHost");
// Call unload method on current scenario, if there is one
host.winControl && host.winControl.unload && host.winControl.unload();
WinJS.Utilities.empty(host);
eventObject.detail.setPromise(WinJS.UI.Pages.render(url, host, eventObject.detail.state).then(function () {
WinJS.Application.sessionState.lastUrl = url;
}));
});
Предоставление данных приложению при активации в результате звонка
Определите, получаем ли мы событие звонка контакту или событие звонка tel: protocol.
В случае события звонка контакту передаются данные ServiceId и ServiceUserId. Пример использует номер телефона выбранного контакта и печатает, например, "Получена команда активации в результате звонка. Номер телефона: (555) 555-0100".
В случае события звонка tel: protocol передаются данные URI schemeName и path. Пример использует номер телефона выбранного контакта и печатает, например, "Тел: получена команда активации. Номер телефона: (555) 555-0100".
(function () {
"use strict";
var page = WinJS.UI.Pages.define("/html/S1-Call.html", {
processed: function (element, callArgs) {
// callArgs is the parameter passed to navigation in the activated event handler.
if (callArgs) {
if (callArgs.serviceId) {
if (callArgs.serviceId === "telephone") {
WinJS.log && WinJS.log("Call activation was received. The phone number to call is " + callArgs.serviceUserId + ".", "sample", "status");
} else {
WinJS.log && WinJS.log("This app doesn't support calling by using the " + callArgs.serviceId + " service.", "sample", "error");
}
} else if (callArgs.uri) {
if (callArgs.uri.schemeName === "tel") {
WinJS.log && WinJS.log("Tel: activation was received. The phone number to call is " + callArgs.uri.path + ".", "sample", "status");
} else {
WinJS.log && WinJS.log("This app doesn't support the " + callArgs.uri.schemeName + " protocol.", "sample", "error");
}
}
}
},
ready: function (element, options) {
}
});
})();
Предоставление данных приложению при активации в результате отправки сообщения
В случае события отправки сообщения контакту передаются данные ServiceId и ServiceUserId. Пример использует ИД пользователя контакта для конкретной службы и печатает, например, "Получена команда активации в результате отправки сообщения. Используется служба contoso.com. ИД пользователя для сообщения: userid10".
(function () {
"use strict";
var page = WinJS.UI.Pages.define("/html/S2-Send-Message.html", {
processed: function (element, messageArgs) {
// messageArgs is the parameter passed to navigation in the activated event handler.
if (messageArgs) {
WinJS.log && WinJS.log("Send message activation was received. The service to use is " + messageArgs.serviceId + ". The user ID to message is " +
messageArgs.serviceUserId + ".", "sample", "status");
}
},
ready: function (element, options) {
}
});
})();
Предоставление данных приложению при активации в результате запроса карты
В случае события запроса карты контакта передаются данные ContactAddress. Пример использует почтовый адрес контакта и печатает, например, "Получена команда активации в результате запроса карты. На карте отображается адрес: One Microsoft Way".
(function () {
"use strict";
var page = WinJS.UI.Pages.define("/html/S3-Map-Address.html", {
processed: function (element, mapArgs) {
// mapArgs is the parameter passed to navigation in the activated event handler.
if (mapArgs) {
var address = mapArgs.address;
WinJS.log && WinJS.log("Map address activation was received. The street address to map is " +
(address.streetAddress ? address.streetAddress : "unspecified") + ".", "sample", "status");
}
},
ready: function (element, options) {
}
});
})();
Краткая сводка и дальнейшие действия
Теперь у вас есть общее представление о методах обработки активации приложения при действиях для контакта. Скачайте Пример обработки действий для контакта из коллекции примеров кода, чтобы увидеть полный образец кода для обработки активации приложения при действиях для контакта.