From 19520e614c6499bcf98e433fb4bfdc1788ff1f74 Mon Sep 17 00:00:00 2001 From: Yarden Eitan Date: Thu, 16 Jun 2016 15:38:34 -0700 Subject: [PATCH] tvOS Support --- .../HelloMixpanel.xcodeproj/project.pbxproj | 543 +++++++++++++++++- .../HelloMixpanelTests/HelloMixpanelTests.m | 4 + .../HelloMixpanel_tvOS/AppDelegate.h | 21 + .../HelloMixpanel_tvOS/AppDelegate.m | 63 ++ .../Content.imageset/Contents.json | 12 + .../Back.imagestacklayer/Contents.json | 6 + .../App Icon - Large.imagestack/Contents.json | 17 + .../Content.imageset/Contents.json | 12 + .../Front.imagestacklayer/Contents.json | 6 + .../Content.imageset/Contents.json | 12 + .../Middle.imagestacklayer/Contents.json | 6 + .../Content.imageset/Contents.json | 12 + .../Back.imagestacklayer/Contents.json | 6 + .../App Icon - Small.imagestack/Contents.json | 17 + .../Content.imageset/Contents.json | 12 + .../Front.imagestacklayer/Contents.json | 6 + .../Content.imageset/Contents.json | 12 + .../Middle.imagestacklayer/Contents.json | 6 + .../Contents.json | 26 + .../Top Shelf Image.imageset/Contents.json | 12 + .../Assets.xcassets/Contents.json | 6 + .../Icon.imageset/Contents.json | 22 + .../Assets.xcassets/Icon.imageset/Icon-72.png | Bin 0 -> 8096 bytes .../Assets.xcassets/Icon.imageset/Icon@2x.png | Bin 0 -> 15868 bytes .../LaunchImage.launchimage/Contents.json | 15 + .../Base.lproj/Main.storyboard | 67 +++ .../HelloMixpanel_tvOS-Info.plist | 37 ++ .../HelloMixpanel_tvOS/ViewController.h | 13 + .../HelloMixpanel_tvOS/ViewController.m | 41 ++ HelloMixpanel/HelloMixpanel_tvOS/main.m | 16 + HelloMixpanel/Podfile | 10 +- Mixpanel-tvOS-Info.plist | 24 + Mixpanel.podspec | 4 +- Mixpanel.xcodeproj/project.pbxproj | 241 +++++++- .../xcschemes/Mixpanel_tvOS.xcscheme | 80 +++ Mixpanel/AutomaticEventsConstants.h | 3 +- Mixpanel/Mixpanel.h | 2 +- Mixpanel/Mixpanel.m | 84 ++- Mixpanel/MixpanelPrivate.h | 32 +- Mixpanel/tvos.modulemap | 5 + 40 files changed, 1457 insertions(+), 56 deletions(-) create mode 100755 HelloMixpanel/HelloMixpanel_tvOS/AppDelegate.h create mode 100755 HelloMixpanel/HelloMixpanel_tvOS/AppDelegate.m create mode 100755 HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Content.imageset/Contents.json create mode 100755 HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Contents.json create mode 100755 HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Contents.json create mode 100755 HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Content.imageset/Contents.json create mode 100755 HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Contents.json create mode 100755 HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json create mode 100755 HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Contents.json create mode 100755 HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Content.imageset/Contents.json create mode 100755 HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Contents.json create mode 100755 HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Contents.json create mode 100755 HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Content.imageset/Contents.json create mode 100755 HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Contents.json create mode 100755 HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json create mode 100755 HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Contents.json create mode 100755 HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json create mode 100755 HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json create mode 100755 HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/Contents.json create mode 100755 HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/Icon.imageset/Contents.json create mode 100755 HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/Icon.imageset/Icon-72.png create mode 100755 HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/Icon.imageset/Icon@2x.png create mode 100755 HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/LaunchImage.launchimage/Contents.json create mode 100755 HelloMixpanel/HelloMixpanel_tvOS/Base.lproj/Main.storyboard create mode 100755 HelloMixpanel/HelloMixpanel_tvOS/HelloMixpanel_tvOS-Info.plist create mode 100755 HelloMixpanel/HelloMixpanel_tvOS/ViewController.h create mode 100755 HelloMixpanel/HelloMixpanel_tvOS/ViewController.m create mode 100755 HelloMixpanel/HelloMixpanel_tvOS/main.m create mode 100755 Mixpanel-tvOS-Info.plist create mode 100644 Mixpanel.xcodeproj/xcshareddata/xcschemes/Mixpanel_tvOS.xcscheme create mode 100755 Mixpanel/tvos.modulemap diff --git a/HelloMixpanel/HelloMixpanel.xcodeproj/project.pbxproj b/HelloMixpanel/HelloMixpanel.xcodeproj/project.pbxproj index 4d8e0a256..1535946fe 100644 --- a/HelloMixpanel/HelloMixpanel.xcodeproj/project.pbxproj +++ b/HelloMixpanel/HelloMixpanel.xcodeproj/project.pbxproj @@ -52,6 +52,19 @@ A7BB224519183EB800EEDCCD /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A7BB224419183EB800EEDCCD /* ImageIO.framework */; }; C9C012A964EF5858FB45E0D0 /* libPods-HelloMixpanelTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 54804EDCB923F6CC7EF1F17A /* libPods-HelloMixpanelTests.a */; }; E115E00B1CCAD5D20026CFC0 /* Mixpanel.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 515B5A031CB6F95200A34060 /* Mixpanel.framework */; }; + E123C48D1D1354EC0015B425 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = E123C48C1D1354EC0015B425 /* main.m */; }; + E123C4901D1354EC0015B425 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = E123C48F1D1354EC0015B425 /* AppDelegate.m */; }; + E123C4931D1354EC0015B425 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E123C4921D1354EC0015B425 /* ViewController.m */; }; + E123C4961D1354EC0015B425 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = E123C4941D1354EC0015B425 /* Main.storyboard */; }; + E123C4981D1354EC0015B425 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = E123C4971D1354EC0015B425 /* Assets.xcassets */; }; + E123C4AD1D1355990015B425 /* MixpanelBaseTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 51D96E841D120D80001F622D /* MixpanelBaseTests.m */; }; + E123C4AE1D1355A00015B425 /* HelloMixpanelTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 2808F9BF1610EFE4005772B7 /* HelloMixpanelTests.m */; }; + E12C04A41D135952007D2086 /* Mixpanel.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E123C4841D1353D10015B425 /* Mixpanel.framework */; }; + E12C04A51D135952007D2086 /* Mixpanel.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = E123C4841D1353D10015B425 /* Mixpanel.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + E12C04A91D135A8B007D2086 /* Nocilla.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 518010151D11CEA300C5F3EA /* Nocilla.framework */; }; + E12C04AA1D135ACB007D2086 /* Mixpanel.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E123C4841D1353D10015B425 /* Mixpanel.framework */; }; + E12C04AF1D135F17007D2086 /* Nocilla.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = 518010151D11CEA300C5F3EA /* Nocilla.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + E2045FE14FB7248150CA7113 /* libPods-HelloMixpanel_tvOSTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 24ACB1E17599254B3B668E12 /* libPods-HelloMixpanel_tvOSTests.a */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -167,6 +180,27 @@ remoteGlobalIDString = 7C170C291A4A02F500D9E0F2; remoteInfo = Mixpanel; }; + E123C4831D1353D10015B425 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 515B59FC1CB6F95200A34060 /* Mixpanel.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = E1C2BEB61CFD6A010052172F; + remoteInfo = Mixpanel_tvOS; + }; + E123C49F1D1354EC0015B425 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 2808F9841610EFE3005772B7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = E123C4881D1354EC0015B425; + remoteInfo = HelloMixpanel_tvOS; + }; + E12C04A61D135952007D2086 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 515B59FC1CB6F95200A34060 /* Mixpanel.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = E1C2BE0A1CFD6A010052172F; + remoteInfo = Mixpanel_tvOS; + }; /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -192,6 +226,28 @@ name = "Copy Frameworks"; runOnlyForDeploymentPostprocessing = 0; }; + E12C04A81D135952007D2086 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + E12C04A51D135952007D2086 /* Mixpanel.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; + E12C04AE1D135F01007D2086 /* Copy Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + E12C04AF1D135F17007D2086 /* Nocilla.framework in Copy Frameworks */, + ); + name = "Copy Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ @@ -214,6 +270,7 @@ 187939F919A2A7F400CC4FBE /* EventBindingTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = EventBindingTests.m; sourceTree = ""; }; 18FCCF81199BD9CA00D6E474 /* SomeTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SomeTableViewController.h; sourceTree = ""; }; 18FCCF82199BD9CA00D6E474 /* SomeTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SomeTableViewController.m; sourceTree = ""; }; + 24ACB1E17599254B3B668E12 /* libPods-HelloMixpanel_tvOSTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-HelloMixpanel_tvOSTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 2802053F17DEC234000D71F5 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; 2805EDE517C6B815003A0D72 /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; }; 2808F98D1610EFE3005772B7 /* HelloMixpanel.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = HelloMixpanel.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -248,9 +305,22 @@ 83AEB5FB8EC0EA469A50BBB4 /* libPods-EventBindingTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-EventBindingTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 8673E0F319C3B7090099AB66 /* MPTimingViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPTimingViewController.h; sourceTree = ""; }; 8673E0F419C3B7090099AB66 /* MPTimingViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPTimingViewController.m; sourceTree = ""; }; + 86E02D4F180FF50B82E90400 /* Pods-HelloMixpanel_tvOSTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-HelloMixpanel_tvOSTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-HelloMixpanel_tvOSTests/Pods-HelloMixpanel_tvOSTests.debug.xcconfig"; sourceTree = ""; }; + 936971DC65F55B41A8EE46CD /* Pods-HelloMixpanel_tvOSTests.appstore.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-HelloMixpanel_tvOSTests.appstore.xcconfig"; path = "Pods/Target Support Files/Pods-HelloMixpanel_tvOSTests/Pods-HelloMixpanel_tvOSTests.appstore.xcconfig"; sourceTree = ""; }; A7BB224419183EB800EEDCCD /* ImageIO.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ImageIO.framework; path = System/Library/Frameworks/ImageIO.framework; sourceTree = SDKROOT; }; BB2CF402A7CC0E97A5080D11 /* Pods-HelloMixpanelTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-HelloMixpanelTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-HelloMixpanelTests/Pods-HelloMixpanelTests.release.xcconfig"; sourceTree = ""; }; + DF71948F06B2043405B77258 /* Pods-HelloMixpanel_tvOSTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-HelloMixpanel_tvOSTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-HelloMixpanel_tvOSTests/Pods-HelloMixpanel_tvOSTests.release.xcconfig"; sourceTree = ""; }; DF79C3E955E4F278C2032E3E /* Pods-HelloMixpanelTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-HelloMixpanelTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-HelloMixpanelTests/Pods-HelloMixpanelTests.debug.xcconfig"; sourceTree = ""; }; + E123C4891D1354EC0015B425 /* HelloMixpanel_tvOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = HelloMixpanel_tvOS.app; sourceTree = BUILT_PRODUCTS_DIR; }; + E123C48C1D1354EC0015B425 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + E123C48E1D1354EC0015B425 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; + E123C48F1D1354EC0015B425 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; + E123C4911D1354EC0015B425 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; + E123C4921D1354EC0015B425 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; + E123C4951D1354EC0015B425 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + E123C4971D1354EC0015B425 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + E123C4991D1354EC0015B425 /* HelloMixpanel_tvOS-info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "HelloMixpanel_tvOS-info.plist"; sourceTree = ""; }; + E123C49E1D1354EC0015B425 /* HelloMixpanel_tvOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = HelloMixpanel_tvOSTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; E801B3EBBA1BC612E273C12C /* Pods-HelloMixpanelTests.appstore.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-HelloMixpanelTests.appstore.xcconfig"; path = "Pods/Target Support Files/Pods-HelloMixpanelTests/Pods-HelloMixpanelTests.appstore.xcconfig"; sourceTree = ""; }; F93B64201D77994D9569DA54 /* libPods-ABTestingTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-ABTestingTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ @@ -287,6 +357,24 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + E123C4861D1354EC0015B425 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + E12C04A41D135952007D2086 /* Mixpanel.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + E123C49B1D1354EC0015B425 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + E12C04AA1D135ACB007D2086 /* Mixpanel.framework in Frameworks */, + E12C04A91D135A8B007D2086 /* Nocilla.framework in Frameworks */, + E2045FE14FB7248150CA7113 /* libPods-HelloMixpanel_tvOSTests.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ @@ -306,6 +394,7 @@ children = ( 515B59FC1CB6F95200A34060 /* Mixpanel.xcodeproj */, 2808F9971610EFE3005772B7 /* HelloMixpanel */, + E123C48A1D1354EC0015B425 /* HelloMixpanel_tvOS */, 515B59FB1CB6F69900A34060 /* Tests */, 2808F98E1610EFE3005772B7 /* Products */, 62E64CCC887FFDAED5235F29 /* Pods */, @@ -320,6 +409,8 @@ children = ( 2808F98D1610EFE3005772B7 /* HelloMixpanel.app */, 2808F9B11610EFE4005772B7 /* HelloMixpanelTests.xctest */, + E123C4891D1354EC0015B425 /* HelloMixpanel_tvOS.app */, + E123C49E1D1354EC0015B425 /* HelloMixpanel_tvOSTests.xctest */, ); name = Products; sourceTree = ""; @@ -415,6 +506,7 @@ 515B5A031CB6F95200A34060 /* Mixpanel.framework */, 515B5A051CB6F95200A34060 /* Mixpanel.framework */, 515B5A071CB6F95200A34060 /* MixpanelAppExtension.framework */, + E123C4841D1353D10015B425 /* Mixpanel.framework */, ); name = Products; sourceTree = ""; @@ -457,6 +549,9 @@ DF79C3E955E4F278C2032E3E /* Pods-HelloMixpanelTests.debug.xcconfig */, BB2CF402A7CC0E97A5080D11 /* Pods-HelloMixpanelTests.release.xcconfig */, E801B3EBBA1BC612E273C12C /* Pods-HelloMixpanelTests.appstore.xcconfig */, + 86E02D4F180FF50B82E90400 /* Pods-HelloMixpanel_tvOSTests.debug.xcconfig */, + DF71948F06B2043405B77258 /* Pods-HelloMixpanel_tvOSTests.release.xcconfig */, + 936971DC65F55B41A8EE46CD /* Pods-HelloMixpanel_tvOSTests.appstore.xcconfig */, ); name = Pods; sourceTree = ""; @@ -467,10 +562,34 @@ F93B64201D77994D9569DA54 /* libPods-ABTestingTests.a */, 83AEB5FB8EC0EA469A50BBB4 /* libPods-EventBindingTests.a */, 54804EDCB923F6CC7EF1F17A /* libPods-HelloMixpanelTests.a */, + 24ACB1E17599254B3B668E12 /* libPods-HelloMixpanel_tvOSTests.a */, ); name = Frameworks; sourceTree = ""; }; + E123C48A1D1354EC0015B425 /* HelloMixpanel_tvOS */ = { + isa = PBXGroup; + children = ( + E123C48E1D1354EC0015B425 /* AppDelegate.h */, + E123C48F1D1354EC0015B425 /* AppDelegate.m */, + E123C4911D1354EC0015B425 /* ViewController.h */, + E123C4921D1354EC0015B425 /* ViewController.m */, + E123C4941D1354EC0015B425 /* Main.storyboard */, + E123C4971D1354EC0015B425 /* Assets.xcassets */, + E123C4991D1354EC0015B425 /* HelloMixpanel_tvOS-info.plist */, + E123C48B1D1354EC0015B425 /* Supporting Files */, + ); + path = HelloMixpanel_tvOS; + sourceTree = ""; + }; + E123C48B1D1354EC0015B425 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + E123C48C1D1354EC0015B425 /* main.m */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -498,13 +617,13 @@ isa = PBXNativeTarget; buildConfigurationList = 2808F9C61610EFE4005772B7 /* Build configuration list for PBXNativeTarget "HelloMixpanelTests" */; buildPhases = ( - 195A51B1E5797AF49022A1D3 /* [CP] Check Pods Manifest.lock */, + AD48B0E1D0FDE02B32D8F942 /* 📦 Check Pods Manifest.lock */, 2808F9AC1610EFE4005772B7 /* Sources */, 51D96E8B1D1217C5001F622D /* Resources */, 2808F9AD1610EFE4005772B7 /* Frameworks */, 51D96E771D11EF69001F622D /* Copy Frameworks */, - 6AD4F51E62F4794F46EC4F93 /* [CP] Embed Pods Frameworks */, - 7EB546446E7626E6939A1F0F /* [CP] Copy Pods Resources */, + 11FBA527AAB4DE301A04BDD0 /* 📦 Embed Pods Frameworks */, + 97D8318B565052717E5E5717 /* 📦 Copy Pods Resources */, ); buildRules = ( ); @@ -526,6 +645,47 @@ productReference = 2808F9B11610EFE4005772B7 /* HelloMixpanelTests.xctest */; productType = "com.apple.product-type.bundle.unit-test"; }; + E123C4881D1354EC0015B425 /* HelloMixpanel_tvOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = E123C4A51D1354EC0015B425 /* Build configuration list for PBXNativeTarget "HelloMixpanel_tvOS" */; + buildPhases = ( + E123C4851D1354EC0015B425 /* Sources */, + E123C4861D1354EC0015B425 /* Frameworks */, + E123C4871D1354EC0015B425 /* Resources */, + E12C04A81D135952007D2086 /* Embed Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + E12C04A71D135952007D2086 /* PBXTargetDependency */, + ); + name = HelloMixpanel_tvOS; + productName = HelloMixpanel_tvOS; + productReference = E123C4891D1354EC0015B425 /* HelloMixpanel_tvOS.app */; + productType = "com.apple.product-type.application"; + }; + E123C49D1D1354EC0015B425 /* HelloMixpanel_tvOSTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = E123C4A91D1354EC0015B425 /* Build configuration list for PBXNativeTarget "HelloMixpanel_tvOSTests" */; + buildPhases = ( + 222471ECB08A5E0572E0D631 /* 📦 Check Pods Manifest.lock */, + E123C49A1D1354EC0015B425 /* Sources */, + E123C49B1D1354EC0015B425 /* Frameworks */, + E12C04AE1D135F01007D2086 /* Copy Frameworks */, + E123C49C1D1354EC0015B425 /* Resources */, + 768564EFBBB1CF00026F3472 /* 📦 Embed Pods Frameworks */, + 6EDEBFE516C45FD65271D88E /* 📦 Copy Pods Resources */, + ); + buildRules = ( + ); + dependencies = ( + E123C4A01D1354EC0015B425 /* PBXTargetDependency */, + ); + name = HelloMixpanel_tvOSTests; + productName = HelloMixpanel_tvOSTests; + productReference = E123C49E1D1354EC0015B425 /* HelloMixpanel_tvOSTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ @@ -542,6 +702,13 @@ 2808F9B01610EFE4005772B7 = { TestTargetID = 2808F98C1610EFE3005772B7; }; + E123C4881D1354EC0015B425 = { + CreatedOnToolsVersion = 7.3.1; + }; + E123C49D1D1354EC0015B425 = { + CreatedOnToolsVersion = 7.3.1; + TestTargetID = E123C4881D1354EC0015B425; + }; }; }; buildConfigurationList = 2808F9871610EFE3005772B7 /* Build configuration list for PBXProject "HelloMixpanel" */; @@ -551,6 +718,7 @@ knownRegions = ( en, English, + Base, ); mainGroup = 2808F9821610EFE3005772B7; productRefGroup = 2808F98E1610EFE3005772B7 /* Products */; @@ -565,6 +733,8 @@ targets = ( 2808F98C1610EFE3005772B7 /* HelloMixpanel */, 2808F9B01610EFE4005772B7 /* HelloMixpanelTests */, + E123C4881D1354EC0015B425 /* HelloMixpanel_tvOS */, + E123C49D1D1354EC0015B425 /* HelloMixpanel_tvOSTests */, ); }; /* End PBXProject section */ @@ -591,6 +761,13 @@ remoteRef = 515B5A061CB6F95200A34060 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; + E123C4841D1353D10015B425 /* Mixpanel.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = Mixpanel.framework; + remoteRef = E123C4831D1353D10015B425 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; /* End PBXReferenceProxy section */ /* Begin PBXResourcesBuildPhase section */ @@ -618,17 +795,48 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + E123C4871D1354EC0015B425 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + E123C4981D1354EC0015B425 /* Assets.xcassets in Resources */, + E123C4961D1354EC0015B425 /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + E123C49C1D1354EC0015B425 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 195A51B1E5797AF49022A1D3 /* [CP] Check Pods Manifest.lock */ = { + 11FBA527AAB4DE301A04BDD0 /* 📦 Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); - name = "[CP] Check Pods Manifest.lock"; + name = "📦 Embed Pods Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-HelloMixpanelTests/Pods-HelloMixpanelTests-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 222471ECB08A5E0572E0D631 /* 📦 Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "📦 Check Pods Manifest.lock"; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; @@ -636,29 +844,44 @@ shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n"; showEnvVarsInLog = 0; }; - 6AD4F51E62F4794F46EC4F93 /* [CP] Embed Pods Frameworks */ = { + 6EDEBFE516C45FD65271D88E /* 📦 Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); - name = "[CP] Embed Pods Frameworks"; + name = "📦 Copy Pods Resources"; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-HelloMixpanelTests/Pods-HelloMixpanelTests-frameworks.sh\"\n"; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-HelloMixpanel_tvOSTests/Pods-HelloMixpanel_tvOSTests-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; + 768564EFBBB1CF00026F3472 /* 📦 Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "📦 Embed Pods Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-HelloMixpanel_tvOSTests/Pods-HelloMixpanel_tvOSTests-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - 7EB546446E7626E6939A1F0F /* [CP] Copy Pods Resources */ = { + 97D8318B565052717E5E5717 /* 📦 Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); - name = "[CP] Copy Pods Resources"; + name = "📦 Copy Pods Resources"; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; @@ -666,6 +889,21 @@ shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-HelloMixpanelTests/Pods-HelloMixpanelTests-resources.sh\"\n"; showEnvVarsInLog = 0; }; + AD48B0E1D0FDE02B32D8F942 /* 📦 Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "📦 Check Pods Manifest.lock"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n"; + showEnvVarsInLog = 0; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -699,6 +937,25 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + E123C4851D1354EC0015B425 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + E123C4931D1354EC0015B425 /* ViewController.m in Sources */, + E123C4901D1354EC0015B425 /* AppDelegate.m in Sources */, + E123C48D1D1354EC0015B425 /* main.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + E123C49A1D1354EC0015B425 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + E123C4AE1D1355A00015B425 /* HelloMixpanelTests.m in Sources */, + E123C4AD1D1355990015B425 /* MixpanelBaseTests.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ @@ -767,8 +1024,29 @@ name = Mixpanel; targetProxy = 515B5A0C1CB6F96700A34060 /* PBXContainerItemProxy */; }; + E123C4A01D1354EC0015B425 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = E123C4881D1354EC0015B425 /* HelloMixpanel_tvOS */; + targetProxy = E123C49F1D1354EC0015B425 /* PBXContainerItemProxy */; + }; + E12C04A71D135952007D2086 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = Mixpanel_tvOS; + targetProxy = E12C04A61D135952007D2086 /* PBXContainerItemProxy */; + }; /* End PBXTargetDependency section */ +/* Begin PBXVariantGroup section */ + E123C4941D1354EC0015B425 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + E123C4951D1354EC0015B425 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + /* Begin XCBuildConfiguration section */ 2808F9C11610EFE4005772B7 /* Debug */ = { isa = XCBuildConfiguration; @@ -929,6 +1207,8 @@ ); PRODUCT_BUNDLE_IDENTIFIER = com.mixpanel.hellomixpanel; PRODUCT_NAME = "$(TARGET_NAME)"; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; + TVOS_DEPLOYMENT_TARGET = 9.0; WRAPPER_EXTENSION = app; }; name = Debug; @@ -960,6 +1240,8 @@ ); PRODUCT_BUNDLE_IDENTIFIER = com.mixpanel.hellomixpanel; PRODUCT_NAME = "$(TARGET_NAME)"; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; + TVOS_DEPLOYMENT_TARGET = 9.0; WRAPPER_EXTENSION = app; }; name = Release; @@ -1126,6 +1408,8 @@ ); PRODUCT_BUNDLE_IDENTIFIER = com.mixpanel.hellomixpanel; PRODUCT_NAME = "$(TARGET_NAME)"; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; + TVOS_DEPLOYMENT_TARGET = 9.0; WRAPPER_EXTENSION = app; }; name = AppStore; @@ -1167,6 +1451,225 @@ }; name = AppStore; }; + E123C4A61D1354EC0015B425 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image"; + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; + CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + DEBUG_INFORMATION_FORMAT = dwarf; + DEFINES_MODULE = NO; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + INFOPLIST_FILE = "HelloMixpanel_tvOS/HelloMixpanel_tvOS-Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(SRCROOT)/../Mixpanel", + "$(inherited)", + ); + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_BUNDLE_IDENTIFIER = "com.mixpanel.HelloMixpanel-tvOS"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = appletvos; + TARGETED_DEVICE_FAMILY = 3; + TVOS_DEPLOYMENT_TARGET = 9.0; + }; + name = Debug; + }; + E123C4A71D1354EC0015B425 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image"; + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; + CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = NO; + ENABLE_NS_ASSERTIONS = NO; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + INFOPLIST_FILE = "HelloMixpanel_tvOS/HelloMixpanel_tvOS-Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(SRCROOT)/../Mixpanel", + "$(inherited)", + ); + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = "com.mixpanel.HelloMixpanel-tvOS"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = appletvos; + TARGETED_DEVICE_FAMILY = 3; + TVOS_DEPLOYMENT_TARGET = 9.0; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + E123C4A81D1354EC0015B425 /* AppStore */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image"; + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; + CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = NO; + ENABLE_NS_ASSERTIONS = NO; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + INFOPLIST_FILE = "HelloMixpanel_tvOS/HelloMixpanel_tvOS-Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(SRCROOT)/../Mixpanel", + "$(inherited)", + ); + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = "com.mixpanel.HelloMixpanel-tvOS"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = appletvos; + TARGETED_DEVICE_FAMILY = 3; + TVOS_DEPLOYMENT_TARGET = 9.0; + VALIDATE_PRODUCT = YES; + }; + name = AppStore; + }; + E123C4AA1D1354EC0015B425 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 86E02D4F180FF50B82E90400 /* Pods-HelloMixpanel_tvOSTests.debug.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + DEBUG_INFORMATION_FORMAT = dwarf; + DEFINES_MODULE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/HelloMixpanelTests", + "\"$(SRCROOT)/../Mixpanel\"", + ); + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + "MIXPANEL_TVOS_EXTENSION=1", + ); + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/../Mixpanel\"", + ); + INFOPLIST_FILE = "HelloMixpanelTests/HelloMixpanelTests-Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_BUNDLE_IDENTIFIER = "com.mixpanel.HelloMixpanel-tvOSTests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = appletvos; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/HelloMixpanel_tvOS.app/HelloMixpanel_tvOS"; + TVOS_DEPLOYMENT_TARGET = 9.2; + }; + name = Debug; + }; + E123C4AB1D1354EC0015B425 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = DF71948F06B2043405B77258 /* Pods-HelloMixpanel_tvOSTests.release.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = NO; + ENABLE_NS_ASSERTIONS = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/HelloMixpanelTests", + "\"$(SRCROOT)/../Mixpanel\"", + ); + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/../Mixpanel\"", + ); + INFOPLIST_FILE = "HelloMixpanelTests/HelloMixpanelTests-Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = "com.mixpanel.HelloMixpanel-tvOSTests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = appletvos; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/HelloMixpanel_tvOS.app/HelloMixpanel_tvOS"; + TVOS_DEPLOYMENT_TARGET = 9.2; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + E123C4AC1D1354EC0015B425 /* AppStore */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 936971DC65F55B41A8EE46CD /* Pods-HelloMixpanel_tvOSTests.appstore.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = NO; + ENABLE_NS_ASSERTIONS = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/HelloMixpanelTests", + "\"$(SRCROOT)/../Mixpanel\"", + ); + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/../Mixpanel\"", + ); + INFOPLIST_FILE = "HelloMixpanelTests/HelloMixpanelTests-Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = "com.mixpanel.HelloMixpanel-tvOSTests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = appletvos; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/HelloMixpanel_tvOS.app/HelloMixpanel_tvOS"; + TVOS_DEPLOYMENT_TARGET = 9.2; + VALIDATE_PRODUCT = YES; + }; + name = AppStore; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -1200,6 +1703,26 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + E123C4A51D1354EC0015B425 /* Build configuration list for PBXNativeTarget "HelloMixpanel_tvOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + E123C4A61D1354EC0015B425 /* Debug */, + E123C4A71D1354EC0015B425 /* Release */, + E123C4A81D1354EC0015B425 /* AppStore */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + E123C4A91D1354EC0015B425 /* Build configuration list for PBXNativeTarget "HelloMixpanel_tvOSTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + E123C4AA1D1354EC0015B425 /* Debug */, + E123C4AB1D1354EC0015B425 /* Release */, + E123C4AC1D1354EC0015B425 /* AppStore */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; /* End XCConfigurationList section */ }; rootObject = 2808F9841610EFE3005772B7 /* Project object */; diff --git a/HelloMixpanel/HelloMixpanelTests/HelloMixpanelTests.m b/HelloMixpanel/HelloMixpanelTests/HelloMixpanelTests.m index 88fafa369..8c66b8533 100644 --- a/HelloMixpanel/HelloMixpanelTests/HelloMixpanelTests.m +++ b/HelloMixpanel/HelloMixpanelTests/HelloMixpanelTests.m @@ -320,6 +320,7 @@ - (void)testValidSuperProperties { XCTAssertNoThrow([self.mixpanel registerSuperPropertiesOnce:p defaultValue:@"v"], @"property type should be allowed"); } +#if !defined(MIXPANEL_TVOS_EXTENSION) - (void)testTrackLaunchOptions { NSDictionary *launchOptions = @{ UIApplicationLaunchOptionsRemoteNotificationKey: @{ @"mp": @{ @@ -340,6 +341,7 @@ - (void)testTrackLaunchOptions { XCTAssertEqualObjects(p[@"message_id"], @"the_message_id", @"message_id not equal"); XCTAssertEqualObjects(p[@"message_type"], @"push", @"type does not equal inapp"); } +#endif - (void)testTrackPushNotification { [self.mixpanel trackPushNotification:@{ @"mp": @{ @@ -575,8 +577,10 @@ - (void)testEventTiming { XCTAssertNil(p[@"$duration"], @"Tracking the same event should require a second call to timeEvent."); } +#if !defined(MIXPANEL_TVOS_EXTENSION) - (void)testTelephonyInfoInitialized { XCTAssertNotNil([self.mixpanel performSelector:@selector(telephonyInfo)], @"telephonyInfo wasn't initialized"); } +#endif @end diff --git a/HelloMixpanel/HelloMixpanel_tvOS/AppDelegate.h b/HelloMixpanel/HelloMixpanel_tvOS/AppDelegate.h new file mode 100755 index 000000000..1ad7e5a16 --- /dev/null +++ b/HelloMixpanel/HelloMixpanel_tvOS/AppDelegate.h @@ -0,0 +1,21 @@ +// +// AppDelegate.h +// tvOS_Example +// +// Created by Yarden Eitan on 5/31/16. +// Copyright © 2016 Mixpanel. All rights reserved. +// + +#import +@import Mixpanel; + +@interface AppDelegate : UIResponder +@property (strong, nonatomic) Mixpanel *mixpanel; +@property (strong, nonatomic, retain) NSDate *startTime; + +@property (nonatomic) UIBackgroundTaskIdentifier bgTask; +@property (strong, nonatomic) UIWindow *window; + + +@end + diff --git a/HelloMixpanel/HelloMixpanel_tvOS/AppDelegate.m b/HelloMixpanel/HelloMixpanel_tvOS/AppDelegate.m new file mode 100755 index 000000000..fa2ce5c1e --- /dev/null +++ b/HelloMixpanel/HelloMixpanel_tvOS/AppDelegate.m @@ -0,0 +1,63 @@ +// +// AppDelegate.m +// tvOS_Example +// +// Created by Yarden Eitan on 5/31/16. +// Copyright © 2016 Mixpanel. All rights reserved. +// + +@import Mixpanel; +#import "AppDelegate.h" + +// IMPORTANT!!! replace with your api token from https://mixpanel.com/account/ +#define MIXPANEL_TOKEN @"6e8cf49a783398b5768f24f105a95fb5" + +@implementation AppDelegate + +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { + self.mixpanel = [Mixpanel sharedInstanceWithToken:MIXPANEL_TOKEN launchOptions:nil]; + self.mixpanel.flushInterval = 20; // defaults to 60 seconds + + // Set some super properties, which will be added to every tracked event + [self.mixpanel registerSuperProperties:@{@"Plan": @"Premium"}]; + + // Name a user in Mixpanel Streams + self.mixpanel.nameTag = @"Walter Sobchak"; + + // Start timing the session, then we'll have a duration when the user leaves the app + [self.mixpanel timeEvent:@"Session"]; + + return YES; +} + +- (void)applicationWillResignActive:(UIApplication *)application { + [self.mixpanel track:@"Session"]; +} + +- (void)applicationDidEnterBackground:(UIApplication *)application { + self.bgTask = [application beginBackgroundTaskWithExpirationHandler:^{ + NSLog(@"%@ background task %lu cut short", self, (unsigned long)self.bgTask); + + [application endBackgroundTask:self.bgTask]; + self.bgTask = UIBackgroundTaskInvalid; + }]; + + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + + NSLog(@"%@ starting background task %lu", self, (unsigned long)self.bgTask); + + // track some events and set some people properties + Mixpanel *mixpanel = [Mixpanel sharedInstance]; + [mixpanel registerSuperProperties:@{@"Background Super Property": @"Hi!"}]; + [mixpanel track:@"Background Event"]; + [mixpanel.people set:@"Entered Background" to:[NSDate date]]; + + NSLog(@"%@ ending background task %lu", self, (unsigned long)self.bgTask); + [application endBackgroundTask:self.bgTask]; + self.bgTask = UIBackgroundTaskInvalid; + }); + + NSLog(@"%@ dispatched background task %lu", self, (unsigned long)self.bgTask); +} + +@end diff --git a/HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Content.imageset/Contents.json b/HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Content.imageset/Contents.json new file mode 100755 index 000000000..0564959fb --- /dev/null +++ b/HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Content.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "tv", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Contents.json b/HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Contents.json new file mode 100755 index 000000000..da4a164c9 --- /dev/null +++ b/HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Contents.json b/HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Contents.json new file mode 100755 index 000000000..8bf75d9f5 --- /dev/null +++ b/HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Contents.json @@ -0,0 +1,17 @@ +{ + "layers" : [ + { + "filename" : "Front.imagestacklayer" + }, + { + "filename" : "Middle.imagestacklayer" + }, + { + "filename" : "Back.imagestacklayer" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Content.imageset/Contents.json b/HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Content.imageset/Contents.json new file mode 100755 index 000000000..0564959fb --- /dev/null +++ b/HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Content.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "tv", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Contents.json b/HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Contents.json new file mode 100755 index 000000000..da4a164c9 --- /dev/null +++ b/HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json b/HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json new file mode 100755 index 000000000..0564959fb --- /dev/null +++ b/HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "tv", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Contents.json b/HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Contents.json new file mode 100755 index 000000000..da4a164c9 --- /dev/null +++ b/HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Content.imageset/Contents.json b/HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Content.imageset/Contents.json new file mode 100755 index 000000000..0564959fb --- /dev/null +++ b/HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Content.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "tv", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Contents.json b/HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Contents.json new file mode 100755 index 000000000..da4a164c9 --- /dev/null +++ b/HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Contents.json b/HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Contents.json new file mode 100755 index 000000000..8bf75d9f5 --- /dev/null +++ b/HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Contents.json @@ -0,0 +1,17 @@ +{ + "layers" : [ + { + "filename" : "Front.imagestacklayer" + }, + { + "filename" : "Middle.imagestacklayer" + }, + { + "filename" : "Back.imagestacklayer" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Content.imageset/Contents.json b/HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Content.imageset/Contents.json new file mode 100755 index 000000000..0564959fb --- /dev/null +++ b/HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Content.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "tv", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Contents.json b/HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Contents.json new file mode 100755 index 000000000..da4a164c9 --- /dev/null +++ b/HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json b/HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json new file mode 100755 index 000000000..0564959fb --- /dev/null +++ b/HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "tv", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Contents.json b/HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Contents.json new file mode 100755 index 000000000..da4a164c9 --- /dev/null +++ b/HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json b/HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json new file mode 100755 index 000000000..6a3dcfa52 --- /dev/null +++ b/HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json @@ -0,0 +1,26 @@ +{ + "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" : "1920x720", + "idiom" : "tv", + "filename" : "Top Shelf Image.imageset", + "role" : "top-shelf-image" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json b/HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json new file mode 100755 index 000000000..0564959fb --- /dev/null +++ b/HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "tv", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/Contents.json b/HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/Contents.json new file mode 100755 index 000000000..da4a164c9 --- /dev/null +++ b/HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/Icon.imageset/Contents.json b/HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/Icon.imageset/Contents.json new file mode 100755 index 000000000..66b242c7d --- /dev/null +++ b/HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/Icon.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Icon-72.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "Icon@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/Icon.imageset/Icon-72.png b/HelloMixpanel/HelloMixpanel_tvOS/Assets.xcassets/Icon.imageset/Icon-72.png new file mode 100755 index 0000000000000000000000000000000000000000..d17af22ac606a5edd64c85e9d0756bd2108985f5 GIT binary patch literal 8096 zcmV;RA79{!P)4Tx07!|ImIqW*X%@%7_tG0J5b1>8yFdVe&5d|wCgNle^8x$L;=mZ&5lyR_NLuDVZ#N9nRXV3oM`I6te=brz&_j~U<=K?^k zXA1;runYj{{7hk}w;O$NbPOFg1h9Y%qyP<=vpE?8*Wh4(@VEMKA3!tzcT8uz{yy)& zN|wvZ-~a#xBOK4o;G`pb3Rxu_fiM#Q6cdT-WM>Lyn2WHy5GfGhoEc7>`^Nxwp$AO2~<5>KHhRI(2|euTu6%l44$E${%Iz#qBjAOcte3t$N> zGkH0gGsU~F5Udg=CnjamU6B*OGoiEi95WNTm4&4hm^n{#uj}35>^XsG_#d%~wE%c_ zAi>{%#O#rJj~FA5&H543kp@6Y1%S>$j!2j_7emkdU;q(FBNZwkUxPL<0H(kS*aAnu zM5^@#K_DDNgJpmNl0Z5Tf^3in)`LP&47P*apc2%81KyI1ye6=fVZ>R=6Cl zgO9+i@CEofd=D1Gui!}(K#@>1lqSj)#Xz~Ef>1H21e6f97FC2QL)D?0Q5~pW)E$%< zHIDj>#-gccI@%QNi1tB8pgHK3=(Xq)bS3%_x)t4nzJne{PoTeJC>T|YF~$MI!Ysxl zVzM!Xm@-TQ<}~IK<{oAg^8t&+(y;niJFE{j8k>S$jV;0M#kOF(u>IH(>?96{Q^FbJ zoNz%nHZBuah^xRI!JWt5#*N}W;YoN6ycOOHAA{%PH{i?ghw^qDM2HX^%|W62`&R`Nk|7x@AC9fd;CqcABkluXK2N+abWa{dMT36atdYN>tbeZ%?>6_ByG6Wet8Fv}B%vzZ$nKLp2GLy1YSxea< z*>u?w*~79|WnakQ==@_2pUeDe}eg zN9FtEClurq7Aiz4Id7ttn<#82x6-O10N|DM5m4~XZ zs*!4_>T1;ksy9?8)zsCz)dXr4Y8TbU)oJQX^%V78>gUwQG^iTR8p#^FG|p?hq$|)} z>1p(GdJla0m|*{3#;Ubo1vYcy-T}WdqPJ;CqO4pr%C6b zEMEHqxoTexrG zpbga~z-F^ex6L|pDV>2Si~ zFGo|yRL8@PFBa)9;w`FQG~%S?#CEE65ga-I>Mm7Y($w7e3%n!F~wZM;`|clls^ z{Csx!46xK#99AQ1!q?7sjc<=1*)Pnm((kFik-yNtBLEKY4cHkl6sQ}>4{QqpL9C#i zL63v=gI5Os8iEZ84yg)x7HS!q7up*}4O<>|IP62XTllu{M-c`QqKNKD>B!i~#>kIR z9#N%H;>G5R*DSsstsI>k-5!IBiHvE8nOx$zWcQNMSew|w*!xTMm*y#M#&hD8@}4I+C6p$-NOVfv znK+i@l2n#7p6s4nnfxZjC#5FkV`@<9!PM!rsI-=Je0p5^8NM7pmEW^MeMQcSeu1%| zP#|9EuyXgx389~`Ap^=-n$eyqj|?t1LQ8tPw1bLf9l&}y`^Hy_abi5wPK6nvf{5LoRVul zTmD@B^Yqq)t$o{Ux9!`G-Ok^Be}~JCL#48%xuqjJ19rCVqVFo&^?vvA-B-&NmeuSb z?h)+~m;0BuSLjr1ulQP-RC%w;t*WJ3wR%hS$GzOWxA!skHP@)s6xV#&pS*vt*1NW~ zPOq-)0QNxEfoJuR^}W9^eraq_ZYXZ}c94Hid?@r#PorI9<6+gq+nV4eQPbFw*dw=& zdK_(UHf^qLp|unr1II+iULKD-e*c8uiSCn(lg+1ePgS3$o-S&IT35ABv?aBP+oRk2 z&-k9{?r`il{j1rp2Rk)8tIjH%-FA+6uHfAC`P}o9U4pLh3yBv-x|er9y14k_-JX!1 zzDs_Wu3YxIe6iQH_xu&7E1g#zuAaHZxYl;v_Im3Ln;WNpv-$0GpKV|3O}m@zx9o3q z^e^f^ciZLmg*zU1F5hL{y?!t7UjO}w`-20q1L8sM;EM-o58gb?dN}nce+V;F^jPL` z*%Q?#b-x?_-XgXYpB?rXzVS5d>7x)@mZoORc za`ctp)zo<5pR#{ezczS%>M!PBHzpQOjJ^@RnSNXHPU+pj_Y2>5PXSNI- zrB8=GGd}lziTd(BQ^z^p|q}Yc5bbXkcvu7l81OO(_+KSvn>bFKm-8kKrLR!Yssvgdt*H0_((+P)0{ucD-~%Kc;gA1*@KXu;gM{D% zP*tg_R3NmfT9THwDJ4lm;wEw8*iL+HC)d~KoHhAaYtA{=I>&all6%kHXYaA*n$NN3 z+S~H+-~KCARj4Wefd~Ky00rt#K^&?IhybdPagkksx3Z% zl#&48FQsZ(T%+c;0*S%NVnz6>9rma?I8fYH2|uN<-U7bqjPXgnz(>K?q5xIG7jaP> zU!*8XEq&-!@u7+_YwH_Yy@)-uXj0s>mK{=EnLWfN*eVo&gc9t+z;6}6$_82wQ5cR= zh}l@}ybK>pFk5^y-kO9wT*QPD@_4D%v6}+OXD;jwc1jv$UJXAlgas?MwUj4$OR7uo zBRy37yyzkEb&sze;v#~i03->Ii;Ztsbd5UIe^+3m0aYI{`bSv6`F`1&toO7E;BjrQ0R>g!R zTne|CdVXo^2$tj5+yxZba?VTeIW)@sxr<(b27YFIi^)2F#&_)lDY!-%OfBKXHTC<} z<;5oN=Cpg%KZ&Gj0jZ@pRe4%30VV$^yRJU+miD(LWV^q~Llr|czGr+f+mSN_eq1}+ zbcl{r1&D`FqL?!!X5laEMb@!KZTBbouTrko^2iB#ERvN=1?P*qyHK=AQitvpb~!NIVk~ZT>+SeJY=j|@`5*X zYxu1Xdc^>oN5x{dRxtq1K~myM6$#B^HS}JGNdn2VKC9PhorvAj;>!ZQC0DO(R8pmS zL`Efa<|p1Fkm?y_yd(mZ2%iWR!Y3VTDvB;LGF7NmEJ$H!t?v&t9Eeym$Xg0{atpR$ zv@0PNLQiZ*GdSDeAwijUO5eZdz9c|C#Yqa#7KQu<#H4*$A{x8 zPlgh&Pm-J~*Q%-txUsK+@8{4acJrL+7)(9nl-5v{u1TAGI&yoA(C*B zCmR8;h)+sdG)CZX`?QN5_vi*c*K|;gr5!%RiDH+?G(KpS#v?+INVa0FkZP51dq-Im z*vaTyz!#$!v940Hh#|3(8?sBSSjHzACDqW=$iD`eEC*PL_aQo0kH48%weBjlq6C*H z)=H8vR3*BKntR1503S{*ENM0&q5iq>w1M(VP=E$sDW}yuY2N9?wyENZ(Rhjp6eYOz z1WTCOjbQYixsYnC$pADwCBiajfs;Go#c+!sUz9Eb<7>{I>_c}&hMXx6CXIy7N&!#^ zGw02ci^gy#i@gL%{5M&xdM;NUA$M;02*>gge49z1C>!r=JhF}@C2aa!!R1{NuL{g) zXsaZ%7pD!WdQ=IuoE0g1bIf|T8KPa=w7M+Qc;+4jBeWl*M?V{4z2{<5OYCv9O~k(s+dbtf7Ly zZ>pBJKFEWl+qW8QUo0l&9u4(G+~$u~5p0N_zoj%Z_+Gii_Qfiwm*+%GTD1u$&QYpx z3-%!bRfwYN4^jC~i~DXKPF|g^vTvm*__bHDurFr#Sj1;<41*DUK={Mhmv?s>v>$k1 z%uc5y7>D9Pc4t<_bUG_olxuj5o?8Jy&Uk!hz@(UFg8oz8F4x4T(+yL%rHUo-ia|UG zD8}ZcM*TZy`_h##4y6JA(yJG+vpX&K3$T4)4O<7+k#nt%#Ayt|qoe-FIleP|_)@^# zta`JBel+r|%0=TVDp8Lgn-of(6=tzYYHi`s+|oUy4Nw2u9z;-8tgMXKxv-19X~st$ zeh~NFeJl2FZs6?e=ked)`98k%^=EM7;eA-0jF?X6NGbNeqlH@WlK|ODaz+BMG8r+i zOm`d;=5<>s1KuAZRn(A8jrVwXIewKNedZ*N9Nxs`*}U8?wK-Nn z%<_r|ugPSFIdASdffTOC06j6L)Ni#g~&W9hZ$BQ59sV#Eem-8is_~JYyUN{KX&rDt_|E zAHogSAIA39A>48M&3NdY_v7SCC-KyCuj0CWtC;7W;Bcj_|0luouk7I2lRH>n8L+;# zQoc`RFWr>U%HJBUP{-D(oKLvB)nCIf;PmTn-~;bIj{EMp0|1&wSmORT_nvn>fV++z z!tUO*2}9o~thbIs!iiHC@EafdAb$95_n@q{W7U25&;fknmp_8d^;Jw~^ID392aS*Q z&o_3b_~b9XAD{m7U%`X--i&h>E+N%Wj*?D}Ab@~2Fe`pC7iFQGQ>5A)%Zech&hJif z&z;Axwzk?VH?DMSA3lhCj~~VPi+feLx)w6#Dy12JX>W#`w>RXfE+BDDF?Vx@I?s&|IV;vyC&6;BaSX$Nwbd0&=h0>*$0_&%OlNZ(*j&S8 zQp2E8e6?f}?BBnE**sel3s#djTv8J3>|Vy5w;%J6KYC;vx8Agc^B4Cp4&o7F#JA~W z)VVt~Dap+mbW@2ac zD6TFz@xse^;(uPmP1~EkpQV}!w+J(tjK~@I(tkXTwf#mr}5=)K8IVb z-;e1$CRswY%3oRh)`1N?_VuUn%IUww%|{O7zrOW<^c5UfIEqz5O=4=NYZ>`$wjR1-V z1qHW+92&HVKuYZ93=BhYa~|J&{tT{LU%`#r`!TJSyB5BE zTa*Q?j04h85|n1eY_49`wJJ0!5BI>^Wm02!#MA#&N6{QwmL*ELb!v`quss%uJu*?bPn?QCrQ zc(^BVquC0-uSPu!v8|nEoe5im5zJog2n72!Rb{K8MHnuRj0z3R$(OZbZkUA64CFqblXX6mEe)B_TIM7S|0#}Wd$ zP|)I@2>!qri>#Nv(;#d-QRYj1{%AdRp#v*XKBeCyk=7ldLe54wu{%ka(njEnX7){d#q2dTSkv?aM@ zqTbD(5M|m&spl;`?5cQGiSc<~%tU6M5@8?o-we?0i9xk-TcA!P0H_%1M(`v5B{5XHy<>5y7mX8)HjYO4c zat0BhVK)qg%GX_#`~Pcvz5z$umUCdlEhg6t3dp6FwN9 zOkg463L>{ph_dVR4bkeDhHm?A@sPWD2P@q1D+s^u=J;xR`u0ATC&E~d^(9^a@at3d zQK^b}TeH42VT4XqyT@W8$2opy3`;Gp95!YqD!}+?_ubm1MYk`8c05$W3C%5OH(`s2 z&eNKt=))N=32Fl0h^x7!DY-R)IX)eI6*By6`6;A~d;_j%@hi^9eg2eghuH`(ivtp;sT-N}Vng@YfUC#i?Kzk`Kz?2Yy^{67pDfz3pCj3a~ur&smF)!}Cef z5mIT59P;KS1&l_RLb#eZp)?RZEa2t3GEry5ROx!-m_m8>=skwjUMGXdKhoq9KFCXR zktZ5rBtJsdUZ#SdYxD@|Ly-)vd7=YKP|4G$Q1u?>Wa&US$(lD2g;yi~#%vw|0{8 za&LqgXyAsrlV@20;K@jP0;=|p1ZXJ7AMdNy_DZUR-#>`e;ZrhK?eM!iX%CAs*&WT@ z`lSI-14|0yX69GIH_xoOOe|Sw?A|sz8pM#ryn$aXCL?nGv=c=p zsUcE4BO8w)#i-UdnH)cOT?+6xJULpEyES$fR^7f5<0whu)(kl1Cc0hHRkh zEW-!r5#~B+t})EY**ilIq?{(#mA_MY->beJ&k!nkhyaXQr2J2UK-f8*9o*iJGBvSuz6MjzGT(Dh1 zlj|xyoJ8K!ueh_?BC^G|#{`R{97--n4i9KHJY^Bzv#OnE1)8b-wFJW# zK>UsGHcU$XF~SG{*(cA3u?nsVWiCEI{vdroKWfCi8aP5tYcTN!PUaZMBSKerDTtt(*X zF(E|XrihsJgv-2V8NQkjrWJwhTP@%dO^a8c`W8t?QyQfOEwReA4BzvmwD@BP-S&Ny za?b*(1I6}|!XSyaQB3I(3gtZG0~XF9i=A8C7qfrjqFQbt^c!|d6){!_!HXE*VQN7s zD+sb|lPeJ5jS{q4lHTVs3pTwOQidz8!}mXX9;S-_)+#$pO`1^MgWx#BZv zv|JT6RC!;F!lk+>&yc%r<{IwS-U_MttFfpq;5+Lj@3L7ihJ|eZz?6rEFn+55#%Ek_ z$I^}pcRfSVB|=633tK2nNmP4Eod9~pHTkODWQ4Y_M!DkazdvTnlQxgQvCvJzjnsU{ z@-G_E+p@&04Tx07!|ImIqW*X%@%7_tG0J5b1>8yFdVe&5d|wCgNle^8x$L;=mZ&5lyR_NLuDVZ#N9nRXV3oM`I6te=brz&_j~U<=K?^k zXA1;runYj{{7hk}w;O$NbPOFg1h9Y%qyP<=vpE?8*Wh4(@VEMKA3!tzcT8uz{yy)& zN|wvZ-~a#xBOK4o;G`pb3Rxu_fiM#Q6cdT-WM>Lyn2WHy5GfGhoEc7>`^Nxwp$AO2~<5>KHhRI(2|euTu6%l44$E${%Iz#qBjAOcte3t$N> zGkH0gGsU~F5Udg=CnjamU6B*OGoiEi95WNTm4&4hm^n{#uj}35>^XsG_#d%~wE%c_ zAi>{%#O#rJj~FA5&H543kp@6Y1%S>$j!2j_7emkdU;q(FBNZwkUxPL<0H(kS*aAnu zM5^@#K_DDNgJpmNl0Z5Tf^3in)`LP&47P*apc2%81KyI1ye6=fVZ>R=6Cl zgO9+i@CEofd=D1Gui!}(K#@>1lqSj)#Xz~Ef>1H21e6f97FC2QL)D?0Q5~pW)E$%< zHIDj>#-gccI@%QNi1tB8pgHK3=(Xq)bS3%_x)t4nzJne{PoTeJC>T|YF~$MI!Ysxl zVzM!Xm@-TQ<}~IK<{oAg^8t&+(y;niJFE{j8k>S$jV;0M#kOF(u>IH(>?96{Q^FbJ zoNz%nHZBuah^xRI!JWt5#*N}W;YoN6ycOOHAA{%PH{i?ghw^qDM2HX^%|W62`&R`Nk|7x@AC9fd;CqcABkluXK2N+abWa{dMT36atdYN>tbeZ%?>6_ByG6Wet8Fv}B%vzZ$nKLp2GLy1YSxea< z*>u?w*~79|WnakQ==@_2pUeDe}eg zN9FtEClurq7Aiz4Id7ttn<#82x6-O10N|DM5m4~XZ zs*!4_>T1;ksy9?8)zsCz)dXr4Y8TbU)oJQX^%V78>gUwQG^iTR8p#^FG|p?hq$|)} z>1p(GdJla0m|*{3#;Ubo1vYcy-T}WdqPJ;CqO4pr%C6b zEMEHqxoTexrG zpbga~z-F^ex6L|pDV>2Si~ zFGo|yRL8@PFBa)9;w`FQG~%S?#CEE65ga-I>Mm7Y($w7e3%n!F~wZM;`|clls^ z{Csx!46xK#99AQ1!q?7sjc<=1*)Pnm((kFik-yNtBLEKY4cHkl6sQ}>4{QqpL9C#i zL63v=gI5Os8iEZ84yg)x7HS!q7up*}4O<>|IP62XTllu{M-c`QqKNKD>B!i~#>kIR z9#N%H;>G5R*DSsstsI>k-5!IBiHvE8nOx$zWcQNMSew|w*!xTMm*y#M#&hD8@}4I+C6p$-NOVfv znK+i@l2n#7p6s4nnfxZjC#5FkV`@<9!PM!rsI-=Je0p5^8NM7pmEW^MeMQcSeu1%| zP#|9EuyXgx389~`Ap^=-n$eyqj|?t1LQ8tPw1bLf9l&}y`^Hy_abi5wPK6nvf{5LoRVul zTmD@B^Yqq)t$o{Ux9!`G-Ok^Be}~JCL#48%xuqjJ19rCVqVFo&^?vvA-B-&NmeuSb z?h)+~m;0BuSLjr1ulQP-RC%w;t*WJ3wR%hS$GzOWxA!skHP@)s6xV#&pS*vt*1NW~ zPOq-)0QNxEfoJuR^}W9^eraq_ZYXZ}c94Hid?@r#PorI9<6+gq+nV4eQPbFw*dw=& zdK_(UHf^qLp|unr1II+iULKD-e*c8uiSCn(lg+1ePgS3$o-S&IT35ABv?aBP+oRk2 z&-k9{?r`il{j1rp2Rk)8tIjH%-FA+6uHfAC`P}o9U4pLh3yBv-x|er9y14k_-JX!1 zzDs_Wu3YxIe6iQH_xu&7E1g#zuAaHZxYl;v_Im3Ln;WNpv-$0GpKV|3O}m@zx9o3q z^e^f^ciZLmg*zU1F5hL{y?!t7UjO}w`-20q1L8sM;EM-o58gb?dN}nce+V;F^jPL` z*%Q?#b-x?_-XgXYpB?rXzVS5d>7x)@mZoORc za`ctp)zo<5pR#{ezczS%>M!PBHzpQOjJ^@RnSNXHPU+pj_Y2>5PXSNI- zrB8=GGd}lziTd(BQ^z^p|q}Yc5bbXkcvu7l81OO(_+KS%>p z_Brp>tD&o^tEyeqQ`%0u?KpPq#7;OE+u?1m>6A}c-1Y`se{D1`F7d!s}Li~Uf z2_gm=DGD+c7_bC5V8<9d#&+!3?J4fIyKVPSUES5M-n(Zne%R|Flim)go4yG#5nv~B+KSl=!;J8mrdTU&4FK`L8jczw-kT!6QYa7STaWx5rtYR~NqY0Oc>%=VhrQ#ZcBM2o1R6CYs+}HS>;mTf&ShsLNAPw$ST5FhTAq3~b z&VqMg+jSVG?Jk3IY?P<<9va##4bl|aLuys44P=W)W?U4Em?u>*6o@MZZI~LL#@D_9 zfCh;A-wXvJ3O2qAmoR+r`_v|%J-lhf1rJFvnCuHJ*oG94@JcP=3eRu?E>+BiKZxL33O%qcD#+7ee6|GsKGj-58I% z4Y&pG@SWp5_4QZr~=Chmw&eM zxsHpL5{eomjoxP)m&actTj4nd#^HM5*Tz>h^sHZ5d`$#%b{Ec;QfIn$2%5#07+CSR zCNAvUVTho$&}zy^0H}@FF80?|F-bEPJO+Gd?=D=)t&<2C0~FJ|zQzSfN)*qn-)CGQ zP*+fU=rkp(LVOo`6!D*|mWt4Ox7eFKpm;m^UUpDi)*&+@Y)%f6`Q}c+1}WJS07YMV z1l|P5?^R6?ja#VzgNQ6HBnn3WEZU)oF!d90sU<^65fU!!!j<~K_Vf3usJMD+TXhV8 zeU#Iaz@=3={n}m>mN9qR){Ftr!p6mpi#_gL{r=vKgpPE;zDzDDG`DKTpgVAl^+BK} zub|aI@GhgZ=BY^jZ@8gQ5Z#4KDlXZ9D`I;?bz9MwaQ)G}f-B)`t$D0wUt^%_pw_s# z%Z-l|D9g&<+jCt~8n~u5!kjem5Yt*i8zb5Q5zh-lFl;`#7i*hDCkrREFbD#TBL+BJ zL|4VKbn8^@Y*1}I0T;1FDnne^Lh1H7z%j`D-Za|>r{ZGzH4^;nWd^RDd8L8zKD**& z3sWO<(I!-@43lyw0v96{Qz{XlDZ<^&^WlZ@ ztxzCC*nIB56_(-2wOvb${7i_eB}VDEYUL?#CDM}d*mYU4`F@%vQ!*4>jqTX`mg3|z zwS*mDm1j3DANPSFX-a+`0L(ztRFl3ZB${bGqu2!PFI zF{Lm~?=fh(9qSK7#GVmEBC|_{dId+!weG@&go)C~UWB-!sPTNb)NuiZi?PrVSY>JQ zt{bktvpt3ih6Km8EI!yG!vYmLDsc*9>cAX~uncz@b-tpk6@`GVYV5MQj@AU|S&PZ= zym^SyN=C=Ggy#O62|qmpYm9K5R=Bd#Sgql@voq`HD@BR?lB|#e8Uvegt>qGB#3TcR zb&{;%1Y7`dQ8~j>b&U%d7o14W%=Kt-@P~ISeT;lJr%cMvkr>Hqic9<)DITR5!#_O? z7|^9h$BWhj=>8mWoXgVfeP0QcWM>C1WL!z1bR^b%zjd92i^S@FCoN_S^bAo6QuJj! z==pF3A3(iVsbh(2zzPAPP8b2OvIEb%c!NkAIXdMqltcg85WW+lRSJ{_Gh0Z(L9wp;q4o$aC z*BqJQP$*g9azje2n;7Sz<#uDzHXp;H_1U_{1-B~NGbsFYqNme z@{KV0H4?7YuP?aNafJZ8;lh@yT=#c`njwp}8tjY<=Kd%GO_pac0kncElbTUA>o!AD zr|7hd>l#-jjI$F2(=uo>afxKy8)EG8L^uX9S3zJg12U3T?bKo;Bb}BOZ7^2xIn68~ zaK#|P+AE5t)Yi;4Yq?E`D+!$BqqWh8EnFJ7XrVGp+uf$iLeyh-cBSiZ6S%tJl2Mgv zf~nv#S87~FB>Jz0p*6uw|DSy{D?B4d8gqJ4v_=6m1UcO7()+gdsshp=Z6vLnsaJGM zc(ZG*Wj$@XakXi*(U*=q6-3L9=Z^uQ6+}KY#PJK` zg3B*Y2{w^2<3?O!eP?W?l9^oQh+*;AW@b(;b8@BI`DMgY^5eL#wehH>_b6@{toU zu)e5Bz2NeY0)*u!(z9$9pfyhTbJUrmP*bgvLtjjylgI=Ihn)_pz|ZQGRPJpR{P=R3 zxVA+j4KpN04ihZ zTQgj9(IkxN#v!NSQtJbn2lnhN7?e%#!tD;Jy7q+7)En@;$OUKaw1ox|*Z3@Oh2UH2 zaKdH(Gd)P*0FhGI8kx*adAHKZ*s6uRNX&7mDNX|xBW{YZ25OBfUODd4>ghcwi=4s; zpg}4fms>tCckN@bl7wl49rJ<8uFDn`0cg`y*{p`J*i*hANqoa(_pm4(gBU5rGzpg8 zSGn6sxVqz_Fs5l5?>0-Z`jsdFj5sT;VIF}Jo6fS^XfAVuY07JMY(Ndau85wZu8dH? zi~pM)xSXMy_EBl3X@ZDgQ>GhZ0UNo@3{}_2b!VfHE7o|2D~~Yt1T!1?Xl~PX^SxB4L^~Gul9LY==B9YeO(kOosGT_DA93?Gd zyo)8x%qb`P8-23`dhj5%wC2qZl@cbpH;1p`ljSBw$hf@P!XLbetQs{FbZn%SmE zqUWh?Gq)3Qx#+UQcH;8Tpz64ouWsQ|g;LSXN+(k~o4$>uEJy_g0NQ&hbW|%XxFk3Q zaft||nKF6CAco5(D!33_M`&u3pn1b=Fu9@PGN@rTh<(wbfjRNzM78QjJv<(2oubJu zjL#ngqWhqFr^|hTtE5kY(*7=7Vs5e*TsRRIpD(G6{JC1tQa;PvdQM4bak*fUWwDrL z(_;H(F(Zlp#yxAR4-73gOmLi82zC^cqk{#9b+{lApP59_noX?wvI!=$K^CMW^md(R zO}fI>60ViS(aJR1$=|Q7k^LO2zk_f%E+K{?v62d*4svTP(hMq@Teucw%XnOQQye9p z)@r#r_!R07@(cFq;iTs4ldPh#HpE5 zcTOw=(-eWXB(!8lQkU{&@&UVq_D0r~OG;VmoaH8^05B}JbW|J{`xrvChbGM4SxJR% z8qkVy2Ch(y;#v)t0#Q*i4k03#BwV)eT6cXX<6_K{ow$-Lgkq->hYUy@Nr(h8CYGrc z)f&{SF9v1oqX zE)HB&U9u&O)T1wkrHSW@F-WO$L>6R&v{d>!hJ7`jx=q~ zsl*u2DXhuLWn9X^d}dAELrVsjr7s>v!m`J6IKLQez@KkOiZZ~eKn0i8Vq;yYm0pri zDz31MP^M52K3_6PogSdIAbOHgg4nhfo$=+0jw@fkl#<{sTzT-_zp=`darJ}?z?>6YYJ4_% zz-BSBS6t;cIWDNG1>t;yxz93t5ti3PAalgN{CqN84Q(p8LWWrh#ETNyQr8R3XeG|H z3$D@DJd;qwf~kS4&MgMXS>vL_44b0tOr!3R3`(P5S2xtii~Ey$3Wi;O9@88W6{1Pa*;noVs9 zhF3L_v(=(?`GIAB#vy z`IvElHVN8fr7uY{A_1(pHW2`}mNqYhik)MXMA6j~7r!4Nr<$$+o<=nYrg^e;w`ua5 zBfuG_4Xnq@b55|6LLm=jY}Fz zc`Xzw5hWz|x5A~G$x;j)J)f>|rIP|bzoRB3385parJ<5Aj5P%07dYo^rzMSMUJYHHcz381zMX&YD0!Lqipl^4Rb zr8o%}*-egJhKy{$NJ^gJfNvp)l;Q+jtxf_&n69|8XUNP}%?}gT9D_kE95?3$KZ?-A zb;s9qpS_Mm*6G-Y!wF1ge=Og1UawhcA~q41H1WmLflI-?>$%zzuqdsB`+0GxTWjyN zAC2)dDRayr4qOqNci`H=MWPR~B6fjYBzw5XV~a}C3Ve}Mi=r^KAUc{XBY}yrPQp?X z-#U+TWq{WzdspA!y6$MkMQd!-P6-0BjZ3z0@d3nDR|Up(;Y!s>N5&;9Tq1!h=h8rp zmFv08JZSmvAX||p(Sv4Ob6!`fx)`1y|838 z3Df#r8Y^4?_X*PC!lL3-5A!Cgm{b1maZJ7YG$toKs#df}@hm|C72E-Gm|*Y6E0#%) zf(DhgA`1TDwd{l|i^Iv^$i-P;9&s)2HRS3!BBo1qk#Qhol+d#E(FGUFO8?aB#xuz7 zV%CA3!WJ$cWXT;g)|@)tTG|zC)-rI%WVu619wgUfN%oj?=Yl)2v{rFt!yHzmS(J4U zQ~V2DRZiLK#$K~od~uDzJw8>i-x<}f=l3o;SASsA>$IP`hrn3V3?qrH-pHy zJPa}Rsv;|TmTeSf(m=+@!vrAdZ-F0VBtXnJGa&}Jc9WKtg}~3KRix&?(744;$neD5 z6oxC)eV|UjMFD2}VPc&Jw|m<)Rbi}&_%uEn)tw>ue7e_y?v_d1Z6~f|*c!NOyj*e0 zR=R`>8sov6w8s)s(3)w0<-WB-ppJ0gjFr-)0tZg{u%an?YO*@TTFijY|cX5&>!}TokfEEWOi0yu=x5C_^rU zlYop(Hx(B>R5CQwwKjRmu!a`*H*THkN<-@vx@QsiOpE}t$2}Pdb|p4RD+s_kF|6O* zn_reJ5@R)76TuTtKZhrtKE&Q$!`Xv<2!O+*4Q}4r;OxPKm)(9A`};GFH$BC<$f4R4 z(=V0D5?9~C<@)VrC*FoqQS7rUK)2eos+__T+igm#%ddXV+b6*71Vp4v!!J_V;I;+MBWTK4urp-Lmw>80bZYR8fM&%)Y7u%i6lc z7ihVol$dzV^39bd{!Q$gO`Z}HKYW8L9ld|Af773O_jqh#n3kCO;v->#&T0y4kVBB1 zY1gjU+neyz)6e1VtGDAH{`%YTGe7wwICu6;0hk4R>eN17e&1bq;~QRu8`q!0$N%7A zTsnW?u}ISMGp?d&WZX_Z21f3S+?yMoxp@m;{?>Ku%@ZzPJcrY#PvME{&*AHjJ&n`* zGfp4u6-Euj%!>D)mcUtuOtU0X52WvS=&nc%D2pt4&}*M0*g6n-zOl-D<`7>epXy=t z$DBSyX^NT@EDEZa=Z0r*-omAeXYmjI?%VOISKjBqMYbQFzq|A56}IUox|~F@f3ocCEF!IWBeMj*~T?bf=3^J26w&e0{+_DAH?gv|CKm*_6$UTXP&u< z&;8+7@!t1;1mAe{NnE>f8#bF|oFwAxG3H;Xj2>$pm&NoYpXveg7MX}8d6g_M{-klL z#)P=qbBRk8zAM08>&d5j1Pk;NKKRTXi7?Me`}Xxi{Jp>V=h7f<&oky%CN`IDKaXGi z#h=3;eCfAv^Y92~4)$?u6RPwS1*h3j~phs1qJxzfCb}=Ac2;L@>SfhkoYWBVcpZoZ1#{JMZ=d)>Bu*diUlD-}>$i zJouxp#@qk=pT_>)Toyq+-zy90@}-M7I=qPw{+}=6!nso^ElGr2@_jkB#L~fep78A_ zpT!%#?;ia9zx_+N>)IVj@b%f}Z##$Az2<&=;~S6Qp+EW#&Yd}h@KnKC)vZR0mkDBI z2xX9(8_(Xt*B^Zv-+KHRGyrE0_J_Q@Eh-)jh)MxZHx#R*T#)w6NZ@I7m21}*=7RPi66w-GY8|=7cq!gpbXxB;!Ur`)k|k_cSyI!FQgz>8#fc0@)h#WHbDG_HFbxksL5COPuOK_mwSC zjKHw!0*{w9!ER0P+^r4nx#K+UHTPAm_Qek-0Ni=?3SRw+Yxv~nzkxFc`{;dHCE3;G zO)Fdi!IL)*@#AlLC0_ID`^#XQ^h^MF;QssY;E%ov@BiJ;;=a2s;?~gyl42R3o0VWa zce*#vc=Gy9yx}$X;BWoaKa1~u#XSIkw>UHd=OO?mv6s-UwG?J%YibRLw~le`$~j!UW8}@tvW%KC zfJ>Jy;J&*r+nPK%B^y%a0 zY2<20#~bhD|L<#AIt~wyFtz8wg>aXFE0&E+t>MNqH(&CzZyg=ucv(+*Y1&Q@u@Vrd zs9O#MI5;)q@$1jw@h7hjVNa7UK6~n^8+iE9Cvf5HJ~nx8=6F{ujxiGU9kAvc9Bf-) zmL)C%qxROYSzw{qt=s|;!Di_=b7~KdJa!#7Zan*vh3C)=_tQ6?#UtN(9A{3=E;v;` zAS6{(h@n}M9<2N9!Hh3``C;5TI!*)f{I8>+o9Wgv%Gs;P*c95We`Oui*z?`@l#irfr6qNz+%p_6Yv_M?R0c zuAIZsaXuh;K%1u6Xq)?`;4W+6XtUt*`P2BlPktHK|H;3_PyNXsz^POF_}C}EfDe7* z%eZ#=+&D}(=&0jh7T|@5CS!e5Qc!oLX(?rEJk^7%phav!(zt289@TTFG2~D+KW#DK zj`OGRfe(HhKl&rD$HfchUeZ9aaL~Kr!yo;9Jaywa+;RJ59NSSQTs#fbWfFl4mK}|w zT}~hDyP2XpZ+?!0#|N3g=?420wU-=4W8P7BJlf665z!ao+8Z) z6;&yx*S&ER1oEExHB}F~pDB2CSIg3I?#w<96;LGT99`*t#MHaoOnqrGr8@|K0f!*qqzRm6L{cz@4>lqXG$K(|Gxd5 zC-AS{^Pliv{^w_L=jC%aI*wCBmL;zi4AQ~WfoabgS69WEQ+v2}=^XC3cz|=u6gHd1mm#ikv5ob?d}A9ya{*kq z?Es(p!o&FN=e~qVMhsIZ4iAs;t;fEDkACbk_|1R)ethWT58;nAjaVizvD z(UBDIz-6&?YJ%&}9OApz4{`6+3%Gja90Y<#9=nc5zIy{#&L80R^QW;P?MEzeiNpBQ z1Og(LI|)}TT26ALrJ;H=-e1owN(9JbWWwd_)|BcO-|;SO5)?lJ;md=3w_VJL!w|CD zr4Z+N!gGg5c=DMe{N=a(7~b;JKa6|txrY7yy#jt&I==ngC-9Mvej4w2?}u>X<{|F5 zcy?&=4wqbUX(C%a7B-tJET?EeG0$TX_~>}SbGMEG2oClp931Q!<6PW3Yzf+wVz7D= zs@K(UZni{_Q#MAhrhabboKK*6<-_JjS`|muD zb7u}lSuANAOH+wMJFYR)r1dkvPadhb;f(OV_ojc-)Cm(2Bu6kY%BBUkpKV^`bk7VR6bK-hfIyJkzf9`-_ZO3_s!Jk@u6$e z5I`)47~yqvaD60-s^ZlCjAw7&!ndBdiQ}bXG9th=p;vD|jf=M(V6$lHOt>+W&+`&{ zq-!&=A}+uVbLe%j{b-ogfCmAgvKkwmW4Q}sl-lrDT<{d=`EkL2MuM!B^7AFBMKRK3 zwByn^JP|s!48-WGGbUC`NP^T{82>iuLUk~we7c3Z9tCb4ZLq(;hX?MxeJtTfODN{4 z;dtq|b+lCNOD>eF6t++G7y=lb4Av_GtMUj$hQfqmjq~nYNm3dDWZ^||!Vh;aORX~^ z^^BcxdleU1El>3jiM2r$*LLjmHj+gag|;|6QvEXD}mJYgR5b}U9O*Q_o%{VJv zc{uN;%(+{Mr+M=sI30E#Y&~Y%EWS-Oqt9`=1gZjM)C0$hhpdLXk=M>oTzWM?aLx;6HxZ&z{vNe##22g zC?HPt;KhpdsUF*>jqJvi_wN%|Y#GcXtoCK=v=Ns@Rj6_Vx8Z_tniqEOSS_ImS9ldx zor2vKT>ji<1ZfDWoX$Md0t)pXj#-w@Q$3_MxTeABb7}^+b^$>KtS{+D&sL{;bhUG9 z?C>CI;FbfBd`M`s$G7<<;4%%KIItMACUHzl;L3z$n$m%`iFlA9kKzQ0VVvrbaRGHb zQ&xf+s{X>7P$lI?;(VAK1~vG zt-eG%A*>a7$yl~m*$Fe$~<;_Oz&523GiTzQguRjtAH zX(RPm@4%%VS`;&Df86Rfyyf^o5dM&tmPTMIJ6u6u#V>v@M!B36fHKJ1IzAj*#MV1_ zGrNpu1Y^s%+-2;>6@e6-e0CRTF@24T@!!wjS>ZCD?4RY+My58Etrr$E#-LF668LJG zqUp{fS67s_pDC^BQ*;kBc@mh+|>OUM8E8ka^}J>lw_PS2p%S_yfQ zv4{%M{kYiLChsUq`*-3pMw|t2&5hs89HeI91Vaf+;ev|+6 zv{hU=raI}!q{_*cVHGV3v_93t(ObK_&NpI68NX_)CBH1Edgun>PORxDW*d#RiOooE zLvSOBjU3E(OC^A#o@(vKF#tpyGEWTH54g>^*!dEtqOk4-0jaye3Kq@p)ipPl%)&!y z!Byg-;S!atQ$0qG-J_nY>TM7Ctny9_d(KRi<56&}EOgFV!4gHbx}4xXOU8IWtU}lg!ULKq+)QkK6?NF+qjBf zx466_ERqa?&ktOI!@sBRPjct?x%ON`m&6ffs+EZm&p0y7ar!H!Xad|CC_5eQnZk~w zevDo(CvW6KmUiPBu9#=d$H&?LiqW~r+RSQ zGOnnh2QIG@B(qb%m$g7(Kh8E3d|Ad;JrBAiR|MIYxsCK0j z?KQ65FWKss=6G6#SP_yXk zIhbXTgi|!?#3u&Re(Xfnr+S1d+=(m2B);-*UomB+f)P(Wz<$T69wLcA4K2<;2S{8# z*^Bt`a1tq9g^3(rrN}OLMPL1BDDN+)jfi08p+5p7K}+dS)H`DuCI8a7CPENGwz!A5 zcepN2C81vHovNKIieaxfaDhH3{o;Yd?7biJm2n{#(Q9l)QpSvnO4e7nwis&R2;v?n zHmtH@Rk!(PQC+{#Q1 zmovMyJBs+`TI;y56PGxy7=+yC!a(d|^+ z$-rv1fE9tYZ=ImHMa?PjvQAWrhPZH3OdDF&yz{L!-}U8;%U=03sjlgFo$3Bk?6!yb z-+lzxNw{{nK1s^gY!w}!F$QWI7jw$oW_TNp*a^5Oo31NdrAxL_FmSm?W4nn9s4AK_ zpcp3(ZpDD@(w3XM1ei=N)P)_VFpv9_6(@Jwv*IMT3QLatPsf!67^a50j@+{TyYjx!u z7vnnXR3IO}9M-{(3?O;F&TF_s6=L2j39u%_Va;@XO&Tz*aAB1GdK%1W2QDG8vOaL( zR5Jp><2lF4(fMSP$~=*ZA*?$$5n$qgh8$Q)1cs}VDV66a3sKTAL#sO@!o3Lr`=%`CAv%Kc@sUB-e%mK^5ogI2o7OpWgW}H%? ziT&oaJCdI3f;Sn7QT9DwYfMbBw5_BFw*U?0N8+x z{;)94c##i`jlwcgCp@Wdl1^WQx4VUl;r0@fP&HT9igNy9*b`LV0{2rQ9h6uHG2?<+6t7dnrXFPCqj@qNDTc5PGaYtFv7O%3B{oq=werUE3#GJ@b>#sGTo z@`0tri48t9&pC#jmiU%_*{3x@N9>EtxR8`0aanHC z(~ZhkLBLX|DavFg;mXg;=b#tfm~cf*X5m0qM}b>)Eiv<%aX_{Evh=*Ad4Je}|;^9zQ!c zT!M8{BHDDN@ZlOym0h3eK~g5HvIG9}fE;|kwxzaECx6>C#rbj#&^~fU#z78tT`Fjp zWo%8$Wj27(!|o-9NqkkH7b+S($_`xX9ovkbNNuliiTFt#d1ZUH)a-(TD5WZn$uV<) z#vj$zA@4cdWiB{(qv%6yBteXI0DKALnn2_-(z5hop;_qsH`98xc9Gop=tOeuO~A!l zImYree(|aA#6{1r^cTjJPxbKru2}8BoUsP35e9;lk%`uLUU8Mf?q3A1QD_<0&s(=p zBN8&O<6o_)gdhe%zb2tQ2|#%A1D7|c^WyfEN7 zs6@_*j4K8pW(VK0rdJ=eWgK7xbo6UFB&9VWzoHePlRX2SaA90;VQjn z;?a1E5K__f1Y9%>Xzi=x(wOVbxHx#kMUTmh0KnM$!G{jnXw|Av32g6=5BKXo$qsBO z2IDW==htF`A!34zO1M{9IJM-skZ>i&cM`6?Y-=(tZ*7@LrU}=2RXGLR%HN|6dI$+# zkr$VxaFthy#~J06V8xXS6G+dG;qg;FlF;+qSBf=|n7*MvbKQ@zKt%lTf=tVMildE0 zYGrg@*Qnn#3Ra;r+Vx@JtJGDvswwOT9X4ZR-PC&dO8&r#`wbbe2%+e ze|FZobV>)pqIS6=T4yeVQ?T_^kCvWqY*)#cci|$*iMh=6=^^|#$5VMxxG3Xwieg5b z7LltnT+W1y59eKpY-q)3plBIrwLFF;w1a@7MhXNQ;hL$xV#+~ZZPk(kqmALE#s=Yq@%rX@zJj+pjTYsBGYLaxp^?0t)M(+!nm9SJ}aQHs6(xvm>-MHw+*0@N5Vwoh$D!SHM z#U<<0Myh+OxZuk>_yJ|xlGX7yP_k9$Tya=tR?blT93C(VxqwO9O@$Eg3W(mIE3N2V2qXQ8r!FO zI4)B-?hP5oqC|PF5)E9t|sHG z9=MiA-dFv7Fuh1p^F3i%?wEwGR=gdqFjs6RwjLiO3h}N?;B#ZJ)YpctaYg)$wi7OF z;~LM)9w>W@8WUgWI^yCuhD(hBCsfB}L0|1h$SJ%0JWxeR(lRa#H`}N+ed*Y2HlAd& za16u`rI1oOt=_>DX + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/HelloMixpanel/HelloMixpanel_tvOS/HelloMixpanel_tvOS-Info.plist b/HelloMixpanel/HelloMixpanel_tvOS/HelloMixpanel_tvOS-Info.plist new file mode 100755 index 000000000..c77c00c30 --- /dev/null +++ b/HelloMixpanel/HelloMixpanel_tvOS/HelloMixpanel_tvOS-Info.plist @@ -0,0 +1,37 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + arm64 + + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + + + diff --git a/HelloMixpanel/HelloMixpanel_tvOS/ViewController.h b/HelloMixpanel/HelloMixpanel_tvOS/ViewController.h new file mode 100755 index 000000000..f2ad4bcea --- /dev/null +++ b/HelloMixpanel/HelloMixpanel_tvOS/ViewController.h @@ -0,0 +1,13 @@ +// +// ViewController.h +// tvOS_Example +// +// Created by Yarden Eitan on 5/31/16. +// Copyright © 2016 Mixpanel. All rights reserved. +// + +#import + +@interface ViewController : UIViewController + +@end diff --git a/HelloMixpanel/HelloMixpanel_tvOS/ViewController.m b/HelloMixpanel/HelloMixpanel_tvOS/ViewController.m new file mode 100755 index 000000000..b311193a3 --- /dev/null +++ b/HelloMixpanel/HelloMixpanel_tvOS/ViewController.m @@ -0,0 +1,41 @@ +// +// ViewController.m +// tvOS_Example +// +// Created by Yarden Eitan on 5/31/16. +// Copyright © 2016 Mixpanel. All rights reserved. +// + +@import Mixpanel; +#import "ViewController.h" + +@implementation ViewController + +- (IBAction)trackEvent:(id)sender { + [[Mixpanel sharedInstance] track:@"Player Create" + properties:@{ @"gender": @"Male", @"weapon": @"Pistol" }]; +} + +- (IBAction)setPeopleProperties:(id)sender { + Mixpanel *mixpanel = [Mixpanel sharedInstance]; + [mixpanel.people set:@{ @"gender": @"Male", @"weapon": @"Pistol" }]; + + // Mixpanel People requires that you explicitly set a distinct ID for the current user. In this case, + // we're using the automatically generated distinct ID from event tracking. + [mixpanel identify:mixpanel.distinctId]; + // It is strongly recommended that you use the same distinct IDs for Mixpanel Engagement and Mixpanel People. + + // Note that the call to Mixpanel People identify: can come after properties have been set. Data is queued + // until identify: is called. Thus, you can set properties before a user is logged in and identify + // them once you know their user ID. +} + +- (IBAction)start:(id)sender { + [[Mixpanel sharedInstance] timeEvent:@"Timed Event"]; + + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + [[Mixpanel sharedInstance] track:@"Timed Event"]; + }); +} + +@end diff --git a/HelloMixpanel/HelloMixpanel_tvOS/main.m b/HelloMixpanel/HelloMixpanel_tvOS/main.m new file mode 100755 index 000000000..b8cd589bb --- /dev/null +++ b/HelloMixpanel/HelloMixpanel_tvOS/main.m @@ -0,0 +1,16 @@ +// +// main.m +// tvOS_Example +// +// Created by Yarden Eitan on 5/31/16. +// Copyright © 2016 Mixpanel. All rights reserved. +// + +#import +#import "AppDelegate.h" + +int main(int argc, char * argv[]) { + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); + } +} diff --git a/HelloMixpanel/Podfile b/HelloMixpanel/Podfile index 278e58daa..26b71378b 100644 --- a/HelloMixpanel/Podfile +++ b/HelloMixpanel/Podfile @@ -1,3 +1,11 @@ +def shared_pods + pod 'OCMock', '~> 3.0' +end + target :HelloMixpanelTests do - pod 'OCMock', '~> 3.0' + shared_pods +end + +target :HelloMixpanel_tvOSTests do + shared_pods end diff --git a/Mixpanel-tvOS-Info.plist b/Mixpanel-tvOS-Info.plist new file mode 100755 index 000000000..763cca000 --- /dev/null +++ b/Mixpanel-tvOS-Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + Mixpanel + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + + diff --git a/Mixpanel.podspec b/Mixpanel.podspec index 87b060e84..b9eea8fc8 100644 --- a/Mixpanel.podspec +++ b/Mixpanel.podspec @@ -8,7 +8,7 @@ Pod::Spec.new do |s| s.source = { :git => 'https://github.com/mixpanel/mixpanel-iphone.git', :tag => "v#{s.version}" } s.requires_arc = true s.default_subspec = 'Mixpanel' - s.platforms = { :ios => '7.0', :watchos => '2.0' } + s.platforms = { :ios => '7.0', :watchos => '2.0', :tvos => '9.0' } s.subspec 'Mixpanel' do |ss| ss.source_files = 'Mixpanel/**/*.{m,h}', 'Mixpanel/**/*.swift' @@ -16,7 +16,7 @@ Pod::Spec.new do |s| ss.resources = ['Mixpanel/**/*.{png,storyboard}'] ss.frameworks = 'UIKit', 'Foundation', 'SystemConfiguration', 'CoreTelephony', 'Accelerate', 'CoreGraphics', 'QuartzCore' ss.libraries = 'icucore' - ss.platform = :ios + ss.platform = { :ios, :tvos } end s.subspec 'MixpanelHostWatchOS' do |ss| diff --git a/Mixpanel.xcodeproj/project.pbxproj b/Mixpanel.xcodeproj/project.pbxproj index e8cd0e85a..3814e2921 100644 --- a/Mixpanel.xcodeproj/project.pbxproj +++ b/Mixpanel.xcodeproj/project.pbxproj @@ -189,9 +189,51 @@ 7C170D4E1A4A05BE00D9E0F2 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C170D4D1A4A05BE00D9E0F2 /* QuartzCore.framework */; }; E115E0151CCAEDFD0026CFC0 /* Mixpanel+AutomaticEvents.h in Headers */ = {isa = PBXBuildFile; fileRef = 51C3B2381CA5B2D3004CE37C /* Mixpanel+AutomaticEvents.h */; }; E115E0161CCAEE060026CFC0 /* AutomaticEventsConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = 51C3B2391CA5B2D3004CE37C /* AutomaticEventsConstants.h */; }; + E123C47E1D1342120015B425 /* MixpanelPeople.h in Headers */ = {isa = PBXBuildFile; fileRef = 519C548A1D131E6500407F56 /* MixpanelPeople.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E123C47F1D1342150015B425 /* MixpanelPeople.m in Sources */ = {isa = PBXBuildFile; fileRef = 519C548B1D131E6500407F56 /* MixpanelPeople.m */; }; E1954F951CC559E000B92B19 /* MPNotification~ipad.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = E1954F921CC559E000B92B19 /* MPNotification~ipad.storyboard */; }; E1954F961CC559E000B92B19 /* MPNotification~iphonelandscape.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = E1954F931CC559E000B92B19 /* MPNotification~iphonelandscape.storyboard */; }; E1954F971CC559E000B92B19 /* MPNotification~iphoneportrait.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = E1954F941CC559E000B92B19 /* MPNotification~iphoneportrait.storyboard */; }; + E1C2BDFC1CFD61030052172F /* Mixpanel-watchOS-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = E1C2BDFB1CFD61030052172F /* Mixpanel-watchOS-Info.plist */; }; + E1C2BE121CFD6A010052172F /* NSInvocation+MPHelpers.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C170CBB1A4A035F00D9E0F2 /* NSInvocation+MPHelpers.m */; }; + E1C2BE151CFD6A010052172F /* UIColor+MPColor.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C170CBF1A4A035F00D9E0F2 /* UIColor+MPColor.m */; }; + E1C2BE261CFD6A010052172F /* Mixpanel.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C170C4C1A4A035F00D9E0F2 /* Mixpanel.m */; }; + E1C2BE271CFD6A010052172F /* UIImage+MPAverageColor.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C170CC11A4A035F00D9E0F2 /* UIImage+MPAverageColor.m */; }; + E1C2BE2F1CFD6A010052172F /* MixpanelExceptionHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 5177CFC61C5032B600271843 /* MixpanelExceptionHandler.m */; }; + E1C2BE4B1CFD6A010052172F /* UIImage+MPImageEffects.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C170CC31A4A035F00D9E0F2 /* UIImage+MPImageEffects.m */; }; + E1C2BE4D1CFD6A010052172F /* NSData+MPBase64.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C170CB91A4A035F00D9E0F2 /* NSData+MPBase64.m */; }; + E1C2BE551CFD6A010052172F /* libicucore.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 515B5A221CB6FF8600A34060 /* libicucore.tbd */; }; + E1C2BE561CFD6A010052172F /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 519AD7A51CB706A9005411A5 /* CFNetwork.framework */; }; + E1C2BE571CFD6A010052172F /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 519AD7A31CB706A6005411A5 /* Security.framework */; }; + E1C2BE581CFD6A010052172F /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C170D4D1A4A05BE00D9E0F2 /* QuartzCore.framework */; }; + E1C2BE591CFD6A010052172F /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C170D4B1A4A05B400D9E0F2 /* CoreGraphics.framework */; }; + E1C2BE5B1CFD6A010052172F /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C170D471A4A05A500D9E0F2 /* SystemConfiguration.framework */; }; + E1C2BE5C1CFD6A010052172F /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C170D451A4A05A000D9E0F2 /* Foundation.framework */; }; + E1C2BE5D1CFD6A010052172F /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C170D431A4A059800D9E0F2 /* Accelerate.framework */; }; + E1C2BE5E1CFD6A010052172F /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C170D411A4A059400D9E0F2 /* UIKit.framework */; }; + E1C2BE601CFD6A010052172F /* Mixpanel.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C170C4B1A4A035F00D9E0F2 /* Mixpanel.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E1C2BE661CFD6A010052172F /* UIImage+MPImageEffects.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C170CC21A4A035F00D9E0F2 /* UIImage+MPImageEffects.h */; }; + E1C2BE791CFD6A010052172F /* NSInvocation+MPHelpers.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C170CBA1A4A035F00D9E0F2 /* NSInvocation+MPHelpers.h */; }; + E1C2BE7A1CFD6A010052172F /* UIImage+MPAverageColor.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C170CC01A4A035F00D9E0F2 /* UIImage+MPAverageColor.h */; }; + E1C2BE7B1CFD6A010052172F /* MPLogger.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C170C7F1A4A035F00D9E0F2 /* MPLogger.h */; }; + E1C2BE801CFD6A010052172F /* MPFoundation.h in Headers */ = {isa = PBXBuildFile; fileRef = 37F9F7F11C2B8BFC00783DDB /* MPFoundation.h */; }; + E1C2BE871CFD6A010052172F /* NSData+MPBase64.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C170CB81A4A035F00D9E0F2 /* NSData+MPBase64.h */; }; + E1C2BE8F1CFD6A010052172F /* UIColor+MPColor.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C170CBE1A4A035F00D9E0F2 /* UIColor+MPColor.h */; }; + E1C2BE911CFD6A010052172F /* MPAbstractABTestDesignerMessage.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C170C4D1A4A035F00D9E0F2 /* MPAbstractABTestDesignerMessage.h */; }; + E1C2BE9D1CFD6A010052172F /* MixpanelExceptionHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 5177CFC51C5032B600271843 /* MixpanelExceptionHandler.h */; }; + E1C2BEA11CFD6A010052172F /* MPArrowLeft@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 514733C81CD7D6EC0098B23A /* MPArrowLeft@2x.png */; }; + E1C2BEA21CFD6A010052172F /* MPDismissKeyboard.png in Resources */ = {isa = PBXBuildFile; fileRef = 514733D01CD7D6EC0098B23A /* MPDismissKeyboard.png */; }; + E1C2BEA41CFD6A010052172F /* MPArrowRight@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 514733CA1CD7D6EC0098B23A /* MPArrowRight@2x.png */; }; + E1C2BEA51CFD6A010052172F /* snapshot_config.json in Resources */ = {isa = PBXBuildFile; fileRef = 7C170CBC1A4A035F00D9E0F2 /* snapshot_config.json */; }; + E1C2BEA61CFD6A010052172F /* MPCloseButton.png in Resources */ = {isa = PBXBuildFile; fileRef = 514733CD1CD7D6EC0098B23A /* MPCloseButton.png */; }; + E1C2BEA71CFD6A010052172F /* MPCheckmark.png in Resources */ = {isa = PBXBuildFile; fileRef = 514733CB1CD7D6EC0098B23A /* MPCheckmark.png */; }; + E1C2BEA81CFD6A010052172F /* test_variant.json in Resources */ = {isa = PBXBuildFile; fileRef = 7C170CBD1A4A035F00D9E0F2 /* test_variant.json */; }; + E1C2BEA91CFD6A010052172F /* MPCloseButton@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 514733CF1CD7D6EC0098B23A /* MPCloseButton@3x.png */; }; + E1C2BEAA1CFD6A010052172F /* MPCloseButton@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 514733CE1CD7D6EC0098B23A /* MPCloseButton@2x.png */; }; + E1C2BEAB1CFD6A010052172F /* MPDismissKeyboard@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 514733D11CD7D6EC0098B23A /* MPDismissKeyboard@2x.png */; }; + E1C2BEAC1CFD6A010052172F /* MPArrowRight.png in Resources */ = {isa = PBXBuildFile; fileRef = 514733C91CD7D6EC0098B23A /* MPArrowRight.png */; }; + E1C2BEAE1CFD6A010052172F /* MPArrowLeft.png in Resources */ = {isa = PBXBuildFile; fileRef = 514733C71CD7D6EC0098B23A /* MPArrowLeft.png */; }; + E1C2BEAF1CFD6A010052172F /* MPCheckmark@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 514733CC1CD7D6EC0098B23A /* MPCheckmark@2x.png */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -199,7 +241,6 @@ 511FC3091C2B739B00DC4796 /* MixpanelWatchOS.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MixpanelWatchOS.m; sourceTree = ""; }; 511FC30A1C2B739B00DC4796 /* MixpanelWatchOS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MixpanelWatchOS.h; sourceTree = ""; }; 511FC39D1C2B74BD00DC4796 /* Mixpanel.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Mixpanel.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 511FC39E1C2B74BD00DC4796 /* Mixpanel-watchOS-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "Mixpanel-watchOS-Info.plist"; path = "/Users/samgreen/code/mixpanel-iphone/Mixpanel-watchOS-Info.plist"; sourceTree = ""; }; 511FC39F1C2B74DB00DC4796 /* WatchConnectivity.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WatchConnectivity.framework; path = System/Library/Frameworks/WatchConnectivity.framework; sourceTree = SDKROOT; }; 513583951BD1BE50008EEDF1 /* UIView+MPHelpers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIView+MPHelpers.h"; sourceTree = ""; }; 513583961BD1BE50008EEDF1 /* UIView+MPHelpers.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIView+MPHelpers.m"; sourceTree = ""; }; @@ -373,6 +414,11 @@ E1954F921CC559E000B92B19 /* MPNotification~ipad.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = "MPNotification~ipad.storyboard"; sourceTree = ""; }; E1954F931CC559E000B92B19 /* MPNotification~iphonelandscape.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = "MPNotification~iphonelandscape.storyboard"; sourceTree = ""; }; E1954F941CC559E000B92B19 /* MPNotification~iphoneportrait.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = "MPNotification~iphoneportrait.storyboard"; sourceTree = ""; }; + E1C2BDE11CFD5F9D0052172F /* TVServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = TVServices.framework; path = Library/Frameworks/TVServices.framework; sourceTree = DEVELOPER_DIR; }; + E1C2BDFB1CFD61030052172F /* Mixpanel-watchOS-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "Mixpanel-watchOS-Info.plist"; sourceTree = ""; }; + E1C2BE061CFD616A0052172F /* Mixpanel-tvOS-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Mixpanel-tvOS-Info.plist"; sourceTree = ""; }; + E1C2BEB61CFD6A010052172F /* Mixpanel.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Mixpanel.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + E1C2C0BA1CFDD53B0052172F /* tvos.modulemap */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.module-map"; name = tvos.modulemap; path = Mixpanel/tvos.modulemap; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -412,6 +458,22 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + E1C2BE541CFD6A010052172F /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + E1C2BE551CFD6A010052172F /* libicucore.tbd in Frameworks */, + E1C2BE561CFD6A010052172F /* CFNetwork.framework in Frameworks */, + E1C2BE571CFD6A010052172F /* Security.framework in Frameworks */, + E1C2BE581CFD6A010052172F /* QuartzCore.framework in Frameworks */, + E1C2BE591CFD6A010052172F /* CoreGraphics.framework in Frameworks */, + E1C2BE5B1CFD6A010052172F /* SystemConfiguration.framework in Frameworks */, + E1C2BE5C1CFD6A010052172F /* Foundation.framework in Frameworks */, + E1C2BE5D1CFD6A010052172F /* Accelerate.framework in Frameworks */, + E1C2BE5E1CFD6A010052172F /* UIKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ @@ -694,6 +756,7 @@ isa = PBXGroup; children = ( 7C170C2C1A4A02F500D9E0F2 /* Mixpanel */, + E1C2BDE01CFD5F9D0052172F /* Frameworks */, 7C170C2B1A4A02F500D9E0F2 /* Products */, ); indentWidth = 4; @@ -706,6 +769,7 @@ 7C170C2A1A4A02F500D9E0F2 /* Mixpanel.framework */, 511FC39D1C2B74BD00DC4796 /* Mixpanel.framework */, 513B0BB61C73CA35008EEE6E /* MixpanelAppExtension.framework */, + E1C2BEB61CFD6A010052172F /* Mixpanel.framework */, ); name = Products; sourceTree = ""; @@ -730,9 +794,11 @@ 7C170CBD1A4A035F00D9E0F2 /* test_variant.json */, 51FF9AB71C2B77B4004B0028 /* module.modulemap */, 5166DCDF1CAF0D2C00920FF1 /* watchos.modulemap */, + E1C2C0BA1CFDD53B0052172F /* tvos.modulemap */, 7C170C2E1A4A02F500D9E0F2 /* Info.plist */, 513B0BFB1C73D5DA008EEE6E /* Mixpanel-AppExtension-Info.plist */, - 511FC39E1C2B74BD00DC4796 /* Mixpanel-watchOS-Info.plist */, + E1C2BDFB1CFD61030052172F /* Mixpanel-watchOS-Info.plist */, + E1C2BE061CFD616A0052172F /* Mixpanel-tvOS-Info.plist */, ); name = "Supporting Files"; sourceTree = ""; @@ -778,6 +844,14 @@ name = Frameworks; sourceTree = ""; }; + E1C2BDE01CFD5F9D0052172F /* Frameworks */ = { + isa = PBXGroup; + children = ( + E1C2BDE11CFD5F9D0052172F /* TVServices.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ @@ -878,6 +952,24 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + E1C2BE5F1CFD6A010052172F /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + E1C2BE601CFD6A010052172F /* Mixpanel.h in Headers */, + E123C47E1D1342120015B425 /* MixpanelPeople.h in Headers */, + E1C2BE661CFD6A010052172F /* UIImage+MPImageEffects.h in Headers */, + E1C2BE791CFD6A010052172F /* NSInvocation+MPHelpers.h in Headers */, + E1C2BE7A1CFD6A010052172F /* UIImage+MPAverageColor.h in Headers */, + E1C2BE7B1CFD6A010052172F /* MPLogger.h in Headers */, + E1C2BE801CFD6A010052172F /* MPFoundation.h in Headers */, + E1C2BE871CFD6A010052172F /* NSData+MPBase64.h in Headers */, + E1C2BE8F1CFD6A010052172F /* UIColor+MPColor.h in Headers */, + E1C2BE911CFD6A010052172F /* MPAbstractABTestDesignerMessage.h in Headers */, + E1C2BE9D1CFD6A010052172F /* MixpanelExceptionHandler.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ @@ -934,6 +1026,24 @@ productReference = 7C170C2A1A4A02F500D9E0F2 /* Mixpanel.framework */; productType = "com.apple.product-type.framework"; }; + E1C2BE0A1CFD6A010052172F /* Mixpanel_tvOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = E1C2BEB31CFD6A010052172F /* Build configuration list for PBXNativeTarget "Mixpanel_tvOS" */; + buildPhases = ( + E1C2BE0B1CFD6A010052172F /* Sources */, + E1C2BE541CFD6A010052172F /* Frameworks */, + E1C2BE5F1CFD6A010052172F /* Headers */, + E1C2BEA01CFD6A010052172F /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Mixpanel_tvOS; + productName = MixpanelFramework; + productReference = E1C2BEB61CFD6A010052172F /* Mixpanel.framework */; + productType = "com.apple.product-type.framework"; + }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ @@ -963,6 +1073,7 @@ 7C170C291A4A02F500D9E0F2 /* Mixpanel */, 511FC3101C2B74BD00DC4796 /* Mixpanel_watchOS */, 513B0B281C73CA35008EEE6E /* MixpanelAppExtension */, + E1C2BE0A1CFD6A010052172F /* Mixpanel_tvOS */, ); }; /* End PBXProject section */ @@ -995,10 +1106,31 @@ 514733D21CD7D6EC0098B23A /* MPArrowLeft.png in Resources */, 514733D71CD7D6EC0098B23A /* MPCheckmark@2x.png in Resources */, E1954F971CC559E000B92B19 /* MPNotification~iphoneportrait.storyboard in Resources */, + E1C2BDFC1CFD61030052172F /* Mixpanel-watchOS-Info.plist in Resources */, E1954F961CC559E000B92B19 /* MPNotification~iphonelandscape.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; + E1C2BEA01CFD6A010052172F /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + E1C2BEA11CFD6A010052172F /* MPArrowLeft@2x.png in Resources */, + E1C2BEA21CFD6A010052172F /* MPDismissKeyboard.png in Resources */, + E1C2BEA41CFD6A010052172F /* MPArrowRight@2x.png in Resources */, + E1C2BEA51CFD6A010052172F /* snapshot_config.json in Resources */, + E1C2BEA61CFD6A010052172F /* MPCloseButton.png in Resources */, + E1C2BEA71CFD6A010052172F /* MPCheckmark.png in Resources */, + E1C2BEA81CFD6A010052172F /* test_variant.json in Resources */, + E1C2BEA91CFD6A010052172F /* MPCloseButton@3x.png in Resources */, + E1C2BEAA1CFD6A010052172F /* MPCloseButton@2x.png in Resources */, + E1C2BEAB1CFD6A010052172F /* MPDismissKeyboard@2x.png in Resources */, + E1C2BEAC1CFD6A010052172F /* MPArrowRight.png in Resources */, + E1C2BEAE1CFD6A010052172F /* MPArrowLeft.png in Resources */, + E1C2BEAF1CFD6A010052172F /* MPCheckmark@2x.png in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -1100,6 +1232,21 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + E1C2BE0B1CFD6A010052172F /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + E1C2BE121CFD6A010052172F /* NSInvocation+MPHelpers.m in Sources */, + E1C2BE151CFD6A010052172F /* UIColor+MPColor.m in Sources */, + E1C2BE261CFD6A010052172F /* Mixpanel.m in Sources */, + E1C2BE271CFD6A010052172F /* UIImage+MPAverageColor.m in Sources */, + E1C2BE2F1CFD6A010052172F /* MixpanelExceptionHandler.m in Sources */, + E1C2BE4B1CFD6A010052172F /* UIImage+MPImageEffects.m in Sources */, + E123C47F1D1342150015B425 /* MixpanelPeople.m in Sources */, + E1C2BE4D1CFD6A010052172F /* NSData+MPBase64.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXSourcesBuildPhase section */ /* Begin XCBuildConfiguration section */ @@ -1341,6 +1488,87 @@ }; name = Release; }; + E1C2BEB41CFD6A010052172F /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BITCODE_GENERATION_MODE = bitcode; + CODE_SIGN_IDENTITY = "iPhone Developer"; + DEAD_CODE_STRIPPING = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = ""; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + "MIXPANEL_TVOS_EXTENSION=1", + ); + INFOPLIST_FILE = "Mixpanel-tvOS-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Mixpanel", + ); + MIXPANEL_TVOS_EXTENSION = YES; + MODULEMAP_FILE = Mixpanel/tvos.modulemap; + OTHER_LDFLAGS = ( + "-ObjC", + "-all_load", + ); + PRESERVE_DEAD_CODE_INITS_AND_TERMS = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.mixpanel.Mixpanel; + PRODUCT_MODULE_NAME = "$(PRODUCT_NAME:c99extidentifier)"; + PRODUCT_NAME = Mixpanel; + SDKROOT = appletvos; + SKIP_INSTALL = YES; + SUPPORTED_PLATFORMS = "appletvsimulator appletvos"; + TARGETED_DEVICE_FAMILY = 3; + TVOS_DEPLOYMENT_TARGET = 9.0; + }; + name = Debug; + }; + E1C2BEB51CFD6A010052172F /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BITCODE_GENERATION_MODE = bitcode; + CODE_SIGN_IDENTITY = "iPhone Developer"; + DEAD_CODE_STRIPPING = NO; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = ""; + GCC_PREPROCESSOR_DEFINITIONS = "MIXPANEL_TVOS_EXTENSION=1"; + INFOPLIST_FILE = "Mixpanel-tvOS-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Mixpanel", + ); + MIXPANEL_TVOS_EXTENSION = YES; + MODULEMAP_FILE = Mixpanel/tvos.modulemap; + OTHER_LDFLAGS = ( + "-ObjC", + "-all_load", + ); + PRESERVE_DEAD_CODE_INITS_AND_TERMS = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.mixpanel.Mixpanel; + PRODUCT_MODULE_NAME = "$(PRODUCT_NAME:c99extidentifier)"; + PRODUCT_NAME = Mixpanel; + SDKROOT = appletvos; + SKIP_INSTALL = YES; + SUPPORTED_PLATFORMS = "appletvsimulator appletvos"; + TARGETED_DEVICE_FAMILY = 3; + TVOS_DEPLOYMENT_TARGET = 9.0; + }; + name = Release; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -1380,6 +1608,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + E1C2BEB31CFD6A010052172F /* Build configuration list for PBXNativeTarget "Mixpanel_tvOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + E1C2BEB41CFD6A010052172F /* Debug */, + E1C2BEB51CFD6A010052172F /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; /* End XCConfigurationList section */ }; rootObject = 7C170C211A4A02F500D9E0F2 /* Project object */; diff --git a/Mixpanel.xcodeproj/xcshareddata/xcschemes/Mixpanel_tvOS.xcscheme b/Mixpanel.xcodeproj/xcshareddata/xcschemes/Mixpanel_tvOS.xcscheme new file mode 100644 index 000000000..6610af551 --- /dev/null +++ b/Mixpanel.xcodeproj/xcshareddata/xcschemes/Mixpanel_tvOS.xcscheme @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Mixpanel/AutomaticEventsConstants.h b/Mixpanel/AutomaticEventsConstants.h index 3c48f3a16..05e933ab2 100644 --- a/Mixpanel/AutomaticEventsConstants.h +++ b/Mixpanel/AutomaticEventsConstants.h @@ -1,3 +1,4 @@ + // // AutomaticEventsConstants.h // Mixpanel @@ -14,4 +15,4 @@ typedef NS_ENUM(NSUInteger, AutomaticEventMode) { }; #pragma mark - Strings -static NSString *const kAutomaticEventName = @"$ios_event"; \ No newline at end of file +static NSString *const kAutomaticEventName = @"$ios_event"; diff --git a/Mixpanel/Mixpanel.h b/Mixpanel/Mixpanel.h index c91003119..cf8909136 100644 --- a/Mixpanel/Mixpanel.h +++ b/Mixpanel/Mixpanel.h @@ -679,7 +679,7 @@ NS_ASSUME_NONNULL_BEGIN + (NSString *)libVersion; -#if !defined(MIXPANEL_APP_EXTENSION) +#if !defined(MIXPANEL_APP_EXTENSION) && !defined(MIXPANEL_TVOS_EXTENSION) #pragma mark - Mixpanel Surveys /*! diff --git a/Mixpanel/Mixpanel.m b/Mixpanel/Mixpanel.m index ea93575db..d48d7f6b8 100755 --- a/Mixpanel/Mixpanel.m +++ b/Mixpanel/Mixpanel.m @@ -60,7 +60,9 @@ - (instancetype)initWithToken:(NSString *)apiToken launchOptions:(NSDictionary * #if !defined(MIXPANEL_APP_EXTENSION) // Install uncaught exception handlers first [[MixpanelExceptionHandler sharedHandler] addMixpanelInstance:self]; +#if !defined(MIXPANEL_TVOS_EXTENSION) self.telephonyInfo = [[CTTelephonyNetworkInfo alloc] init]; +#endif #endif self.networkRequestsAllowedAfterTime = 0; @@ -81,6 +83,14 @@ - (instancetype)initWithToken:(NSString *)apiToken launchOptions:(NSDictionary * self.checkForSurveysOnActive = YES; self.miniNotificationPresentationTime = 6.0; self.miniNotificationBackgroundColor = nil; + self.decideResponseCached = NO; + self.surveys = nil; + self.currentlyShowingSurvey = nil; + self.shownSurveyCollections = [NSMutableSet set]; + self.shownNotifications = [NSMutableSet set]; + self.currentlyShowingNotification = nil; + self.notifications = nil; + self.variants = nil; self.distinctId = [self defaultDistinctId]; self.superProperties = [NSMutableDictionary dictionary]; @@ -96,30 +106,24 @@ - (instancetype)initWithToken:(NSString *)apiToken launchOptions:(NSDictionary * [_dateFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]]; self.timedEvents = [NSMutableDictionary dictionary]; - self.decideResponseCached = NO; self.showSurveyOnActive = YES; self.enableABTestDesigner = YES; - self.surveys = nil; - self.currentlyShowingSurvey = nil; - self.shownSurveyCollections = [NSMutableSet set]; - self.shownNotifications = [NSMutableSet set]; - self.currentlyShowingNotification = nil; - self.notifications = nil; - self.variants = nil; #if !defined(MIXPANEL_APP_EXTENSION) [self setUpListeners]; #endif [self unarchive]; -#if !defined(MIXPANEL_APP_EXTENSION) +#if !defined(MIXPANEL_APP_EXTENSION) && !defined(MIXPANEL_TVOS_EXTENSION) [self executeCachedVariants]; [self executeCachedEventBindings]; #endif +#if !defined(MIXPANEL_TVOS_EXTENSION) NSDictionary *remoteNotification = launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey]; if (remoteNotification) { [self trackPushNotification:remoteNotification event:@"$app_open"]; } +#endif } return self; } @@ -133,7 +137,7 @@ - (void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self]; -#if !defined(MIXPANEL_APP_EXTENSION) +#if !defined(MIXPANEL_APP_EXTENSION) && !defined(MIXPANEL_TVOS_EXTENSION) if (_reachability != NULL) { if (!SCNetworkReachabilitySetCallback(_reachability, NULL, NULL)) { MixpanelError(@"%@ error unsetting reachability callback", self); @@ -148,6 +152,7 @@ - (void)dealloc #endif } +#if !defined(MIXPANEL_APP_EXTENSION) && !defined(MIXPANEL_TVOS_EXTENSION) - (void)setValidationEnabled:(BOOL)validationEnabled { _validationEnabled = validationEnabled; @@ -157,6 +162,7 @@ - (void)setValidationEnabled:(BOOL)validationEnabled { [Mixpanel setSharedAutomatedInstance:nil]; } } +#endif #pragma mark - Encoding/decoding utilities @@ -320,9 +326,11 @@ - (void)track:(NSString *)event properties:(NSDictionary *)properties event = @"mp_event"; } +#if !defined(MIXPANEL_APP_EXTENSION) && !defined(MIXPANEL_TVOS_EXTENSION) // Safety check BOOL isAutomaticEvent = [event isEqualToString:kAutomaticEventName]; if (isAutomaticEvent && !self.isValidationEnabled) return; +#endif properties = [properties copy]; [Mixpanel assertPropertyTypes:properties]; @@ -345,6 +353,7 @@ - (void)track:(NSString *)event properties:(NSDictionary *)properties [p addEntriesFromDictionary:properties]; } +#if !defined(MIXPANEL_APP_EXTENSION) && !defined(MIXPANEL_TVOS_EXTENSION) if (self.validationEnabled) { if (self.validationMode == AutomaticEventModeCount) { if (isAutomaticEvent) { @@ -357,6 +366,7 @@ - (void)track:(NSString *)event properties:(NSDictionary *)properties } } } +#endif NSDictionary *e = @{ @"event": event, @"properties": [NSDictionary dictionaryWithDictionary:p]} ; MixpanelDebug(@"%@ queueing event: %@", self, e); @@ -606,10 +616,29 @@ - (void)flushQueue:(NSMutableArray *)queue endpoint:(NSString *)endpoint NSString *postBody = [NSString stringWithFormat:@"ip=%d&data=%@", self.useIPAddressForGeoLocation, requestData]; MixpanelDebug(@"%@ flushing %lu of %lu to %@: %@", self, (unsigned long)batch.count, (unsigned long)queue.count, endpoint, queue); NSURLRequest *request = [self apiRequestWithEndpoint:endpoint andBody:postBody]; - NSError *error = nil; [self updateNetworkActivityIndicator:YES]; +#if defined(MIXPANEL_TVOS_EXTENSION) + NSURLSession *session = [NSURLSession sharedSession]; + [[session dataTaskWithRequest:request completionHandler:^(NSData *responseData, + NSURLResponse *urlResponse, + NSError *error) { + [self updateNetworkActivityIndicator:NO]; + if (error || !responseData) { + MixpanelError(@"%@ network failure: %@", self, error); + return; + } + + NSString *response = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; + if ([response intValue] == 0) { + MixpanelError(@"%@ %@ api rejected some items", self, endpoint); + } + + }] resume]; + [queue removeObjectsInArray:batch]; +#else + NSError *error = nil; NSHTTPURLResponse *urlResponse = nil; NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:&error]; @@ -627,6 +656,7 @@ - (void)flushQueue:(NSMutableArray *)queue endpoint:(NSString *)endpoint } [queue removeObjectsInArray:batch]; +#endif } } @@ -925,7 +955,7 @@ - (void)setCurrentRadio - (NSString *)currentRadio { -#if !defined(MIXPANEL_APP_EXTENSION) +#if !defined(MIXPANEL_APP_EXTENSION) && !defined(MIXPANEL_TVOS_EXTENSION) NSString *radio = _telephonyInfo.currentRadioAccessTechnology; if (!radio) { radio = @"None"; @@ -962,7 +992,7 @@ - (NSDictionary *)collectAutomaticProperties [p setValue:[[NSBundle mainBundle] infoDictionary][@"CFBundleShortVersionString"] forKey:@"$app_version_string"]; [p setValue:[self IFA] forKey:@"$ios_ifa"]; -#if !defined(MIXPANEL_APP_EXTENSION) +#if !defined(MIXPANEL_APP_EXTENSION) && !defined(MIXPANEL_TVOS_EXTENSION) CTCarrier *carrier = [self.telephonyInfo subscriberCellularProvider]; [p setValue:carrier.carrierName forKey:@"$carrier"]; #endif @@ -994,7 +1024,7 @@ + (BOOL)inBackground - (void)updateNetworkActivityIndicator:(BOOL)on { -#if !defined(MIXPANEL_APP_EXTENSION) +#if !defined(MIXPANEL_APP_EXTENSION) && !defined(MIXPANEL_TVOS_EXTENSION) if (_showNetworkActivityIndicator) { [UIApplication sharedApplication].networkActivityIndicatorVisible = on; } @@ -1007,6 +1037,9 @@ - (void)updateNetworkActivityIndicator:(BOOL)on - (void)setUpListeners { + NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; + +#if !defined(MIXPANEL_TVOS_EXTENSION) // wifi reachability BOOL reachabilityOk = NO; if ((_reachability = SCNetworkReachabilityCreateWithName(NULL, "api.mixpanel.com")) != NULL) { @@ -1024,16 +1057,15 @@ - (void)setUpListeners if (!reachabilityOk) { MixpanelError(@"%@ failed to set up reachability callback: %s", self, SCErrorString(SCError())); } - - NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; - + // cellular info [self setCurrentRadio]; [notificationCenter addObserver:self selector:@selector(setCurrentRadio) name:CTRadioAccessTechnologyDidChangeNotification object:nil]; - +#endif + // Application lifecycle events [notificationCenter addObserver:self selector:@selector(applicationWillTerminate:) @@ -1060,7 +1092,7 @@ - (void)setUpListeners name:@"com.parse.bolts.measurement_event" object:nil]; -#if !defined(DISABLE_MIXPANEL_AB_DESIGNER) +#if !defined(DISABLE_MIXPANEL_AB_DESIGNER) && !defined(MIXPANEL_TVOS_EXTENSION) dispatch_async(dispatch_get_main_queue(), ^{ self.testDesignerGestureRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(connectGestureRecognized:)]; @@ -1076,6 +1108,8 @@ - (void)setUpListeners #endif } +#if !defined(MIXPANEL_TVOS_EXTENSION) + static void MixpanelReachabilityCallback(SCNetworkReachabilityRef target, SCNetworkReachabilityFlags flags, void *info) { Mixpanel *mixpanel = (__bridge Mixpanel *)info; @@ -1100,11 +1134,14 @@ - (void)reachabilityChanged:(SCNetworkReachabilityFlags)flags } } +#endif + - (void)applicationDidBecomeActive:(NSNotification *)notification { MixpanelDebug(@"%@ application did become active", self); [self startFlushTimer]; +#if !defined(MIXPANEL_TVOS_EXTENSION) if (self.checkForSurveysOnActive || self.checkForNotificationsOnActive || self.checkForVariantsOnActive) { NSDate *start = [NSDate date]; @@ -1129,6 +1166,7 @@ - (void)applicationDidBecomeActive:(NSNotification *)notification }); }]; } +#endif } - (void)applicationWillResignActive:(NSNotification *)notification @@ -1196,6 +1234,7 @@ - (void)appLinksNotificationRaised:(NSNotification *)notification } } +#if !defined(MIXPANEL_TVOS_EXTENSION) #pragma mark - Decide + (UIViewController *)topPresentedViewController @@ -1441,7 +1480,6 @@ - (BOOL)isSurveyAvailable { - (void)presentSurveyWithRootViewController:(MPSurvey *)survey { -#if !defined(MIXPANEL_APP_EXTENSION) UIViewController *presentingViewController = [Mixpanel topPresentedViewController]; if ([[self class] canPresentFromViewController:presentingViewController]) { @@ -1452,7 +1490,6 @@ - (void)presentSurveyWithRootViewController:(MPSurvey *)survey controller.backgroundImage = [presentingViewController.view mp_snapshotImage]; [presentingViewController presentViewController:controller animated:YES completion:nil]; } -#endif } - (void)showSurveyWithObject:(MPSurvey *)survey withAlert:(BOOL)showAlert @@ -1631,7 +1668,6 @@ - (void)showNotificationWithObject:(MPNotification *)notification - (BOOL)showTakeoverNotificationWithObject:(MPNotification *)notification { -#if !defined(MIXPANEL_APP_EXTENSION) UIViewController *presentingViewController = [Mixpanel topPresentedViewController]; if ([[self class] canPresentFromViewController:presentingViewController]) { @@ -1647,7 +1683,6 @@ - (BOOL)showTakeoverNotificationWithObject:(MPNotification *)notification } else { return NO; } -#endif } - (BOOL)showMiniNotificationWithObject:(MPNotification *)notification @@ -1874,6 +1909,7 @@ - (void)executeCachedEventBindings { } } -#endif +#endif //MIXPANEL_TVOS_EXTENSION +#endif //MIXPANEL_APP_EXTENSION @end diff --git a/Mixpanel/MixpanelPrivate.h b/Mixpanel/MixpanelPrivate.h index 7623f2c0b..7c5f0c384 100644 --- a/Mixpanel/MixpanelPrivate.h +++ b/Mixpanel/MixpanelPrivate.h @@ -9,9 +9,14 @@ #import "Mixpanel.h" #import "MPSurveyNavigationController.h" #import "MPNotificationViewController.h" +#import "Mixpanel+AutomaticEvents.h" +#import "AutomaticEventsConstants.h" #if !defined(MIXPANEL_APP_EXTENSION) +#import "MixpanelExceptionHandler.h" +#endif +#if !defined(MIXPANEL_APP_EXTENSION) && !defined(MIXPANEL_TVOS_EXTENSION) #import #import #import @@ -19,7 +24,6 @@ #import #import "MPResources.h" -#import "MixpanelExceptionHandler.h" #import "MPABTestDesignerConnection.h" #import "UIView+MPHelpers.h" #import "MPDesignerEventBindingMessage.h" @@ -31,12 +35,9 @@ #import "MPSwizzler.h" #import "MPVariant.h" #import "MPWebSocket.h" -#import "Mixpanel+AutomaticEvents.h" -#import "AutomaticEventsConstants.h" - #endif -#if !defined(MIXPANEL_APP_EXTENSION) +#if !defined(MIXPANEL_APP_EXTENSION) && !defined(MIXPANEL_TVOS_EXTENSION) @interface Mixpanel () #else @interface Mixpanel () @@ -46,18 +47,19 @@ BOOL _enableABTestDesigner; } -#if !defined(MIXPANEL_APP_EXTENSION) +#if !defined(MIXPANEL_APP_EXTENSION) && !defined(MIXPANEL_TVOS_EXTENSION) @property (nonatomic, assign) SCNetworkReachabilityRef reachability; @property (nonatomic, strong) CTTelephonyNetworkInfo *telephonyInfo; @property (nonatomic, strong) UILongPressGestureRecognizer *testDesignerGestureRecognizer; +@property (nonatomic, strong) MPABTestDesignerConnection *abtestDesignerConnection; +@property (nonatomic) AutomaticEventMode validationMode; +@property (nonatomic) NSUInteger validationEventCount; +@property (nonatomic, getter=isValidationEnabled) BOOL validationEnabled; #endif // re-declare internally as readwrite @property (atomic, strong) MixpanelPeople *people; @property (atomic, copy) NSString *distinctId; -@property (nonatomic, getter=isValidationEnabled) BOOL validationEnabled; -@property (nonatomic) AutomaticEventMode validationMode; -@property (nonatomic) NSUInteger validationEventCount; @property (nonatomic, copy) NSString *apiToken; @property (atomic, strong) NSDictionary *superProperties; @@ -71,7 +73,6 @@ @property (nonatomic, strong) NSMutableDictionary *timedEvents; @property (nonatomic) BOOL decideResponseCached; - @property (nonatomic, strong) NSArray *surveys; @property (nonatomic, strong) id currentlyShowingSurvey; @property (nonatomic, strong) NSMutableSet *shownSurveyCollections; @@ -81,10 +82,10 @@ @property (nonatomic, strong) UIViewController *notificationViewController; @property (nonatomic, strong) NSMutableSet *shownNotifications; -@property (nonatomic, strong) MPABTestDesignerConnection *abtestDesignerConnection; @property (nonatomic, strong) NSSet *variants; @property (nonatomic, strong) NSSet *eventBindings; + @property (atomic, copy) NSString *decideURL; @property (atomic, copy) NSString *switchboardURL; @property (nonatomic) NSTimeInterval networkRequestsAllowedAfterTime; @@ -101,16 +102,17 @@ - (NSString *)eventsFilePath; - (NSString *)peopleFilePath; - (NSString *)propertiesFilePath; -- (void)presentSurveyWithRootViewController:(MPSurvey *)survey; -- (void)showNotificationWithObject:(MPNotification *)notification; - (NSData *)JSONSerializeObject:(id)obj; - (NSString *)encodeAPIData:(NSArray *)array; +#if !defined(MIXPANEL_APP_EXTENSION) && !defined(MIXPANEL_TVOS_EXTENSION) +- (void)presentSurveyWithRootViewController:(MPSurvey *)survey; +- (void)showNotificationWithObject:(MPNotification *)notification; +- (void)markVariantRun:(MPVariant *)variant; - (void)checkForDecideResponseWithCompletion:(void (^)(NSArray *surveys, NSArray *notifications, NSSet *variants, NSSet *eventBindings))completion; - (void)checkForDecideResponseWithCompletion:(void (^)(NSArray *surveys, NSArray *notifications, NSSet *variants, NSSet *eventBindings))completion useCache:(BOOL)useCache; -- (void)markVariantRun:(MPVariant *)variant; - +#endif @end diff --git a/Mixpanel/tvos.modulemap b/Mixpanel/tvos.modulemap new file mode 100755 index 000000000..e9a907d94 --- /dev/null +++ b/Mixpanel/tvos.modulemap @@ -0,0 +1,5 @@ +framework module Mixpanel { + umbrella header "Mixpanel.h" + export * + module * { export * } +} \ No newline at end of file