[Emporium] move sample to public repo

This commit is contained in:
Rustam Zaitov 2015-10-07 17:38:05 +03:00
Родитель ae64a104b7
Коммит d309af49c4
71 изменённых файлов: 2107 добавлений и 0 удалений

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

@ -0,0 +1,46 @@
using Foundation;
namespace Emporium
{
/// <summary>
/// The value of the EmporiumBundlePrefix setting is
/// written to the Info.plist file of every project of the
/// Emporium solution. Specifically, the value of EmporiumBundlePrefix is
/// used as the string value for a key of EmporiumBundlePrefix. This value
/// is loaded from the target's bundle to static property
/// "Prefix" from the nested "Bundle" class.
/// This avoids the need for developers to edit both EmporiumBundlePrefix
/// and the code below. The value of "Bundle.Prefix" is then used as part of
/// an interpolated string to insert the user-defined value of EmporiumBundlePrefix
/// into several static string constants below.
/// </summary>
public static class AppConfiguration
{
public static class Bundle
{
public static string Prefix {
get {
return (NSString)NSBundle.MainBundle.ObjectForInfoDictionary ("EmporiumBundlePrefix");
}
}
}
public static class UserActivity
{
public static string Payment {
get {
return string.Format ("{0}.payment", Bundle.Prefix);
}
}
}
public static class Merchant
{
public static string Identififer {
get {
return string.Format ("merchant.{0}", Bundle.Prefix);
}
}
}
}
}

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

@ -0,0 +1,47 @@
<?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)' == '' ">AnyCPU</Platform>
<ProjectTypeGuids>{FEACFBD2-3405-455C-9665-78FE426C6842};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<ProjectGuid>{42C07B56-96DC-494F-8C90-1BF068D37DC2}</ProjectGuid>
<OutputType>Library</OutputType>
<RootNamespace>Emporium</RootNamespace>
<IPhoneResourcePrefix>Resources</IPhoneResourcePrefix>
<AssemblyName>Common</AssemblyName>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug</OutputPath>
<DefineConstants>DEBUG;</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<ConsolePause>false</ConsolePause>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>full</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release</OutputPath>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<ConsolePause>false</ConsolePause>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Xml" />
<Reference Include="System.Core" />
<Reference Include="Xamarin.iOS" />
</ItemGroup>
<ItemGroup>
<Folder Include="Resources\" />
</ItemGroup>
<ItemGroup>
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Product.cs" />
<Compile Include="AppConfiguration.cs" />
<Compile Include="ProductContainer.cs" />
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath)\Xamarin\iOS\Xamarin.iOS.CSharp.targets" />
</Project>

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

@ -0,0 +1,13 @@
using Foundation;
namespace Emporium
{
public class Product : NSObject
{
public string Name { get; set; }
new public string Description { get; set; }
public string Price { get; set; }
}
}

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

@ -0,0 +1,57 @@
using Foundation;
namespace Emporium
{
public class ProductContainer : DictionaryContainer
{
static readonly NSString NameKey = (NSString)"name";
static readonly NSString DescriptionKey = (NSString)"description";
static readonly NSString PriceKey = (NSString)"price";
public string Name {
get {
return GetStringValue (NameKey);
}
set {
SetStringValue (NameKey, value);
}
}
public string Description {
get {
return GetStringValue (DescriptionKey);
}
set {
SetStringValue (DescriptionKey, value);
}
}
public string Price {
get {
return GetStringValue (PriceKey);
}
set {
SetStringValue (PriceKey, value);
}
}
public Product Product {
get {
return new Product {
Name = Name,
Description = Description,
Price = Price
};
}
}
public ProductContainer ()
{
}
public ProductContainer (NSDictionary dictionary)
: base (dictionary)
{
}
}
}

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

@ -0,0 +1,27 @@
using System.Reflection;
using System.Runtime.CompilerServices;
// Information about this assembly is defined by the following attributes.
// Change them to the values specific to your project.
[assembly: AssemblyTitle ("Common")]
[assembly: AssemblyDescription ("")]
[assembly: AssemblyConfiguration ("")]
[assembly: AssemblyCompany ("")]
[assembly: AssemblyProduct ("")]
[assembly: AssemblyCopyright ("rzaitov")]
[assembly: AssemblyTrademark ("")]
[assembly: AssemblyCulture ("")]
// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}".
// The form "{Major}.{Minor}.*" will automatically update the build and revision,
// and "{Major}.{Minor}.{Build}.*" will update just the revision.
[assembly: AssemblyVersion ("1.0.*")]
// The following attributes are used to specify the signing key for the assembly,
// if desired. See the Mono documentation for more information about signing.
//[assembly: AssemblyDelaySign(false)]
//[assembly: AssemblyKeyFile("")]

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

@ -0,0 +1,53 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2012
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Emporium", "Emporium\Emporium.csproj", "{1595970C-A6E2-4009-B859-06C33B46423C}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EmporiumWatchKitApp", "EmporiumWatchKitApp\EmporiumWatchKitApp.csproj", "{2CAD9CB9-6A46-4163-856D-505C69F8EF59}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EmporiumWatchKitExtension", "EmporiumWatchKitExtension\EmporiumWatchKitExtension.csproj", "{080C3EB6-E706-4299-AE6C-6945E98698B4}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Common", "Common\Common.csproj", "{42C07B56-96DC-494F-8C90-1BF068D37DC2}"
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
{080C3EB6-E706-4299-AE6C-6945E98698B4}.Debug|iPhone.ActiveCfg = Debug|iPhone
{080C3EB6-E706-4299-AE6C-6945E98698B4}.Debug|iPhone.Build.0 = Debug|iPhone
{080C3EB6-E706-4299-AE6C-6945E98698B4}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator
{080C3EB6-E706-4299-AE6C-6945E98698B4}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator
{080C3EB6-E706-4299-AE6C-6945E98698B4}.Release|iPhone.ActiveCfg = Release|iPhone
{080C3EB6-E706-4299-AE6C-6945E98698B4}.Release|iPhone.Build.0 = Release|iPhone
{080C3EB6-E706-4299-AE6C-6945E98698B4}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
{080C3EB6-E706-4299-AE6C-6945E98698B4}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
{1595970C-A6E2-4009-B859-06C33B46423C}.Debug|iPhone.ActiveCfg = Debug|iPhone
{1595970C-A6E2-4009-B859-06C33B46423C}.Debug|iPhone.Build.0 = Debug|iPhone
{1595970C-A6E2-4009-B859-06C33B46423C}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator
{1595970C-A6E2-4009-B859-06C33B46423C}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator
{1595970C-A6E2-4009-B859-06C33B46423C}.Release|iPhone.ActiveCfg = Release|iPhone
{1595970C-A6E2-4009-B859-06C33B46423C}.Release|iPhone.Build.0 = Release|iPhone
{1595970C-A6E2-4009-B859-06C33B46423C}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
{1595970C-A6E2-4009-B859-06C33B46423C}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
{2CAD9CB9-6A46-4163-856D-505C69F8EF59}.Debug|iPhone.ActiveCfg = Debug|iPhone
{2CAD9CB9-6A46-4163-856D-505C69F8EF59}.Debug|iPhone.Build.0 = Debug|iPhone
{2CAD9CB9-6A46-4163-856D-505C69F8EF59}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator
{2CAD9CB9-6A46-4163-856D-505C69F8EF59}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator
{2CAD9CB9-6A46-4163-856D-505C69F8EF59}.Release|iPhone.ActiveCfg = Release|iPhone
{2CAD9CB9-6A46-4163-856D-505C69F8EF59}.Release|iPhone.Build.0 = Release|iPhone
{2CAD9CB9-6A46-4163-856D-505C69F8EF59}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
{2CAD9CB9-6A46-4163-856D-505C69F8EF59}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
{42C07B56-96DC-494F-8C90-1BF068D37DC2}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{42C07B56-96DC-494F-8C90-1BF068D37DC2}.Debug|iPhone.Build.0 = Debug|Any CPU
{42C07B56-96DC-494F-8C90-1BF068D37DC2}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{42C07B56-96DC-494F-8C90-1BF068D37DC2}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{42C07B56-96DC-494F-8C90-1BF068D37DC2}.Release|iPhone.ActiveCfg = Release|Any CPU
{42C07B56-96DC-494F-8C90-1BF068D37DC2}.Release|iPhone.Build.0 = Release|Any CPU
{42C07B56-96DC-494F-8C90-1BF068D37DC2}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{42C07B56-96DC-494F-8C90-1BF068D37DC2}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
EndGlobalSection
EndGlobal

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

@ -0,0 +1,49 @@
using Foundation;
using UIKit;
namespace Emporium
{
[Register ("AppDelegate")]
public class AppDelegate : UIApplicationDelegate
{
public override UIWindow Window { get; set; }
UINavigationController RootViewController {
get {
var window = Window;
return (window != null) ? window.RootViewController as UINavigationController : null;
}
}
// Here we handle our WatchKit activity handoff request. We'll take the dictionary passed in as part of the activity's userInfo property, and immediately
// present a payment sheet. If you're using handoff to allow WatchKit apps to request Apple Pay payments you try to display the payment sheet as soon as
// possible.
public override bool ContinueUserActivity (UIApplication application, NSUserActivity userActivity, UIApplicationRestorationHandler completionHandler)
{
// Create a new product detail view controller using the supplied product.
var rawDictionary = userActivity.UserInfo? ["product"] as NSDictionary;
if (rawDictionary != null) {
var productContainer = new ProductContainer (rawDictionary);
Product product = productContainer.Product;
// Firstly, we'll create a product detail page. We can instantiate it from our storyboard...
var viewController = (ProductTableViewController)RootViewController?.Storyboard?.InstantiateViewController ("ProductTableViewController");
// Manually set the product we want to display.
if (viewController != null) {
viewController.Product = product;
// The rootViewController should be a navigation controller. Pop to it if needed.
RootViewController?.PopToRootViewController (false);
// Push the view controller onto our app, so it's the first thing the user sees.
RootViewController?.PushViewController (viewController, false);
// We also want to immediately show the payment sheet, so we'll trigger that too.
viewController.ApplyPayButtonClicked ();
}
}
return true;
}
}
}

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

@ -0,0 +1,82 @@
using System;
using UIKit;
using Foundation;
namespace Emporium
{
[Register ("CatalogCollectionViewController")]
public class CatalogCollectionViewController : UICollectionViewController
{
static readonly NSString reuseIdentifier = (NSString)"ProductCell";
static readonly NSString segueIdentifier = (NSString)"ProductDetailSegue";
Product[] products;
Product[] Products {
get {
if (products == null) {
// Populate the products array from a plist.
NSUrl productsURL = NSBundle.MainBundle.GetUrlForResource ("ProductsList", "plist");
var productArr = NSArray.FromFile (productsURL.Path);
products = new Product[(int)productArr.Count];
for (nuint i = 0; i < productArr.Count; i++) {
var container = new ProductContainer (productArr.GetItem<NSDictionary> (i));
products [(int)i] = container.Product;
}
}
return products;
}
}
public CatalogCollectionViewController (IntPtr handle)
: base (handle)
{
}
public override void PrepareForSegue (UIStoryboardSegue segue, NSObject sender)
{
if (segue.Identifier == segueIdentifier) {
var indexPaths = CollectionView.GetIndexPathsForSelectedItems ();
if (indexPaths == null || indexPaths.Length == 0)
return;
var viewController = (ProductTableViewController)segue.DestinationViewController;
viewController.Product = products [indexPaths [0].Row];
} else {
base.PrepareForSegue (segue, sender);
}
}
#region IUICollectionViewDataSource & IUICollectionViewDelegate
public override nint GetItemsCount (UICollectionView collectionView, nint section)
{
return Products.Length;
}
public override UICollectionViewCell GetCell (UICollectionView collectionView, NSIndexPath indexPath)
{
var cell = (ProductCell)collectionView.DequeueReusableCell (reuseIdentifier, indexPath);
ConfigureCell (cell, Products [indexPath.Row]);
return cell;
}
public override void ItemSelected (UICollectionView collectionView, NSIndexPath indexPath)
{
PerformSegue (segueIdentifier, this);
}
#endregion
static void ConfigureCell (ProductCell cell, Product product)
{
cell.TitleLabel.Text = product.Name;
cell.PriceLabel.Text = product.Price;
cell.SubtitleLabel.Text = product.Description;
}
}
}

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

@ -0,0 +1,27 @@
using System;
using UIKit;
using Foundation;
namespace Emporium
{
[Register ("ConfirmationViewController")]
public class ConfirmationViewController : UIViewController
{
public string TransactionIdentifier { get; set; }
[Outlet ("confirmationLabel")]
public UILabel confirmationLabel { get; set; }
public ConfirmationViewController (IntPtr handle)
: base (handle)
{
}
public override void ViewWillAppear (bool animated)
{
base.ViewWillAppear (animated);
confirmationLabel.Text = TransactionIdentifier;
}
}
}

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

@ -0,0 +1,141 @@
<?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>
<ProjectTypeGuids>{FEACFBD2-3405-455C-9665-78FE426C6842};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<ProjectGuid>{1595970C-A6E2-4009-B859-06C33B46423C}</ProjectGuid>
<OutputType>Exe</OutputType>
<RootNamespace>Emporium</RootNamespace>
<IPhoneResourcePrefix>Resources</IPhoneResourcePrefix>
<AssemblyName>Emporium</AssemblyName>
</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>
<ConsolePause>false</ConsolePause>
<MtouchArch>i386</MtouchArch>
<MtouchLink>None</MtouchLink>
<MtouchDebug>true</MtouchDebug>
<MtouchProfiling>true</MtouchProfiling>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|iPhone' ">
<DebugType>full</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\iPhone\Release</OutputPath>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<CodesignEntitlements>Entitlements.plist</CodesignEntitlements>
<MtouchArch>ARMv7, ARM64</MtouchArch>
<ConsolePause>false</ConsolePause>
<CodesignKey>iPhone Developer</CodesignKey>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|iPhoneSimulator' ">
<DebugType>full</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\iPhoneSimulator\Release</OutputPath>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<MtouchArch>i386</MtouchArch>
<ConsolePause>false</ConsolePause>
<MtouchLink>None</MtouchLink>
</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>
<ConsolePause>false</ConsolePause>
<MtouchArch>ARMv7, ARM64</MtouchArch>
<CodesignEntitlements>Entitlements.plist</CodesignEntitlements>
<MtouchProfiling>true</MtouchProfiling>
<CodesignKey>iPhone Developer</CodesignKey>
<MtouchDebug>true</MtouchDebug>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Xml" />
<Reference Include="System.Core" />
<Reference Include="Xamarin.iOS" />
</ItemGroup>
<ItemGroup>
<ImageAsset Include="Resources\Images.xcassets\AppIcons.appiconset\Contents.json" />
<ImageAsset Include="Images.xcassets\Contents.json" />
<ImageAsset Include="Images.xcassets\AppIcons.appiconset\Contents.json" />
<ImageAsset Include="Images.xcassets\AppIcons.appiconset\Icon-app-60%403x.png" />
<ImageAsset Include="Images.xcassets\AppIcons.appiconset\icon-app-57.png" />
<ImageAsset Include="Images.xcassets\AppIcons.appiconset\icon-app-60%402x.png" />
<ImageAsset Include="Images.xcassets\AppIcons.appiconset\icon-app-72.png" />
<ImageAsset Include="Images.xcassets\AppIcons.appiconset\icon-app-72%402x.png" />
<ImageAsset Include="Images.xcassets\AppIcons.appiconset\icon-app-76.png" />
<ImageAsset Include="Images.xcassets\AppIcons.appiconset\icon-app-76%402x.png" />
<ImageAsset Include="Images.xcassets\AppIcons.appiconset\icon-carplay-120.png" />
<ImageAsset Include="Images.xcassets\AppIcons.appiconset\icon-spotlight-29.png" />
<ImageAsset Include="Images.xcassets\AppIcons.appiconset\icon-spotlight-29%402x.png" />
<ImageAsset Include="Images.xcassets\AppIcons.appiconset\icon-spotlight-29%403x.png" />
<ImageAsset Include="Images.xcassets\AppIcons.appiconset\icon-spotlight-40.png" />
<ImageAsset Include="Images.xcassets\AppIcons.appiconset\icon-spotlight-40%402x.png" />
<ImageAsset Include="Images.xcassets\AppIcons.appiconset\icon-spotlight-40%403x.png" />
<ImageAsset Include="Images.xcassets\AppIcons.appiconset\icon-spotlight-50.png" />
<ImageAsset Include="Images.xcassets\AppIcons.appiconset\icon-spotlight-50%402x.png" />
<ImageAsset Include="Images.xcassets\AppIcons.appiconset\icon-spp-57%402x.png" />
<ImageAsset Include="Images.xcassets\AppIcons.appiconset\icon-watch-172.png" />
<ImageAsset Include="Images.xcassets\AppIcons.appiconset\icon-watch-196.png" />
<ImageAsset Include="Images.xcassets\AppIcons.appiconset\icon-watch-29%402x.png" />
<ImageAsset Include="Images.xcassets\AppIcons.appiconset\icon-watch-29%403x.png" />
<ImageAsset Include="Images.xcassets\AppIcons.appiconset\icon-watch-40%402x.png" />
<ImageAsset Include="Images.xcassets\AppIcons.appiconset\icon-watch-44%402x.png" />
<ImageAsset Include="Images.xcassets\AppIcons.appiconset\icon-watch-48.png" />
<ImageAsset Include="Images.xcassets\AppIcons.appiconset\icon-watch-55.png" />
<ImageAsset Include="Images.xcassets\splash-xamagon.imageset\Contents.json" />
<ImageAsset Include="Images.xcassets\splash-xamagon.imageset\splash-xamagon.png" />
<ImageAsset Include="Images.xcassets\splash-xamagon.imageset\splash-xamagon%402x.png" />
<ImageAsset Include="Images.xcassets\splash-xamagon.imageset\splash-xamagon%403x.png" />
<ImageAsset Include="Resources\Images.xcassets\product_image.imageset\Contents.json" />
<ImageAsset Include="Resources\Images.xcassets\product_image.imageset\product_image.jpg" />
</ItemGroup>
<ItemGroup>
<InterfaceDefinition Include="Resources\LaunchScreen.xib" />
<InterfaceDefinition Include="Main.storyboard" />
<InterfaceDefinition Include="LaunchScreen.storyboard" />
</ItemGroup>
<ItemGroup>
<None Include="Info.plist" />
<None Include="Entitlements.plist" />
</ItemGroup>
<ItemGroup>
<Compile Include="Main.cs" />
<Compile Include="AppDelegate.cs" />
<Compile Include="CatalogCollectionViewController.cs" />
<Compile Include="ProductTableViewController.cs" />
<Compile Include="ProductCell.cs" />
<Compile Include="ConfirmationViewController.cs" />
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath)\Xamarin\iOS\Xamarin.iOS.CSharp.targets" />
<ItemGroup>
<Folder Include="Images.xcassets\" />
<Folder Include="Resources\Images.xcassets\product_image.imageset\" />
</ItemGroup>
<ItemGroup>
<BundleResource Include="Resources\ProductsList.plist" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\EmporiumWatchKitExtension\EmporiumWatchKitExtension.csproj">
<Project>{080C3EB6-E706-4299-AE6C-6945E98698B4}</Project>
<Name>EmporiumWatchKitExtension</Name>
<IsAppExtension>True</IsAppExtension>
</ProjectReference>
<ProjectReference Include="..\Common\Common.csproj">
<Project>{42C07B56-96DC-494F-8C90-1BF068D37DC2}</Project>
<Name>Common</Name>
</ProjectReference>
</ItemGroup>
</Project>

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

@ -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,190 @@
{
"images": [
{
"filename": "icon-spotlight-29.png",
"size": "29x29",
"scale": "1x",
"idiom": "iphone"
},
{
"filename": "icon-spotlight-29@2x.png",
"size": "29x29",
"scale": "2x",
"idiom": "iphone"
},
{
"filename": "icon-spotlight-29@3x.png",
"size": "29x29",
"scale": "3x",
"idiom": "iphone"
},
{
"filename": "icon-spotlight-40@2x.png",
"size": "40x40",
"scale": "2x",
"idiom": "iphone"
},
{
"filename": "icon-spotlight-40@3x.png",
"size": "40x40",
"scale": "3x",
"idiom": "iphone"
},
{
"filename": "icon-app-57.png",
"size": "57x57",
"scale": "1x",
"idiom": "iphone"
},
{
"filename": "icon-spp-57@2x.png",
"size": "57x57",
"scale": "2x",
"idiom": "iphone"
},
{
"filename": "icon-app-60@2x.png",
"size": "60x60",
"scale": "2x",
"idiom": "iphone"
},
{
"filename": "Icon-app-60@3x.png",
"size": "60x60",
"scale": "3x",
"idiom": "iphone"
},
{
"filename": "icon-spotlight-29.png",
"size": "29x29",
"scale": "1x",
"idiom": "ipad"
},
{
"filename": "icon-spotlight-29@2x.png",
"size": "29x29",
"scale": "2x",
"idiom": "ipad"
},
{
"filename": "icon-spotlight-40.png",
"size": "40x40",
"scale": "1x",
"idiom": "ipad"
},
{
"filename": "icon-spotlight-40@2x.png",
"size": "40x40",
"scale": "2x",
"idiom": "ipad"
},
{
"filename": "icon-spotlight-50.png",
"size": "50x50",
"scale": "1x",
"idiom": "ipad"
},
{
"filename": "icon-spotlight-50@2x.png",
"size": "50x50",
"scale": "2x",
"idiom": "ipad"
},
{
"filename": "icon-app-72.png",
"size": "72x72",
"scale": "1x",
"idiom": "ipad"
},
{
"filename": "icon-app-72@2x.png",
"size": "72x72",
"scale": "2x",
"idiom": "ipad"
},
{
"filename": "icon-app-76.png",
"size": "76x76",
"scale": "1x",
"idiom": "ipad"
},
{
"filename": "icon-app-76@2x.png",
"size": "76x76",
"scale": "2x",
"idiom": "ipad"
},
{
"role": "notificationCenter",
"filename": "icon-watch-48.png",
"size": "24x24",
"subtype": "38mm",
"scale": "2x",
"idiom": "watch"
},
{
"role": "notificationCenter",
"filename": "icon-watch-55.png",
"size": "27.5x27.5",
"subtype": "42mm",
"scale": "2x",
"idiom": "watch"
},
{
"role": "companionSettings",
"filename": "icon-watch-29@2x.png",
"size": "29x29",
"scale": "2x",
"idiom": "watch"
},
{
"role": "companionSettings",
"filename": "icon-watch-29@3x.png",
"size": "29x29",
"scale": "3x",
"idiom": "watch"
},
{
"role": "appLauncher",
"filename": "icon-watch-40@2x.png",
"size": "40x40",
"subtype": "38mm",
"scale": "2x",
"idiom": "watch"
},
{
"role": "longLook",
"filename": "icon-watch-44@2x.png",
"size": "44x44",
"subtype": "42mm",
"scale": "2x",
"idiom": "watch"
},
{
"role": "quickLook",
"filename": "icon-watch-172.png",
"size": "86x86",
"subtype": "38mm",
"scale": "2x",
"idiom": "watch"
},
{
"role": "quickLook",
"filename": "icon-watch-196.png",
"size": "98x98",
"subtype": "42mm",
"scale": "2x",
"idiom": "watch"
},
{
"filename": "icon-carplay-120.png",
"size": "120x120",
"scale": "1x",
"idiom": "car"
}
],
"info": {
"version": 1,
"author": "xcode"
}
}

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 5.0 KiB

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 1.6 KiB

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 3.3 KiB

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 1.8 KiB

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 4.0 KiB

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 2.0 KiB

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 4.3 KiB

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 3.3 KiB

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 900 B

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 1.8 KiB

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 2.5 KiB

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 1.1 KiB

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 2.2 KiB

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 3.3 KiB

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 1.5 KiB

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 3.1 KiB

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 3.1 KiB

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 5.0 KiB

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 5.5 KiB

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 1.6 KiB

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 2.2 KiB

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 2.1 KiB

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 2.3 KiB

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 1.2 KiB

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 1.5 KiB

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

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

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

@ -0,0 +1,23 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "splash-xamagon.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "splash-xamagon@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "splash-xamagon@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

Двоичные данные
ios9/Emporium/Emporium/Images.xcassets/splash-xamagon.imageset/splash-xamagon.png поставляемый Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 6.3 KiB

Двоичные данные
ios9/Emporium/Emporium/Images.xcassets/splash-xamagon.imageset/splash-xamagon@2x.png поставляемый Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 16 KiB

Двоичные данные
ios9/Emporium/Emporium/Images.xcassets/splash-xamagon.imageset/splash-xamagon@3x.png поставляемый Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 29 KiB

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

@ -0,0 +1,53 @@
<?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>Emporium</string>
<key>CFBundleIdentifier</key>
<string>com.xamarin.emporium</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1.0</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>NSUserActivityTypes</key>
<array>
<string>com.xamarin.emporium.payment</string>
</array>
<key>MinimumOSVersion</key>
<string>9.0</string>
<key>UIDeviceFamily</key>
<array>
<integer>1</integer>
<integer>2</integer>
</array>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
</array>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>XSAppIconAssets</key>
<string>Resources/Images.xcassets/AppIcons.appiconset</string>
<key>UIMainStoryboardFile~ipad</key>
<string>Main</string>
<key>EmporiumBundlePrefix</key>
<string>com.xamarin.emporium</string>
<key>UIMainStoryboardFile</key>
<string>Main</string>
</dict>
</plist>

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

@ -0,0 +1,40 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="8152.3" systemVersion="15A178w" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" initialViewController="01J-lp-oVM">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="8124.4"/>
</dependencies>
<scenes>
<!--View Controller-->
<scene sceneID="EHf-IW-A2E">
<objects>
<viewController id="01J-lp-oVM" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="LE5-Z4-Am4"/>
<viewControllerLayoutGuide type="bottom" id="mNk-pX-FNy"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="4AM-jj-fek">
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<subviews>
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="splash-xamagon" translatesAutoresizingMaskIntoConstraints="NO" id="e3X-hv-tO0">
<rect key="frame" x="236" y="236" width="128" height="128"/>
<animations/>
</imageView>
</subviews>
<animations/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstItem="e3X-hv-tO0" firstAttribute="centerY" secondItem="4AM-jj-fek" secondAttribute="centerY" id="KYd-0x-jga"/>
<constraint firstItem="e3X-hv-tO0" firstAttribute="centerX" secondItem="4AM-jj-fek" secondAttribute="centerX" id="bdz-0K-If4"/>
</constraints>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="53" y="375"/>
</scene>
</scenes>
<resources>
<image name="splash-xamagon" width="128" height="128"/>
</resources>
</document>

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

@ -0,0 +1,15 @@
using UIKit;
namespace Emporium
{
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,284 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="8121.17" systemVersion="14E31" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="4B8-Il-xPF">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="8101.14"/>
<capability name="Constraints to layout margins" minToolsVersion="6.0"/>
</dependencies>
<customFonts key="customFonts">
<mutableArray key="HelveticaNeueLights.ttc">
<string>HelveticaNeue-Light</string>
</mutableArray>
</customFonts>
<scenes>
<!--Navigation Controller-->
<scene sceneID="uyB-Og-gQZ">
<objects>
<navigationController id="4B8-Il-xPF" sceneMemberID="viewController">
<navigationBar key="navigationBar" contentMode="scaleToFill" id="CDZ-oZ-PgX">
<rect key="frame" x="0.0" y="0.0" width="320" height="44"/>
<autoresizingMask key="autoresizingMask"/>
</navigationBar>
<connections>
<segue destination="blF-Qd-Jbw" kind="relationship" relationship="rootViewController" id="imS-Do-Up6"/>
</connections>
</navigationController>
<placeholder placeholderIdentifier="IBFirstResponder" id="G8W-3g-CmP" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="-499" y="-120"/>
</scene>
<!--Emporium-->
<scene sceneID="CKe-bj-IgF">
<objects>
<collectionViewController id="blF-Qd-Jbw" customClass="CatalogCollectionViewController" sceneMemberID="viewController">
<collectionView key="view" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" dataMode="prototypes" id="gkt-ww-caN">
<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="calibratedWhite"/>
<collectionViewFlowLayout key="collectionViewLayout" minimumLineSpacing="10" minimumInteritemSpacing="10" id="KhH-z6-ect">
<size key="itemSize" width="227" height="170"/>
<size key="headerReferenceSize" width="0.0" height="0.0"/>
<size key="footerReferenceSize" width="0.0" height="0.0"/>
<inset key="sectionInset" minX="0.0" minY="0.0" maxX="0.0" maxY="0.0"/>
</collectionViewFlowLayout>
<cells>
<collectionViewCell opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" reuseIdentifier="ProductCell" id="CAc-WM-j57" customClass="ProductCell">
<rect key="frame" x="0.0" y="64" width="227" height="170"/>
<autoresizingMask key="autoresizingMask"/>
<view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
<rect key="frame" x="0.0" y="0.0" width="227" height="170"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<imageView userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="product_image" translatesAutoresizingMaskIntoConstraints="NO" id="ySo-Nv-86h">
<rect key="frame" x="0.0" y="0.0" width="227" height="170"/>
</imageView>
<visualEffectView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="suW-XG-QNl">
<rect key="frame" x="0.0" y="121" width="227" height="49"/>
<view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" id="sdg-tN-FwS">
<rect key="frame" x="0.0" y="0.0" width="227" height="49"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
</view>
<blurEffect style="light"/>
</visualEffectView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Product Title" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="dy9-yL-ZN1">
<rect key="frame" x="8" y="129" width="103" height="21"/>
<constraints>
<constraint firstAttribute="height" constant="21" id="gFN-MP-Vrl"/>
</constraints>
<fontDescription key="fontDescription" type="system" pointSize="15"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="$8.99" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="A6p-q7-NmL">
<rect key="frame" x="122" y="121" width="97" height="49"/>
<constraints>
<constraint firstAttribute="height" constant="49" id="Uo4-61-YAj"/>
</constraints>
<fontDescription key="fontDescription" type="boldSystem" pointSize="21"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Product Description" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="9W9-BQ-xLA">
<rect key="frame" x="8" y="147" width="103" height="21"/>
<constraints>
<constraint firstAttribute="height" constant="21" id="ovI-20-J2J"/>
</constraints>
<fontDescription key="fontDescription" name="HelveticaNeue-Light" family="Helvetica Neue" pointSize="12"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
</view>
<color key="backgroundColor" name="gridColor" catalog="System" colorSpace="catalog"/>
<constraints>
<constraint firstItem="A6p-q7-NmL" firstAttribute="leading" secondItem="dy9-yL-ZN1" secondAttribute="trailing" constant="11" id="1AP-tw-7zA"/>
<constraint firstAttribute="bottomMargin" secondItem="dy9-yL-ZN1" secondAttribute="bottom" constant="12" id="4aO-gn-P6K"/>
<constraint firstItem="9W9-BQ-xLA" firstAttribute="trailing" secondItem="dy9-yL-ZN1" secondAttribute="trailing" id="CeY-0W-AVd"/>
<constraint firstItem="suW-XG-QNl" firstAttribute="leading" secondItem="ySo-Nv-86h" secondAttribute="leading" id="PYN-N7-dRo"/>
<constraint firstItem="A6p-q7-NmL" firstAttribute="trailing" secondItem="CAc-WM-j57" secondAttribute="trailingMargin" id="RyW-yO-WJz"/>
<constraint firstAttribute="trailing" secondItem="suW-XG-QNl" secondAttribute="trailing" id="Zd8-tE-qQa"/>
<constraint firstItem="dy9-yL-ZN1" firstAttribute="leading" secondItem="CAc-WM-j57" secondAttribute="leadingMargin" id="aIH-PN-djx"/>
<constraint firstItem="A6p-q7-NmL" firstAttribute="bottom" secondItem="ySo-Nv-86h" secondAttribute="bottom" id="aUd-QJ-Y6Z"/>
<constraint firstItem="ySo-Nv-86h" firstAttribute="leading" secondItem="CAc-WM-j57" secondAttribute="leading" id="bPa-z2-zIX"/>
<constraint firstItem="A6p-q7-NmL" firstAttribute="top" secondItem="suW-XG-QNl" secondAttribute="top" id="hma-tm-Jiv"/>
<constraint firstItem="suW-XG-QNl" firstAttribute="trailing" secondItem="ySo-Nv-86h" secondAttribute="trailing" id="jMC-qv-Vqs"/>
<constraint firstItem="dy9-yL-ZN1" firstAttribute="leading" secondItem="9W9-BQ-xLA" secondAttribute="leading" id="jhY-WH-tbn"/>
<constraint firstItem="ySo-Nv-86h" firstAttribute="top" secondItem="CAc-WM-j57" secondAttribute="top" id="lV8-W8-p5a"/>
<constraint firstAttribute="bottom" secondItem="suW-XG-QNl" secondAttribute="bottom" id="not-oc-KYo"/>
<constraint firstItem="ySo-Nv-86h" firstAttribute="bottom" secondItem="suW-XG-QNl" secondAttribute="bottom" id="tTb-Yt-ibs"/>
<constraint firstAttribute="bottomMargin" secondItem="9W9-BQ-xLA" secondAttribute="bottom" constant="-6" id="yYL-d6-h4s"/>
</constraints>
<connections>
<outlet property="imageView" destination="ySo-Nv-86h" id="8AA-Y7-yE7"/>
<outlet property="priceLabel" destination="A6p-q7-NmL" id="6wH-BQ-pnL"/>
<outlet property="subtitleLabel" destination="9W9-BQ-xLA" id="F0B-Jf-RBY"/>
<outlet property="titleLabel" destination="dy9-yL-ZN1" id="Sp2-mF-l9A"/>
</connections>
</collectionViewCell>
</cells>
<connections>
<outlet property="dataSource" destination="blF-Qd-Jbw" id="siV-Dm-3Iw"/>
<outlet property="delegate" destination="blF-Qd-Jbw" id="mSw-jS-wFg"/>
</connections>
</collectionView>
<navigationItem key="navigationItem" title="Emporium" id="78h-yr-ItG"/>
<connections>
<segue destination="9co-WD-bOH" kind="show" identifier="ProductDetailSegue" id="NuN-mV-axf">
<nil key="action"/>
</segue>
</connections>
</collectionViewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="AFf-nd-eeI" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="276" y="-106"/>
</scene>
<!--Product Table View Controller-->
<scene sceneID="y7e-25-tdx">
<objects>
<tableViewController storyboardIdentifier="ProductTableViewController" id="9co-WD-bOH" customClass="ProductTableViewController" sceneMemberID="viewController">
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="plain" separatorStyle="none" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" id="kAS-yO-zqP">
<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="calibratedWhite"/>
<sections>
<tableViewSection id="JVi-Oh-mAa">
<cells>
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="ImageCell" rowHeight="240" id="5oL-PL-YCs">
<rect key="frame" x="0.0" y="64" width="600" height="240"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="5oL-PL-YCs" id="6TA-K3-u5Q">
<rect key="frame" x="0.0" y="0.0" width="600" height="240"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<imageView userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="product_image" translatesAutoresizingMaskIntoConstraints="NO" id="yYD-As-VbG">
<rect key="frame" x="0.0" y="0.0" width="600" height="239"/>
</imageView>
</subviews>
<constraints>
<constraint firstItem="yYD-As-VbG" firstAttribute="leading" secondItem="6TA-K3-u5Q" secondAttribute="leading" id="8uz-dl-V2O"/>
<constraint firstItem="yYD-As-VbG" firstAttribute="centerY" secondItem="6TA-K3-u5Q" secondAttribute="centerY" id="Yvf-TZ-B6m"/>
<constraint firstAttribute="trailing" secondItem="yYD-As-VbG" secondAttribute="trailing" id="aBU-1F-drF"/>
<constraint firstItem="yYD-As-VbG" firstAttribute="top" secondItem="6TA-K3-u5Q" secondAttribute="top" id="adQ-fn-0TO"/>
</constraints>
</tableViewCellContentView>
</tableViewCell>
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="TitleCell" textLabel="Add-eS-lIB" detailTextLabel="foL-6E-YQg" rowHeight="50" style="IBUITableViewCellStyleValue1" id="qhJ-CY-oPE">
<rect key="frame" x="0.0" y="304" width="600" height="50"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="qhJ-CY-oPE" id="zpb-qu-8dz">
<rect key="frame" x="0.0" y="0.0" width="600" height="50"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="Product Title" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="Add-eS-lIB">
<rect key="frame" x="15" y="12" width="125" height="27"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="22"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="$8.99" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="foL-6E-YQg">
<rect key="frame" x="524" y="12" width="61" height="27"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="22"/>
<color key="textColor" red="0.5568627451" green="0.5568627451" blue="0.57647058819999997" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
</subviews>
</tableViewCellContentView>
</tableViewCell>
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="DescriptionCell" rowHeight="144" id="26L-mx-GcK">
<rect key="frame" x="0.0" y="354" width="600" height="144"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="26L-mx-GcK" id="lFd-Vo-DiM">
<rect key="frame" x="0.0" y="0.0" width="600" height="144"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<textView clipsSubviews="YES" multipleTouchEnabled="YES" tag="999" contentMode="scaleToFill" fixedFrame="YES" scrollEnabled="NO" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" editable="NO" selectable="NO" translatesAutoresizingMaskIntoConstraints="NO" id="bye-vV-FaU">
<rect key="frame" x="0.0" y="0.0" width="600" height="144"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<string key="text">Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</string>
<fontDescription key="fontDescription" type="system" pointSize="14"/>
<textInputTraits key="textInputTraits" autocapitalizationType="sentences"/>
</textView>
</subviews>
</tableViewCellContentView>
<connections>
<segue destination="jve-eX-3Ox" kind="show" identifier="ConfirmationSegue" id="doc-Z9-4Vx">
<nil key="action"/>
</segue>
</connections>
</tableViewCell>
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="ApplePayCell" rowHeight="73" id="fpG-FN-wH0">
<rect key="frame" x="0.0" y="498" width="600" height="73"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="fpG-FN-wH0" id="ylH-1P-eRe">
<rect key="frame" x="0.0" y="0.0" width="600" height="73"/>
<autoresizingMask key="autoresizingMask"/>
</tableViewCellContentView>
</tableViewCell>
</cells>
</tableViewSection>
</sections>
<connections>
<outlet property="dataSource" destination="9co-WD-bOH" id="cXK-dW-rEj"/>
<outlet property="delegate" destination="9co-WD-bOH" id="YAh-ia-nV6"/>
</connections>
</tableView>
<connections>
<outlet property="applePayView" destination="ylH-1P-eRe" id="mmx-Bf-V85"/>
<outlet property="productDescriptionView" destination="bye-vV-FaU" id="v4v-7Q-Ky7"/>
<outlet property="productImageView" destination="yYD-As-VbG" id="amE-th-oOb"/>
<outlet property="productPriceLabel" destination="foL-6E-YQg" id="bYX-77-xIy"/>
<outlet property="productTitleLabel" destination="Add-eS-lIB" id="lI9-mB-v3Z"/>
</connections>
</tableViewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="be2-Ju-JhN" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="1038" y="-106"/>
</scene>
<!--Confirmation View Controller-->
<scene sceneID="jsR-n0-dR6">
<objects>
<viewController id="jve-eX-3Ox" customClass="ConfirmationViewController" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="e5E-6z-J6B"/>
<viewControllerLayoutGuide type="bottom" id="swI-qk-6gX"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="tiY-lx-eH6">
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Thanks for your purchase" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="6Lr-nT-xai">
<rect key="frame" x="20" y="28" width="484" height="34"/>
<fontDescription key="fontDescription" type="system" weight="light" pointSize="28"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Your payment reference:" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="XVH-0h-na8">
<rect key="frame" x="20" y="76" width="391" height="34"/>
<fontDescription key="fontDescription" style="UICTFontTextStyleSubhead"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Payment ID" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Rir-Nd-gff">
<rect key="frame" x="20" y="105" width="391" height="34"/>
<fontDescription key="fontDescription" style="UICTFontTextStyleSubhead"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</view>
<connections>
<outlet property="confirmationLabel" destination="Rir-Nd-gff" id="N6E-5U-ebq"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="PjA-1U-qNu" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="1777" y="-106"/>
</scene>
</scenes>
<resources>
<image name="product_image" width="1351" height="748"/>
</resources>
</document>

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

@ -0,0 +1,28 @@
using System;
using UIKit;
using Foundation;
namespace Emporium
{
[Register ("ProductCell")]
public class ProductCell : UICollectionViewCell
{
[Outlet ("imageView")]
public UIImageView ImageView { get; set; }
[Outlet ("titleLabel")]
public UILabel TitleLabel { get; set; }
[Outlet ("priceLabel")]
public UILabel PriceLabel { get; set; }
[Outlet ("subtitleLabel")]
public UILabel SubtitleLabel { get; set; }
public ProductCell (IntPtr handle)
: base (handle)
{
}
}
}

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

@ -0,0 +1,221 @@
using System;
using UIKit;
using Foundation;
using PassKit;
using System.Collections.Generic;
namespace Emporium
{
[Register ("ProductTableViewController")]
public class ProductTableViewController : UITableViewController, IPKPaymentAuthorizationViewControllerDelegate
{
static readonly NSString confirmationSegue = (NSString)"ConfirmationSegue";
readonly NSString[] supportedNetworks = {
PKPaymentNetwork.Amex,
PKPaymentNetwork.Discover,
PKPaymentNetwork.MasterCard,
PKPaymentNetwork.Visa
};
public Product Product { get; set; }
PKPaymentToken paymentToken;
[Outlet ("productImageView")]
public UIImageView ProductImageView { get; set; }
[Outlet ("productTitleLabel")]
public UILabel ProductTitleLabel { get; set; }
[Outlet ("productPriceLabel")]
public UILabel ProductPriceLabel { get; set; }
[Outlet ("productDescriptionView")]
public UITextView ProductDescriptionView { get; set; }
[Outlet ("applePayView")]
public UIView ApplePayView { get; set; }
public ProductTableViewController (IntPtr handle)
: base (handle)
{
}
public override void PrepareForSegue (UIStoryboardSegue segue, NSObject sender)
{
if (segue.Identifier == confirmationSegue) {
var viewController = (ConfirmationViewController)segue.DestinationViewController;
viewController.TransactionIdentifier = paymentToken.TransactionIdentifier;
} else {
base.PrepareForSegue (segue, sender);
}
}
public override void ViewWillAppear (bool animated)
{
base.ViewWillAppear (animated);
ProductTitleLabel.Text = Product.Name;
ProductDescriptionView.Text = Product.Description;
ProductPriceLabel.Text = string.Format ("${0}", Product.Price);
// Display an Apple Pay button if a payment card is available. In your
// app, you might divert the user to a more traditional checkout if
// Apple Pay wasn't set up.
if (PKPaymentAuthorizationViewController.CanMakePaymentsUsingNetworks (supportedNetworks)) {
var button = new PKPaymentButton (PKPaymentButtonType.Buy, PKPaymentButtonStyle.Black);
button.TouchUpInside += ApplyPayButtonClicked;
button.Center = ApplePayView.Center;
button.AutoresizingMask = UIViewAutoresizing.FlexibleLeftMargin | UIViewAutoresizing.FlexibleRightMargin;
ApplePayView.AddSubview (button);
}
}
void ApplyPayButtonClicked (object sender, EventArgs e)
{
ApplyPayButtonClicked ();
}
public void ApplyPayButtonClicked ()
{
if (!PKPaymentAuthorizationViewController.CanMakePaymentsUsingNetworks (supportedNetworks)) {
ShowAuthorizationAlert ();
return;
}
// Set up our payment request.
var paymentRequest = new PKPaymentRequest ();
// Our merchant identifier needs to match what we previously set up in
// the Capabilities window (or the developer portal).
paymentRequest.MerchantIdentifier = AppConfiguration.Merchant.Identififer;
// Both country code and currency code are standard ISO formats. Country
// should be the region you will process the payment in. Currency should
// be the currency you would like to charge in.
paymentRequest.CountryCode = "US";
paymentRequest.CurrencyCode = "USD";
// The networks we are able to accept.
paymentRequest.SupportedNetworks = supportedNetworks;
// Ask your payment processor what settings are right for your app. In
// most cases you will want to leave this set to ThreeDS.
paymentRequest.MerchantCapabilities = PKMerchantCapability.ThreeDS;
// An array of `PKPaymentSummaryItems` that we'd like to display on the
// sheet (see the MakeSummaryItems method).
paymentRequest.PaymentSummaryItems = MakeSummaryItems (false);
// Request shipping information, in this case just postal address.
paymentRequest.RequiredShippingAddressFields = PKAddressField.PostalAddress;
// Display the view controller.
var viewController = new PKPaymentAuthorizationViewController (paymentRequest);
viewController.Delegate = this;
PresentViewController (viewController, true, null);
}
PKPaymentSummaryItem[] MakeSummaryItems (bool requiresInternationalSurcharge)
{
var items = new List<PKPaymentSummaryItem> ();
// Product items have a label (a string) and an amount (NSDecimalNumber).
// NSDecimalNumber is a Cocoa class that can express floating point numbers
// in Base 10, which ensures precision. It can be initialized with a
// double, or in this case, a string.
var productSummaryItem = PKPaymentSummaryItem.Create ("Sub-total", new NSDecimalNumber (Product.Price));
items.Add (productSummaryItem);
var totalSummaryItem = PKPaymentSummaryItem.Create ("Emporium", productSummaryItem.Amount);
// Apply an international surcharge, if needed.
if (requiresInternationalSurcharge) {
var handlingSummaryItem = PKPaymentSummaryItem.Create ("International Handling", new NSDecimalNumber ("9.99"));
// Note how NSDecimalNumber has its own arithmetic methods.
totalSummaryItem.Amount = productSummaryItem.Amount.Add (handlingSummaryItem.Amount);
items.Add (handlingSummaryItem);
}
items.Add (totalSummaryItem);
return items.ToArray ();
}
#region IPKPaymentAuthorizationViewControllerDelegate
/// <summary>
/// Whenever the user changed their shipping information we will receive a callback here.
///
/// Note that for privacy reasons the contact we receive will be redacted,
/// and only have a city, ZIP, and country.
///
/// You can use this method to estimate additional shipping charges and update
/// the payment summary items.
/// </summary>
[Export ("paymentAuthorizationViewController:didSelectShippingContact:completion:")]
void DidSelectShippingContact (PKPaymentAuthorizationViewController controller, PKContact contact, PKPaymentShippingAddressSelected completion)
{
// Create a shipping method. Shipping methods use PKShippingMethod,
// which inherits from PKPaymentSummaryItem. It adds a detail property
// you can use to specify information like estimated delivery time.
var shipping = new PKShippingMethod {
Label = "Standard Shipping",
Amount = NSDecimalNumber.Zero,
Detail = "Delivers within two working days"
};
// Note that this is a contrived example. Because addresses can come from
// many sources on iOS they may not always have the fields you want.
// Your application should be sure to verify the address is correct,
// and return the appropriate status. If the address failed to pass validation
// you should return `InvalidShippingPostalAddress` instead of `Success`.
var address = contact.PostalAddress;
var requiresInternationalSurcharge = address.Country != "United States";
PKPaymentSummaryItem[] summaryItems = MakeSummaryItems (requiresInternationalSurcharge);
completion (PKPaymentAuthorizationStatus.Success, new [] { shipping }, summaryItems);
}
/// <summary>
/// This is where you would send your payment to be processed - here we will
/// simply present a confirmation screen. If your payment processor failed the
/// payment you would return `completion(PKPaymentAuthorizationStatus.Failure)` instead. Remember to never
/// attempt to decrypt the payment token on device.
/// </summary>
public void DidAuthorizePayment (PKPaymentAuthorizationViewController controller, PKPayment payment, Action<PKPaymentAuthorizationStatus> completion)
{
paymentToken = payment.Token;
completion (PKPaymentAuthorizationStatus.Success);
PerformSegue (confirmationSegue, this);
}
public void PaymentAuthorizationViewControllerDidFinish (PKPaymentAuthorizationViewController controller)
{
// We always need to dismiss our payment view controller when done.
DismissViewController (true, null);
}
public void WillAuthorizePayment (PKPaymentAuthorizationViewController controller)
{
}
#endregion
void ShowAuthorizationAlert ()
{
var alert = UIAlertController.Create ("Error", "This device cannot make payments.", UIAlertControllerStyle.Alert);
var action = UIAlertAction.Create ("Okay", UIAlertActionStyle.Default, null);
alert.AddAction (action);
PresentViewController (alert, true, null);
}
}
}

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

@ -0,0 +1,108 @@
{
"images": [
{
"size": "29x29",
"scale": "1x",
"idiom": "iphone"
},
{
"size": "29x29",
"scale": "2x",
"idiom": "iphone"
},
{
"size": "29x29",
"scale": "3x",
"idiom": "iphone"
},
{
"size": "40x40",
"scale": "2x",
"idiom": "iphone"
},
{
"size": "40x40",
"scale": "3x",
"idiom": "iphone"
},
{
"size": "57x57",
"scale": "1x",
"idiom": "iphone"
},
{
"size": "57x57",
"scale": "2x",
"idiom": "iphone"
},
{
"size": "60x60",
"scale": "2x",
"idiom": "iphone"
},
{
"size": "60x60",
"scale": "3x",
"idiom": "iphone"
},
{
"size": "29x29",
"scale": "1x",
"idiom": "ipad"
},
{
"size": "29x29",
"scale": "2x",
"idiom": "ipad"
},
{
"size": "40x40",
"scale": "1x",
"idiom": "ipad"
},
{
"size": "40x40",
"scale": "2x",
"idiom": "ipad"
},
{
"size": "50x50",
"scale": "1x",
"idiom": "ipad"
},
{
"size": "50x50",
"scale": "2x",
"idiom": "ipad"
},
{
"size": "72x72",
"scale": "1x",
"idiom": "ipad"
},
{
"size": "72x72",
"scale": "2x",
"idiom": "ipad"
},
{
"size": "76x76",
"scale": "1x",
"idiom": "ipad"
},
{
"size": "76x76",
"scale": "2x",
"idiom": "ipad"
},
{
"size": "120x120",
"scale": "1x",
"idiom": "car"
}
],
"info": {
"version": 1,
"author": "xcode"
}
}

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

@ -0,0 +1,21 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "product_image.jpg",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

Двоичные данные
ios9/Emporium/Emporium/Resources/Images.xcassets/product_image.imageset/product_image.jpg поставляемый Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 217 KiB

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

@ -0,0 +1,43 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="6214" systemVersion="14A314h" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="6207" />
<capability name="Constraints with non-1.0 multipliers" minToolsVersion="5.1" />
</dependencies>
<objects>
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" />
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder" />
<view contentMode="scaleToFill" id="iN0-l3-epB">
<rect key="frame" x="0.0" y="0.0" width="480" height="480" />
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES" />
<subviews>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text=" Copyright (c) 2015 rzaitov" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines"
minimumFontSize="9" translatesAutoresizingMaskIntoConstraints="NO" id="8ie-xW-0ye">
<rect key="frame" x="20" y="439" width="441" height="21" />
<fontDescription key="fontDescription" type="system" pointSize="17" />
<color key="textColor" cocoaTouchSystemColor="darkTextColor" />
<nil key="highlightedColor" />
</label>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Emporium" textAlignment="center" lineBreakMode="middleTruncation" baselineAdjustment="alignBaselines"
minimumFontSize="18" translatesAutoresizingMaskIntoConstraints="NO" id="kId-c2-rCX">
<rect key="frame" x="20" y="140" width="441" height="43" />
<fontDescription key="fontDescription" type="boldSystem" pointSize="36" />
<color key="textColor" cocoaTouchSystemColor="darkTextColor" />
<nil key="highlightedColor" />
</label>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite" />
<constraints>
<constraint firstItem="kId-c2-rCX" firstAttribute="centerY" secondItem="iN0-l3-epB" secondAttribute="bottom" multiplier="1/3" constant="1" id="5cJ-9S-tgC" />
<constraint firstAttribute="centerX" secondItem="kId-c2-rCX" secondAttribute="centerX" id="Koa-jz-hwk" />
<constraint firstAttribute="bottom" secondItem="8ie-xW-0ye" secondAttribute="bottom" constant="20" id="Kzo-t9-V3l" />
<constraint firstItem="8ie-xW-0ye" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="20" symbolic="YES" id="MfP-vx-nX0" />
<constraint firstAttribute="centerX" secondItem="8ie-xW-0ye" secondAttribute="centerX" id="ZEH-qu-HZ9" />
<constraint firstItem="kId-c2-rCX" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="20" symbolic="YES" id="fvb-Df-36g" />
</constraints>
<nil key="simulatedStatusBarMetrics" />
<freeformSimulatedSizeMetrics key="simulatedDestinationMetrics" />
<point key="canvasLocation" x="548" y="455" />
</view>
</objects>
</document>

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

@ -0,0 +1,30 @@
<?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">
<array>
<dict>
<key>name</key>
<string>Deluxe Dog Collar</string>
<key>description</key>
<string>Your pooch will go nuts for this deluxe doggy collar</string>
<key>price</key>
<string>44.99</string>
</dict>
<dict>
<key>name</key>
<string>Mini Dog Collar</string>
<key>description</key>
<string>For the smaller dogs who appreciate the little things in life</string>
<key>price</key>
<string>16.99</string>
</dict>
<dict>
<key>name</key>
<string>Classic Collar</string>
<key>description</key>
<string>The original, and still the best.</string>
<key>price</key>
<string>24.99</string>
</dict>
</array>
</plist>

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

@ -0,0 +1,80 @@
<?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>
<ProjectTypeGuids>{FEACFBD2-3405-455C-9665-78FE426C6842};{D73F8E79-B4DD-4AB0-A767-D9FA3E2FE740};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<ProjectGuid>{2CAD9CB9-6A46-4163-856D-505C69F8EF59}</ProjectGuid>
<OutputType>Library</OutputType>
<RootNamespace>EmporiumWatchKitApp</RootNamespace>
<IPhoneResourcePrefix>Resources</IPhoneResourcePrefix>
<AssemblyName>EmporiumWatchKitApp</AssemblyName>
</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>
<ConsolePause>false</ConsolePause>
<MtouchArch>i386</MtouchArch>
<MtouchLink>None</MtouchLink>
<MtouchDebug>true</MtouchDebug>
<MtouchProfiling>true</MtouchProfiling>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|iPhone' ">
<DebugType>full</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\iPhone\Release</OutputPath>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<CodesignEntitlements>Entitlements.plist</CodesignEntitlements>
<MtouchArch>ARMv7, ARM64</MtouchArch>
<ConsolePause>false</ConsolePause>
<CodesignKey>iPhone Developer</CodesignKey>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|iPhoneSimulator' ">
<DebugType>full</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\iPhoneSimulator\Release</OutputPath>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<MtouchArch>i386</MtouchArch>
<ConsolePause>false</ConsolePause>
<MtouchLink>None</MtouchLink>
</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>
<ConsolePause>false</ConsolePause>
<MtouchArch>ARMv7, ARM64</MtouchArch>
<CodesignEntitlements>Entitlements.plist</CodesignEntitlements>
<MtouchProfiling>true</MtouchProfiling>
<CodesignKey>iPhone Developer</CodesignKey>
<MtouchDebug>true</MtouchDebug>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Xml" />
<Reference Include="System.Core" />
<Reference Include="Xamarin.iOS" />
</ItemGroup>
<ItemGroup>
<ImageAsset Include="Resources\Images.xcassets\AppIcons.appiconset\Contents.json" />
</ItemGroup>
<ItemGroup>
<None Include="Info.plist" />
<None Include="Entitlements.plist" />
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath)\Xamarin\iOS\Xamarin.iOS.WatchApp.CSharp.targets" />
<ItemGroup>
<InterfaceDefinition Include="Interface.storyboard" />
</ItemGroup>
</Project>

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

@ -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,29 @@
<?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>EmporiumWatchKitApp</string>
<key>CFBundleIdentifier</key>
<string>com.xamarin.emporium.watchkitapp</string>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1.0</string>
<key>MinimumOSVersion</key>
<string>8.2</string>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
</array>
<key>WKCompanionAppBundleIdentifier</key>
<string>com.xamarin.emporium</string>
<key>WKWatchKitApp</key>
<true/>
<key>XSAppIconAssets</key>
<string>Resources/Images.xcassets/AppIcons.appiconset</string>
</dict>
</plist>

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

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder.WatchKit.Storyboard" version="3.0" toolsVersion="8121.17" systemVersion="15A178u" targetRuntime="watchKit" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="AgC-eL-Hgc">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="8101.14"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBWatchKitPlugin" version="8066.13"/>
</dependencies>
<scenes>
<!--Interface Controller-->
<scene sceneID="aou-V4-d1y">
<objects>
<controller id="AgC-eL-Hgc" customClass="InterfaceController">
<items>
<button width="1" alignment="left" title="Pay" id="Pr9-Gi-CnM">
<connections>
<action selector="makePaymentPressed" destination="AgC-eL-Hgc" id="DVE-KR-dFY"/>
</connections>
</button>
<label width="136" alignment="left" textAlignment="center" numberOfLines="0" id="2PF-ke-xcm"/>
</items>
<connections>
<outlet property="statusLabel" destination="2PF-ke-xcm" id="REn-31-BMO"/>
</connections>
</controller>
</objects>
<point key="canvasLocation" x="193" y="188"/>
</scene>
</scenes>
</document>

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

@ -0,0 +1,108 @@
{
"images": [
{
"size": "29x29",
"scale": "1x",
"idiom": "iphone"
},
{
"size": "29x29",
"scale": "2x",
"idiom": "iphone"
},
{
"size": "29x29",
"scale": "3x",
"idiom": "iphone"
},
{
"size": "40x40",
"scale": "2x",
"idiom": "iphone"
},
{
"size": "40x40",
"scale": "3x",
"idiom": "iphone"
},
{
"size": "57x57",
"scale": "1x",
"idiom": "iphone"
},
{
"size": "57x57",
"scale": "2x",
"idiom": "iphone"
},
{
"size": "60x60",
"scale": "2x",
"idiom": "iphone"
},
{
"size": "60x60",
"scale": "3x",
"idiom": "iphone"
},
{
"size": "29x29",
"scale": "1x",
"idiom": "ipad"
},
{
"size": "29x29",
"scale": "2x",
"idiom": "ipad"
},
{
"size": "40x40",
"scale": "1x",
"idiom": "ipad"
},
{
"size": "40x40",
"scale": "2x",
"idiom": "ipad"
},
{
"size": "50x50",
"scale": "1x",
"idiom": "ipad"
},
{
"size": "50x50",
"scale": "2x",
"idiom": "ipad"
},
{
"size": "72x72",
"scale": "1x",
"idiom": "ipad"
},
{
"size": "72x72",
"scale": "2x",
"idiom": "ipad"
},
{
"size": "76x76",
"scale": "1x",
"idiom": "ipad"
},
{
"size": "76x76",
"scale": "2x",
"idiom": "ipad"
},
{
"size": "120x120",
"scale": "1x",
"idiom": "car"
}
],
"info": {
"version": 1,
"author": "xcode"
}
}

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

@ -0,0 +1,94 @@
<?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>
<ProjectTypeGuids>{FEACFBD2-3405-455C-9665-78FE426C6842};{EE2C853D-36AF-4FDB-B1AD-8E90477E2198};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<ProjectGuid>{080C3EB6-E706-4299-AE6C-6945E98698B4}</ProjectGuid>
<OutputType>Library</OutputType>
<RootNamespace>EmporiumWatchKitExtension</RootNamespace>
<IPhoneResourcePrefix>Resources</IPhoneResourcePrefix>
<AssemblyName>EmporiumWatchKitExtension</AssemblyName>
</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>
<ConsolePause>false</ConsolePause>
<MtouchArch>i386</MtouchArch>
<MtouchLink>None</MtouchLink>
<MtouchDebug>true</MtouchDebug>
<MtouchProfiling>true</MtouchProfiling>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|iPhone' ">
<DebugType>full</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\iPhone\Release</OutputPath>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<CodesignEntitlements>Entitlements.plist</CodesignEntitlements>
<MtouchArch>ARMv7, ARM64</MtouchArch>
<ConsolePause>false</ConsolePause>
<CodesignKey>iPhone Developer</CodesignKey>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|iPhoneSimulator' ">
<DebugType>full</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\iPhoneSimulator\Release</OutputPath>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<MtouchArch>i386</MtouchArch>
<ConsolePause>false</ConsolePause>
<MtouchLink>None</MtouchLink>
</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>
<ConsolePause>false</ConsolePause>
<MtouchArch>ARMv7, ARM64</MtouchArch>
<CodesignEntitlements>Entitlements.plist</CodesignEntitlements>
<MtouchProfiling>true</MtouchProfiling>
<CodesignKey>iPhone Developer</CodesignKey>
<MtouchDebug>true</MtouchDebug>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Xml" />
<Reference Include="System.Core" />
<Reference Include="Xamarin.iOS" />
</ItemGroup>
<ItemGroup>
<Folder Include="Resources\" />
</ItemGroup>
<ItemGroup>
<None Include="Info.plist" />
<None Include="Entitlements.plist" />
</ItemGroup>
<ItemGroup>
<Compile Include="InterfaceController.cs" />
<Compile Include="InterfaceController.designer.cs">
<DependentUpon>InterfaceController.cs</DependentUpon>
</Compile>
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath)\Xamarin\iOS\Xamarin.iOS.AppExtension.CSharp.targets" />
<ItemGroup>
<ProjectReference Include="..\EmporiumWatchKitApp\EmporiumWatchKitApp.csproj">
<Project>{2CAD9CB9-6A46-4163-856D-505C69F8EF59}</Project>
<Name>EmporiumWatchKitApp</Name>
<IsWatchApp>True</IsWatchApp>
</ProjectReference>
<ProjectReference Include="..\Common\Common.csproj">
<Project>{42C07B56-96DC-494F-8C90-1BF068D37DC2}</Project>
<Name>Common</Name>
</ProjectReference>
</ItemGroup>
</Project>

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

@ -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,32 @@
<?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>EmporiumWatchKitExtension</string>
<key>CFBundleIdentifier</key>
<string>com.xamarin.emporium.watchkitextension</string>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1.0</string>
<key>MinimumOSVersion</key>
<string>8.2</string>
<key>NSExtension</key>
<dict>
<key>NSExtensionAttributes</key>
<dict>
<key>WKAppBundleIdentifier</key>
<string>com.xamarin.emporium.watchkitapp</string>
</dict>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.watchkit</string>
</dict>
<key>RemoteInterfacePrincipleClass</key>
<string>InterfaceController</string>
<key>EmporiumBundlePrefix</key>
<string>com.xamarin.emporium</string>
</dict>
</plist>

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

@ -0,0 +1,42 @@
using System;
using WatchKit;
using Foundation;
using Emporium;
namespace EmporiumWatchKitExtension
{
public partial class InterfaceController : WKInterfaceController
{
[Outlet ("statusLabel")]
public WKInterfaceLabel StatusLabel { get; set; }
public InterfaceController (IntPtr handle)
: base (handle)
{
}
[Export ("makePaymentPressed")]
void MakePaymentPressed ()
{
// We'll send the product as a dictionary, and convert it to a `Product`
// value in our app delegate.
var product = new ProductContainer {
Name = "Example Charge",
Description = "An example charge made by a WatchKit Extension",
Price = "14.99"
};
// Create our activity handoff type (registered in the iOS app's Info.plist).
var activityType = AppConfiguration.UserActivity.Payment;
// Use Handoff to route the wearer to the payment controller on phone
var userInfo = new NSDictionary ("product", product.Dictionary);
UpdateUserActivity (activityType, userInfo, null);
// Tell the user to use handoff to pay.
StatusLabel.SetText ("Use handoff to pay!");
}
}
}

19
ios9/Emporium/EmporiumWatchKitExtension/InterfaceController.designer.cs сгенерированный Normal file
Просмотреть файл

@ -0,0 +1,19 @@
//
// This file has been generated automatically by MonoDevelop to store outlets and
// actions made in the Xcode designer. If it is removed, they will be lost.
// Manual changes to this file may not be handled correctly.
//
using Foundation;
namespace EmporiumWatchKitExtension
{
[Register ("InterfaceController")]
partial class InterfaceController
{
void ReleaseDesignerOutlets ()
{
}
}
}

42
ios9/Emporium/README.md Normal file
Просмотреть файл

@ -0,0 +1,42 @@
Emporium
==============
This sample shows how to integrate Apple Pay into a simple shopping experience. You'll learn how to make payment requests, collect shipping and contact information, apply discounts for debit/credit cards, and use the Apple Pay button. This project also contains an Apple Watch WatchKit extension that shows you how to start to make Apple Pay transactions using Handoff with the NSUserActivity class.
The app is comprised of several parts:
* `CatalogCollectionViewController` - a collection view that displays a list of products (parsed from `ProductsList.plist`)
* `ProductTableViewController` - a detail table view that summarizes a product, and allows the user to buy it using Apple Pay
* `ConfirmationViewController` - a simple confirmation screen to be shown after a successful payment
Additionally, a simple WatchKit extension is supplied showing how to easily use hand-off to trigger a payment sheet on a companion iPhone.
Requirements
------------
If you're running this application on an iOS device you will need an Apple Pay card available, or alternatively you can use the iOS Simulator. Additionally, you'll need to have set up an Apple Pay merchant identifier. You can do this using Xcode's Capabilities window, which will also set up the required entitlement on your behalf.
To ensure the smoothest start with the sample, make sure to update the EmporiumBundlePrefix to a reverse DNS value appropriate for you or your organization. As this app makes use of entitlements, the bundle identifier and many other strings need to be unique. The project has been configured so that you only have to change these values in a few places (Info.plist files) to establish this set of unique values in your situation.
For more information about processing an Apple Pay payment using a payment platform or merchant bank, visit [this link](developer.apple.com/apple-pay).
Build Requirements
------------------
Xcode 7.0, iOS 9.0 SDK, watchOS 1.0 SDK
Refs
----
* [Original sample](https://developer.apple.com/library/prerelease/watchos/samplecode/Emporium/Introduction/Intro.html)
* [Documentation](developer.apple.com/apple-pay)
Target
------
This sample runnable on iPhoneSimulator/iPadSimulator iPhone/iPad
Author
------
IOS:
Copyright (C) 2015 Apple Inc. All rights reserved.
Ported to Xamarin.iOS by Rustam Zaitov

Двоичные данные
ios9/Emporium/Screenshots/iPad/1.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 336 KiB

Двоичные данные
ios9/Emporium/Screenshots/iPad/2.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 1.0 MiB

Двоичные данные
ios9/Emporium/Screenshots/iPad/3.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 607 KiB

Двоичные данные
ios9/Emporium/Screenshots/iPhone/1.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 1.2 MiB

Двоичные данные
ios9/Emporium/Screenshots/iPhone/2.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 1009 KiB

Двоичные данные
ios9/Emporium/Screenshots/iPhone/3.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 991 KiB

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

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8" ?>
<SampleMetadata>
<ID>fb06bd17-5325-11e5-b379-20c9d09677c3</ID>
<IsFullApplication>true</IsFullApplication>
<Level>Beginning</Level>
<Tags>iOS9, Platform Features, Device Features, Getting Started</Tags>
<SupportedPlatforms>iOS</SupportedPlatforms>
<Gallery>true</Gallery>
<MinimumLicenseRequirement>Starter</MinimumLicenseRequirement>
<Brief>This sample shows how to integrate Apple Pay into a simple shopping experience</Brief>
</SampleMetadata>