Merge remote-tracking branch 'xamarin/xcode11.4' into d16-5-xcode11.4-merge

This commit is contained in:
Alex Soto 2020-03-03 09:41:16 -05:00
Родитель 30e8706b4f 5cc1406ec4
Коммит 709a90599e
128 изменённых файлов: 6404 добавлений и 1036 удалений

Просмотреть файл

@ -59,9 +59,9 @@ IOS_PACKAGE_VERSION_BUILD=$(IOS_COMMIT_DISTANCE)
IOS_PACKAGE_UPDATE_ID=$(shell printf "2%02d%02d%02d%03d" $(IOS_PACKAGE_VERSION_MAJOR) $(IOS_PACKAGE_VERSION_MINOR) $(IOS_PACKAGE_VERSION_REV) $(IOS_PACKAGE_VERSION_BUILD))
# Xcode version should have both a major and a minor version (even if the minor version is 0)
XCODE_VERSION=11.3
XCODE_URL=http://xamarin-storage/bot-provisioning/xcodes/Xcode_11.3.xip
XCODE_DEVELOPER_ROOT=/Applications/Xcode113.app/Contents/Developer
XCODE_VERSION=11.4
XCODE_URL=http://xamarin-storage/bot-provisioning/xcodes/Xcode_11.4_beta_2.xip
XCODE_DEVELOPER_ROOT=/Applications/Xcode114-beta2.app/Contents/Developer
XCODE_PRODUCT_BUILD_VERSION:=$(shell /usr/libexec/PlistBuddy -c 'Print :ProductBuildVersion' $(XCODE_DEVELOPER_ROOT)/../version.plist)
# Mono version embedded in XI/XM (NEEDED_MONO_VERSION/BRANCH) are specified in mk/mono.mk
@ -89,28 +89,27 @@ MIN_CMAKE_VERSION=2.8.8
# ObjectiveSharpie min/max versions
MIN_SHARPIE_VERSION=3.4.43
MAX_SHARPIE_VERSION=3.4.99
MAX_SHARPIE_VERSION=3.5.99
MIN_SHARPIE_URL=https://download.visualstudio.microsoft.com/download/pr/2319addc-fc41-42b9-b6f8-245c1deb39c5/34f249d93ca3cf853a8b7f6408ab564e/objectivesharpie-3.4.43.pkg
# Minimum OSX versions for building XI/XM
MIN_OSX_BUILD_VERSION=10.14
MIN_OSX_BUILD_VERSION=10.15
# Minimum OSX version for executing XI/XM tooling.
MIN_OSX_VERSION_FOR_IOS=10.11
MIN_OSX_VERSION_FOR_MAC=10.11
# WARNING: Do **not** use versions higher than the available Xcode SDK or else we will have issues with mtouch (See https://github.com/xamarin/xamarin-macios/issues/7705)
IOS_SDK_VERSION=13.2
IOS_SDK_VERSION=13.4
# When bumping OSX_SDK_VERSION also update the macOS version where we execute on bots in jenkins/Jenkinsfile (in the 'node' element)
OSX_SDK_VERSION=10.15
WATCH_SDK_VERSION=6.1
TVOS_SDK_VERSION=13.2
WATCH_SDK_VERSION=6.2
TVOS_SDK_VERSION=13.4
MAX_IOS_DEPLOYMENT_TARGET=13.3
MAX_IOS_DEPLOYMENT_TARGET=$(IOS_SDK_VERSION)
MAX_WATCH_DEPLOYMENT_TARGET=$(WATCH_SDK_VERSION)
MAX_TVOS_DEPLOYMENT_TARGET=13.3
MAX_TVOS_DEPLOYMENT_TARGET=$(TVOS_SDK_VERSION)
MAX_IOS_SIMULATOR_VERSION=13.3
MAX_TVOS_SIMULATOR_VERSION=13.3
MAX_IOS_SIMULATOR_VERSION=$(IOS_SDK_VERSION)
MAX_TVOS_SIMULATOR_VERSION=$(TVOS_SDK_VERSION)
MAX_WATCH_SIMULATOR_VERSION=$(WATCH_SDK_VERSION)
# Minimum OS versions for running XI/XM apps.
@ -356,7 +355,8 @@ JENKINS_RESULTS_DIRECTORY ?= $(abspath $(TOP)/jenkins-results)
# Clone files instead of copying them on APFS file systems. Much faster.
CP:=$(shell df -t apfs / >/dev/null 2>&1 && echo "cp -c" || echo "cp")
XCODE_ARCHIVE_VERSION=xcode-$(XCODE_PRODUCT_BUILD_VERSION)
# WORKAROUND, should be xcode-$(XCODE_PRODUCT_BUILD_VERSION) but we are stuck due to xcode 11.4 beta 1 issue: https://github.com/xamarin/xamarin-macios/issues/7872
XCODE_ARCHIVE_VERSION=xcode-11C29
MONO_IOS_FILENAME:=ios-release-Darwin-$(MONO_HASH).7z
MONO_IOS_URL:=https://xamjenkinsartifact.azureedge.net/mono-sdks/$(XCODE_ARCHIVE_VERSION)/$(MONO_IOS_FILENAME)
MONO_MAC_FILENAME:=mac-release-Darwin-$(MONO_HASH).7z
@ -373,5 +373,9 @@ MONO_MAC_SDK_DESTDIR:=$(abspath $(MONO_PATH)/sdks/out)
MONO_BUILD_MODE=compile-mono
endif
# If we should inject an x86_64 slice into every binary that doesn't have one.
# This is sometimes necessary to work around an Apple bug wrt notarization where Apple flags all binaries that don't have a x86_64 slice, even if they're correctly signed.
INJECT_X86_64_SLICE=
.SUFFIXES:
MAKEFLAGS += --no-builtin-rules

Просмотреть файл

@ -43,5 +43,5 @@
# line changed in git).
#
IOS_PACKAGE_VERSION=13.14.1.$(IOS_COMMIT_DISTANCE)
MAC_PACKAGE_VERSION=6.14.1.$(MAC_COMMIT_DISTANCE)
IOS_PACKAGE_VERSION=13.14.2.$(IOS_COMMIT_DISTANCE)
MAC_PACKAGE_VERSION=6.14.2.$(MAC_COMMIT_DISTANCE)

Просмотреть файл

@ -37,6 +37,7 @@
<string>13.1</string>
<string>13.2</string>
<string>13.3</string>
<string>13.4</string>
</array>
<key>tvOS</key>
<array>
@ -59,6 +60,7 @@
<string>13.0</string>
<string>13.2</string>
<string>13.3</string>
<string>13.4</string>
</array>
<key>watchOS</key>
<array>
@ -79,6 +81,7 @@
<string>5.3</string>
<string>6.0</string>
<string>6.1</string>
<string>6.2</string>
</array>
</dict>
<key>RecommendedXcodeVersion</key>

Просмотреть файл

@ -54,28 +54,13 @@ downloads/%: downloads/%.7z
clean-local::
$(Q) rm -Rf downloads .stamp-download-mono
x86-64-slice.c: Makefile
echo "void xamarin_x86_64_function_for_notarization_workaround () {}" > $@
x86-64-slice.o: x86-64-slice.c
$(MAC_CC) -c -ggdb3 $< -o $@
X86_64_SLICE_BASE=$(abspath $(CURDIR)/x86-64-slice)
X86_64_SLICE_DYLIB=$(X86_64_SLICE_BASE).dylib
X86_64_SLICE_A=$(X86_64_SLICE_BASE).a
X86_64_SLICE_NOEXT=$(X86_64_SLICE_BASE)
X86_64_SLICE=$(X86_64_SLICE_BASE)$(suffix $@)
X86_64_SLICE_ALL=$(X86_64_SLICE_DYLIB) $(X86_64_SLICE_A) $(X86_64_SLICE_NOEXT)
$(X86_64_SLICE_DYLIB): x86-64-slice.o
$(MAC_CC) -shared -o$@ $<
$(X86_64_SLICE_A): x86-64-slice.o
$(AR) -rv $@ $<
$(X86_64_SLICE_NOEXT): $(X86_64_SLICE_DYLIB)
$(Q) $(CP) $< $@
ifdef INJECT_X86_64_SLICE
X86_64_SLICE=$(abspath $(CURDIR)/x86-64-slice.dylib)
$(X86_64_SLICE): Makefile
echo "void xamarin_x86_64_function_for_notarization_workaround () {}" | $(MAC_CC) -shared -x c -o$@ -
else
X86_64_SLICE=
endif
ifeq ($(MONO_BUILD_FROM_SOURCE),)
@ -874,10 +859,12 @@ $(IOS_DESTDIR)$(XAMARIN_IPHONEOS_SDK)/usr/lib/%: .stamp-$(MONO_BUILD_MODE) $(X86
$(IOS_DESTDIR)$(XAMARIN_IPHONEOS_SDK)/Frameworks/Mono.framework/Mono: .stamp-$(MONO_BUILD_MODE) $(X86_64_SLICE_ALL) | $(IOS_DESTDIR)$(XAMARIN_IPHONEOS_SDK)/Frameworks
$(Q) $(CP) -R $(MONO_IOS_SDK_DESTDIR)/ios-frameworks/ios/Mono.framework $(IOS_DESTDIR)$(XAMARIN_IPHONEOS_SDK)/Frameworks
$(Q) $(CP) -R $(MONO_IOS_SDK_DESTDIR)/ios-frameworks/ios/Mono.framework.dSYM $(IOS_DESTDIR)$(XAMARIN_IPHONEOS_SDK)/Frameworks
ifdef INJECT_X86_64_SLICE
@# inject x86-64 slice
$(Q) mv $@ $@.tmp
$(Q_LIPO) lipo $@.tmp $(X86_64_SLICE) -create -output $@
$(Q) rm $@.tmp
endif
$(IPHONEOS_DIRECTORIES):
$(Q) mkdir -p $@
@ -916,10 +903,12 @@ $(IOS_DESTDIR)$(XAMARIN_WATCHOS_SDK)/usr/lib/%: .stamp-$(MONO_BUILD_MODE) $(X86_
$(IOS_DESTDIR)$(XAMARIN_WATCHOS_SDK)/Frameworks/Mono.framework/Mono: .stamp-$(MONO_BUILD_MODE) $(X86_64_SLICE_ALL) | $(IOS_DESTDIR)$(XAMARIN_WATCHOS_SDK)/Frameworks
$(Q) $(CP) -R $(MONO_IOS_SDK_DESTDIR)/ios-frameworks/watchos/Mono.framework $(IOS_DESTDIR)$(XAMARIN_WATCHOS_SDK)/Frameworks
$(Q) $(CP) -R $(MONO_IOS_SDK_DESTDIR)/ios-frameworks/watchos/Mono.framework.dSYM $(IOS_DESTDIR)$(XAMARIN_WATCHOS_SDK)/Frameworks
ifdef INJECT_X86_64_SLICE
@# inject x86-64 slice
$(Q) mv $@ $@.tmp
$(Q_LIPO) lipo $@.tmp $(X86_64_SLICE) -create -output $@
$(Q) rm $@.tmp
endif
$(WATCHOS_DIRECTORIES):
$(Q) mkdir -p $@
@ -958,10 +947,12 @@ $(IOS_DESTDIR)$(XAMARIN_TVOS_SDK)/usr/lib/%: .stamp-$(MONO_BUILD_MODE) $(X86_64_
$(IOS_DESTDIR)$(XAMARIN_TVOS_SDK)/Frameworks/Mono.framework/Mono: .stamp-$(MONO_BUILD_MODE) $(X86_64_SLICE_ALL) | $(IOS_DESTDIR)$(XAMARIN_TVOS_SDK)/Frameworks
$(Q) $(CP) -R $(MONO_IOS_SDK_DESTDIR)/ios-frameworks/tvos/Mono.framework $(IOS_DESTDIR)$(XAMARIN_TVOS_SDK)/Frameworks
$(Q) $(CP) -R $(MONO_IOS_SDK_DESTDIR)/ios-frameworks/tvos/Mono.framework.dSYM $(IOS_DESTDIR)$(XAMARIN_TVOS_SDK)/Frameworks
ifdef INJECT_X86_64_SLICE
@# inject x86-64 slice
$(Q) mv $@ $@.tmp
$(Q_LIPO) lipo $@.tmp $(X86_64_SLICE) -create -output $@
$(Q) rm $@.tmp
endif
$(TVOS_DIRECTORIES):
$(Q) mkdir -p $@

2
external/macios-binaries поставляемый

@ -1 +1 @@
Subproject commit eb6980e8b6ee7bcd6edfd514e606b664bd93f33d
Subproject commit bbaabd14307336945971f7c092f3ceeeb812665c

2
jenkins/Jenkinsfile поставляемый
Просмотреть файл

@ -397,7 +397,7 @@ def abortExecutingBuilds ()
}
timestamps {
def mainMacOSVersion = 14
def mainMacOSVersion = 15
node ("xamarin-macios && macos-10.${mainMacOSVersion}") {
try {
timeout (time: 15, unit: 'HOURS') {

Просмотреть файл

@ -46,7 +46,6 @@ echo 'cat (//xar/toc/signature/x:KeyInfo/x:X509Data/x:X509Certificate)[1]/text()
echo Signature Verification
for pkg in package/*.pkg; do
/usr/sbin/spctl -vvv --assess --type install "$pkg"
pkgutil --check-signature "$pkg"
xar -f "$pkg" --dump-toc="$pkg.toc"
(

Просмотреть файл

@ -46,7 +46,7 @@ fi
P=$(cat tmp.p)
VSTS_BUILD_URL="${SYSTEM_TEAMFOUNDATIONCOLLECTIONURI}${SYSTEM_TEAMPROJECT}/_build/index?buildId=${BUILD_BUILDID}"
VSTS_BUILD_URL="${SYSTEM_TEAMFOUNDATIONCOLLECTIONURI}${SYSTEM_TEAMPROJECT}/_build/index?buildId=${BUILD_BUILDID}&view=ms.vss-test-web.test-result-details"
# Add a GitHub status to the commit we're testing
GH_STATE=failure

Просмотреть файл

@ -7,7 +7,7 @@ MONO_BRANCH := $(shell cd $(MONO_PATH) 2> /dev/null && git symbolic-ref --sho
endif
ifdef ENABLE_XAMARIN
NEEDED_MACCORE_VERSION := 89f83d012347661c0eb92b0196ee001b35d6f70f
NEEDED_MACCORE_VERSION := b1f738dd701b5f4b8932eeaadae7f3f619068f77
NEEDED_MACCORE_BRANCH := d16-5
MACCORE_DIRECTORY := maccore

Просмотреть файл

@ -343,6 +343,7 @@ Copyright (C) 2014 Xamarin. All rights reserved.
TargetFrameworkIdentifier="$(TargetFrameworkIdentifier)"
ResourcePrefix="$(XamMacResourcePrefix)"
SdkDevPath="$(_SdkDevPath)"
SdkIsSimulator="false"
SdkRoot="$(_SdkRoot)"
SdkVersion="$(MacOSXSdkVersion)"
SourceFile="@(Metal)">

Просмотреть файл

@ -33,6 +33,9 @@ namespace Xamarin.MacDev.Tasks
[Required]
public string SdkVersion { get; set; }
[Required]
public bool SdkIsSimulator { get; set; }
[Required]
public string SdkRoot { get; set; }
@ -55,13 +58,13 @@ namespace Xamarin.MacDev.Tasks
get {
switch (PlatformFrameworkHelper.GetFramework (TargetFrameworkIdentifier)) {
case PlatformFramework.WatchOS:
return "watchos";
return SdkIsSimulator ? "watchos-simulator" : "watchos";
case PlatformFramework.TVOS:
return "tvos";
return SdkIsSimulator ? "tvos-simulator" : "tvos";
case PlatformFramework.MacOS:
return "macosx";
case PlatformFramework.iOS:
return "ios";
return SdkIsSimulator ? "iphonesimulator" : "ios";
default:
Log.LogError ($"Unknown target framework identifier: {TargetFrameworkIdentifier}.");
return string.Empty;

Просмотреть файл

@ -597,8 +597,6 @@ Copyright (C) 2013-2016 Xamarin. All rights reserved.
</Target>
<Target Name="_SmeltMetal" Condition="'$(_CanOutputAppBundle)' == 'true' And '@(Metal)' != ''" DependsOnTargets="_DetectSdkLocations">
<Error Condition="'$(ComputedPlatform)' == 'iPhoneSimulator'" Text="The iOS Simulator does not support metal. Build for a device instead."/>
<Metal
SessionId="$(BuildSessionId)"
Condition="'$(IsMacEnabled)' == 'true' and '%(Metal.Identity)' != ''"
@ -608,6 +606,7 @@ Copyright (C) 2013-2016 Xamarin. All rights reserved.
TargetFrameworkIdentifier="$(TargetFrameworkIdentifier)"
ResourcePrefix="$(IPhoneResourcePrefix)"
SdkDevPath="$(_SdkDevPath)"
SdkIsSimulator="$(_SdkIsSimulator)"
SdkRoot="$(_SdkRoot)"
SdkVersion="$(MtouchSdkVersion)"
SourceFile="@(Metal)">

Просмотреть файл

@ -208,6 +208,8 @@ namespace MyMetalGame
// If we need a depth texture and don't have one, or if the depth texture we have is the wrong size
// Then allocate one of the proper size
MTLTextureDescriptor desc = MTLTextureDescriptor.CreateTexture2DDescriptor (MTLPixelFormat.Depth32Float, texture.Width, texture.Height, false);
if (ObjCRuntime.Runtime.Arch == ObjCRuntime.Arch.SIMULATOR)
desc.StorageMode = MTLStorageMode.Private;
depthTex = device.CreateTexture (desc);
depthTex.Label = "Depth";

Просмотреть файл

@ -0,0 +1,23 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MyMetalGame", "MyMetalGame.csproj", "{4598E620-3F15-4F66-B01A-B7F9E45CE659}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|iPhoneSimulator = Debug|iPhoneSimulator
Release|iPhoneSimulator = Release|iPhoneSimulator
Debug|iPhone = Debug|iPhone
Release|iPhone = Release|iPhone
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{4598E620-3F15-4F66-B01A-B7F9E45CE659}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator
{4598E620-3F15-4F66-B01A-B7F9E45CE659}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator
{4598E620-3F15-4F66-B01A-B7F9E45CE659}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
{4598E620-3F15-4F66-B01A-B7F9E45CE659}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
{4598E620-3F15-4F66-B01A-B7F9E45CE659}.Debug|iPhone.ActiveCfg = Debug|iPhone
{4598E620-3F15-4F66-B01A-B7F9E45CE659}.Debug|iPhone.Build.0 = Debug|iPhone
{4598E620-3F15-4F66-B01A-B7F9E45CE659}.Release|iPhone.ActiveCfg = Release|iPhone
{4598E620-3F15-4F66-B01A-B7F9E45CE659}.Release|iPhone.Build.0 = Release|iPhone
EndGlobalSection
EndGlobal

Просмотреть файл

@ -0,0 +1,56 @@
using Foundation;
using UIKit;
namespace MyTVMetalGame {
// The UIApplicationDelegate for the application. This class is responsible for launching the
// User Interface of the application, as well as listening (and optionally responding) to application events from iOS.
[Register ("AppDelegate")]
public class AppDelegate : UIApplicationDelegate {
// class-level declarations
public override UIWindow Window {
get;
set;
}
public override bool FinishedLaunching (UIApplication application, NSDictionary launchOptions)
{
// Override point for customization after application launch.
// If not required for your application you can safely delete this method
return true;
}
public override void OnResignActivation (UIApplication application)
{
// Invoked when the application is about to move from active to inactive state.
// This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message)
// or when the user quits the application and it begins the transition to the background state.
// Games should use this method to pause the game.
}
public override void DidEnterBackground (UIApplication application)
{
// Use this method to release shared resources, save user data, invalidate timers and store the application state.
// If your application supports background exection this method is called instead of WillTerminate when the user quits.
}
public override void WillEnterForeground (UIApplication application)
{
// Called as part of the transiton from background to active state.
// Here you can undo many of the changes made on entering the background.
}
public override void OnActivated (UIApplication application)
{
// Restart any tasks that were paused (or not yet started) while the application was inactive.
// If the application was previously in the background, optionally refresh the user interface.
}
public override void WillTerminate (UIApplication application)
{
// Called when the application is about to terminate. Save data, if needed. See also DidEnterBackground.
}
}
}

Просмотреть файл

@ -0,0 +1,54 @@
{
"images": [
{
"idiom": "universal"
},
{
"scale": "1x",
"idiom": "universal"
},
{
"scale": "2x",
"idiom": "universal"
},
{
"scale": "3x",
"idiom": "universal"
},
{
"idiom": "iphone"
},
{
"scale": "1x",
"idiom": "iphone"
},
{
"scale": "2x",
"idiom": "iphone"
},
{
"subtype": "retina4",
"scale": "2x",
"idiom": "iphone"
},
{
"scale": "3x",
"idiom": "iphone"
},
{
"idiom": "ipad"
},
{
"scale": "1x",
"idiom": "ipad"
},
{
"scale": "2x",
"idiom": "ipad"
}
],
"info": {
"version": 1,
"author": "xcode"
}
}

Просмотреть файл

@ -0,0 +1,6 @@
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}

Просмотреть файл

@ -0,0 +1,17 @@
{
"layers" : [
{
"filename" : "Front.imagestacklayer"
},
{
"filename" : "Middle.imagestacklayer"
},
{
"filename" : "Back.imagestacklayer"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

Просмотреть файл

@ -0,0 +1,54 @@
{
"images": [
{
"idiom": "universal"
},
{
"scale": "1x",
"idiom": "universal"
},
{
"scale": "2x",
"idiom": "universal"
},
{
"scale": "3x",
"idiom": "universal"
},
{
"idiom": "iphone"
},
{
"scale": "1x",
"idiom": "iphone"
},
{
"scale": "2x",
"idiom": "iphone"
},
{
"subtype": "retina4",
"scale": "2x",
"idiom": "iphone"
},
{
"scale": "3x",
"idiom": "iphone"
},
{
"idiom": "ipad"
},
{
"scale": "1x",
"idiom": "ipad"
},
{
"scale": "2x",
"idiom": "ipad"
}
],
"info": {
"version": 1,
"author": "xcode"
}
}

Просмотреть файл

@ -0,0 +1,6 @@
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}

Просмотреть файл

@ -0,0 +1,54 @@
{
"images": [
{
"idiom": "universal"
},
{
"scale": "1x",
"idiom": "universal"
},
{
"scale": "2x",
"idiom": "universal"
},
{
"scale": "3x",
"idiom": "universal"
},
{
"idiom": "iphone"
},
{
"scale": "1x",
"idiom": "iphone"
},
{
"scale": "2x",
"idiom": "iphone"
},
{
"subtype": "retina4",
"scale": "2x",
"idiom": "iphone"
},
{
"scale": "3x",
"idiom": "iphone"
},
{
"idiom": "ipad"
},
{
"scale": "1x",
"idiom": "ipad"
},
{
"scale": "2x",
"idiom": "ipad"
}
],
"info": {
"version": 1,
"author": "xcode"
}
}

Просмотреть файл

@ -0,0 +1,6 @@
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}

Просмотреть файл

@ -0,0 +1,54 @@
{
"images": [
{
"idiom": "universal"
},
{
"scale": "1x",
"idiom": "universal"
},
{
"scale": "2x",
"idiom": "universal"
},
{
"scale": "3x",
"idiom": "universal"
},
{
"idiom": "iphone"
},
{
"scale": "1x",
"idiom": "iphone"
},
{
"scale": "2x",
"idiom": "iphone"
},
{
"subtype": "retina4",
"scale": "2x",
"idiom": "iphone"
},
{
"scale": "3x",
"idiom": "iphone"
},
{
"idiom": "ipad"
},
{
"scale": "1x",
"idiom": "ipad"
},
{
"scale": "2x",
"idiom": "ipad"
}
],
"info": {
"version": 1,
"author": "xcode"
}
}

Просмотреть файл

@ -0,0 +1,6 @@
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}

Просмотреть файл

@ -0,0 +1,17 @@
{
"layers" : [
{
"filename" : "Front.imagestacklayer"
},
{
"filename" : "Middle.imagestacklayer"
},
{
"filename" : "Back.imagestacklayer"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

Просмотреть файл

@ -0,0 +1,54 @@
{
"images": [
{
"idiom": "universal"
},
{
"scale": "1x",
"idiom": "universal"
},
{
"scale": "2x",
"idiom": "universal"
},
{
"scale": "3x",
"idiom": "universal"
},
{
"idiom": "iphone"
},
{
"scale": "1x",
"idiom": "iphone"
},
{
"scale": "2x",
"idiom": "iphone"
},
{
"subtype": "retina4",
"scale": "2x",
"idiom": "iphone"
},
{
"scale": "3x",
"idiom": "iphone"
},
{
"idiom": "ipad"
},
{
"scale": "1x",
"idiom": "ipad"
},
{
"scale": "2x",
"idiom": "ipad"
}
],
"info": {
"version": 1,
"author": "xcode"
}
}

Просмотреть файл

@ -0,0 +1,6 @@
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}

Просмотреть файл

@ -0,0 +1,54 @@
{
"images": [
{
"idiom": "universal"
},
{
"scale": "1x",
"idiom": "universal"
},
{
"scale": "2x",
"idiom": "universal"
},
{
"scale": "3x",
"idiom": "universal"
},
{
"idiom": "iphone"
},
{
"scale": "1x",
"idiom": "iphone"
},
{
"scale": "2x",
"idiom": "iphone"
},
{
"subtype": "retina4",
"scale": "2x",
"idiom": "iphone"
},
{
"scale": "3x",
"idiom": "iphone"
},
{
"idiom": "ipad"
},
{
"scale": "1x",
"idiom": "ipad"
},
{
"scale": "2x",
"idiom": "ipad"
}
],
"info": {
"version": 1,
"author": "xcode"
}
}

Просмотреть файл

@ -0,0 +1,6 @@
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}

Просмотреть файл

@ -0,0 +1,32 @@
{
"assets" : [
{
"size" : "1280x768",
"idiom" : "tv",
"filename" : "App Icon - Large.imagestack",
"role" : "primary-app-icon"
},
{
"size" : "400x240",
"idiom" : "tv",
"filename" : "App Icon - Small.imagestack",
"role" : "primary-app-icon"
},
{
"size" : "2320x720",
"idiom" : "tv",
"filename" : "Top Shelf Image Wide.imageset",
"role" : "top-shelf-image-wide"
},
{
"size" : "1920x720",
"idiom" : "tv",
"filename" : "Top Shelf Image.imageset",
"role" : "top-shelf-image"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

Просмотреть файл

@ -0,0 +1,54 @@
{
"images": [
{
"idiom": "universal"
},
{
"scale": "1x",
"idiom": "universal"
},
{
"scale": "2x",
"idiom": "universal"
},
{
"scale": "3x",
"idiom": "universal"
},
{
"idiom": "iphone"
},
{
"scale": "1x",
"idiom": "iphone"
},
{
"scale": "2x",
"idiom": "iphone"
},
{
"subtype": "retina4",
"scale": "2x",
"idiom": "iphone"
},
{
"scale": "3x",
"idiom": "iphone"
},
{
"idiom": "ipad"
},
{
"scale": "1x",
"idiom": "ipad"
},
{
"scale": "2x",
"idiom": "ipad"
}
],
"info": {
"version": 1,
"author": "xcode"
}
}

Просмотреть файл

@ -0,0 +1,54 @@
{
"images": [
{
"idiom": "universal"
},
{
"scale": "1x",
"idiom": "universal"
},
{
"scale": "2x",
"idiom": "universal"
},
{
"scale": "3x",
"idiom": "universal"
},
{
"idiom": "iphone"
},
{
"scale": "1x",
"idiom": "iphone"
},
{
"scale": "2x",
"idiom": "iphone"
},
{
"subtype": "retina4",
"scale": "2x",
"idiom": "iphone"
},
{
"scale": "3x",
"idiom": "iphone"
},
{
"idiom": "ipad"
},
{
"scale": "1x",
"idiom": "ipad"
},
{
"scale": "2x",
"idiom": "ipad"
}
],
"info": {
"version": 1,
"author": "xcode"
}
}

Просмотреть файл

@ -0,0 +1,6 @@
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}

Просмотреть файл

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
</dict>
</plist>

Просмотреть файл

@ -0,0 +1,366 @@
using System;
using System.Runtime.InteropServices;
using System.Threading;
using CoreAnimation;
using CoreGraphics;
using Foundation;
using OpenTK;
using Metal;
using UIKit;
namespace MyTVMetalGame {
public partial class GameViewController : UIViewController {
struct Uniforms {
public Matrix4 ModelviewProjectionMatrix;
public Matrix4 NormalMatrix;
}
// The max number of command buffers in flight
const int max_inflight_buffers = 3;
// Max API memory buffer size
const int max_bytes_per_frame = 1024 * 1024;
float [] cubeVertexData = {
// Data layout for each line below is:
// positionX, positionY, positionZ, normalX, normalY, normalZ,
0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f,
-0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f,
-0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f,
0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f,
0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f,
-0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f,
0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f,
0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 0.0f,
0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f,
0.5f, 0.5f, -0.5f, 1.0f, 0.0f, 0.0f,
0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f,
0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f,
-0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f,
0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f,
0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f,
-0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f,
-0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f,
0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f,
-0.5f, -0.5f, 0.5f, -1.0f, 0.0f, 0.0f,
-0.5f, 0.5f, 0.5f, -1.0f, 0.0f, 0.0f,
-0.5f, 0.5f, -0.5f, -1.0f, 0.0f, 0.0f,
-0.5f, -0.5f, -0.5f, -1.0f, 0.0f, 0.0f,
-0.5f, -0.5f, 0.5f, -1.0f, 0.0f, 0.0f,
-0.5f, 0.5f, -0.5f, -1.0f, 0.0f, 0.0f,
0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f,
-0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f,
-0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f,
-0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f,
0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f,
0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f,
0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f,
-0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f,
-0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f,
0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f,
0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f,
-0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f
};
// Layer
CAMetalLayer metalLayer;
MTLRenderPassDescriptor renderPassDescriptor;
// Controller
CADisplayLink timer;
Semaphore inflightSemaphore;
IMTLBuffer dynamicConstantBuffer;
byte constantDataBufferIndex;
// Renderer
IMTLDevice device;
IMTLCommandQueue commandQueue;
IMTLLibrary defaultLibrary;
IMTLRenderPipelineState pipelineState;
IMTLBuffer vertexBuffer;
IMTLDepthStencilState depthState;
IMTLTexture depthTex;
// Uniforms
Matrix4 projectionMatrix;
Matrix4 viewMatrix;
Uniforms uniformBuffer;
float rotation;
public GameViewController (IntPtr handle) : base (handle)
{
}
public override void ViewDidLoad ()
{
base.ViewDidLoad ();
constantDataBufferIndex = 0;
inflightSemaphore = new Semaphore (max_inflight_buffers, max_inflight_buffers);
SetupMetal ();
LoadAssets ();
timer = CADisplayLink.Create (Gameloop);
timer.FrameInterval = 1;
timer.AddToRunLoop (NSRunLoop.Main, NSRunLoop.NSDefaultRunLoopMode);
}
public override void DidReceiveMemoryWarning ()
{
base.DidReceiveMemoryWarning ();
// Dispose of any resources that can be recreated.
}
void SetupMetal ()
{
// Find a usable device
device = MTLDevice.SystemDefault;
// Create a new command queue
commandQueue = device.CreateCommandQueue ();
// Load all the shader files with a metal file extension in the project
NSError error;
defaultLibrary = device.CreateLibrary ("default.metallib", out error);
// Setup metal layer and add as sub layer to view
metalLayer = new CAMetalLayer ();
metalLayer.Device = device;
metalLayer.PixelFormat = MTLPixelFormat.BGRA8Unorm;
// Change this to NO if the compute encoder is used as the last pass on the drawable texture
metalLayer.FramebufferOnly = true;
// Add metal layer to the views layer hierarchy
metalLayer.Frame = View.Layer.Frame;
View.Layer.AddSublayer (metalLayer);
View.Opaque = true;
View.BackgroundColor = null;
View.ContentScaleFactor = UIScreen.MainScreen.Scale;
}
void LoadAssets ()
{
// Allocate one region of memory for the uniform buffer
dynamicConstantBuffer = device.CreateBuffer (max_bytes_per_frame, 0);
dynamicConstantBuffer.Label = "UniformBuffer";
// Load the fragment program into the library
IMTLFunction fragmentProgram = defaultLibrary.CreateFunction ("lighting_fragment");
// Load the vertex program into the library
IMTLFunction vertexProgram = defaultLibrary.CreateFunction ("lighting_vertex");
// Setup the vertex buffers
vertexBuffer = device.CreateBuffer<float> (cubeVertexData, (MTLResourceOptions)0);
vertexBuffer.Label = "Vertices";
// Create a reusable pipeline state
var pipelineStateDescriptor = new MTLRenderPipelineDescriptor {
Label = "MyPipeline",
SampleCount = 1,
VertexFunction = vertexProgram,
FragmentFunction = fragmentProgram,
DepthAttachmentPixelFormat = MTLPixelFormat.Depth32Float
};
pipelineStateDescriptor.ColorAttachments [0].PixelFormat = MTLPixelFormat.BGRA8Unorm;
NSError error;
pipelineState = device.CreateRenderPipelineState (pipelineStateDescriptor, out error);
if (pipelineState == null)
Console.WriteLine ("Failed to created pipeline state, error " + error);
var depthStateDesc = new MTLDepthStencilDescriptor {
DepthCompareFunction = MTLCompareFunction.Less,
DepthWriteEnabled = true
};
depthState = device.CreateDepthStencilState (depthStateDesc);
}
void SetupRenderPassDescriptorForTexture (IMTLTexture texture)
{
if (renderPassDescriptor == null)
renderPassDescriptor = MTLRenderPassDescriptor.CreateRenderPassDescriptor ();
renderPassDescriptor.ColorAttachments [0].Texture = texture;
renderPassDescriptor.ColorAttachments [0].LoadAction = MTLLoadAction.Clear;
renderPassDescriptor.ColorAttachments [0].ClearColor = new MTLClearColor (0.65f, 0.65f, 0.65f, 1.0f);
renderPassDescriptor.ColorAttachments [0].StoreAction = MTLStoreAction.Store;
if (depthTex == null || (depthTex.Width != texture.Width || depthTex.Height != texture.Height)) {
// If we need a depth texture and don't have one, or if the depth texture we have is the wrong size
// Then allocate one of the proper size
MTLTextureDescriptor desc = MTLTextureDescriptor.CreateTexture2DDescriptor (MTLPixelFormat.Depth32Float, texture.Width, texture.Height, false);
if (ObjCRuntime.Runtime.Arch == ObjCRuntime.Arch.SIMULATOR)
desc.StorageMode = MTLStorageMode.Private; depthTex = device.CreateTexture (desc);
depthTex.Label = "Depth";
renderPassDescriptor.DepthAttachment.Texture = depthTex;
renderPassDescriptor.DepthAttachment.LoadAction = MTLLoadAction.Clear;
renderPassDescriptor.DepthAttachment.ClearDepth = 1.0f;
renderPassDescriptor.DepthAttachment.StoreAction = MTLStoreAction.DontCare;
}
}
void Render ()
{
inflightSemaphore.WaitOne ();
Update ();
// Create a new command buffer for each renderpass to the current drawable
IMTLCommandBuffer commandBuffer = commandQueue.CommandBuffer ();
commandBuffer.Label = "MyCommand";
// Obtain a drawable texture for this render pass and set up the renderpass descriptor for the command encoder to render into
ICAMetalDrawable drawable = GetCurrentDrawable ();
SetupRenderPassDescriptorForTexture (drawable.Texture);
// Create a render command encoder so we can render into something
IMTLRenderCommandEncoder renderEncoder = commandBuffer.CreateRenderCommandEncoder (renderPassDescriptor);
renderEncoder.Label = "MyRenderEncoder";
renderEncoder.SetDepthStencilState (depthState);
// Set context state
renderEncoder.PushDebugGroup ("DrawCube");
renderEncoder.SetRenderPipelineState (pipelineState);
renderEncoder.SetVertexBuffer (vertexBuffer, 0, 0);
renderEncoder.SetVertexBuffer (dynamicConstantBuffer, (nuint)(Marshal.SizeOf (typeof (Uniforms)) * constantDataBufferIndex), 1);
// Tell the render context we want to draw our primitives
renderEncoder.DrawPrimitives (MTLPrimitiveType.Triangle, 0, 36, 1);
renderEncoder.PopDebugGroup ();
// We're done encoding commands
renderEncoder.EndEncoding ();
// Call the view's completion handler which is required by the view since it will signal its semaphore and set up the next buffer
commandBuffer.AddCompletedHandler (buffer => {
drawable.Dispose ();
inflightSemaphore.Release ();
});
// Schedule a present once the framebuffer is complete
commandBuffer.PresentDrawable (drawable);
// Finalize rendering here & push the command buffer to the GPU
commandBuffer.Commit ();
// The renderview assumes it can now increment the buffer index and that the previous index won't be touched until we cycle back around to the same index
constantDataBufferIndex = (byte)((constantDataBufferIndex + 1) % max_inflight_buffers);
}
void Reshape ()
{
// When reshape is called, update the view and projection matricies since this means the view orientation or size changed
var aspect = (float)(View.Bounds.Size.Width / View.Bounds.Size.Height);
projectionMatrix = CreateMatrixFromPerspective (65.0f * ((float)Math.PI / 180.0f), aspect, 0.1f, 100.0f);
viewMatrix = Matrix4.Identity;
}
void Update ()
{
var baseModel = Matrix4.Mult (CreateMatrixFromTranslation (0.0f, 0.0f, 5.0f), CreateMatrixFromRotation (rotation, 0.0f, 1.0f, 0.0f));
var baseMv = Matrix4.Mult (viewMatrix, baseModel);
var modelViewMatrix = Matrix4.Mult (baseMv, CreateMatrixFromRotation (rotation, 1.0f, 1.0f, 1.0f));
uniformBuffer.NormalMatrix = Matrix4.Invert (Matrix4.Transpose (modelViewMatrix));
uniformBuffer.ModelviewProjectionMatrix = Matrix4.Transpose (Matrix4.Mult (projectionMatrix, modelViewMatrix));
// Copy uniformBuffer's content into dynamicConstantBuffer.Contents
int rawsize = Marshal.SizeOf (typeof (Uniforms));
var rawdata = new byte [rawsize];
IntPtr ptr = Marshal.AllocHGlobal (rawsize);
Marshal.StructureToPtr (uniformBuffer, ptr, false);
Marshal.Copy (ptr, rawdata, 0, rawsize);
Marshal.FreeHGlobal (ptr);
Marshal.Copy (rawdata, 0, dynamicConstantBuffer.Contents + rawsize * constantDataBufferIndex, rawsize);
rotation += 0.01f;
}
// The main game loop called by the CADisplayLine timer
public void Gameloop ()
{
Render ();
}
// Called whenever view changes orientation or layout is changed
public override void ViewDidLayoutSubviews ()
{
Reshape ();
}
ICAMetalDrawable GetCurrentDrawable ()
{
ICAMetalDrawable currentDrawable = null;
while (currentDrawable == null) {
currentDrawable = metalLayer.NextDrawable ();
if (currentDrawable == null)
Console.WriteLine ("CurrentDrawable is null");
}
return currentDrawable;
}
static Matrix4 CreateMatrixFromPerspective (float fovY, float aspect, float nearZ, float farZ)
{
float yscale = 1.0f / (float)Math.Tan (fovY * 0.5f);
float xscale = yscale / aspect;
float q = farZ / (farZ - nearZ);
var m = new Matrix4 {
Row0 = new Vector4 (xscale, 0.0f, 0.0f, 0.0f),
Row1 = new Vector4 (0.0f, yscale, 0.0f, 0.0f),
Row2 = new Vector4 (0.0f, 0.0f, q, q * -nearZ),
Row3 = new Vector4 (0.0f, 0.0f, 1.0f, 0.0f)
};
return m;
}
static Matrix4 CreateMatrixFromTranslation (float x, float y, float z)
{
var m = Matrix4.Identity;
m.Row0.W = x;
m.Row1.W = y;
m.Row2.W = z;
m.Row3.W = 1.0f;
return m;
}
static Matrix4 CreateMatrixFromRotation (float radians, float x, float y, float z)
{
Vector3 v = Vector3.Normalize (new Vector3 (x, y, z));
var cos = (float)Math.Cos (radians);
var sin = (float)Math.Sin (radians);
float cosp = 1.0f - cos;
var m = new Matrix4 {
Row0 = new Vector4 (cos + cosp * v.X * v.X, cosp * v.X * v.Y - v.Z * sin, cosp * v.X * v.Z + v.Y * sin, 0.0f),
Row1 = new Vector4 (cosp * v.X * v.Y + v.Z * sin, cos + cosp * v.Y * v.Y, cosp * v.Y * v.Z - v.X * sin, 0.0f),
Row2 = new Vector4 (cosp * v.X * v.Z - v.Y * sin, cosp * v.Y * v.Z + v.X * sin, cos + cosp * v.Z * v.Z, 0.0f),
Row3 = new Vector4 (0.0f, 0.0f, 0.0f, 1.0f)
};
return m;
}
}
}

11
msbuild/tests/MyTVMetalGame/GameViewController.designer.cs сгенерированный Normal file
Просмотреть файл

@ -0,0 +1,11 @@
using Foundation;
using System.CodeDom.Compiler;
namespace MyTVMetalGame {
[Register ("GameViewController")]
partial class GameViewController {
void ReleaseDesignerOutlets ()
{
}
}
}

Просмотреть файл

@ -0,0 +1,45 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDisplayName</key>
<string>MyTVMetalGame</string>
<key>CFBundleName</key>
<string>MyTVMetalGame</string>
<key>CFBundleIdentifier</key>
<string>com.xamarin.MyTVMetalGame</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1.0</string>
<key>MinimumOSVersion</key>
<string>13.0</string>
<key>UIDeviceFamily</key>
<array>
<integer>3</integer>
</array>
<key>UIMainStoryboardFile</key>
<string>Main</string>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>arm64</string>
</array>
<key>GCSupportedGameControllers</key>
<array>
<dict>
<key>ProfileName</key>
<string>ExtendedGamepad</string>
</dict>
<dict>
<key>ProfileName</key>
<string>MicroGamepad</string>
</dict>
</array>
<key>GCSupportsControllerUserInteraction</key>
<true/>
<key>XSAppIconAssets</key>
<string>Assets.xcassets/App Icon &amp; Top Shelf Image.brandassets</string>
<key>XSLaunchImageAssets</key>
<string>Assets.xcassets/LaunchImages.launchimage</string>
</dict>
</plist>

Просмотреть файл

@ -0,0 +1,13 @@
using UIKit;
namespace MyTVMetalGame {
public class Application {
// This is the main entry point of the application.
static void Main (string [] args)
{
// if you want to use a different Application Delegate class from "AppDelegate"
// you can specify it here.
UIApplication.Main (args, null, "AppDelegate");
}
}
}

Просмотреть файл

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="6211" systemVersion="14A298i" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="BV1-FR-VrT">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="6204"/>
</dependencies>
<scenes>
<!--Game View Controller-->
<scene sceneID="tXr-a1-R10">
<objects>
<viewController id="BV1-FR-VrT" customClass="GameViewController" customModuleProvider="" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="8aa-yV-Osq"/>
<viewControllerLayoutGuide type="bottom" id="qHh-Mt-9TT"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="3se-qz-xqx">
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="SZV-WD-TEh" sceneMemberID="firstResponder"/>
</objects>
</scene>
</scenes>
</document>

Просмотреть файл

@ -0,0 +1,125 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">iPhoneSimulator</Platform>
<ProjectGuid>{CE09F37A-C1E9-488D-B72D-26269D735ECD}</ProjectGuid>
<ProjectTypeGuids>{06FA79CB-D6CD-4721-BB4B-1BD202089C55};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<OutputType>Exe</OutputType>
<RootNamespace>MyTVMetalGame</RootNamespace>
<AssemblyName>MyTVMetalGame</AssemblyName>
<IPhoneResourcePrefix>Resources</IPhoneResourcePrefix>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|iPhoneSimulator' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\iPhoneSimulator\Debug</OutputPath>
<DefineConstants>DEBUG;</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<CodesignKey>iPhone Developer</CodesignKey>
<MtouchDebug>true</MtouchDebug>
<MtouchNoSymbolStrip>true</MtouchNoSymbolStrip>
<MtouchFastDev>true</MtouchFastDev>
<IOSDebuggerPort>51092</IOSDebuggerPort>
<MtouchLink>None</MtouchLink>
<MtouchArch>x86_64</MtouchArch>
<MtouchHttpClientHandler>NSUrlSessionHandler</MtouchHttpClientHandler>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|iPhone' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\iPhone\Release</OutputPath>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<CodesignKey>iPhone Developer</CodesignKey>
<MtouchUseLlvm>true</MtouchUseLlvm>
<MtouchFloat32>true</MtouchFloat32>
<MtouchEnableBitcode>true</MtouchEnableBitcode>
<CodesignEntitlements>Entitlements.plist</CodesignEntitlements>
<MtouchLink>SdkOnly</MtouchLink>
<MtouchArch>ARM64</MtouchArch>
<MtouchHttpClientHandler>NSUrlSessionHandler</MtouchHttpClientHandler>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|iPhoneSimulator' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\iPhoneSimulator\Release</OutputPath>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<CodesignKey>iPhone Developer</CodesignKey>
<MtouchNoSymbolStrip>true</MtouchNoSymbolStrip>
<MtouchLink>None</MtouchLink>
<MtouchArch>x86_64</MtouchArch>
<MtouchHttpClientHandler>NSUrlSessionHandler</MtouchHttpClientHandler>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|iPhone' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\iPhone\Debug</OutputPath>
<DefineConstants>DEBUG;</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<CodesignKey>iPhone Developer</CodesignKey>
<DeviceSpecificBuild>true</DeviceSpecificBuild>
<MtouchDebug>true</MtouchDebug>
<MtouchNoSymbolStrip>true</MtouchNoSymbolStrip>
<MtouchFastDev>true</MtouchFastDev>
<MtouchFloat32>true</MtouchFloat32>
<CodesignEntitlements>Entitlements.plist</CodesignEntitlements>
<IOSDebuggerPort>39926</IOSDebuggerPort>
<MtouchLink>SdkOnly</MtouchLink>
<MtouchArch>ARM64</MtouchArch>
<MtouchHttpClientHandler>NSUrlSessionHandler</MtouchHttpClientHandler>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Xml" />
<Reference Include="System.Core" />
<Reference Include="Xamarin.TVOS" />
</ItemGroup>
<ItemGroup>
<ImageAsset Include="Assets.xcassets\App Icon &amp; Top Shelf Image.brandassets\Contents.json" />
<ImageAsset Include="Assets.xcassets\App Icon &amp; Top Shelf Image.brandassets\App Icon - Large.imagestack\Contents.json" />
<ImageAsset Include="Assets.xcassets\App Icon &amp; Top Shelf Image.brandassets\App Icon - Large.imagestack\Back.imagestacklayer\Contents.json" />
<ImageAsset Include="Assets.xcassets\App Icon &amp; Top Shelf Image.brandassets\App Icon - Large.imagestack\Back.imagestacklayer\Content.imageset\Contents.json" />
<ImageAsset Include="Assets.xcassets\App Icon &amp; Top Shelf Image.brandassets\App Icon - Large.imagestack\Front.imagestacklayer\Contents.json" />
<ImageAsset Include="Assets.xcassets\App Icon &amp; Top Shelf Image.brandassets\App Icon - Large.imagestack\Front.imagestacklayer\Content.imageset\Contents.json" />
<ImageAsset Include="Assets.xcassets\App Icon &amp; Top Shelf Image.brandassets\App Icon - Large.imagestack\Middle.imagestacklayer\Contents.json" />
<ImageAsset Include="Assets.xcassets\App Icon &amp; Top Shelf Image.brandassets\App Icon - Large.imagestack\Middle.imagestacklayer\Content.imageset\Contents.json" />
<ImageAsset Include="Assets.xcassets\App Icon &amp; Top Shelf Image.brandassets\App Icon - Small.imagestack\Contents.json" />
<ImageAsset Include="Assets.xcassets\App Icon &amp; Top Shelf Image.brandassets\App Icon - Small.imagestack\Back.imagestacklayer\Contents.json" />
<ImageAsset Include="Assets.xcassets\App Icon &amp; Top Shelf Image.brandassets\App Icon - Small.imagestack\Back.imagestacklayer\Content.imageset\Contents.json" />
<ImageAsset Include="Assets.xcassets\App Icon &amp; Top Shelf Image.brandassets\App Icon - Small.imagestack\Front.imagestacklayer\Contents.json" />
<ImageAsset Include="Assets.xcassets\App Icon &amp; Top Shelf Image.brandassets\App Icon - Small.imagestack\Front.imagestacklayer\Content.imageset\Contents.json" />
<ImageAsset Include="Assets.xcassets\App Icon &amp; Top Shelf Image.brandassets\App Icon - Small.imagestack\Middle.imagestacklayer\Contents.json" />
<ImageAsset Include="Assets.xcassets\App Icon &amp; Top Shelf Image.brandassets\App Icon - Small.imagestack\Middle.imagestacklayer\Content.imageset\Contents.json" />
<ImageAsset Include="Assets.xcassets\App Icon &amp; Top Shelf Image.brandassets\Top Shelf Image Wide.imageset\Contents.json" />
<ImageAsset Include="Assets.xcassets\App Icon &amp; Top Shelf Image.brandassets\Top Shelf Image.imageset\Contents.json" />
<ImageAsset Include="Assets.xcassets\Contents.json" />
</ItemGroup>
<ItemGroup>
<Folder Include="Resources\" />
</ItemGroup>
<ItemGroup>
<Metal Include="Shaders.metal" />
</ItemGroup>
<ItemGroup>
<None Include="Info.plist" />
<None Include="Entitlements.plist" />
</ItemGroup>
<ItemGroup>
<Compile Include="Main.cs" />
<Compile Include="AppDelegate.cs" />
<Compile Include="GameViewController.cs" />
<Compile Include="GameViewController.designer.cs">
<DependentUpon>GameViewController.cs</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<InterfaceDefinition Include="Main.storyboard" />
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath)\Xamarin\TVOS\Xamarin.TVOS.CSharp.targets" />
</Project>

Просмотреть файл

@ -0,0 +1,23 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MyTVMetalGame", "MyTVMetalGame.csproj", "{CE09F37A-C1E9-488D-B72D-26269D735ECD}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|iPhoneSimulator = Debug|iPhoneSimulator
Release|iPhone = Release|iPhone
Release|iPhoneSimulator = Release|iPhoneSimulator
Debug|iPhone = Debug|iPhone
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{CE09F37A-C1E9-488D-B72D-26269D735ECD}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator
{CE09F37A-C1E9-488D-B72D-26269D735ECD}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator
{CE09F37A-C1E9-488D-B72D-26269D735ECD}.Release|iPhone.ActiveCfg = Release|iPhone
{CE09F37A-C1E9-488D-B72D-26269D735ECD}.Release|iPhone.Build.0 = Release|iPhone
{CE09F37A-C1E9-488D-B72D-26269D735ECD}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
{CE09F37A-C1E9-488D-B72D-26269D735ECD}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
{CE09F37A-C1E9-488D-B72D-26269D735ECD}.Debug|iPhone.ActiveCfg = Debug|iPhone
{CE09F37A-C1E9-488D-B72D-26269D735ECD}.Debug|iPhone.Build.0 = Debug|iPhone
EndGlobalSection
EndGlobal

Просмотреть файл

@ -0,0 +1,53 @@
#include <metal_stdlib>
#include <simd/simd.h>
using namespace metal;
// Variables in constant address space
constant float3 light_position = float3(0.0, 1.0, -1.0);
constant float4 ambient_color = float4(0.18, 0.24, 0.8, 1.0);
constant float4 diffuse_color = float4(0.4, 0.4, 1.0, 1.0);
typedef struct
{
float4x4 modelview_projection_matrix;
float4x4 normal_matrix;
} uniforms_t;
typedef struct
{
packed_float3 position;
packed_float3 normal;
} vertex_t;
typedef struct {
float4 position [[position]];
half4 color;
} ColorInOut;
// Vertex shader function
vertex ColorInOut lighting_vertex(device vertex_t* vertex_array [[ buffer(0) ]],
constant uniforms_t& uniforms [[ buffer(1) ]],
unsigned int vid [[ vertex_id ]])
{
ColorInOut out;
float4 in_position = float4(float3(vertex_array[vid].position), 1.0);
out.position = uniforms.modelview_projection_matrix * in_position;
float3 normal = vertex_array[vid].normal;
float4 eye_normal = normalize(uniforms.normal_matrix * float4(normal, 0.0));
float n_dot_l = dot(eye_normal.rgb, normalize(light_position));
n_dot_l = fmax(0.0, n_dot_l);
out.color = half4(ambient_color + diffuse_color * n_dot_l);
return out;
}
// Fragment shader function
fragment half4 lighting_fragment(ColorInOut in [[stage_in]])
{
return in.color;
}

Просмотреть файл

@ -17,13 +17,8 @@ namespace Xamarin.iOS.Tasks {
[Test]
public void BasicTest ()
{
if (Platform == "iPhoneSimulator") {
// Note: we expect an error due to Metal not being supported on iPhoneSimulator
// Note 2: msbuild now is aware that Metal is device-only and throws an error thus this test becomes device-only for time being
//this.BuildExtension ("MyMetalGame", "MyKeyboardExtension", Platform, 1);
return;
}
if (Platform == "iPhoneSimulator" && Environment.OSVersion.Version.Major < 19) // Environment.OSVersion = 19.* in macOS Catalina.
Assert.Ignore ("Metal support is not available in the simulator until macOS 10.15.");
this.BuildExtension ("MyMetalGame", "MyKeyboardExtension", Platform, "Debug");
this.TestStoryboardC (AppBundlePath);
}

Просмотреть файл

@ -1,4 +1,6 @@
using NUnit.Framework;
using System;
using NUnit.Framework;
namespace Xamarin.iOS.Tasks
{
@ -13,7 +15,9 @@ namespace Xamarin.iOS.Tasks
[Test]
public void BasicTest()
{
BuildExtension("MyTVApp", "MyTVServicesExtension", BundlePath, Platform, "Debug");
if (Platform == "iPhoneSimulator" && Environment.OSVersion.Version.Major < 19) // Environment.OSVersion = 19.* in macOS Catalina.
Assert.Ignore ("Metal support is not available in the simulator until macOS 10.15.");
BuildExtension ("MyTVApp", "MyTVServicesExtension", BundlePath, Platform, "Debug");
}
public override string TargetFrameworkIdentifier {

Просмотреть файл

@ -0,0 +1,28 @@
using System;
using NUnit.Framework;
namespace Xamarin.iOS.Tasks {
[TestFixture ("iPhone")]
[TestFixture ("iPhoneSimulator")]
public class TVMetalGameTests : ProjectTest {
public TVMetalGameTests (string platform) : base (platform)
{
}
[Test]
public void BasicTest ()
{
if (Platform == "iPhoneSimulator" && Environment.OSVersion.Version.Major < 19) // Environment.OSVersion = 19.* in macOS Catalina.
Assert.Ignore ("Metal support is not available in the simulator until macOS 10.15.");
BuildProject ("MyTVMetalGame", Platform, "Debug");
}
public override string TargetFrameworkIdentifier {
get {
return "Xamarin.TVOS";
}
}
}
}

Просмотреть файл

@ -473,11 +473,9 @@ namespace Xamarin.iOS.Tasks
Assert.IsTrue (bundleItems.Any (i => i.EvaluatedInclude == Path.Combine (actool, "LaunchImage-568h@2x.png") && i.GetMetadataValue ("LogicalName") == "LaunchImage-568h@2x.png"), "#11");
Assert.IsTrue (bundleItems.Any (i => i.EvaluatedInclude == Path.Combine (actool, "LaunchImage.png") && i.GetMetadataValue ("LogicalName") == "LaunchImage.png"), "#12");
Assert.IsTrue (bundleItems.Any (i => i.EvaluatedInclude == Path.Combine (actool, "LaunchImage@2x.png") && i.GetMetadataValue ("LogicalName") == "LaunchImage@2x.png"), "#13");
Assert.IsTrue (bundleItems.Any (i => i.EvaluatedInclude == Path.Combine (ibtool, "MainStoryboard.storyboardc", "1-view-2.nib", "objects-13.0+.nib") && i.GetMetadataValue ("LogicalName") == "MainStoryboard.storyboardc/1-view-2.nib/objects-13.0+.nib"), "#14.1");
Assert.IsTrue (bundleItems.Any (i => i.EvaluatedInclude == Path.Combine (ibtool, "MainStoryboard.storyboardc", "1-view-2.nib", "runtime.nib") && i.GetMetadataValue ("LogicalName") == "MainStoryboard.storyboardc/1-view-2.nib/runtime.nib"), "#14.2");
Assert.IsTrue (bundleItems.Any (i => i.EvaluatedInclude == Path.Combine (ibtool, "MainStoryboard.storyboardc", "1-view-2.nib") && i.GetMetadataValue ("LogicalName") == "MainStoryboard.storyboardc/1-view-2.nib"), "#14");
Assert.IsTrue (bundleItems.Any (i => i.EvaluatedInclude == Path.Combine (ibtool, "MainStoryboard.storyboardc", "Info.plist") && i.GetMetadataValue ("LogicalName") == "MainStoryboard.storyboardc/Info.plist"), "#15");
Assert.IsTrue (bundleItems.Any (i => i.EvaluatedInclude == Path.Combine (ibtool, "MainStoryboard.storyboardc", "UIViewController-1.nib", "objects-13.0+.nib") && i.GetMetadataValue ("LogicalName") == "MainStoryboard.storyboardc/UIViewController-1.nib/objects-13.0+.nib"), "#16.1");
Assert.IsTrue (bundleItems.Any (i => i.EvaluatedInclude == Path.Combine (ibtool, "MainStoryboard.storyboardc", "UIViewController-1.nib", "runtime.nib") && i.GetMetadataValue ("LogicalName") == "MainStoryboard.storyboardc/UIViewController-1.nib/runtime.nib"), "#16.2");
Assert.IsTrue (bundleItems.Any (i => i.EvaluatedInclude == Path.Combine (ibtool, "MainStoryboard.storyboardc", "UIViewController-1.nib") && i.GetMetadataValue ("LogicalName") == "MainStoryboard.storyboardc/UIViewController-1.nib"), "#16");
if (bundleItems.Length > ExpectedExecutableBundleResources.Length) {
Assert.IsTrue (bundleItems.Any (i => i.EvaluatedInclude == Path.Combine (ibtool, "en.lproj", "TranslatedView.nib", "runtime.nib") && i.GetMetadataValue ("LogicalName") == "en.lproj/TranslatedView.nib/runtime.nib"), "#17");
Assert.IsTrue (bundleItems.Any (i => i.EvaluatedInclude == Path.Combine (ibtool, "FolderView.nib", "runtime.nib") && i.GetMetadataValue ("LogicalName") == "FolderView.nib/runtime.nib"), "#18");

Просмотреть файл

@ -80,26 +80,21 @@ namespace Xamarin.iOS.Tasks
bundleResources.Add (bundleResource.GetMetadata ("LogicalName"));
}
string[] expected = { "LaunchScreen~ipad.nib/objects-8.0+.nib",
"LaunchScreen~ipad.nib/objects-13.0+.nib",
string[] expected = {
"LaunchScreen~ipad.nib/runtime.nib",
"LaunchScreen~iphone.nib/objects-13.0+.nib",
"LaunchScreen~iphone.nib/objects-8.0+.nib",
"LaunchScreen~iphone.nib/runtime.nib",
"Main.storyboardc/BYZ-38-t0r-view-8bC-Xf-vdC~ipad.nib/objects-13.0+.nib",
"Main.storyboardc/BYZ-38-t0r-view-8bC-Xf-vdC~ipad.nib/objects-8.0+.nib",
"Main.storyboardc/BYZ-38-t0r-view-8bC-Xf-vdC~ipad.nib/runtime.nib",
"Main.storyboardc/BYZ-38-t0r-view-8bC-Xf-vdC~iphone.nib/objects-13.0+.nib",
"Main.storyboardc/BYZ-38-t0r-view-8bC-Xf-vdC~iphone.nib/objects-8.0+.nib",
"Main.storyboardc/BYZ-38-t0r-view-8bC-Xf-vdC~iphone.nib/runtime.nib",
"Main.storyboardc/UIViewController-BYZ-38-t0r~ipad.nib/objects-13.0+.nib",
"Main.storyboardc/UIViewController-BYZ-38-t0r~ipad.nib/objects-8.0+.nib",
"Main.storyboardc/UIViewController-BYZ-38-t0r~ipad.nib/runtime.nib",
"Main.storyboardc/UIViewController-BYZ-38-t0r~iphone.nib/objects-13.0+.nib",
"Main.storyboardc/UIViewController-BYZ-38-t0r~iphone.nib/objects-8.0+.nib",
"Main.storyboardc/UIViewController-BYZ-38-t0r~iphone.nib/runtime.nib",
"LaunchScreen~ipad.nib/objects-8.0+.nib",
"Main~ipad.storyboardc/Info-8.0+.plist",
"Main~ipad.storyboardc/Info.plist",
"Main.storyboardc/UIViewController-BYZ-38-t0r~ipad.nib/runtime.nib",
"Main.storyboardc/UIViewController-BYZ-38-t0r~ipad.nib/objects-8.0+.nib",
"Main.storyboardc/BYZ-38-t0r-view-8bC-Xf-vdC~iphone.nib/runtime.nib",
"Main.storyboardc/BYZ-38-t0r-view-8bC-Xf-vdC~iphone.nib/objects-8.0+.nib",
"Main.storyboardc/UIViewController-BYZ-38-t0r~iphone.nib/runtime.nib",
"Main.storyboardc/UIViewController-BYZ-38-t0r~iphone.nib/objects-8.0+.nib",
"Main.storyboardc/BYZ-38-t0r-view-8bC-Xf-vdC~ipad.nib/runtime.nib",
"Main.storyboardc/BYZ-38-t0r-view-8bC-Xf-vdC~ipad.nib/objects-8.0+.nib",
"LaunchScreen~iphone.nib/runtime.nib",
"LaunchScreen~iphone.nib/objects-8.0+.nib",
"Main~iphone.storyboardc/Info-8.0+.plist",
"Main~iphone.storyboardc/Info.plist",
};
@ -153,35 +148,23 @@ namespace Xamarin.iOS.Tasks
ibtool.EnableOnDemandResources = true;
string[] expected = {
"Base.lproj/LaunchScreen.storyboardc/01J-lp-oVM-view-Ze5-6b-2t3.nib/objects-13.0+.nib",
"Base.lproj/LaunchScreen.storyboardc/01J-lp-oVM-view-Ze5-6b-2t3.nib/runtime.nib",
"Base.lproj/LaunchScreen.storyboardc/Info.plist",
"Base.lproj/LaunchScreen.storyboardc/UIViewController-01J-lp-oVM.nib/objects-13.0+.nib",
"Base.lproj/LaunchScreen.storyboardc/UIViewController-01J-lp-oVM.nib/runtime.nib",
"Base.lproj/Linked.storyboardc/5xv-Yx-H4r-view-gMo-tm-chA.nib/objects-13.0+.nib",
"Base.lproj/Linked.storyboardc/5xv-Yx-H4r-view-gMo-tm-chA.nib/runtime.nib",
"Base.lproj/Linked.storyboardc/Info.plist",
"Base.lproj/Linked.storyboardc/MyLinkedViewController.nib/objects-13.0+.nib",
"Base.lproj/Linked.storyboardc/MyLinkedViewController.nib/runtime.nib",
"Base.lproj/Main.storyboardc/BYZ-38-t0r-view-8bC-Xf-vdC.nib/objects-13.0+.nib",
"Base.lproj/Main.storyboardc/BYZ-38-t0r-view-8bC-Xf-vdC.nib/runtime.nib",
"Base.lproj/Main.storyboardc/Info.plist",
"Base.lproj/Main.storyboardc/MyLinkedViewController.nib/objects-13.0+.nib",
"Base.lproj/Main.storyboardc/MyLinkedViewController.nib/runtime.nib",
"Base.lproj/Main.storyboardc/UIViewController-BYZ-38-t0r.nib/objects-13.0+.nib",
"Base.lproj/Main.storyboardc/UIViewController-BYZ-38-t0r.nib/runtime.nib",
"en.lproj/Linked.storyboardc/5xv-Yx-H4r-view-gMo-tm-chA.nib/objects-13.0+.nib",
"en.lproj/Linked.storyboardc/5xv-Yx-H4r-view-gMo-tm-chA.nib/runtime.nib",
"en.lproj/Linked.storyboardc/Info.plist",
"en.lproj/Linked.storyboardc/MyLinkedViewController.nib/objects-13.0+.nib",
"en.lproj/Linked.storyboardc/MyLinkedViewController.nib/runtime.nib",
"en.lproj/Main.storyboardc/BYZ-38-t0r-view-8bC-Xf-vdC.nib/objects-13.0+.nib",
"en.lproj/Main.storyboardc/BYZ-38-t0r-view-8bC-Xf-vdC.nib/runtime.nib",
"en.lproj/Main.storyboardc/UIViewController-BYZ-38-t0r.nib",
"en.lproj/Main.storyboardc/BYZ-38-t0r-view-8bC-Xf-vdC.nib",
"en.lproj/Main.storyboardc/Info.plist",
"en.lproj/Main.storyboardc/MyLinkedViewController.nib/objects-13.0+.nib",
"en.lproj/Main.storyboardc/MyLinkedViewController.nib/runtime.nib",
"en.lproj/Main.storyboardc/UIViewController-BYZ-38-t0r.nib/objects-13.0+.nib",
"en.lproj/Main.storyboardc/UIViewController-BYZ-38-t0r.nib/runtime.nib",
"en.lproj/Main.storyboardc/MyLinkedViewController.nib",
"en.lproj/Linked.storyboardc/5xv-Yx-H4r-view-gMo-tm-chA.nib",
"en.lproj/Linked.storyboardc/Info.plist",
"en.lproj/Linked.storyboardc/MyLinkedViewController.nib",
"Base.lproj/Main.storyboardc/UIViewController-BYZ-38-t0r.nib",
"Base.lproj/Main.storyboardc/BYZ-38-t0r-view-8bC-Xf-vdC.nib",
"Base.lproj/Main.storyboardc/Info.plist",
"Base.lproj/Main.storyboardc/MyLinkedViewController.nib",
"Base.lproj/Linked.storyboardc/5xv-Yx-H4r-view-gMo-tm-chA.nib",
"Base.lproj/Linked.storyboardc/Info.plist",
"Base.lproj/Linked.storyboardc/MyLinkedViewController.nib",
"Base.lproj/LaunchScreen.storyboardc/01J-lp-oVM-view-Ze5-6b-2t3.nib",
"Base.lproj/LaunchScreen.storyboardc/UIViewController-01J-lp-oVM.nib",
"Base.lproj/LaunchScreen.storyboardc/Info.plist",
};
var inexistentResource = bundleResources.Except (expected).ToArray ();
@ -237,16 +220,14 @@ namespace Xamarin.iOS.Tasks
Assert.IsNotNullOrEmpty (bundleResource.GetMetadata ("Optimize"), "The 'Optimize' metadata must be set.");
Assert.IsNotNullOrEmpty (tag, "The 'ResourceTags' metadata should be set.");
Assert.AreEqual (Path.Combine (tmp, "ibtool", tag + ".nib", Path.GetFileName (bundleName)), bundleResource.ItemSpec, $"BundleResource {bundleName} is not at the expected location.");
Assert.AreEqual (Path.Combine (tmp, "ibtool", tag + ".nib"), bundleResource.ItemSpec, $"BundleResource {bundleName} is not at the expected location.");
bundleResources.Add (bundleName);
}
string[] expected = {
"View~ipad.nib/objects-13.0+.nib",
"View~ipad.nib/runtime.nib",
"View.nib/objects-13.0+.nib",
"View.nib/runtime.nib",
"View.nib",
"View~ipad.nib",
};
var inexistentResource = bundleResources.Except (expected).ToArray ();

Просмотреть файл

@ -30,9 +30,13 @@ SHARED_FILES = $(SHARED_SOURCES) $(SHARED_HEADERS) $(SHARED_I386_SOURCES) $(SHAR
EXTRA_DEPENDENCIES = $(SHARED_HEADERS) $(TOP)/Make.config $(TOP)/mk/mono.mk
ifdef INJECT_X86_64_SLICE
X86_64_SLICE=$(abspath $(CURDIR)/x86-64-slice.dylib)
$(X86_64_SLICE): Makefile
$(Q) echo "void xamarin_x86_64_function_for_notarization_workaround_v2 () {}" | $(MAC_CC) -shared -x c -o$@ -
else
X86_64_SLICE=
endif
xamarin/mono-runtime.h: mono-runtime.h.t4 exports.t4
$(Q_GEN) $(TT) $< -o $@

Просмотреть файл

@ -117,6 +117,8 @@ namespace CoreBluetooth {
UnknownDevice,
[iOS (12,0)][TV (12,0)][Mac (10,14)][Watch (5,0)]
OperationNotSupported,
PeerRemovedPairingInformation,
EncryptionTimedOut,
}
[Watch (4,0)]

Просмотреть файл

@ -535,11 +535,19 @@ namespace CoreGraphics {
[Mac (10,15)][iOS(13,0)]
[TV (13,0)][Watch (6,0)]
[Deprecated (PlatformName.MacOSX, 10,15,4)]
[Deprecated (PlatformName.iOS, 13,4)]
[Deprecated (PlatformName.TvOS, 13,4)]
[Deprecated (PlatformName.WatchOS, 6,2)]
[DllImport (Constants.CoreGraphicsLibrary)]
static extern bool CGColorSpaceIsHDR (/* CGColorSpaceRef */ IntPtr space);
[Mac (10,15)][iOS(13,0)]
[TV (13,0)][Watch (6,0)]
[Deprecated (PlatformName.MacOSX, 10,15,4)]
[Deprecated (PlatformName.iOS, 13,4)]
[Deprecated (PlatformName.TvOS, 13,4)]
[Deprecated (PlatformName.WatchOS, 6,2)]
public bool IsHdr {
get {
return CGColorSpaceIsHDR (handle);

Просмотреть файл

@ -41,6 +41,7 @@ namespace CoreText {
InvalidFontData = 104,
AlreadyRegistered = 105,
ExceededResourceLimit = 106,
AssetNotFound = 107,
NotRegistered = 201,
InUse = 202,
SystemRequired = 203,

Просмотреть файл

@ -44,6 +44,14 @@ namespace Intents {
throw new NotImplementedException ("All subclasses of INIntentResolutionResult must re-implement this property");
}
}
#if !MONOMAC
[Watch (6,0), iOS (13,0)]
public static INIntentResolutionResult GetUnsupported (nint reason) => throw new NotImplementedException ("All subclasses of INIntentResolutionResult must re-implement this method");
[Watch (6,0), iOS (13,0)]
public static INIntentResolutionResult GetConfirmationRequired (NSObject itemToConfirm, nint reason) => throw new NotImplementedException ("All subclasses of INIntentResolutionResult must re-implement this method");
#endif
}
}
#endif // XAMCORE_2_0

Просмотреть файл

@ -60,7 +60,9 @@ namespace LocalAuthentication {
[iOS (9,0), Mac (10,11), Watch (3,0), TV (11,0)]
[Native]
public enum LACredentialType : long {
ApplicationPassword = 0
ApplicationPassword = 0,
[iOS (13,4), Mac (10,15,4), NoWatch, NoTV]
SmartCardPin = -3,
}
[iOS (9,0)]

Просмотреть файл

@ -27,7 +27,7 @@ namespace SafariServices {
[NoMac]
[iOS (9,0)]
[Deprecated (PlatformName.iOS, 10,0, message: "Use 'SFErrorCode' enum.")]
[Unavailable (PlatformName.MacCatalyst)][Advice ("This API is not available when using UIKit on macOS.")]
[Introduced (PlatformName.MacCatalyst, 13, 4)]
[Native]
[ErrorDomain ("SFContentBlockerErrorDomain")]
public enum SFContentBlockerErrorCode : long {

Просмотреть файл

@ -2672,4 +2672,198 @@ namespace UIKit {
[Field ("UIActivityItemsConfigurationPreviewIntentThumbnail")]
Thumbnail,
}
[NoWatch, NoTV, iOS (13,4)]
[Native]
public enum UIDatePickerStyle : long {
Automatic,
Wheels,
Compact,
}
[Introduced (PlatformName.MacCatalyst, 13, 4)]
[iOS (13,4), NoWatch, TV (13,4)]
[Native]
public enum UIKeyboardHidUsage : long {
KeyboardErrorRollOver = 1,
KeyboardPostFail = 2,
KeyboardErrorUndefined = 3,
KeyboardA = 4,
KeyboardB = 5,
KeyboardC = 6,
KeyboardD = 7,
KeyboardE = 8,
KeyboardF = 9,
KeyboardG = 10,
KeyboardH = 11,
KeyboardI = 12,
KeyboardJ = 13,
KeyboardK = 14,
KeyboardL = 15,
KeyboardM = 16,
KeyboardN = 17,
KeyboardO = 18,
KeyboardP = 19,
KeyboardQ = 20,
KeyboardR = 21,
KeyboardS = 22,
KeyboardT = 23,
KeyboardU = 24,
KeyboardV = 25,
KeyboardW = 26,
KeyboardX = 27,
KeyboardY = 28,
KeyboardZ = 29,
Keyboard1 = 30,
Keyboard2 = 31,
Keyboard3 = 32,
Keyboard4 = 33,
Keyboard5 = 34,
Keyboard6 = 35,
Keyboard7 = 36,
Keyboard8 = 37,
Keyboard9 = 38,
Keyboard0 = 39,
KeyboardReturnOrEnter = 40,
KeyboardEscape = 41,
KeyboardDeleteOrBackspace = 42,
KeyboardTab = 43,
KeyboardSpacebar = 44,
KeyboardHyphen = 45,
KeyboardEqualSign = 46,
KeyboardOpenBracket = 47,
KeyboardCloseBracket = 48,
KeyboardBackslash = 49,
KeyboardNonUSPound = 50,
KeyboardSemicolon = 51,
KeyboardQuote = 52,
KeyboardGraveAccentAndTilde = 53,
KeyboardComma = 54,
KeyboardPeriod = 55,
KeyboardSlash = 56,
KeyboardCapsLock = 57,
KeyboardF1 = 58,
KeyboardF2 = 59,
KeyboardF3 = 60,
KeyboardF4 = 61,
KeyboardF5 = 62,
KeyboardF6 = 63,
KeyboardF7 = 64,
KeyboardF8 = 65,
KeyboardF9 = 66,
KeyboardF10 = 67,
KeyboardF11 = 68,
KeyboardF12 = 69,
KeyboardPrintScreen = 70,
KeyboardScrollLock = 71,
KeyboardPause = 72,
KeyboardInsert = 73,
KeyboardHome = 74,
KeyboardPageUp = 75,
KeyboardDeleteForward = 76,
KeyboardEnd = 77,
KeyboardPageDown = 78,
KeyboardRightArrow = 79,
KeyboardLeftArrow = 80,
KeyboardDownArrow = 81,
KeyboardUpArrow = 82,
KeypadNumLock = 83,
KeypadSlash = 84,
KeypadAsterisk = 85,
KeypadHyphen = 86,
KeypadPlus = 87,
KeypadEnter = 88,
Keypad1 = 89,
Keypad2 = 90,
Keypad3 = 91,
Keypad4 = 92,
Keypad5 = 93,
Keypad6 = 94,
Keypad7 = 95,
Keypad8 = 96,
Keypad9 = 97,
Keypad0 = 98,
KeypadPeriod = 99,
KeyboardNonUSBackslash = 100,
KeyboardApplication = 101,
KeyboardPower = 102,
KeypadEqualSign = 103,
KeyboardF13 = 104,
KeyboardF14 = 105,
KeyboardF15 = 106,
KeyboardF16 = 107,
KeyboardF17 = 108,
KeyboardF18 = 109,
KeyboardF19 = 110,
KeyboardF20 = 111,
KeyboardF21 = 112,
KeyboardF22 = 113,
KeyboardF23 = 114,
KeyboardF24 = 115,
KeyboardExecute = 116,
KeyboardHelp = 117,
KeyboardMenu = 118,
KeyboardSelect = 119,
KeyboardStop = 120,
KeyboardAgain = 121,
KeyboardUndo = 122,
KeyboardCut = 123,
KeyboardCopy = 124,
KeyboardPaste = 125,
KeyboardFind = 126,
KeyboardMute = 127,
KeyboardVolumeUp = 128,
KeyboardVolumeDown = 129,
KeyboardLockingCapsLock = 130,
KeyboardLockingNumLock = 131,
KeyboardLockingScrollLock = 132,
KeypadComma = 133,
KeypadEqualSignAS400 = 134,
KeyboardInternational1 = 135,
KeyboardInternational2 = 136,
KeyboardInternational3 = 137,
KeyboardInternational4 = 138,
KeyboardInternational5 = 139,
KeyboardInternational6 = 140,
KeyboardInternational7 = 141,
KeyboardInternational8 = 142,
KeyboardInternational9 = 143,
KeyboardLang1 = 144,
KeyboardLang2 = 145,
KeyboardLang3 = 146,
KeyboardLang4 = 147,
KeyboardLang5 = 148,
KeyboardLang6 = 149,
KeyboardLang7 = 150,
KeyboardLang8 = 151,
KeyboardLang9 = 152,
KeyboardAlternateErase = 153,
KeyboardSysReqOrAttention = 154,
KeyboardCancel = 155,
KeyboardClear = 156,
KeyboardPrior = 157,
KeyboardReturn = 158,
KeyboardSeparator = 159,
KeyboardOut = 160,
KeyboardOper = 161,
KeyboardClearOrAgain = 162,
KeyboardCrSelOrProps = 163,
KeyboardExSel = 164,
KeyboardLeftControl = 224,
KeyboardLeftShift = 225,
KeyboardLeftAlt = 226,
KeyboardLeftGui = 227,
KeyboardRightControl = 228,
KeyboardRightShift = 229,
KeyboardRightAlt = 230,
KeyboardRightGui = 231,
KeyboardReserved = 65535,
KeyboardHangul = KeyboardLang1,
KeyboardHanja = KeyboardLang2,
KeyboardKanaSwitch = KeyboardLang1,
KeyboardAlphanumericSwitch = KeyboardLang2,
KeyboardKatakana = KeyboardLang3,
KeyboardHiragana = KeyboardLang4,
KeyboardZenkakuHankakuKanji = KeyboardLang5,
}
}

Просмотреть файл

@ -5210,6 +5210,10 @@ namespace AppKit {
[Export ("maxDate", ArgumentSemantic.Copy)]
NSDate MaxDate { get; set; }
[Mac (10,15,4)]
[Export ("presentsCalendarOverlay")]
bool PresentsCalendarOverlay { get; set; }
[Export ("delegate", ArgumentSemantic.Assign), NullAllowed]
NSObject WeakDelegate { get; set; }

Просмотреть файл

@ -55,13 +55,16 @@ namespace AuthenticationServices {
Url,
}
[NoTV][NoWatch]
[NoTV]
[Watch (6,2)]
[Mac (10,15)]
[iOS (12,0)]
[Native]
[ErrorDomain ("ASWebAuthenticationSessionErrorDomain")]
public enum ASWebAuthenticationSessionErrorCode : long {
CanceledLogin = 1,
PresentationContextNotProvided = 2,
PresentationContextInvalid = 3,
}
delegate void ASCredentialIdentityStoreCompletionHandler (bool success, NSError error);
@ -213,7 +216,8 @@ namespace AuthenticationServices {
delegate void ASWebAuthenticationSessionCompletionHandler ([NullAllowed] NSUrl callbackUrl, [NullAllowed] NSError error);
[NoTV][NoWatch]
[NoTV]
[Watch (6,2)]
[Mac (10, 15)]
[iOS (12,0)]
[BaseType (typeof (NSObject))]
@ -228,13 +232,17 @@ namespace AuthenticationServices {
[Export ("cancel")]
void Cancel ();
[iOS (13,0)]
[iOS (13,0), NoWatch]
[NullAllowed, Export ("presentationContextProvider", ArgumentSemantic.Weak)]
IASWebAuthenticationPresentationContextProviding PresentationContextProvider { get; set; }
[iOS (13,0)]
[Export ("prefersEphemeralWebBrowserSession")]
bool PrefersEphemeralWebBrowserSession { get; set; }
[Mac (10,15,4), iOS (13,4)]
[Export ("canStart")]
bool CanStart { get; }
}
[Watch (6,0), TV (13,0), Mac (10,15), iOS (13,0)]

Просмотреть файл

@ -10843,13 +10843,13 @@ namespace AVFoundation {
[Export ("preventsDisplaySleepDuringVideoPlayback")]
bool PreventsDisplaySleepDuringVideoPlayback { get; set; }
[NoWatch, NoTV, NoiOS, Mac (10,15)]
[TV (13,4), NoWatch, Mac (10,15), iOS (13,4)]
[Static]
[Export ("eligibleForHDRPlayback")]
bool EligibleForHdrPlayback { get; }
[Notification]
[NoWatch, NoTV, NoiOS, Mac (10, 15)]
[TV (13,4), NoWatch, Mac (10,15), iOS (13,4)]
[Field ("AVPlayerEligibleForHDRPlaybackDidChangeNotification")]
NSString EligibleForHdrPlaybackDidChangeNotification { get; }
}

Просмотреть файл

@ -302,6 +302,13 @@ namespace CallKit {
[Async]
[Export ("getEnabledStatusForExtensionWithIdentifier:completionHandler:")]
void GetEnabledStatusForExtension (string identifier, Action<CXCallDirectoryEnabledStatus, NSError> completion);
[Unavailable (PlatformName.MacCatalyst)]
[NoWatch, NoTV, NoMac, iOS (13,4)]
[Advice ("This API is not available when using UIKit on macOS.")]
[Async]
[Export ("openSettingsWithCompletionHandler:")]
void OpenSettings ([NullAllowed] Action<NSError> completion);
}
[iOS (10, 0)]

Просмотреть файл

@ -940,5 +940,72 @@ namespace CarPlay {
[Export ("actions", ArgumentSemantic.Strong)]
CPAlertAction [] Actions { get; }
}
[NoWatch, NoTV, NoMac, iOS (13,4)]
[BaseType (typeof (NSObject))]
[DisableDefaultCtor]
interface CPDashboardButton : NSSecureCoding {
[Export ("initWithTitleVariants:subtitleVariants:image:handler:")]
[DesignatedInitializer]
IntPtr Constructor (string[] titleVariants, string[] subtitleVariants, UIImage image, [NullAllowed] Action<CPDashboardButton> handler);
[Export ("image")]
UIImage Image { get; }
[Export ("titleVariants")]
string [] TitleVariants { get; }
[Export ("subtitleVariants")]
string [] SubtitleVariants { get; }
}
[NoWatch, NoTV, NoMac, iOS (13,4)]
[BaseType (typeof (NSObject))]
[DisableDefaultCtor]
interface CPDashboardController {
[Export ("shortcutButtons", ArgumentSemantic.Copy)]
CPDashboardButton [] ShortcutButtons { get; set; }
}
interface ICPTemplateApplicationDashboardSceneDelegate { }
[NoWatch, NoTV, NoMac, iOS (13,4)]
[Protocol, Model (AutoGeneratedName = true)]
[BaseType (typeof (NSObject))]
interface CPTemplateApplicationDashboardSceneDelegate : UISceneDelegate {
[Export ("templateApplicationDashboardScene:didConnectDashboardController:toWindow:")]
void DidConnectDashboardController (CPTemplateApplicationDashboardScene templateApplicationDashboardScene, CPDashboardController dashboardController, UIWindow window);
[Export ("templateApplicationDashboardScene:didDisconnectDashboardController:fromWindow:")]
void DidDisconnectDashboardController (CPTemplateApplicationDashboardScene templateApplicationDashboardScene, CPDashboardController dashboardController, UIWindow window);
}
[NoWatch, NoTV, NoMac, iOS (13,4)]
[BaseType (typeof (UIScene))]
interface CPTemplateApplicationDashboardScene {
[Field ("CPTemplateApplicationDashboardSceneSessionRoleApplication")]
NSString SessionRoleApplication { get; }
[Export ("initWithSession:connectionOptions:")]
[DesignatedInitializer]
IntPtr Constructor (UISceneSession session, UISceneConnectionOptions connectionOptions);
[Wrap ("WeakDelegate")]
[NullAllowed, New]
ICPTemplateApplicationDashboardSceneDelegate Delegate { get; set; }
[NullAllowed, Export ("delegate", ArgumentSemantic.Strong), New]
NSObject WeakDelegate { get; set; }
[Export ("dashboardController", ArgumentSemantic.Strong)]
CPDashboardController DashboardController { get; }
[Export ("dashboardWindow", ArgumentSemantic.Strong)]
UIWindow DashboardWindow { get; }
}
}
#endif // XAMCORE_2_0

Просмотреть файл

@ -11,6 +11,7 @@
using System;
using Foundation;
using ObjCRuntime;
using CoreGraphics;
using System.Reflection;
namespace ClassKit {
@ -44,6 +45,10 @@ namespace ClassKit {
Document,
Audio,
Video,
[iOS (13,4)]
Course,
[iOS (13,4)]
Custom,
}
[NoWatch, NoTV, NoMac, iOS (11,4)]
@ -195,6 +200,10 @@ namespace ClassKit {
[DisableDefaultCtor]
interface CLSContext {
[iOS (13,4)]
[Export ("identifierPath", ArgumentSemantic.Copy)]
string [] IdentifierPath { get; }
[Export ("identifier")]
string Identifier { get; }
@ -204,12 +213,24 @@ namespace ClassKit {
[Export ("type", ArgumentSemantic.Assign)]
CLSContextType Type { get; }
[iOS (13,4)]
[NullAllowed, Export ("customTypeName")]
string CustomTypeName { get; set; }
[Export ("title")]
string Title { get; set; }
[Export ("displayOrder")]
nint DisplayOrder { get; set; }
[iOS (13,4)]
[NullAllowed, Export ("summary")]
string Summary { get; set; }
[iOS (13,4)]
[NullAllowed, Export ("thumbnail", ArgumentSemantic.Assign)]
CGImage Thumbnail { get; set; }
[Protected]
[NullAllowed, Export ("topic")]
NSString WeakTopic { get; set; }

Просмотреть файл

@ -1443,7 +1443,7 @@ namespace Contacts {
[Export ("value", ArgumentSemantic.Strong)]
NSObject Value { get; }
[Export ("currentHistoryToken", ArgumentSemantic.Copy)]
[Export ("currentHistoryToken", ArgumentSemantic.Copy), NullAllowed]
NSData CurrentHistoryToken { get; }
}

Просмотреть файл

@ -207,14 +207,30 @@ namespace CoreGraphics {
[Mac (10,14)][iOS (12,0)]
[TV (12,0)][Watch (5,0)]
[Deprecated (PlatformName.MacOSX, 10,15,4)]
[Deprecated (PlatformName.iOS, 13,4)]
[Deprecated (PlatformName.TvOS, 13,4)]
[Deprecated (PlatformName.WatchOS, 6,2)]
[Field ("kCGColorSpaceITUR_2020_PQ_EOTF")]
NSString Itur_2020_PQ_Eotf { get; }
[Mac (10,15,4), iOS (13,4), TV (13,4), Watch (6,2)]
[Field ("kCGColorSpaceITUR_2020_PQ")]
NSString Itur_2020_PQ { get; }
[Mac (10,15)][iOS (13,0)]
[TV (13,0)][Watch (6,0)]
[Deprecated (PlatformName.MacOSX, 10,15,4)]
[Deprecated (PlatformName.iOS, 13,4)]
[Deprecated (PlatformName.TvOS, 13,4)]
[Deprecated (PlatformName.WatchOS, 6,2)]
[Field ("kCGColorSpaceDisplayP3_PQ_EOTF")]
NSString DisplayP3_PQ_Eotf { get; }
[Mac (10,15,4), iOS (13,4), TV (13,4), Watch (6,2)]
[Field ("kCGColorSpaceDisplayP3_PQ")]
NSString DisplayP3_PQ { get; }
[Mac (10,15)][iOS (13,0)]
[TV (13,0)][Watch (6,0)]
[Field ("kCGColorSpaceDisplayP3_HLG")]

Просмотреть файл

@ -2863,10 +2863,9 @@ namespace CoreImage {
[CoreImageFilterProperty ("outputImageNonMPS")]
CIImage OutputImageNonMps { get; }
#if MONOMAC
[iOS (13,4)]
[CoreImageFilterProperty ("outputImageMPS")]
CIImage OutputImageMps { get; }
#endif
}
[CoreImageFilter]
@ -5331,10 +5330,9 @@ namespace CoreImage {
[CoreImageFilterProperty ("outputImageNonMPS")]
CIImage OutputImageNonMps { get; }
#if MONOMAC
[iOS (13,4)]
[CoreImageFilterProperty ("outputImageMPS")]
CIImage OutputImageMps { get; }
#endif
}
[CoreImageFilter]

Просмотреть файл

@ -92,11 +92,19 @@ namespace CoreLocation {
[Export ("course")]
double Course { get; }
[Watch (6,2), TV (13,4), Mac (10,15,4), iOS (13,4)]
[Export ("courseAccuracy")]
double CourseAccuracy { get; }
[TV (13,0)] // API_UNAVAILABLE(tvos) removed in Xcode 11 beta 1
[Watch (3,0)] // __WATCHOS_PROHIBITED removed in Xcode 8 beta 3
[Export ("speed")]
double Speed { get; }
[Watch (6,2), TV (13,4), Mac (10,15,4), iOS (13,4)]
[Export ("speedAccuracy")]
double SpeedAccuracy { get; }
[Export ("timestamp", ArgumentSemantic.Copy)]
NSDate Timestamp { get; }
@ -112,6 +120,10 @@ namespace CoreLocation {
[Export ("initWithCoordinate:altitude:horizontalAccuracy:verticalAccuracy:course:speed:timestamp:")]
IntPtr Constructor (CLLocationCoordinate2D coordinate, double altitude, double hAccuracy, double vAccuracy, double course, double speed, NSDate timestamp);
[Watch (6,2), TV (13,4), Mac (10,15,4), iOS (13,4)]
[Export ("initWithCoordinate:altitude:horizontalAccuracy:verticalAccuracy:course:courseAccuracy:speed:speedAccuracy:timestamp:")]
IntPtr Constructor (CLLocationCoordinate2D coordinate, double altitude, double hAccuracy, double vAccuracy, double course, double courseAccuracy, double speed, double speedAccuracy, NSDate timestamp);
// Apple keep changing the 'introduction' of this field (5.0->8.0->5.0) but it was not available in 6.1
// nor in 7.0 - but it works on my iPad3 running iOS 7.1
[NoTV][NoWatch]

Просмотреть файл

@ -689,6 +689,9 @@ namespace GameKit {
GKLeaderboardTimeScope TimeScope { get; set; }
}
[Watch (6,2), TV (13,4), Mac (10,15,4), iOS (13,4)]
delegate void GKFetchItemsForIdentityVerificationSignatureCompletionHandler (NSUrl publicKeyUrl, NSData signature, NSData salt, ulong timestamp, NSError error);
[Watch (3,0)]
[BaseType (typeof (GKPlayer))]
interface GKLocalPlayer
@ -791,11 +794,20 @@ namespace GameKit {
[Export ("unregisterAllListeners")]
void UnregisterAllListeners ();
[Deprecated (PlatformName.iOS, 13, 4, message: "Use 'FetchItemsForIdentityVerificationSignature' instead.")]
[Deprecated (PlatformName.TvOS, 13, 4, message: "Use 'FetchItemsForIdentityVerificationSignature' instead.")]
[Deprecated (PlatformName.MacOSX, 10, 15, 4, message: "Use 'FetchItemsForIdentityVerificationSignature' instead.")]
[Deprecated (PlatformName.WatchOS, 6, 2, message: "Use 'FetchItemsForIdentityVerificationSignature' instead.")]
[iOS (7,0), Mac (10,10)]
[Async (ResultTypeName = "GKIdentityVerificationSignatureResult")]
[Export ("generateIdentityVerificationSignatureWithCompletionHandler:")]
void GenerateIdentityVerificationSignature ([NullAllowed] GKIdentityVerificationSignatureHandler completionHandler);
[Watch (6,2), TV (13,4), Mac (10,15,4), iOS (13,4)]
[Async (ResultTypeName = "GKFetchItemsForIdentityVerificationSignature")]
[Export ("fetchItemsForIdentityVerificationSignature:")]
void FetchItemsForIdentityVerificationSignature ([NullAllowed] GKFetchItemsForIdentityVerificationSignatureCompletionHandler completionHandler);
[iOS (8,0), Mac (10,10)]
[Deprecated (PlatformName.iOS, 10, 0)]
[Deprecated (PlatformName.MacOSX, 10, 11)]

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Просмотреть файл

@ -48,6 +48,9 @@ namespace PassKit {
[NullAllowed, Export ("supplementarySubLocality", ArgumentSemantic.Strong)]
string SupplementarySubLocality { get; set; }
}
[Watch (6,2), iOS (13,4)]
delegate void PKPassLibrarySignDataCompletionHandler (NSData signedData, NSData signature, NSError error);
[BaseType (typeof (NSObject))]
interface PKPassLibrary {
@ -149,6 +152,11 @@ namespace PassKit {
[NoWatch][iOS (10,0)]
[Export ("presentPaymentPass:")]
void PresentPaymentPass (PKPaymentPass pass);
[Watch (6,2), iOS (13,4)]
[Async (ResultTypeName = "PKSignDataCompletionResult")]
[Export ("signData:withPaymentPass:completion:")]
void SignData (NSData signData, PKPaymentPass paymentPass, PKPassLibrarySignDataCompletionHandler completion);
}
[Static]

Просмотреть файл

@ -23,7 +23,7 @@ namespace SafariServices {
delegate void SFExtensionValidationHandler (bool shouldHide, NSString text);
[Mac (10,12)][iOS (10,0)]
[Unavailable (PlatformName.MacCatalyst)][Advice ("This API is not available when using UIKit on macOS.")]
[Introduced (PlatformName.MacCatalyst, 13, 4)]
[BaseType (typeof(NSObject))]
interface SFContentBlockerState
{
@ -32,7 +32,7 @@ namespace SafariServices {
}
[iOS (9,0)][Mac (10,12)]
[Unavailable (PlatformName.MacCatalyst)][Advice ("This API is not available when using UIKit on macOS.")]
[Introduced (PlatformName.MacCatalyst, 13, 4)]
[BaseType (typeof (NSObject))]
interface SFContentBlockerManager {
[Async]
@ -47,7 +47,7 @@ namespace SafariServices {
#if !MONOMAC
[iOS (7,0)]
[Unavailable (PlatformName.MacCatalyst)][Advice ("This API is not available when using UIKit on macOS.")]
[Introduced (PlatformName.MacCatalyst, 13, 4)]
[BaseType (typeof (NSObject))]
[DisableDefaultCtor] // NSGenericException Misuse of SSReadingList interface. Use class method defaultReadingList.
partial interface SSReadingList {

Просмотреть файл

@ -6552,6 +6552,86 @@ namespace UIKit {
[Field ("UIKeyInputEscape")]
NSString Escape { get; }
[Introduced (PlatformName.MacCatalyst, 13, 4)]
[iOS (13,4), TV (13,4)]
[Field ("UIKeyInputPageUp")]
NSString PageUp { get; }
[Introduced (PlatformName.MacCatalyst, 13, 4)]
[iOS (13,4), TV (13,4)]
[Field ("UIKeyInputPageDown")]
NSString PageDown { get; }
[Introduced (PlatformName.MacCatalyst, 13, 4)]
[iOS (13,4), TV (13,4)]
[Field ("UIKeyInputHome")]
NSString Home { get; }
[Introduced (PlatformName.MacCatalyst, 13, 4)]
[iOS (13,4), TV (13,4)]
[Field ("UIKeyInputEnd")]
NSString End { get; }
[Introduced (PlatformName.MacCatalyst, 13, 4)]
[iOS (13,4), TV (13,4)]
[Field ("UIKeyInputF1")]
NSString F1 { get; }
[Introduced (PlatformName.MacCatalyst, 13, 4)]
[iOS (13,4), TV (13,4)]
[Field ("UIKeyInputF2")]
NSString F2 { get; }
[Introduced (PlatformName.MacCatalyst, 13, 4)]
[iOS (13,4), TV (13,4)]
[Field ("UIKeyInputF3")]
NSString F3 { get; }
[Introduced (PlatformName.MacCatalyst, 13, 4)]
[iOS (13,4), TV (13,4)]
[Field ("UIKeyInputF4")]
NSString F4 { get; }
[Introduced (PlatformName.MacCatalyst, 13, 4)]
[iOS (13,4), TV (13,4)]
[Field ("UIKeyInputF5")]
NSString F5 { get; }
[Introduced (PlatformName.MacCatalyst, 13, 4)]
[iOS (13,4), TV (13,4)]
[Field ("UIKeyInputF6")]
NSString F6 { get; }
[Introduced (PlatformName.MacCatalyst, 13, 4)]
[iOS (13,4), TV (13,4)]
[Field ("UIKeyInputF7")]
NSString F7 { get; }
[Introduced (PlatformName.MacCatalyst, 13, 4)]
[iOS (13,4), TV (13,4)]
[Field ("UIKeyInputF8")]
NSString F8 { get; }
[Introduced (PlatformName.MacCatalyst, 13, 4)]
[iOS (13,4), TV (13,4)]
[Field ("UIKeyInputF9")]
NSString F9 { get; }
[Introduced (PlatformName.MacCatalyst, 13, 4)]
[iOS (13,4), TV (13,4)]
[Field ("UIKeyInputF10")]
NSString F10 { get; }
[Introduced (PlatformName.MacCatalyst, 13, 4)]
[iOS (13,4), TV (13,4)]
[Field ("UIKeyInputF11")]
NSString F11 { get; }
[Introduced (PlatformName.MacCatalyst, 13, 4)]
[iOS (13,4), TV (13,4)]
[Field ("UIKeyInputF12")]
NSString F12 { get; }
[iOS (9,0)]
[Deprecated (PlatformName.iOS, 13, 0, message: "Use 'UIKeyCommand.Create (NSString, UIKeyModifierFlags, Selector)' overload instead.")]
[Static]
@ -8539,7 +8619,16 @@ namespace UIKit {
[Export ("setDate:animated:")]
void SetDate (NSDate date, bool animated);
[Introduced (PlatformName.MacCatalyst, 13, 4)]
[iOS (13,4)]
[Export ("preferredDatePickerStyle", ArgumentSemantic.Assign)]
UIDatePickerStyle PreferredDatePickerStyle { get; set; }
[Introduced (PlatformName.MacCatalyst, 13, 4)]
[iOS (13,4)]
[Export ("datePickerStyle", ArgumentSemantic.Assign)]
UIDatePickerStyle DatePickerStyle { get; }
}
[BaseType (typeof (NSObject))]
@ -17686,6 +17775,11 @@ namespace UIKit {
[Export ("force")]
nfloat Force { get; }
[Introduced (PlatformName.MacCatalyst, 13, 4)]
[iOS (13,4), TV (13,4)]
[NullAllowed, Export ("key")]
UIKey Key { get; }
}
[NoWatch]
@ -21043,4 +21137,23 @@ namespace UIKit {
void AddCompletion (Action completion);
}
[Introduced (PlatformName.MacCatalyst, 13, 4)]
[iOS (13,4), NoWatch, TV (13,4)]
[BaseType (typeof (NSObject))]
[DisableDefaultCtor]
interface UIKey : NSCopying, NSCoding {
[Export ("characters")]
string Characters { get; }
[Export ("charactersIgnoringModifiers")]
string CharactersIgnoringModifiers { get; }
[Export ("modifierFlags")]
UIKeyModifierFlags ModifierFlags { get; }
[Export ("keyCode")]
UIKeyboardHidUsage KeyCode { get; }
}
}

Просмотреть файл

@ -34,6 +34,7 @@ namespace VideoSubscriberAccount {
ProviderRejected = 4,
InvalidVerificationToken = 5,
Rejected = 6,
Unsupported = 7,
}
[Native]

Просмотреть файл

@ -515,7 +515,11 @@ namespace WatchKit {
[Watch (6,0)][NoiOS]
[Export ("supportsAudioStreaming")]
bool SupportsAudioStreaming { get; }
[Watch (6,2), NoiOS]
[NullAllowed, Export ("identifierForVendor", ArgumentSemantic.Strong)]
NSUuid IdentifierForVendor { get; }
[Watch (6,1)][NoiOS]
[Export ("enableWaterLock")]
void EnableWaterLock ();

Просмотреть файл

@ -125,6 +125,7 @@ namespace Xamarin.Tests
alternate_version = new Version (7, 0, 0); // our arm64 slices has min iOS 7.0.
} else if (slice.IsDynamicLibrary && !device) {
version = new Version (8, 0, 0);
alternate_version = new Version (7, 0, 0);
}
mono_native_compat_version = version;
mono_native_unified_version = new Version (10, 0, 0);

Просмотреть файл

@ -56,7 +56,7 @@ namespace Introspection {
Minimum = new Version (10,9);
// Need to special case macOS 'Maximum' version for OS minor subversions (can't change Constants.SdkVersion)
// Please comment the code below if needed
Maximum = new Version (10,15,1);
Maximum = new Version (10,15,4);
Filter = (AvailabilityBaseAttribute arg) => {
return (arg.AvailabilityKind != AvailabilityKind.Introduced) || (arg.Platform != PlatformName.MacOSX);
};

Просмотреть файл

@ -172,6 +172,9 @@ namespace Introspection {
case "NSFileProviderRequest":
case "NSFileProviderSearchQuery":
return true;
// Xcode 11.4, not documented
case "NSHttpCookie":
return true;
}
break;
case "NSSecureCoding":
@ -229,6 +232,10 @@ namespace Introspection {
case "NSFileProviderItemVersion":
case "NSFileProviderRequest":
case "NSFileProviderSearchQuery":
case "INUserContext": // Header shows NSSecureCoding but intro on both device and simulator says nope FB7604793
return true;
// Xcode 11.4, not documented
case "NSHttpCookie":
return true;
}
break;

Просмотреть файл

@ -0,0 +1,58 @@
using System;
using System.Reflection;
using System.Runtime.CompilerServices;
using NUnit.Framework;
using Xamarin.Utils;
using Foundation;
using ObjCRuntime;
namespace Introspection {
[TestFixture]
// we want the tests to be available because we use the linker
[Preserve (AllMembers = true)]
public class ApiTypeTest : ApiBaseTest {
bool Skip (Type type)
{
switch (type.Namespace) {
#if __IOS__
// running the .cctor on the simulator works... but makes some other CoreNFC intro tests fail later
// we'll still get the results from device tests
case "CoreNFC":
case "DeviceCheck":
// we can't call the `NFCNdefReaderSession.ReadingAvailable` API on 32bits (PlatformNotSupportedException)
// and if we call it then the .cctor is executed and we get the same failures :()
return ((IntPtr.Size == 4) || (Runtime.Arch == Arch.SIMULATOR));
#endif
default:
return false;
}
}
[Test]
public void StaticCtor ()
{
ContinueOnFailure = true;
foreach (Type t in Assembly.GetTypes ()) {
if (Skip (t))
continue;
var cctor = t.GetConstructor (BindingFlags.Static | BindingFlags.NonPublic, null, Type.EmptyTypes, null);
if (cctor == null)
continue;
// we don't skip based on availability attributes since the execution of .cctor can easily happen indirectly and
// we rather catch them all here *now* than trying to figure out how to replicate the specific conditions *later*
try {
RuntimeHelpers.RunClassConstructor (t.TypeHandle);
}
catch (TypeInitializationException e) {
ReportError ($"{t.FullName} .cctor could not execute properly: {e}");
}
}
AssertIfErrors ($"{Errors} execution failure(s)");
}
}
}

Просмотреть файл

@ -132,6 +132,9 @@
<Compile Include="..\ApiFrameworkTest.cs">
<Link>ApiFrameworkTest.cs</Link>
</Compile>
<Compile Include="..\ApiTypeTest.cs">
<Link>ApiTypeTest.cs</Link>
</Compile>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\external\guiunit\src\framework\GuiUnit_NET_4_5.csproj">

Просмотреть файл

@ -223,6 +223,9 @@
<Compile Include="..\ApiFrameworkTest.cs">
<Link>ApiFrameworkTest.cs</Link>
</Compile>
<Compile Include="..\ApiTypeTest.cs">
<Link>ApiTypeTest.cs</Link>
</Compile>
</ItemGroup>
<ItemGroup>
<None Include="Info.plist">

Просмотреть файл

@ -17,6 +17,9 @@ namespace Xamarin.MMP.Tests
else if (Environment.OSVersion.Version.Major >= 19 /* macOS 10.15+ */)
Assert.Ignore ("Xcode 9.4 does not work on Catalina or later."); // This can check can be removed after switching to a newer Xcode than 9.4.
if (PlatformHelpers.CheckSystemVersion (10, 15))
Assert.Ignore ("This test requires Xcode 9.4, which doesn't work on macOS 10.15+");
MMPTests.RunMMPTest (tmpDir => {
TI.UnifiedTestConfig test = new TI.UnifiedTestConfig (tmpDir);
var output = TI.TestUnifiedExecutable (test, environment: new string[] { "MD_APPLE_SDK_ROOT", Path.GetDirectoryName (Path.GetDirectoryName (oldXcode)) });

Просмотреть файл

@ -318,6 +318,7 @@ class MyObjectErr : NSObject, IFoo1, IFoo2
mtouch.Linker = MTouchLinker.LinkSdk;
mtouch.Registrar = MTouchRegistrar.Static;
mtouch.AssertExecuteFailure (MTouchAction.BuildDev);
// the above MUST be kept in sync with new frameworks or it will fail.
var invalidFrameworks = new [] {
new { Framework = "IdentityLookup", Version = "11.0" },
new { Framework = "FileProviderUI", Version = "11.0" },
@ -334,6 +335,14 @@ class MyObjectErr : NSObject, IFoo1, IFoo2
new { Framework = "CarPlay", Version = "12.0" },
new { Framework = "IdentityLookupUI", Version = "12.0" },
new { Framework = "NaturalLanguage", Version = "12.0" },
new { Framework = "VisionKit", Version = "13.0" },
new { Framework = "SoundAnalysis", Version = "13.0" },
new { Framework = "PencilKit", Version = "13.0" },
new { Framework = "MetricKit", Version = "13.0" },
new { Framework = "LinkPresentation", Version = "13.0" },
new { Framework = "CoreHaptics", Version = "13.0" },
new { Framework = "BackgroundTasks", Version = "13.0" },
new { Framework = "QuickLookThumbnailing", Version = "13.0" },
};
foreach (var framework in invalidFrameworks)
mtouch.AssertError (4134, $"Your application is using the '{framework.Framework}' framework, which isn't included in the iOS SDK you're using to build your app (this framework was introduced in iOS {framework.Version}, while you're building with the iOS {mtouch.Sdk} SDK.) Please select a newer SDK in your app's iOS Build options.");

Просмотреть файл

@ -39,6 +39,7 @@ namespace xharness
public Harness Harness;
public string ProjectFile;
public string AppPath;
public string Variation;
public TestExecutingResult Result { get; private set; }
public string FailureMessage { get; private set; }
@ -360,8 +361,16 @@ namespace xharness
try {
var newFilename = XmlResultParser.GetXmlFilePath (path, xmlType);
// rename the path to the correct value
File.Move (path, newFilename);
// at this point, we have the test results, but we want to be able to have attachments in vsts, so if the format is
// the right one (NUnitV3) add the nodes. ATM only TouchUnit uses V3.
var testRunName = $"{appName} {Variation}";
if (xmlType == XmlResultParser.Jargon.NUnitV3) {
// add the attachments and write in the new filename
XmlResultParser.UpdateMissingData (path, newFilename, testRunName, Directory.GetFiles (Logs.Directory));
} else {
// rename the path to the correct value
File.Move (path, newFilename);
}
path = newFilename;
// write the human readable results in a tmp file, which we later use to step on the logs
@ -371,7 +380,7 @@ namespace xharness
File.Delete (tmpFile);
// we do not longer need the tmp file
Logs.AddFile (path, "Test xml");
Logs.AddFile (path, Log.XML_LOG);
return parseResult;
} catch (Exception e) {
@ -495,6 +504,7 @@ namespace xharness
if (useXmlOutput) {
args.Add ("-setenv=NUNIT_ENABLE_XML_OUTPUT=true");
args.Add ("-setenv=NUNIT_ENABLE_XML_MODE=wrapped");
args.Add ("-setenv=NUNIT_XML_VERSION=nunitv3");
}
if (Harness.InCI) {
@ -529,7 +539,7 @@ namespace xharness
args.Add ($"-argument=-app-arg:-transport:{transport}");
args.Add ($"-setenv=NUNIT_TRANSPORT={transport}");
listener_log = Logs.Create ($"test-{mode}-{Harness.Timestamp}.log", "Test log", timestamp: !useXmlOutput);
listener_log = Logs.Create ($"test-{mode}-{Harness.Timestamp}.log", Log.TEST_LOG, timestamp: !useXmlOutput);
SimpleListener listener;
switch (transport) {
@ -630,7 +640,7 @@ namespace xharness
var log = new CaptureLog (Logs, sim.SystemLog, entire_file: Harness.Action != HarnessAction.Jenkins)
{
Path = Path.Combine (LogDirectory, sim.Name + ".log"),
Description = isCompanion ? "System log (companion)" : "System log",
Description = isCompanion ? Log.COMPANION_SYSTEM_LOG : Log.SYSTEM_LOG,
};
log.StartCapture ();
Logs.Add (log);

Просмотреть файл

@ -126,5 +126,11 @@ namespace xharness
var rnd = new Random ((int) DateTime.Now.Ticks);
return collection.OrderBy (v => rnd.Next ());
}
public static string AsHtml (this string inString)
{
var rv = System.Web.HttpUtility.HtmlEncode (inString);
return rv.Replace ("\t", "&nbsp;&nbsp;&nbsp;&nbsp;").Replace ("\n", "<br/>\n");
}
}
}

Просмотреть файл

@ -2071,7 +2071,7 @@ namespace xharness
writer.WriteLine ($"Known failure: {test.KnownFailure} <br />");
if (!string.IsNullOrEmpty (test.FailureMessage)) {
var msg = HtmlFormat (test.FailureMessage);
var msg = test.FailureMessage.AsHtml ();
var prefix = test.Ignored ? "Ignored" : "Failure";
if (test.FailureMessage.Contains ('\n')) {
writer.WriteLine ($"{prefix}:<br /> <div style='margin-left: 20px;'>{msg}</div>");
@ -2081,7 +2081,7 @@ namespace xharness
}
var progressMessage = test.ProgressMessage;
if (!string.IsNullOrEmpty (progressMessage))
writer.WriteLine (HtmlFormat (progressMessage) + " <br />");
writer.WriteLine (progressMessage.AsHtml () + " <br />");
if (runTest != null) {
if (runTest.BuildTask.Duration.Ticks > 0) {
@ -2115,6 +2115,7 @@ namespace xharness
if (logs.Count () > 0) {
foreach (var log in logs) {
log.Flush ();
var exists = File.Exists (log.FullPath);
string log_type = System.Web.MimeMapping.GetMimeMapping (log.FullPath);
string log_target;
switch (log_type) {
@ -2125,7 +2126,9 @@ namespace xharness
log_target = "_self";
break;
}
if (log.Description == "Build log") {
if (!exists) {
writer.WriteLine ("<a href='{0}' type='{2}' target='{3}'>{1}</a> (does not exist)<br />", LinkEncode (log.FullPath.Substring (LogDirectory.Length + 1)), log.Description, log_type, log_target);
} else if (log.Description == Log.BUILD_LOG) {
var binlog = log.FullPath.Replace (".txt", ".binlog");
if (File.Exists (binlog)) {
var textLink = string.Format ("<a href='{0}' type='{2}' target='{3}'>{1}</a>", LinkEncode (log.FullPath.Substring (LogDirectory.Length + 1)), log.Description, log_type, log_target);
@ -2137,7 +2140,9 @@ namespace xharness
} else {
writer.WriteLine ("<a href='{0}' type='{2}' target='{3}'>{1}</a><br />", LinkEncode (log.FullPath.Substring (LogDirectory.Length + 1)), log.Description, log_type, log_target);
}
if (log.Description == "Test log" || log.Description == "Extension test log" || log.Description == "Execution log") {
if (!exists) {
// Don't try to parse files that don't exist
} else if (log.Description == Log.TEST_LOG || log.Description == Log.EXTENSION_TEST_LOG || log.Description == Log.EXECUTION_LOG) {
string summary;
List<string> fails;
try {
@ -2169,15 +2174,15 @@ namespace xharness
if (fails.Count > 0) {
writer.WriteLine ("<div style='padding-left: 15px;'>");
foreach (var fail in fails)
writer.WriteLine ("{0} <br />", HtmlFormat (fail));
writer.WriteLine ("{0} <br />", fail.AsHtml ());
writer.WriteLine ("</div>");
}
if (!string.IsNullOrEmpty (summary))
writer.WriteLine ("<span style='padding-left: 15px;'>{0}</span><br />", summary);
} catch (Exception ex) {
writer.WriteLine ("<span style='padding-left: 15px;'>Could not parse log file: {0}</span><br />", HtmlFormat (ex.Message));
writer.WriteLine ("<span style='padding-left: 15px;'>Could not parse log file: {0}</span><br />", ex.Message.AsHtml ());
}
} else if (log.Description == "Build log") {
} else if (log.Description == Log.BUILD_LOG) {
HashSet<string> errors;
try {
using (var reader = log.GetReader ()) {
@ -2207,45 +2212,21 @@ namespace xharness
if (errors.Count > 0) {
writer.WriteLine ("<div style='padding-left: 15px;'>");
foreach (var error in errors)
writer.WriteLine ("{0} <br />", HtmlFormat (error));
writer.WriteLine ("{0} <br />", error.AsHtml ());
writer.WriteLine ("</div>");
}
} catch (Exception ex) {
writer.WriteLine ("<span style='padding-left: 15px;'>Could not parse log file: {0}</span><br />", HtmlFormat (ex.Message));
writer.WriteLine ("<span style='padding-left: 15px;'>Could not parse log file: {0}</span><br />", ex.Message.AsHtml ());
}
} else if (log.Description == "NUnit results" || log.Description == "XML log") {
} else if (log.Description == Log.NUNIT_RESULT || log.Description == Log.XML_LOG) {
try {
if (File.Exists (log.FullPath) && new FileInfo (log.FullPath).Length > 0) {
if (XmlResultParser.IsValidXml (log.FullPath, out var jargon)) {
if (jargon == XmlResultParser.Jargon.NUnit) {
var doc = new XmlDocument ();
doc.LoadWithoutNetworkAccess (log.FullPath);
var failures = doc.SelectNodes ("//test-case[@result='Error' or @result='Failure']").Cast<System.Xml.XmlNode> ().ToArray ();
if (failures.Length > 0) {
writer.WriteLine ("<div style='padding-left: 15px;'>");
writer.WriteLine ("<ul>");
foreach (var failure in failures) {
writer.WriteLine ("<li>");
var test_name = failure.Attributes ["name"]?.Value;
var message = failure.SelectSingleNode ("failure/message")?.InnerText;
writer.Write (HtmlFormat (test_name));
if (!string.IsNullOrEmpty (message)) {
writer.Write (": ");
writer.Write (HtmlFormat (message));
}
writer.WriteLine ("<br />");
writer.WriteLine ("</li>");
}
writer.WriteLine ("</ul>");
writer.WriteLine ("</div>");
}
} else {
writer.WriteLine ($"<span style='padding-left: 15px;'>Could not parse {log.Description}: Not supported format.</span><br />");
}
XmlResultParser.GenerateTestReport (writer, log.FullPath, jargon);
}
}
} catch (Exception ex) {
writer.WriteLine ($"<span style='padding-left: 15px;'>Could not parse {log.Description}: {HtmlFormat (ex.Message)}</span><br />");
writer.WriteLine ($"<span style='padding-left: 15px;'>Could not parse {log.Description}: {ex.Message.AsHtml ()}</span><br />");
}
}
}
@ -2287,7 +2268,7 @@ namespace xharness
if (runningTests.Any ()) {
writer.WriteLine ($"<h3>{runningTests.Count ()} running tests:</h3>");
foreach (var test in runningTests) {
writer.WriteLine ($"<a href='#test_{test.TestName}'>{test.TestName} ({test.Mode})</a> {test.Duration.ToString ()} {HtmlFormat ("\n\t" + test.ProgressMessage)}<br />");
writer.WriteLine ($"<a href='#test_{test.TestName}'>{test.TestName} ({test.Mode})</a> {test.Duration.ToString ()} {("\n\t" + test.ProgressMessage).AsHtml ()}<br />");
}
}
@ -2321,12 +2302,6 @@ namespace xharness
}
Dictionary<Log, Tuple<long, object>> log_data = new Dictionary<Log, Tuple<long, object>> ();
static string HtmlFormat (string value)
{
var rv = System.Web.HttpUtility.HtmlEncode (value);
return rv.Replace ("\t", "&nbsp;&nbsp;&nbsp;&nbsp;").Replace ("\n", "<br/>\n");
}
static string LinkEncode (string path)
{
return System.Web.HttpUtility.UrlEncode (path).Replace ("%2f", "/").Replace ("+", "%20");
@ -2927,7 +2902,7 @@ namespace xharness
make.StartInfo.WorkingDirectory = WorkingDirectory;
make.StartInfo.Arguments = Target;
SetEnvironmentVariables (make);
var log = Logs.Create ($"make-{Platform}-{Timestamp}.txt", "Build log");
var log = Logs.Create ($"make-{Platform}-{Timestamp}.txt", Log.BUILD_LOG);
LogEvent (log, "Making {0} in {1}", Target, WorkingDirectory);
if (!Harness.DryRun) {
var timeout = Timeout;
@ -2956,7 +2931,7 @@ namespace xharness
protected override async Task ExecuteAsync ()
{
using (var resource = await NotifyAndAcquireDesktopResourceAsync ()) {
var log = Logs.Create ($"build-{Platform}-{Timestamp}.txt", "Build log");
var log = Logs.Create ($"build-{Platform}-{Timestamp}.txt", Log.BUILD_LOG);
var binlogPath = log.FullPath.Replace (".txt", ".binlog");
await RestoreNugetsAsync (log, resource, useXIBuild: true);
@ -3123,8 +3098,8 @@ namespace xharness
protected override async Task RunTestAsync ()
{
using (var resource = await NotifyAndAcquireDesktopResourceAsync ()) {
var xmlLog = Logs.CreateFile ($"log-{Timestamp}.xml", "XML log");
var log = Logs.Create ($"execute-{Timestamp}.txt", "Execution log");
var xmlLog = Logs.CreateFile ($"log-{Timestamp}.xml", Log.XML_LOG);
var log = Logs.Create ($"execute-{Timestamp}.txt", Log.EXECUTION_LOG);
FindNUnitConsoleExecutable (log);
using (var proc = new Process ()) {
@ -3301,7 +3276,7 @@ namespace xharness
proc.StartInfo.EnvironmentVariables ["DISABLE_SYSTEM_PERMISSION_TESTS"] = "1";
proc.StartInfo.EnvironmentVariables ["MONO_DEBUG"] = "no-gdb-backtrace";
Jenkins.MainLog.WriteLine ("Executing {0} ({1})", TestName, Mode);
var log = Logs.Create ($"execute-{Platform}-{Timestamp}.txt", "Execution log");
var log = Logs.Create ($"execute-{Platform}-{Timestamp}.txt", Log.EXECUTION_LOG);
if (!Harness.DryRun) {
ExecutionResult = TestExecutingResult.Running;
@ -3355,8 +3330,8 @@ namespace xharness
proc.StartInfo.Arguments = $"--debug {reporter} {WorkingDirectory} {results}";
Jenkins.MainLog.WriteLine ("Executing {0} ({1})", TestName, Mode);
var log = Logs.Create ($"execute-xtro-{Timestamp}.txt", "Execution log");
log.WriteLine ("{0} {1}", proc.StartInfo.FileName, proc.StartInfo.Arguments);
var log = Logs.Create ($"execute-xtro-{Timestamp}.txt", Log.EXECUTION_LOG);
log.WriteLine ("{0} {1}", proc.StartInfo.FileName, proc.StartInfo.Arguments);
if (!Harness.DryRun) {
ExecutionResult = TestExecutingResult.Running;
@ -3662,6 +3637,7 @@ namespace xharness
CompanionDeviceName = CompanionDevice?.Name,
Configuration = ProjectConfiguration,
TimeoutMultiplier = TimeoutMultiplier,
Variation = Variation,
};
// Sometimes devices can't upgrade (depending on what has changed), so make sure to uninstall any existing apps first.
@ -3716,6 +3692,7 @@ namespace xharness
DeviceName = Device.Name,
CompanionDeviceName = CompanionDevice?.Name,
Configuration = ProjectConfiguration,
Variation = Variation,
};
additional_runner = todayRunner;
await todayRunner.RunAsync ();
@ -3826,6 +3803,7 @@ namespace xharness
MainLog = Logs.Create ($"run-{Device.UDID}-{Timestamp}.log", "Run log"),
Configuration = ProjectConfiguration,
TimeoutMultiplier = TimeoutMultiplier,
Variation = Variation
};
runner.Simulators = Simulators;
runner.Initialize ();

Просмотреть файл

@ -12,6 +12,15 @@ namespace xharness
public string Description;
public bool Timestamp = true;
public static string XML_LOG = "XML log";
public static string NUNIT_RESULT = "NUnit results";
public static string SYSTEM_LOG = "System log";
public static string COMPANION_SYSTEM_LOG = "System log (companion)";
public static string BUILD_LOG = "Build log";
public static string TEST_LOG = "Test log";
public static string EXTENSION_TEST_LOG = "Extension test log";
public static string EXECUTION_LOG = "Execution log";
protected Log (Logs logs)
{
Logs = logs;

Просмотреть файл

@ -1,13 +1,17 @@
using System;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Xml;
using System.Xml.Linq;
namespace xharness {
public static class XmlResultParser {
public enum Jargon {
TouchUnit,
NUnit,
NUnitV2,
NUnitV3,
xUnit,
Missing,
}
@ -24,15 +28,19 @@ namespace xharness {
while ((line = stream.ReadLine ()) != null) { // special case when get got the tcp connection
if (line.Contains ("ping"))
continue;
if (line.Contains ("test-run")) { // first element of the NUnitV3 test collection
type = Jargon.NUnitV3;
return true;
}
if (line.Contains ("TouchUnitTestRun")) {
type = Jargon.TouchUnit;
return true;
}
if (line.Contains ("nunit-version")) {
type = Jargon.NUnit;
if (line.Contains ("test-results")) { // first element of the NUnitV3 test collection
type = Jargon.NUnitV2;
return true;
}
if (line.Contains ("xUnit")) {
if (line.Contains ("<assemblies>")) { // first element of the xUnit test collection
type = Jargon.xUnit;
return true;
}
@ -41,6 +49,75 @@ namespace xharness {
return false;
}
static (string resultLine, bool failed) ParseNUnitV3Xml (StreamReader stream, StreamWriter writer)
{
long testcasecount, passed, failed, inconclusive, skipped;
bool failedTestRun = false; // result = "Failed"
testcasecount = passed = failed = inconclusive = skipped = 0L;
using (var reader = XmlReader.Create (stream)) {
while (reader.Read ()) {
if (reader.NodeType == XmlNodeType.Element && reader.Name == "test-run") {
long.TryParse (reader ["testcasecount"], out testcasecount);
long.TryParse (reader ["passed"], out passed);
long.TryParse (reader ["failed"], out failed);
long.TryParse (reader ["inconclusive"], out inconclusive);
long.TryParse (reader ["skipped"], out skipped);
failedTestRun = failed != 0;
}
if (reader.NodeType == XmlNodeType.Element && reader.Name == "test-suite" && (reader ["type"] == "TestFixture" || reader ["type"] == "ParameterizedFixture")) {
var testCaseName = reader ["fullname"];
writer.WriteLine (testCaseName);
var time = reader.GetAttribute ("time") ?? "0"; // some nodes might not have the time :/
// get the first node and then move in the siblings of the same type
reader.ReadToDescendant ("test-case");
do {
if (reader.Name != "test-case")
break;
// read the test cases in the current node
var status = reader ["result"];
switch (status) {
case "Passed":
writer.Write ("\t[PASS] ");
break;
case "Skipped":
writer.Write ("\t[IGNORED] ");
break;
case "Error":
case "Failed":
writer.Write ("\t[FAIL] ");
break;
case "Inconclusive":
writer.Write ("\t[INCONCLUSIVE] ");
break;
default:
writer.Write ("\t[INFO] ");
break;
}
writer.Write (reader ["name"]);
if (status == "Failed") { // we need to print the message
reader.ReadToDescendant ("failure");
reader.ReadToDescendant ("message");
writer.Write ($" : {reader.ReadElementContentAsString ()}");
reader.ReadToNextSibling ("stack-trace");
writer.Write ($" : {reader.ReadElementContentAsString ()}");
}
if (status == "Skipped") { // nice to have the skip reason
reader.ReadToDescendant ("reason");
reader.ReadToDescendant ("message");
writer.Write ($" : {reader.ReadElementContentAsString ()}");
}
// add a new line
writer.WriteLine ();
} while (reader.ReadToNextSibling ("test-case"));
writer.WriteLine ($"{testCaseName} {time} ms");
}
}
}
var resultLine = $"Tests run: {testcasecount} Passed: {passed} Inconclusive: {inconclusive} Failed: {failed} Ignored: {skipped + inconclusive}";
return (resultLine, failedTestRun);
}
static (string resultLine, bool failed) ParseTouchUnitXml (StreamReader stream, StreamWriter writer)
{
long total, errors, failed, notRun, inconclusive, ignored, skipped, invalid;
@ -205,7 +282,8 @@ namespace xharness {
var fileName = Path.GetFileName (path);
switch (xmlType) {
case Jargon.TouchUnit:
case Jargon.NUnit:
case Jargon.NUnitV2:
case Jargon.NUnitV3:
return path.Replace (fileName, $"nunit-{fileName}");
case Jargon.xUnit:
return path.Replace (fileName, $"xunit-{fileName}");
@ -241,9 +319,12 @@ namespace xharness {
case Jargon.TouchUnit:
parseData = ParseTouchUnitXml (reader, writer);
break;
case Jargon.NUnit:
case Jargon.NUnitV2:
parseData = ParseNUnitXml (reader, writer);
break;
case Jargon.NUnitV3:
parseData = ParseNUnitV3Xml (reader, writer);
break;
case Jargon.xUnit:
parseData = ParsexUnitXml (reader, writer);
break;
@ -254,5 +335,192 @@ namespace xharness {
}
return parseData;
}
static void GenerateNUnitV2TestReport (StreamWriter writer, XmlReader reader)
{
while (reader.Read ()) {
if (reader.NodeType == XmlNodeType.Element && reader.Name == "test-suite" && (reader ["type"] == "TestFixture" || reader ["type"] == "TestCollection")) {
long.TryParse (reader ["errors"], out var errors);
long.TryParse (reader ["failed"], out var failed);
if (errors == 0 && failed == 0) {
// if we do not have any errors, return, nothing to be written here
return;
}
writer.WriteLine ("<div style='padding-left: 15px;'>");
writer.WriteLine ("<ul>");
reader.ReadToDescendant ("test-case");
do {
if (reader.Name != "test-case")
break;
// read the test cases in the current node
var status = reader ["result"];
switch (status) { // only interested in errors
case "Error":
case "Failure":
writer.WriteLine ("<li>");
var test_name = reader ["name"];
writer.Write (test_name.AsHtml ());
// read to the message of the error and get it
reader.ReadToDescendant ("message");
var message = reader.ReadElementContentAsString ();
if (!string.IsNullOrEmpty (message)) {
writer.Write (": ");
writer.Write (message.AsHtml ());
}
writer.WriteLine ("<br />");
writer.WriteLine ("</li>");
break;
}
} while (reader.ReadToNextSibling ("test-case"));
}
}
}
static void GenerateNUnitV3TestReport (StreamWriter writer, XmlReader reader)
{
List<(string name, string message)> failedTests = new List<(string name, string message)> ();
while (reader.Read ()) {
if (reader.NodeType == XmlNodeType.Element && reader.Name == "test-run") {
long.TryParse (reader ["failed"], out var failed);
if (failed == 0)
break;
}
if (reader.NodeType == XmlNodeType.Element && reader.Name == "test-suite" && (reader ["type"] == "TestFixture" || reader ["type"] == "ParameterizedFixture")) {
var testCaseName = reader ["fullname"];
reader.ReadToDescendant ("test-case");
do {
if (reader.Name != "test-case")
break;
// read the test cases in the current node
var status = reader ["result"];
switch (status) {
case "Error":
case "Failed":
var name = reader ["name"];
reader.ReadToDescendant ("message");
var message = reader.ReadElementContentAsString ();
failedTests.Add ((name, message));
break;
}
} while (reader.ReadToNextSibling ("test-case"));
}
}
if (failedTests.Count > 0) {
writer.WriteLine ("<div style='padding-left: 15px;'>");
writer.WriteLine ("<ul>");
foreach (var (name, message) in failedTests) {
writer.WriteLine ("<li>");
writer.Write (name.AsHtml ());
if (!string.IsNullOrEmpty (message)) {
writer.Write (": ");
writer.Write (message.AsHtml ());
}
}
writer.WriteLine ("<br />");
writer.WriteLine ("</li>");
}
}
static void GeneratexUnitTestReport (StreamWriter writer, XmlReader reader)
{
var failedTests = new List<(string name, string message)> ();
// xUnit is not as nice and does not provide the final result in a top node,
// we need to look in all the collections and find all the failed tests, this is really bad :/
while (reader.Read ()) {
if (reader.NodeType == XmlNodeType.Element && reader.Name == "collection") {
reader.ReadToDescendant ("test");
do {
if (reader.Name != "test")
break;
// read the test cases in the current node
var status = reader ["result"];
switch (status) {
case "Fail":
var name = reader ["name"];
reader.ReadToDescendant ("message");
var message = reader.ReadElementContentAsString ();
failedTests.Add ((name, message));
break;
}
} while (reader.ReadToNextSibling ("test"));
}
}
if (failedTests.Count > 0) {
writer.WriteLine ("<div style='padding-left: 15px;'>");
writer.WriteLine ("<ul>");
foreach (var (name, message) in failedTests) {
writer.WriteLine ("<li>");
writer.Write (name.AsHtml ());
if (!string.IsNullOrEmpty (message)) {
writer.Write (": ");
writer.Write (message.AsHtml ());
}
}
writer.WriteLine ("<br />");
writer.WriteLine ("</li>");
}
}
public static void GenerateTestReport (StreamWriter writer, string resultsPath, Jargon xmlType)
{
using (var stream = new StreamReader (resultsPath))
using (var reader = XmlReader.Create (stream)) {
switch (xmlType) {
case Jargon.NUnitV2:
case Jargon.TouchUnit:
GenerateNUnitV2TestReport (writer, reader);
break;
case Jargon.xUnit:
GeneratexUnitTestReport (writer, reader);
break;
case Jargon.NUnitV3:
GenerateNUnitV3TestReport (writer, reader);
break;
default:
writer.WriteLine ($"<span style='padding-left: 15px;'>Could not parse {resultsPath}: Not supported format.</span><br />");
break;
}
}
}
// get the file, parse it and add the attachments to the first node found
public static void UpdateMissingData (string source, string destination, string applicationName, params string [] attachments)
{
// we could do this with a XmlReader and a Writer, but might be to complicated to get right, we pay with performance what we
// cannot pay with brain cells.
var doc = XDocument.Load (source);
var attachmentsElement = new XElement ("attachments");
foreach (var path in attachments) {
// we do not add a description, VSTS ignores that :/
attachmentsElement.Add (new XElement ("attachment",
new XElement ("filePath", path)));
}
var testSuitesElements = doc.Descendants ().Where (e => e.Name == "test-suite" && e.Attribute ("type")?.Value == "Assembly");
if (!testSuitesElements.Any ())
return;
// add the attachments to the first test-suite, this will add the attachmnets to it, which will be added to the test-run, the pipeline
// SHOULD NOT merge runs, else this upload will be really hard to use. Also, just to one of them, else we have duplicated logs.
testSuitesElements.FirstOrDefault ().Add (attachmentsElement);
foreach (var suite in testSuitesElements) {
suite.SetAttributeValue ("name", applicationName);
suite.SetAttributeValue ("fullname", applicationName); // docs say just name, but I've seen the fullname instead, docs usually lie
// add also the attachments to all the failing tests, this will make the life of the person monitoring easier, since
// he will see the logs directly from the attachment page
var tests = suite.Descendants ().Where (e => e.Name == "test-case" && e.Attribute ("result").Value == "Failed");
foreach (var t in tests) {
t.Add (attachmentsElement);
}
}
doc.Save (destination);
}
}
}

Просмотреть файл

@ -64,6 +64,7 @@
<Reference Include="Mono.Posix" />
<Reference Include="System.Runtime.Serialization" />
<Reference Include="mscorlib" />
<Reference Include="System.Xml.Linq" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Mono.Options" Version="5.3.0.1" />

Просмотреть файл

@ -49,6 +49,7 @@ namespace Extrospection {
{ "tls_protocol_version_t", "TlsProtocolVersion" },
{ "UIDataDetectorTypes", "UIDataDetectorType" },
{ "UIControlEvents", "UIControlEvent" },
{ "UIKeyboardHIDUsage", "UIKeyboardHidUsage" },
{ "UITableViewCellAccessoryType", "UITableViewCellAccessory" },
{ "UITableViewCellStateMask", "UITableViewCellState" },
{ "WatchKitErrorCode", "WKErrorCode" }, // WebKit already had that name

Просмотреть файл

@ -48,7 +48,7 @@ XMAC_ARCH = x86_64
XMAC_PCH = macosx$(OSX_SDK_VERSION)-$(XMAC_ARCH).pch
$(XMAC_PCH): .stamp-check-sharpie
sharpie sdk-db --xcode $(XCODE) -s macosx$(OSX_SDK_VERSION) -a $(XMAC_ARCH) -exclude DriverKit -exclude IOUSBHost -exclude NetworkingDriverKit -exclude USBDriverKit -exclude USBSerialDriverKit -exclude HIDDriverKit -exclude PDFKit
sharpie sdk-db --xcode $(XCODE) -s macosx$(OSX_SDK_VERSION) -a $(XMAC_ARCH) -exclude DriverKit -exclude IOUSBHost -exclude NetworkingDriverKit -exclude USBDriverKit -exclude USBSerialDriverKit -exclude HIDDriverKit -exclude PCIDriverKit -exclude PDFKit

Просмотреть файл

@ -36,7 +36,12 @@
!missing-selector! +INIntentResolutionResult::needsValue not bound
!missing-selector! +INIntentResolutionResult::notRequired not bound
!missing-selector! +INIntentResolutionResult::unsupported not bound
!missing-selector! +INIntentResolutionResult::confirmationRequiredWithItemToConfirm:forReason: not bound
!missing-selector! +INIntentResolutionResult::unsupportedWithReason: not bound
## NS_DEPRECATED(13_0, 13_0, 6_0, 6_0)
!missing-selector! INMediaSearch::activityNames not bound
!missing-selector! INMediaSearch::initWithMediaType:sortOrder:mediaName:artistName:albumName:genreNames:moodNames:activityNames:releaseDate:reference:mediaIdentifier: not bound
## unsorted

Просмотреть файл

Просмотреть файл

Просмотреть файл

Просмотреть файл

Просмотреть файл

Просмотреть файл

Просмотреть файл

Просмотреть файл

@ -1,399 +0,0 @@
!deprecated-attribute-missing! INAddTasksIntent::initWithTargetTaskList:taskTitles:spatialEventTrigger:temporalEventTrigger: missing a [Deprecated] attribute
!deprecated-attribute-missing! INNoteContentTypeResolutionResult missing a [Deprecated] attribute
!deprecated-attribute-missing! INPlayMediaIntent::initWithMediaItems:mediaContainer:playShuffled:playbackRepeatMode:resumePlayback: missing a [Deprecated] attribute
!deprecated-attribute-missing! INSearchForNotebookItemsIntent::initWithTitle:content:itemType:status:location:locationSearchType:dateTime:dateSearchType:notebookItemIdentifier: missing a [Deprecated] attribute
!deprecated-attribute-missing! INSetTaskAttributeIntent::initWithTargetTask:status:spatialEventTrigger:temporalEventTrigger: missing a [Deprecated] attribute
!deprecated-attribute-missing! INStartAudioCallIntent missing a [Deprecated] attribute
!deprecated-attribute-missing! INStartAudioCallIntentResponse missing a [Deprecated] attribute
!deprecated-attribute-missing! INStartVideoCallIntent missing a [Deprecated] attribute
!deprecated-attribute-missing! INStartVideoCallIntentResponse missing a [Deprecated] attribute
!extra-designated-initializer! INAddTasksIntent::initWithTargetTaskList:taskTitles:spatialEventTrigger:temporalEventTrigger: is incorrectly decorated with an [DesignatedInitializer] attribute
!extra-designated-initializer! INCallRecord::initWithIdentifier:dateCreated:caller:callRecordType:callCapability:callDuration:unseen: is incorrectly decorated with an [DesignatedInitializer] attribute
!extra-designated-initializer! INMediaItem::initWithIdentifier:title:type:artwork: is incorrectly decorated with an [DesignatedInitializer] attribute
!extra-designated-initializer! INPlayMediaIntent::initWithMediaItems:mediaContainer:playShuffled:playbackRepeatMode:resumePlayback: is incorrectly decorated with an [DesignatedInitializer] attribute
!extra-designated-initializer! INSearchForNotebookItemsIntent::initWithTitle:content:itemType:status:location:locationSearchType:dateTime:dateSearchType:notebookItemIdentifier: is incorrectly decorated with an [DesignatedInitializer] attribute
!extra-designated-initializer! INSetTaskAttributeIntent::initWithTargetTask:status:spatialEventTrigger:temporalEventTrigger: is incorrectly decorated with an [DesignatedInitializer] attribute
!extra-designated-initializer! INTask::initWithTitle:status:taskType:spatialEventTrigger:temporalEventTrigger:createdDateComponents:modifiedDateComponents:identifier: is incorrectly decorated with an [DesignatedInitializer] attribute
!missing-enum! INAddMediaIntentResponseCode not bound
!missing-enum! INAddMediaMediaDestinationUnsupportedReason not bound
!missing-enum! INAddMediaMediaItemUnsupportedReason not bound
!missing-enum! INAddTasksTargetTaskListConfirmationReason not bound
!missing-enum! INAddTasksTemporalEventTriggerUnsupportedReason not bound
!missing-enum! INCallAudioRoute not bound
!missing-enum! INDeleteTasksIntentResponseCode not bound
!missing-enum! INDeleteTasksTaskListUnsupportedReason not bound
!missing-enum! INDeleteTasksTaskUnsupportedReason not bound
!missing-enum! INGetReservationDetailsIntentResponseCode not bound
!missing-enum! INMediaAffinityType not bound
!missing-enum! INMediaDestinationType not bound
!missing-enum! INMediaReference not bound
!missing-enum! INMediaSortOrder not bound
!missing-enum! INMediaUserContextSubscriptionStatus not bound
!missing-enum! INPlaybackQueueLocation not bound
!missing-enum! INPlayMediaMediaItemUnsupportedReason not bound
!missing-enum! INPlayMediaPlaybackSpeedUnsupportedReason not bound
!missing-enum! INReservationActionType not bound
!missing-enum! INReservationStatus not bound
!missing-enum! INSearchForMediaIntentResponseCode not bound
!missing-enum! INSearchForMediaMediaItemUnsupportedReason not bound
!missing-enum! INSetTaskAttributeTemporalEventTriggerUnsupportedReason not bound
!missing-enum! INSnoozeTasksIntentResponseCode not bound
!missing-enum! INSnoozeTasksTaskUnsupportedReason not bound
!missing-enum! INStartCallCallCapabilityUnsupportedReason not bound
!missing-enum! INStartCallContactUnsupportedReason not bound
!missing-enum! INStartCallIntentResponseCode not bound
!missing-enum! INTaskPriority not bound
!missing-enum! INTemporalEventTriggerTypeOptions not bound
!missing-enum! INTicketedEventCategory not bound
!missing-enum! INUpdateMediaAffinityIntentResponseCode not bound
!missing-enum! INUpdateMediaAffinityMediaItemUnsupportedReason not bound
!missing-field! INPersonRelationshipDaughter not bound
!missing-field! INPersonRelationshipSon not bound
!missing-protocol! INAddMediaIntentHandling not bound
!missing-protocol! INDeleteTasksIntentHandling not bound
!missing-protocol! INSearchForMediaIntentHandling not bound
!missing-protocol! INSnoozeTasksIntentHandling not bound
!missing-protocol! INStartCallIntentHandling not bound
!missing-protocol! INUpdateMediaAffinityIntentHandling not bound
!missing-protocol-member! INAddTasksIntentHandling::resolvePriorityForAddTasks:withCompletion: not found
!missing-protocol-member! INAddTasksIntentHandling::resolveTargetTaskListForAddTasks:completion: not found
!missing-protocol-member! INAddTasksIntentHandling::resolveTemporalEventTriggerForAddTasks:completion: not found
!missing-protocol-member! INPlayMediaIntentHandling::resolveMediaItemsForPlayMedia:withCompletion: not found
!missing-protocol-member! INPlayMediaIntentHandling::resolvePlaybackQueueLocationForPlayMedia:withCompletion: not found
!missing-protocol-member! INPlayMediaIntentHandling::resolvePlaybackRepeatModeForPlayMedia:withCompletion: not found
!missing-protocol-member! INPlayMediaIntentHandling::resolvePlaybackSpeedForPlayMedia:withCompletion: not found
!missing-protocol-member! INPlayMediaIntentHandling::resolvePlayShuffledForPlayMedia:withCompletion: not found
!missing-protocol-member! INPlayMediaIntentHandling::resolveResumePlaybackForPlayMedia:withCompletion: not found
!missing-protocol-member! INSearchForNotebookItemsIntentHandling::resolveTaskPriorityForSearchForNotebookItems:withCompletion: not found
!missing-protocol-member! INSearchForNotebookItemsIntentHandling::resolveTemporalEventTriggerTypesForSearchForNotebookItems:withCompletion: not found
!missing-protocol-member! INSetTaskAttributeIntentHandling::resolvePriorityForSetTaskAttribute:withCompletion: not found
!missing-protocol-member! INSetTaskAttributeIntentHandling::resolveTaskTitleForSetTaskAttribute:withCompletion: not found
!missing-protocol-member! INSetTaskAttributeIntentHandling::resolveTemporalEventTriggerForSetTaskAttribute:completion: not found
!missing-selector! +INAddMediaMediaDestinationResolutionResult::unsupportedForReason: not bound
!missing-selector! +INAddMediaMediaItemResolutionResult::unsupportedForReason: not bound
!missing-selector! +INAddTasksTargetTaskListResolutionResult::confirmationRequiredWithTaskListToConfirm:forReason: not bound
!missing-selector! +INAddTasksTemporalEventTriggerResolutionResult::unsupportedForReason: not bound
!missing-selector! +INCallCapabilityResolutionResult::confirmationRequiredWithCallCapabilityToConfirm: not bound
!missing-selector! +INCallCapabilityResolutionResult::successWithResolvedCallCapability: not bound
!missing-selector! +INDeleteTasksTaskListResolutionResult::unsupportedForReason: not bound
!missing-selector! +INDeleteTasksTaskResolutionResult::unsupportedForReason: not bound
!missing-selector! +INEnergyResolutionResult::confirmationRequiredWithEnergyToConfirm: not bound
!missing-selector! +INEnergyResolutionResult::disambiguationWithEnergyToDisambiguate: not bound
!missing-selector! +INEnergyResolutionResult::successWithResolvedEnergy: not bound
!missing-selector! +INEnumResolutionResult::confirmationRequiredWithValueToConfirm: not bound
!missing-selector! +INEnumResolutionResult::successWithResolvedValue: not bound
!missing-selector! +INFile::fileWithData:filename:typeIdentifier: not bound
!missing-selector! +INFile::fileWithFileURL:filename:typeIdentifier: not bound
!missing-selector! +INFileResolutionResult::confirmationRequiredWithFileToConfirm: not bound
!missing-selector! +INFileResolutionResult::disambiguationWithFilesToDisambiguate: not bound
!missing-selector! +INFileResolutionResult::successWithResolvedFile: not bound
!missing-selector! +INIntentResolutionResult::confirmationRequiredWithItemToConfirm:forReason: not bound
!missing-selector! +INIntentResolutionResult::unsupportedWithReason: not bound
!missing-selector! +INLengthResolutionResult::confirmationRequiredWithLengthToConfirm: not bound
!missing-selector! +INLengthResolutionResult::disambiguationWithLengthsToDisambiguate: not bound
!missing-selector! +INLengthResolutionResult::successWithResolvedLength: not bound
!missing-selector! +INMassResolutionResult::confirmationRequiredWithMassToConfirm: not bound
!missing-selector! +INMassResolutionResult::disambiguationWithMassToDisambiguate: not bound
!missing-selector! +INMassResolutionResult::successWithResolvedMass: not bound
!missing-selector! +INMediaAffinityTypeResolutionResult::confirmationRequiredWithMediaAffinityTypeToConfirm: not bound
!missing-selector! +INMediaAffinityTypeResolutionResult::successWithResolvedMediaAffinityType: not bound
!missing-selector! +INMediaDestination::libraryDestination not bound
!missing-selector! +INMediaDestination::playlistDestinationWithName: not bound
!missing-selector! +INMediaDestinationResolutionResult::confirmationRequiredWithMediaDestinationToConfirm: not bound
!missing-selector! +INMediaDestinationResolutionResult::disambiguationWithMediaDestinationsToDisambiguate: not bound
!missing-selector! +INMediaDestinationResolutionResult::successWithResolvedMediaDestination: not bound
!missing-selector! +INMediaItemResolutionResult::confirmationRequiredWithMediaItemToConfirm: not bound
!missing-selector! +INMediaItemResolutionResult::disambiguationWithMediaItemsToDisambiguate: not bound
!missing-selector! +INMediaItemResolutionResult::successesWithResolvedMediaItems: not bound
!missing-selector! +INMediaItemResolutionResult::successWithResolvedMediaItem: not bound
!missing-selector! +INObjectResolutionResult::confirmationRequiredWithObjectToConfirm: not bound
!missing-selector! +INObjectResolutionResult::disambiguationWithObjectsToDisambiguate: not bound
!missing-selector! +INObjectResolutionResult::successWithResolvedObject: not bound
!missing-selector! +INPaymentMethodResolutionResult::confirmationRequiredWithPaymentMethodToConfirm: not bound
!missing-selector! +INPaymentMethodResolutionResult::disambiguationWithPaymentMethodsToDisambiguate: not bound
!missing-selector! +INPaymentMethodResolutionResult::successWithResolvedPaymentMethod: not bound
!missing-selector! +INPlaybackQueueLocationResolutionResult::confirmationRequiredWithPlaybackQueueLocationToConfirm: not bound
!missing-selector! +INPlaybackQueueLocationResolutionResult::successWithResolvedPlaybackQueueLocation: not bound
!missing-selector! +INPlaybackRepeatModeResolutionResult::confirmationRequiredWithPlaybackRepeatModeToConfirm: not bound
!missing-selector! +INPlaybackRepeatModeResolutionResult::successWithResolvedPlaybackRepeatMode: not bound
!missing-selector! +INPlayMediaMediaItemResolutionResult::unsupportedForReason: not bound
!missing-selector! +INPlayMediaPlaybackSpeedResolutionResult::unsupportedForReason: not bound
!missing-selector! +INSearchForMediaMediaItemResolutionResult::unsupportedForReason: not bound
!missing-selector! +INSetTaskAttributeTemporalEventTriggerResolutionResult::unsupportedForReason: not bound
!missing-selector! +INSnoozeTasksTaskResolutionResult::unsupportedForReason: not bound
!missing-selector! +INSpeedResolutionResult::confirmationRequiredWithSpeedToConfirm: not bound
!missing-selector! +INSpeedResolutionResult::disambiguationWithSpeedToDisambiguate: not bound
!missing-selector! +INSpeedResolutionResult::successWithResolvedSpeed: not bound
!missing-selector! +INStartCallCallCapabilityResolutionResult::unsupportedForReason: not bound
!missing-selector! +INStartCallContactResolutionResult::unsupportedForReason: not bound
!missing-selector! +INTaskPriorityResolutionResult::confirmationRequiredWithTaskPriorityToConfirm: not bound
!missing-selector! +INTaskPriorityResolutionResult::successWithResolvedTaskPriority: not bound
!missing-selector! +INTemporalEventTriggerTypeOptionsResolutionResult::confirmationRequiredWithTemporalEventTriggerTypeOptionsToConfirm: not bound
!missing-selector! +INTemporalEventTriggerTypeOptionsResolutionResult::successWithResolvedTemporalEventTriggerTypeOptions: not bound
!missing-selector! +INTimeIntervalResolutionResult::confirmationRequiredWithTimeIntervalToConfirm: not bound
!missing-selector! +INTimeIntervalResolutionResult::successWithResolvedTimeInterval: not bound
!missing-selector! +INUpdateMediaAffinityMediaItemResolutionResult::unsupportedForReason: not bound
!missing-selector! +INURLResolutionResult::confirmationRequiredWithURLToConfirm: not bound
!missing-selector! +INURLResolutionResult::disambiguationWithURLsToDisambiguate: not bound
!missing-selector! +INURLResolutionResult::successWithResolvedURL: not bound
!missing-selector! +INVolumeResolutionResult::confirmationRequiredWithVolumeToConfirm: not bound
!missing-selector! +INVolumeResolutionResult::disambiguationWithVolumeToDisambiguate: not bound
!missing-selector! +INVolumeResolutionResult::successWithResolvedVolume: not bound
!missing-selector! INAddMediaIntent::initWithMediaItems:mediaSearch:mediaDestination: not bound
!missing-selector! INAddMediaIntent::mediaDestination not bound
!missing-selector! INAddMediaIntent::mediaItems not bound
!missing-selector! INAddMediaIntent::mediaSearch not bound
!missing-selector! INAddMediaIntentResponse::code not bound
!missing-selector! INAddMediaIntentResponse::initWithCode:userActivity: not bound
!missing-selector! INAddMediaMediaDestinationResolutionResult::initWithMediaDestinationResolutionResult: not bound
!missing-selector! INAddMediaMediaItemResolutionResult::initWithMediaItemResolutionResult: not bound
!missing-selector! INAddTasksIntent::initWithTargetTaskList:taskTitles:spatialEventTrigger:temporalEventTrigger:priority: not bound
!missing-selector! INAddTasksIntent::priority not bound
!missing-selector! INAddTasksTargetTaskListResolutionResult::initWithTaskListResolutionResult: not bound
!missing-selector! INAddTasksTemporalEventTriggerResolutionResult::initWithTemporalEventTriggerResolutionResult: not bound
!missing-selector! INAirline::iataCode not bound
!missing-selector! INAirline::icaoCode not bound
!missing-selector! INAirline::initWithName:iataCode:icaoCode: not bound
!missing-selector! INAirline::name not bound
!missing-selector! INAirport::iataCode not bound
!missing-selector! INAirport::icaoCode not bound
!missing-selector! INAirport::initWithName:iataCode:icaoCode: not bound
!missing-selector! INAirport::name not bound
!missing-selector! INAirportGate::airport not bound
!missing-selector! INAirportGate::gate not bound
!missing-selector! INAirportGate::initWithAirport:terminal:gate: not bound
!missing-selector! INAirportGate::terminal not bound
!missing-selector! INCallRecord::initWithIdentifier:dateCreated:caller:callRecordType:callCapability:callDuration:unseen:numberOfCalls: not bound
!missing-selector! INCallRecord::numberOfCalls not bound
!missing-selector! INDeleteTasksIntent::all not bound
!missing-selector! INDeleteTasksIntent::initWithTaskList:tasks:all: not bound
!missing-selector! INDeleteTasksIntent::taskList not bound
!missing-selector! INDeleteTasksIntent::tasks not bound
!missing-selector! INDeleteTasksIntentResponse::code not bound
!missing-selector! INDeleteTasksIntentResponse::deletedTasks not bound
!missing-selector! INDeleteTasksIntentResponse::initWithCode:userActivity: not bound
!missing-selector! INDeleteTasksIntentResponse::setDeletedTasks: not bound
!missing-selector! INDeleteTasksTaskListResolutionResult::initWithTaskListResolutionResult: not bound
!missing-selector! INDeleteTasksTaskResolutionResult::initWithTaskResolutionResult: not bound
!missing-selector! INFile::data not bound
!missing-selector! INFile::filename not bound
!missing-selector! INFile::fileURL not bound
!missing-selector! INFile::setFilename: not bound
!missing-selector! INFile::typeIdentifier not bound
!missing-selector! INFlight::airline not bound
!missing-selector! INFlight::arrivalAirportGate not bound
!missing-selector! INFlight::boardingTime not bound
!missing-selector! INFlight::departureAirportGate not bound
!missing-selector! INFlight::flightDuration not bound
!missing-selector! INFlight::flightNumber not bound
!missing-selector! INFlight::initWithAirline:flightNumber:boardingTime:flightDuration:departureAirportGate:arrivalAirportGate: not bound
!missing-selector! INFlightReservation::flight not bound
!missing-selector! INFlightReservation::initWithItemReference:reservationNumber:bookingTime:reservationStatus:reservationHolderName:actions:reservedSeat:flight: not bound
!missing-selector! INFlightReservation::reservedSeat not bound
!missing-selector! INGetReservationDetailsIntent::initWithReservationContainerReference:reservationItemReferences: not bound
!missing-selector! INGetReservationDetailsIntent::reservationContainerReference not bound
!missing-selector! INGetReservationDetailsIntent::reservationItemReferences not bound
!missing-selector! INGetReservationDetailsIntentResponse::code not bound
!missing-selector! INGetReservationDetailsIntentResponse::initWithCode:userActivity: not bound
!missing-selector! INGetReservationDetailsIntentResponse::reservations not bound
!missing-selector! INGetReservationDetailsIntentResponse::setReservations: not bound
!missing-selector! INLodgingReservation::initWithItemReference:reservationNumber:bookingTime:reservationStatus:reservationHolderName:actions:lodgingBusinessLocation:reservationDuration:numberOfAdults:numberOfChildren: not bound
!missing-selector! INLodgingReservation::lodgingBusinessLocation not bound
!missing-selector! INLodgingReservation::numberOfAdults not bound
!missing-selector! INLodgingReservation::numberOfChildren not bound
!missing-selector! INLodgingReservation::reservationDuration not bound
!missing-selector! INMediaDestination::mediaDestinationType not bound
!missing-selector! INMediaDestination::playlistName not bound
!missing-selector! INMediaItem::artist not bound
!missing-selector! INMediaItem::initWithIdentifier:title:type:artwork:artist: not bound
!missing-selector! INMediaSearch::activityNames not bound
!missing-selector! INMediaSearch::albumName not bound
!missing-selector! INMediaSearch::artistName not bound
!missing-selector! INMediaSearch::genreNames not bound
!missing-selector! INMediaSearch::initWithMediaType:sortOrder:mediaName:artistName:albumName:genreNames:moodNames:activityNames:releaseDate:reference:mediaIdentifier: not bound
!missing-selector! INMediaSearch::mediaIdentifier not bound
!missing-selector! INMediaSearch::mediaName not bound
!missing-selector! INMediaSearch::mediaType not bound
!missing-selector! INMediaSearch::moodNames not bound
!missing-selector! INMediaSearch::reference not bound
!missing-selector! INMediaSearch::releaseDate not bound
!missing-selector! INMediaSearch::sortOrder not bound
!missing-selector! INMediaUserContext::init not bound
!missing-selector! INMediaUserContext::numberOfLibraryItems not bound
!missing-selector! INMediaUserContext::setNumberOfLibraryItems: not bound
!missing-selector! INMediaUserContext::setSubscriptionStatus: not bound
!missing-selector! INMediaUserContext::subscriptionStatus not bound
!missing-selector! INObject::setAlternativeSpeakableMatches: not bound
!missing-selector! INPlayMediaIntent::initWithMediaItems:mediaContainer:playShuffled:playbackRepeatMode:resumePlayback:playbackQueueLocation:playbackSpeed:mediaSearch: not bound
!missing-selector! INPlayMediaIntent::mediaSearch not bound
!missing-selector! INPlayMediaIntent::playbackQueueLocation not bound
!missing-selector! INPlayMediaIntent::playbackSpeed not bound
!missing-selector! INPlayMediaMediaItemResolutionResult::initWithMediaItemResolutionResult: not bound
!missing-selector! INPlayMediaPlaybackSpeedResolutionResult::initWithDoubleResolutionResult: not bound
!missing-selector! INRentalCar::initWithRentalCompanyName:type:make:model:rentalCarDescription: not bound
!missing-selector! INRentalCar::make not bound
!missing-selector! INRentalCar::model not bound
!missing-selector! INRentalCar::rentalCarDescription not bound
!missing-selector! INRentalCar::rentalCompanyName not bound
!missing-selector! INRentalCar::type not bound
!missing-selector! INRentalCarReservation::dropOffLocation not bound
!missing-selector! INRentalCarReservation::initWithItemReference:reservationNumber:bookingTime:reservationStatus:reservationHolderName:actions:rentalCar:rentalDuration:pickupLocation:dropOffLocation: not bound
!missing-selector! INRentalCarReservation::pickupLocation not bound
!missing-selector! INRentalCarReservation::rentalCar not bound
!missing-selector! INRentalCarReservation::rentalDuration not bound
!missing-selector! INReservation::actions not bound
!missing-selector! INReservation::bookingTime not bound
!missing-selector! INReservation::itemReference not bound
!missing-selector! INReservation::reservationHolderName not bound
!missing-selector! INReservation::reservationNumber not bound
!missing-selector! INReservation::reservationStatus not bound
!missing-selector! INReservationAction::initWithType:validDuration:userActivity: not bound
!missing-selector! INReservationAction::type not bound
!missing-selector! INReservationAction::userActivity not bound
!missing-selector! INReservationAction::validDuration not bound
!missing-selector! INRestaurantReservation::initWithItemReference:reservationNumber:bookingTime:reservationStatus:reservationHolderName:actions:reservationDuration:partySize:restaurantLocation: not bound
!missing-selector! INRestaurantReservation::partySize not bound
!missing-selector! INRestaurantReservation::reservationDuration not bound
!missing-selector! INRestaurantReservation::restaurantLocation not bound
!missing-selector! INSearchForMediaIntent::initWithMediaItems:mediaSearch: not bound
!missing-selector! INSearchForMediaIntent::mediaItems not bound
!missing-selector! INSearchForMediaIntent::mediaSearch not bound
!missing-selector! INSearchForMediaIntentResponse::code not bound
!missing-selector! INSearchForMediaIntentResponse::initWithCode:userActivity: not bound
!missing-selector! INSearchForMediaIntentResponse::mediaItems not bound
!missing-selector! INSearchForMediaIntentResponse::setMediaItems: not bound
!missing-selector! INSearchForMediaMediaItemResolutionResult::initWithMediaItemResolutionResult: not bound
!missing-selector! INSearchForNotebookItemsIntent::initWithTitle:content:itemType:status:location:locationSearchType:dateTime:dateSearchType:temporalEventTriggerTypes:taskPriority:notebookItemIdentifier: not bound
!missing-selector! INSearchForNotebookItemsIntent::taskPriority not bound
!missing-selector! INSearchForNotebookItemsIntent::temporalEventTriggerTypes not bound
!missing-selector! INSeat::initWithSeatSection:seatRow:seatNumber:seatingType: not bound
!missing-selector! INSeat::seatingType not bound
!missing-selector! INSeat::seatNumber not bound
!missing-selector! INSeat::seatRow not bound
!missing-selector! INSeat::seatSection not bound
!missing-selector! INSetTaskAttributeIntent::initWithTargetTask:taskTitle:status:priority:spatialEventTrigger:temporalEventTrigger: not bound
!missing-selector! INSetTaskAttributeIntent::priority not bound
!missing-selector! INSetTaskAttributeIntent::taskTitle not bound
!missing-selector! INSetTaskAttributeTemporalEventTriggerResolutionResult::initWithTemporalEventTriggerResolutionResult: not bound
!missing-selector! INSnoozeTasksIntent::all not bound
!missing-selector! INSnoozeTasksIntent::initWithTasks:nextTriggerTime:all: not bound
!missing-selector! INSnoozeTasksIntent::nextTriggerTime not bound
!missing-selector! INSnoozeTasksIntent::tasks not bound
!missing-selector! INSnoozeTasksIntentResponse::code not bound
!missing-selector! INSnoozeTasksIntentResponse::initWithCode:userActivity: not bound
!missing-selector! INSnoozeTasksIntentResponse::setSnoozedTasks: not bound
!missing-selector! INSnoozeTasksIntentResponse::snoozedTasks not bound
!missing-selector! INSnoozeTasksTaskResolutionResult::initWithTaskResolutionResult: not bound
!missing-selector! INStartCallCallCapabilityResolutionResult::initWithCallCapabilityResolutionResult: not bound
!missing-selector! INStartCallContactResolutionResult::initWithPersonResolutionResult: not bound
!missing-selector! INStartCallIntent::audioRoute not bound
!missing-selector! INStartCallIntent::callCapability not bound
!missing-selector! INStartCallIntent::contacts not bound
!missing-selector! INStartCallIntent::destinationType not bound
!missing-selector! INStartCallIntent::initWithAudioRoute:destinationType:contacts:recordTypeForRedialing:callCapability: not bound
!missing-selector! INStartCallIntent::recordTypeForRedialing not bound
!missing-selector! INStartCallIntentResponse::code not bound
!missing-selector! INStartCallIntentResponse::initWithCode:userActivity: not bound
!missing-selector! INTask::initWithTitle:status:taskType:spatialEventTrigger:temporalEventTrigger:createdDateComponents:modifiedDateComponents:identifier:priority: not bound
!missing-selector! INTask::priority not bound
!missing-selector! INTicketedEvent::category not bound
!missing-selector! INTicketedEvent::eventDuration not bound
!missing-selector! INTicketedEvent::initWithCategory:name:eventDuration:location: not bound
!missing-selector! INTicketedEvent::location not bound
!missing-selector! INTicketedEvent::name not bound
!missing-selector! INTicketedEventReservation::event not bound
!missing-selector! INTicketedEventReservation::initWithItemReference:reservationNumber:bookingTime:reservationStatus:reservationHolderName:actions:reservedSeat:event: not bound
!missing-selector! INTicketedEventReservation::reservedSeat not bound
!missing-selector! INTrainReservation::initWithItemReference:reservationNumber:bookingTime:reservationStatus:reservationHolderName:actions:reservedSeat:trainTrip: not bound
!missing-selector! INTrainReservation::reservedSeat not bound
!missing-selector! INTrainReservation::trainTrip not bound
!missing-selector! INTrainTrip::arrivalPlatform not bound
!missing-selector! INTrainTrip::arrivalStationLocation not bound
!missing-selector! INTrainTrip::departurePlatform not bound
!missing-selector! INTrainTrip::departureStationLocation not bound
!missing-selector! INTrainTrip::initWithProvider:trainName:trainNumber:tripDuration:departureStationLocation:departurePlatform:arrivalStationLocation:arrivalPlatform: not bound
!missing-selector! INTrainTrip::provider not bound
!missing-selector! INTrainTrip::trainName not bound
!missing-selector! INTrainTrip::trainNumber not bound
!missing-selector! INTrainTrip::tripDuration not bound
!missing-selector! INUpdateMediaAffinityIntent::affinityType not bound
!missing-selector! INUpdateMediaAffinityIntent::initWithMediaItems:mediaSearch:affinityType: not bound
!missing-selector! INUpdateMediaAffinityIntent::mediaItems not bound
!missing-selector! INUpdateMediaAffinityIntent::mediaSearch not bound
!missing-selector! INUpdateMediaAffinityIntentResponse::code not bound
!missing-selector! INUpdateMediaAffinityIntentResponse::initWithCode:userActivity: not bound
!missing-selector! INUpdateMediaAffinityMediaItemResolutionResult::initWithMediaItemResolutionResult: not bound
!missing-selector! INUserContext::becomeCurrent not bound
!missing-selector! NSExtensionContext::intent not bound
!missing-type! INAddMediaIntent not bound
!missing-type! INAddMediaIntentResponse not bound
!missing-type! INAddMediaMediaDestinationResolutionResult not bound
!missing-type! INAddMediaMediaItemResolutionResult not bound
!missing-type! INAddTasksTargetTaskListResolutionResult not bound
!missing-type! INAddTasksTemporalEventTriggerResolutionResult not bound
!missing-type! INAirline not bound
!missing-type! INAirport not bound
!missing-type! INAirportGate not bound
!missing-type! INCallCapabilityResolutionResult not bound
!missing-type! INDeleteTasksIntent not bound
!missing-type! INDeleteTasksIntentResponse not bound
!missing-type! INDeleteTasksTaskListResolutionResult not bound
!missing-type! INDeleteTasksTaskResolutionResult not bound
!missing-type! INEnergyResolutionResult not bound
!missing-type! INEnumResolutionResult not bound
!missing-type! INFile not bound
!missing-type! INFileResolutionResult not bound
!missing-type! INFlight not bound
!missing-type! INFlightReservation not bound
!missing-type! INGetReservationDetailsIntent not bound
!missing-type! INGetReservationDetailsIntentResponse not bound
!missing-type! INLengthResolutionResult not bound
!missing-type! INLodgingReservation not bound
!missing-type! INMassResolutionResult not bound
!missing-type! INMediaAffinityTypeResolutionResult not bound
!missing-type! INMediaDestination not bound
!missing-type! INMediaDestinationResolutionResult not bound
!missing-type! INMediaItemResolutionResult not bound
!missing-type! INMediaSearch not bound
!missing-type! INMediaUserContext not bound
!missing-type! INObjectResolutionResult not bound
!missing-type! INPaymentMethodResolutionResult not bound
!missing-type! INPlaybackQueueLocationResolutionResult not bound
!missing-type! INPlaybackRepeatModeResolutionResult not bound
!missing-type! INPlayMediaMediaItemResolutionResult not bound
!missing-type! INPlayMediaPlaybackSpeedResolutionResult not bound
!missing-type! INRentalCar not bound
!missing-type! INRentalCarReservation not bound
!missing-type! INReservation not bound
!missing-type! INReservationAction not bound
!missing-type! INRestaurantReservation not bound
!missing-type! INSearchForMediaIntent not bound
!missing-type! INSearchForMediaIntentResponse not bound
!missing-type! INSearchForMediaMediaItemResolutionResult not bound
!missing-type! INSeat not bound
!missing-type! INSetTaskAttributeTemporalEventTriggerResolutionResult not bound
!missing-type! INSnoozeTasksIntent not bound
!missing-type! INSnoozeTasksIntentResponse not bound
!missing-type! INSnoozeTasksTaskResolutionResult not bound
!missing-type! INSpeedResolutionResult not bound
!missing-type! INStartCallCallCapabilityResolutionResult not bound
!missing-type! INStartCallContactResolutionResult not bound
!missing-type! INStartCallIntent not bound
!missing-type! INStartCallIntentResponse not bound
!missing-type! INTaskPriorityResolutionResult not bound
!missing-type! INTemporalEventTriggerTypeOptionsResolutionResult not bound
!missing-type! INTicketedEvent not bound
!missing-type! INTicketedEventReservation not bound
!missing-type! INTimeIntervalResolutionResult not bound
!missing-type! INTrainReservation not bound
!missing-type! INTrainTrip not bound
!missing-type! INUpdateMediaAffinityIntent not bound
!missing-type! INUpdateMediaAffinityIntentResponse not bound
!missing-type! INUpdateMediaAffinityMediaItemResolutionResult not bound
!missing-type! INURLResolutionResult not bound
!missing-type! INUserContext not bound
!missing-type! INVolumeResolutionResult not bound
!missing-selector! INMediaSearch::initWithMediaType:sortOrder:mediaName:artistName:albumName:genreNames:moodNames:releaseDate:reference:mediaIdentifier: not bound
## appended from unclassified file
!missing-selector! INMessage::initWithIdentifier:conversationIdentifier:content:dateSent:sender:recipients:groupName:messageType:serviceName: not bound
!missing-selector! INMessage::serviceName not bound

Просмотреть файл

@ -0,0 +1 @@
!missing-designated-initializer! INUIAddVoiceShortcutButton::initWithStyle: is missing an [DesignatedInitializer] attribute

Просмотреть файл

@ -595,3 +595,8 @@
!missing-type! MPSTemporaryNDArray not bound
!unknown-simd-type-mapping! The Simd type vector_uchar16 does not have a mapping to a managed type. Please add one in SimdCheck.cs
!wrong-base-type! MPSTriangleAccelerationStructure expected MPSPolygonAccelerationStructure actual MPSAccelerationStructure
## Xcode 11.4 b1
!missing-selector! MPSImageGuidedFilter::encodeReconstructionToCommandBuffer:guidanceTexture:coefficientsTextureA:coefficientsTextureB:destinationTexture: not bound
!missing-selector! MPSImageGuidedFilter::encodeRegressionToCommandBuffer:sourceTexture:guidanceTexture:weightsTexture:destinationCoefficientsTextureA:destinationCoefficientsTextureB: not bound

Просмотреть файл

@ -0,0 +1,3 @@
!missing-selector! NEAppProxyFlow::networkInterface not bound
!missing-selector! NEAppProxyFlow::setNetworkInterface: not bound
!missing-selector! NEFilterDataProvider::updateFlow:withVerdict:forDirection: not bound

Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше