├── _config.yml ├── LICENSE ├── img ├── shake.gif ├── usage.png ├── buildrun.png ├── camera.gif ├── connect.png └── wechat.jpg ├── MacOS └── YourView │ ├── YourView │ ├── img │ │ ├── empty.scn │ │ ├── refresh.png │ │ ├── toolbar_segment │ │ │ ├── left_blue.png │ │ │ ├── left_gray.png │ │ │ ├── right_blue.png │ │ │ └── right_gray.png │ │ └── cellimage │ │ │ └── cellimage_view@2x.png │ ├── Assets.xcassets │ │ ├── Contents.json │ │ └── AppIcon.appiconset │ │ │ └── Contents.json │ ├── Window │ │ ├── YVWindow.m │ │ ├── YVWindow.h │ │ └── YVWindowController.h │ ├── view │ │ ├── cell │ │ │ ├── binding │ │ │ │ ├── YVStepperModel.m │ │ │ │ ├── YVObjectController.m │ │ │ │ ├── YVObjectController.h │ │ │ │ └── YVStepperModel.h │ │ │ ├── YVRightCellBase.h │ │ │ ├── YVRightCellViewFrame.h │ │ │ ├── YVRightCellViewInfo.h │ │ │ ├── YVRightCellBase.m │ │ │ ├── YVRightCellViewFrame.m │ │ │ └── YVRightCellViewInfo.m │ │ ├── YVSelectableTextView.h │ │ ├── YVSelectableTextView.m │ │ └── YVSceneView.h │ ├── main.m │ ├── AppDelegate.h │ ├── Controller │ │ ├── split │ │ │ ├── YVLeftViewController.h │ │ │ ├── YVSplitViewController.h │ │ │ ├── YVRightViewController.h │ │ │ ├── YVSplitViewController.m │ │ │ └── YVMiddleViewController.h │ │ ├── YVHomeViewController.h │ │ ├── loading │ │ │ └── YVLoadingViewController.h │ │ ├── script │ │ │ ├── YVScriptEditorViewController.h │ │ │ └── YVScriptEditorViewController.m │ │ └── YVHomeViewController.m │ ├── helper │ │ ├── SCNNode+YVBorder.h │ │ ├── SCNNode+YVIdentifier.h │ │ ├── SCNNode+YVPlane.h │ │ ├── SCNNode+YVSelected.h │ │ ├── SCNNode+YVVisual.h │ │ ├── YVCGRectHelper.h │ │ ├── YVNodeBackTracking.h │ │ ├── SCNNode+YVIdentifier.m │ │ ├── TravseralContext.h │ │ ├── TravseralContext.m │ │ ├── YVDisplayControl.m │ │ ├── SCNNode+YVZIndex.h │ │ ├── YVDisplayControl.h │ │ ├── SCNNode+YVSelected.m │ │ ├── SCNNode+YVVisual.m │ │ ├── YVCGRectHelper.m │ │ ├── SCNNode+YVPlane.m │ │ ├── SCNNode+YVBorder.m │ │ └── YVNodeBackTracking.m │ ├── YourView.entitlements │ ├── AppDelegate.m │ ├── Theme │ │ └── YVTheme.h │ ├── Info.plist │ ├── define │ │ └── defines.h │ └── YourView.pch │ └── YourView.xcodeproj │ ├── project.xcworkspace │ ├── contents.xcworkspacedata │ ├── xcuserdata │ │ └── bliss_ddo.xcuserdatad │ │ │ └── UserInterfaceState.xcuserstate │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist │ └── xcuserdata │ └── bliss_ddo.xcuserdatad │ ├── xcschemes │ └── xcschememanagement.plist │ └── xcdebugger │ └── Breakpoints_v2.xcbkptlist ├── iOS ├── TalkingDataSDKDemo │ ├── PhoneDemo │ │ ├── Assets.xcassets │ │ │ ├── AppIcon.appiconset │ │ │ │ ├── Icon-20.png │ │ │ │ ├── Icon-29.png │ │ │ │ ├── Icon-40.png │ │ │ │ ├── Icon-76.png │ │ │ │ ├── Icon-20@2x.png │ │ │ │ ├── Icon-20@3x.png │ │ │ │ ├── Icon-29@2x.png │ │ │ │ ├── Icon-29@3x.png │ │ │ │ ├── Icon-40@2x.png │ │ │ │ ├── Icon-40@3x.png │ │ │ │ ├── Icon-60@2x.png │ │ │ │ ├── Icon-60@3x.png │ │ │ │ ├── Icon-76@2x.png │ │ │ │ ├── Icon-83.5@2x.png │ │ │ │ └── Contents.json │ │ │ ├── FunIcon │ │ │ │ ├── Base.imageset │ │ │ │ │ ├── FunIcon.png │ │ │ │ │ ├── FunIcon@2x.png │ │ │ │ │ ├── FunIcon@3x.png │ │ │ │ │ └── Contents.json │ │ │ │ ├── Page.imageset │ │ │ │ │ ├── FunIcon.png │ │ │ │ │ ├── FunIcon@2x.png │ │ │ │ │ ├── FunIcon@3x.png │ │ │ │ │ └── Contents.json │ │ │ │ ├── Push.imageset │ │ │ │ │ ├── FunIcon.png │ │ │ │ │ ├── FunIcon@2x.png │ │ │ │ │ ├── FunIcon@3x.png │ │ │ │ │ └── Contents.json │ │ │ │ ├── eAuth.imageset │ │ │ │ │ ├── FunIcon.png │ │ │ │ │ ├── FunIcon@2x.png │ │ │ │ │ ├── FunIcon@3x.png │ │ │ │ │ └── Contents.json │ │ │ │ ├── Codeless.imageset │ │ │ │ │ ├── FunIcon.png │ │ │ │ │ ├── FunIcon@2x.png │ │ │ │ │ ├── FunIcon@3x.png │ │ │ │ │ └── Contents.json │ │ │ │ ├── Custom.imageset │ │ │ │ │ ├── FunIcon.png │ │ │ │ │ ├── FunIcon@2x.png │ │ │ │ │ ├── FunIcon@3x.png │ │ │ │ │ └── Contents.json │ │ │ │ ├── Standard.imageset │ │ │ │ │ ├── FunIcon.png │ │ │ │ │ ├── FunIcon@2x.png │ │ │ │ │ ├── FunIcon@3x.png │ │ │ │ │ └── Contents.json │ │ │ │ ├── AntiCheating.imageset │ │ │ │ │ ├── FunIcon.png │ │ │ │ │ ├── FunIcon@2x.png │ │ │ │ │ ├── FunIcon@3x.png │ │ │ │ │ └── Contents.json │ │ │ │ └── BrandGrowth.imageset │ │ │ │ │ ├── FunIcon.png │ │ │ │ │ ├── FunIcon@2x.png │ │ │ │ │ ├── FunIcon@3x.png │ │ │ │ │ └── Contents.json │ │ │ ├── CheckIcon │ │ │ │ ├── selected.imageset │ │ │ │ │ ├── selected.png │ │ │ │ │ ├── selected@2x.png │ │ │ │ │ ├── selected@3x.png │ │ │ │ │ └── Contents.json │ │ │ │ └── unselected.imageset │ │ │ │ │ ├── unselected.png │ │ │ │ │ ├── unselected@2x.png │ │ │ │ │ ├── unselected@3x.png │ │ │ │ │ └── Contents.json │ │ │ └── PlaceholderImage.imageset │ │ │ │ ├── PlaceholderImage.png │ │ │ │ └── Contents.json │ │ ├── IQKeyboardManager │ │ │ ├── Resources │ │ │ │ └── IQKeyboardManager.bundle │ │ │ │ │ ├── IQButtonBarArrowUp@2x.png │ │ │ │ │ ├── IQButtonBarArrowUp@3x.png │ │ │ │ │ ├── IQButtonBarArrowDown@2x.png │ │ │ │ │ ├── IQButtonBarArrowDown@3x.png │ │ │ │ │ ├── IQButtonBarArrowLeft@2x.png │ │ │ │ │ ├── IQButtonBarArrowLeft@3x.png │ │ │ │ │ ├── IQButtonBarArrowRight@2x.png │ │ │ │ │ ├── IQButtonBarArrowRight@3x.png │ │ │ │ │ ├── zh-Hans │ │ │ │ │ └── IQKeyboardManager.strings │ │ │ │ │ └── en.lproj │ │ │ │ │ └── IQKeyboardManager.strings │ │ │ ├── IQToolbar │ │ │ │ ├── IQPreviousNextView.m │ │ │ │ ├── IQBarButtonItem.h │ │ │ │ ├── IQPreviousNextView.h │ │ │ │ ├── IQToolbar.h │ │ │ │ └── IQTitleBarButtonItem.h │ │ │ ├── Categories │ │ │ │ ├── IQUIScrollView+Additions.h │ │ │ │ ├── IQUIViewController+Additions.h │ │ │ │ ├── IQUIViewController+Additions.m │ │ │ │ ├── IQNSArray+Sort.h │ │ │ │ ├── IQUITextFieldView+Additions.h │ │ │ │ ├── IQUIScrollView+Additions.m │ │ │ │ ├── IQUITextFieldView+Additions.m │ │ │ │ └── IQNSArray+Sort.m │ │ │ └── Constants │ │ │ │ └── IQKeyboardManagerConstantsInternal.h │ │ ├── TDInfoViewController.h │ │ ├── TDHomeViewController.h │ │ ├── eAuth │ │ │ ├── TDEAAuthViewController.h │ │ │ ├── TDEACheckViewController.h │ │ │ ├── TDEAMatchViewController.h │ │ │ ├── TDEAUnbindViewController.h │ │ │ ├── TDEACheckViewController.m │ │ │ ├── TDEAMatchViewController.m │ │ │ ├── TDEAUnbindViewController.m │ │ │ └── TDEAAuthViewController.m │ │ ├── AdTracking │ │ │ ├── TDATGameTableViewCell.h │ │ │ ├── TDATOtherTableViewCell.h │ │ │ ├── TDATDeviceIDTableViewCell.h │ │ │ ├── TDATECommerceTableViewCell.h │ │ │ ├── TDATCustomViewController.h │ │ │ ├── TDATCustomViewController.m │ │ │ ├── TDATGameTableViewCell.m │ │ │ ├── TDATDeviceIDTableViewCell.m │ │ │ ├── TDATECommerceTableViewCell.m │ │ │ └── TDATOtherTableViewCell.m │ │ ├── GameAnalytics │ │ │ ├── TDGAItemTableViewCell.h │ │ │ ├── TDGAOtherTableViewCell.h │ │ │ ├── TDGAAccountTableViewCell.h │ │ │ ├── TDGAMissionTableViewCell.h │ │ │ ├── TDGADeviceIDTableViewCell.h │ │ │ ├── TDGAVirtualCurrencyTableViewCell.h │ │ │ ├── TDGACustomViewController.h │ │ │ ├── TDGADeviceIDTableViewCell.m │ │ │ ├── TDGAOtherTableViewCell.m │ │ │ ├── TDGAItemTableViewCell.m │ │ │ ├── TDGAMissionTableViewCell.m │ │ │ ├── TDGACustomViewController.m │ │ │ └── TDGAVirtualCurrencyTableViewCell.m │ │ ├── AppAnalytics │ │ │ ├── TDAAAccountTableViewCell.h │ │ │ ├── TDAAVersionTableViewCell.h │ │ │ ├── TDAADeviceIDTableViewCell.h │ │ │ ├── TDAAExceptionTableViewCell.h │ │ │ ├── TDAALocationTableViewCell.h │ │ │ ├── TDAAPageFirstViewController.h │ │ │ ├── TDAAPageSecondViewController.h │ │ │ ├── TDAAPageViewController.h │ │ │ ├── TDAACustomViewController.h │ │ │ ├── TDAAStandardViewController.h │ │ │ ├── TDAAAntiCheatingViewController.h │ │ │ ├── TDAAExceptionTableViewCell.m │ │ │ ├── TDAADeviceIDTableViewCell.m │ │ │ ├── TDAAPageViewController.m │ │ │ ├── TDAAPageFirstViewController.m │ │ │ ├── TDAAPageSecondViewController.m │ │ │ ├── TDAAStandardViewController.m │ │ │ ├── TDAALocationTableViewCell.m │ │ │ ├── TDAAVersionTableViewCell.m │ │ │ ├── TDAAAntiCheatingViewController.m │ │ │ ├── TDAACustomViewController.m │ │ │ └── TDAAAccountTableViewCell.m │ │ ├── TDTableViewController.h │ │ ├── PhoneDemo.entitlements │ │ ├── TDGeneralViewController.h │ │ ├── TDHomeTableViewCell.h │ │ ├── main.m │ │ ├── TDInfoViewController.m │ │ ├── AppDelegate.h │ │ ├── Info.plist │ │ ├── AppDelegate.m │ │ ├── TDHomeTableViewCell.m │ │ └── TDHomeViewController.m │ └── TalkingDataSDKDemo.xcodeproj │ │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ ├── xcuserdata │ │ │ └── bliss_ddo.xcuserdatad │ │ │ │ └── UserInterfaceState.xcuserstate │ │ └── xcshareddata │ │ │ └── IDEWorkspaceChecks.plist │ │ ├── xcuserdata │ │ └── bliss_ddo.xcuserdatad │ │ │ └── xcschemes │ │ │ └── xcschememanagement.plist │ │ └── xcshareddata │ │ └── xcschemes │ │ └── PhoneDemo.xcscheme └── libyourview │ ├── libyourview.xcodeproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ ├── xcuserdata │ │ │ └── bliss_ddo.xcuserdatad │ │ │ │ └── UserInterfaceState.xcuserstate │ │ └── xcshareddata │ │ │ └── IDEWorkspaceChecks.plist │ └── xcuserdata │ │ └── bliss_ddo.xcuserdatad │ │ └── xcschemes │ │ └── xcschememanagement.plist │ ├── main │ └── Main.h │ ├── serializer │ ├── NSObject+YVNodeInfo.h │ ├── UIView+YVNodeInfo.h │ ├── UIView+YVViewTree.h │ ├── YVTraversalStepin.h │ ├── UIView+YVTraversal.h │ ├── YVTraversalContext.h │ ├── UIView+YVTraversal.m │ ├── NSObject+YVNodeInfo.m │ ├── UIView+YVViewTree.m │ ├── YVTraversalContext.m │ ├── UIView+YVNodeInfo.m │ └── YVTraversalStepin.m │ ├── manager │ ├── YVObjectManager.h │ └── YVObjectManager.m │ ├── yourviewdynamic │ ├── yourviewdynamic.h │ └── Info.plist │ ├── libyourview │ └── Info.plist │ ├── youview │ └── Info.plist │ └── vendor │ └── GCDWebServer │ ├── Requests │ ├── GCDWebServerFileRequest.h │ ├── GCDWebServerURLEncodedFormRequest.h │ ├── GCDWebServerURLEncodedFormRequest.m │ └── GCDWebServerDataRequest.h │ └── Responses │ ├── GCDWebServerStreamedResponse.m │ └── GCDWebServerStreamedResponse.h └── README.md /_config.yml: -------------------------------------------------------------------------------- 1 | theme: jekyll-theme-cayman -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/LICENSE -------------------------------------------------------------------------------- /img/shake.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/img/shake.gif -------------------------------------------------------------------------------- /img/usage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/img/usage.png -------------------------------------------------------------------------------- /img/buildrun.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/img/buildrun.png -------------------------------------------------------------------------------- /img/camera.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/img/camera.gif -------------------------------------------------------------------------------- /img/connect.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/img/connect.png -------------------------------------------------------------------------------- /img/wechat.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/img/wechat.jpg -------------------------------------------------------------------------------- /MacOS/YourView/YourView/img/empty.scn: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/MacOS/YourView/YourView/img/empty.scn -------------------------------------------------------------------------------- /MacOS/YourView/YourView/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /MacOS/YourView/YourView/img/refresh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/MacOS/YourView/YourView/img/refresh.png -------------------------------------------------------------------------------- /MacOS/YourView/YourView/img/toolbar_segment/left_blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/MacOS/YourView/YourView/img/toolbar_segment/left_blue.png -------------------------------------------------------------------------------- /MacOS/YourView/YourView/img/toolbar_segment/left_gray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/MacOS/YourView/YourView/img/toolbar_segment/left_gray.png -------------------------------------------------------------------------------- /MacOS/YourView/YourView/img/toolbar_segment/right_blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/MacOS/YourView/YourView/img/toolbar_segment/right_blue.png -------------------------------------------------------------------------------- /MacOS/YourView/YourView/img/toolbar_segment/right_gray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/MacOS/YourView/YourView/img/toolbar_segment/right_gray.png -------------------------------------------------------------------------------- /MacOS/YourView/YourView/img/cellimage/cellimage_view@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/MacOS/YourView/YourView/img/cellimage/cellimage_view@2x.png -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/AppIcon.appiconset/Icon-20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/AppIcon.appiconset/Icon-20.png -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/AppIcon.appiconset/Icon-29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/AppIcon.appiconset/Icon-29.png -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/AppIcon.appiconset/Icon-40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/AppIcon.appiconset/Icon-40.png -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/AppIcon.appiconset/Icon-76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/AppIcon.appiconset/Icon-76.png -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/AppIcon.appiconset/Icon-20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/AppIcon.appiconset/Icon-20@2x.png -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/AppIcon.appiconset/Icon-20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/AppIcon.appiconset/Icon-20@3x.png -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/AppIcon.appiconset/Icon-29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/AppIcon.appiconset/Icon-29@2x.png -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/AppIcon.appiconset/Icon-29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/AppIcon.appiconset/Icon-29@3x.png -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/AppIcon.appiconset/Icon-40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/AppIcon.appiconset/Icon-40@2x.png -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/AppIcon.appiconset/Icon-40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/AppIcon.appiconset/Icon-40@3x.png -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/AppIcon.appiconset/Icon-60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/AppIcon.appiconset/Icon-60@2x.png -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/AppIcon.appiconset/Icon-60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/AppIcon.appiconset/Icon-60@3x.png -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/AppIcon.appiconset/Icon-76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/AppIcon.appiconset/Icon-76@2x.png -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/FunIcon/Base.imageset/FunIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/FunIcon/Base.imageset/FunIcon.png -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/FunIcon/Page.imageset/FunIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/FunIcon/Page.imageset/FunIcon.png -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/FunIcon/Push.imageset/FunIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/FunIcon/Push.imageset/FunIcon.png -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/FunIcon/eAuth.imageset/FunIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/FunIcon/eAuth.imageset/FunIcon.png -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/AppIcon.appiconset/Icon-83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/AppIcon.appiconset/Icon-83.5@2x.png -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/FunIcon/Base.imageset/FunIcon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/FunIcon/Base.imageset/FunIcon@2x.png -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/FunIcon/Base.imageset/FunIcon@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/FunIcon/Base.imageset/FunIcon@3x.png -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/FunIcon/Codeless.imageset/FunIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/FunIcon/Codeless.imageset/FunIcon.png -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/FunIcon/Custom.imageset/FunIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/FunIcon/Custom.imageset/FunIcon.png -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/FunIcon/Page.imageset/FunIcon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/FunIcon/Page.imageset/FunIcon@2x.png -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/FunIcon/Page.imageset/FunIcon@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/FunIcon/Page.imageset/FunIcon@3x.png -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/FunIcon/Push.imageset/FunIcon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/FunIcon/Push.imageset/FunIcon@2x.png -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/FunIcon/Push.imageset/FunIcon@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/FunIcon/Push.imageset/FunIcon@3x.png -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/FunIcon/Standard.imageset/FunIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/FunIcon/Standard.imageset/FunIcon.png -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/FunIcon/eAuth.imageset/FunIcon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/FunIcon/eAuth.imageset/FunIcon@2x.png -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/FunIcon/eAuth.imageset/FunIcon@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/FunIcon/eAuth.imageset/FunIcon@3x.png -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/FunIcon/Custom.imageset/FunIcon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/FunIcon/Custom.imageset/FunIcon@2x.png -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/FunIcon/Custom.imageset/FunIcon@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/FunIcon/Custom.imageset/FunIcon@3x.png -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/CheckIcon/selected.imageset/selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/CheckIcon/selected.imageset/selected.png -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/FunIcon/AntiCheating.imageset/FunIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/FunIcon/AntiCheating.imageset/FunIcon.png -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/FunIcon/BrandGrowth.imageset/FunIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/FunIcon/BrandGrowth.imageset/FunIcon.png -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/FunIcon/Codeless.imageset/FunIcon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/FunIcon/Codeless.imageset/FunIcon@2x.png -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/FunIcon/Codeless.imageset/FunIcon@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/FunIcon/Codeless.imageset/FunIcon@3x.png -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/FunIcon/Standard.imageset/FunIcon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/FunIcon/Standard.imageset/FunIcon@2x.png -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/FunIcon/Standard.imageset/FunIcon@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/FunIcon/Standard.imageset/FunIcon@3x.png -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/CheckIcon/selected.imageset/selected@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/CheckIcon/selected.imageset/selected@2x.png -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/CheckIcon/selected.imageset/selected@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/CheckIcon/selected.imageset/selected@3x.png -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/CheckIcon/unselected.imageset/unselected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/CheckIcon/unselected.imageset/unselected.png -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/FunIcon/AntiCheating.imageset/FunIcon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/FunIcon/AntiCheating.imageset/FunIcon@2x.png -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/FunIcon/AntiCheating.imageset/FunIcon@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/FunIcon/AntiCheating.imageset/FunIcon@3x.png -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/FunIcon/BrandGrowth.imageset/FunIcon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/FunIcon/BrandGrowth.imageset/FunIcon@2x.png -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/FunIcon/BrandGrowth.imageset/FunIcon@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/FunIcon/BrandGrowth.imageset/FunIcon@3x.png -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/CheckIcon/unselected.imageset/unselected@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/CheckIcon/unselected.imageset/unselected@2x.png -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/CheckIcon/unselected.imageset/unselected@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/CheckIcon/unselected.imageset/unselected@3x.png -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/PlaceholderImage.imageset/PlaceholderImage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/PlaceholderImage.imageset/PlaceholderImage.png -------------------------------------------------------------------------------- /MacOS/YourView/YourView.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/TalkingDataSDKDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /iOS/libyourview/libyourview.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/IQKeyboardManager/Resources/IQKeyboardManager.bundle/IQButtonBarArrowUp@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/iOS/TalkingDataSDKDemo/PhoneDemo/IQKeyboardManager/Resources/IQKeyboardManager.bundle/IQButtonBarArrowUp@2x.png -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/IQKeyboardManager/Resources/IQKeyboardManager.bundle/IQButtonBarArrowUp@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/iOS/TalkingDataSDKDemo/PhoneDemo/IQKeyboardManager/Resources/IQKeyboardManager.bundle/IQButtonBarArrowUp@3x.png -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/IQKeyboardManager/Resources/IQKeyboardManager.bundle/IQButtonBarArrowDown@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/iOS/TalkingDataSDKDemo/PhoneDemo/IQKeyboardManager/Resources/IQKeyboardManager.bundle/IQButtonBarArrowDown@2x.png -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/IQKeyboardManager/Resources/IQKeyboardManager.bundle/IQButtonBarArrowDown@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/iOS/TalkingDataSDKDemo/PhoneDemo/IQKeyboardManager/Resources/IQKeyboardManager.bundle/IQButtonBarArrowDown@3x.png -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/IQKeyboardManager/Resources/IQKeyboardManager.bundle/IQButtonBarArrowLeft@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/iOS/TalkingDataSDKDemo/PhoneDemo/IQKeyboardManager/Resources/IQKeyboardManager.bundle/IQButtonBarArrowLeft@2x.png -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/IQKeyboardManager/Resources/IQKeyboardManager.bundle/IQButtonBarArrowLeft@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/iOS/TalkingDataSDKDemo/PhoneDemo/IQKeyboardManager/Resources/IQKeyboardManager.bundle/IQButtonBarArrowLeft@3x.png -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/IQKeyboardManager/Resources/IQKeyboardManager.bundle/IQButtonBarArrowRight@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/iOS/TalkingDataSDKDemo/PhoneDemo/IQKeyboardManager/Resources/IQKeyboardManager.bundle/IQButtonBarArrowRight@2x.png -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/IQKeyboardManager/Resources/IQKeyboardManager.bundle/IQButtonBarArrowRight@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/iOS/TalkingDataSDKDemo/PhoneDemo/IQKeyboardManager/Resources/IQKeyboardManager.bundle/IQButtonBarArrowRight@3x.png -------------------------------------------------------------------------------- /MacOS/YourView/YourView.xcodeproj/project.xcworkspace/xcuserdata/bliss_ddo.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/MacOS/YourView/YourView.xcodeproj/project.xcworkspace/xcuserdata/bliss_ddo.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /MacOS/YourView/YourView/Window/YVWindow.m: -------------------------------------------------------------------------------- 1 | // 2 | // YVWindow.m 3 | // YourView 4 | // 5 | // Created by bliss_ddo on 2019/4/24. 6 | // Copyright © 2019 bliss_ddo. All rights reserved. 7 | // 8 | 9 | #import "YVWindow.h" 10 | 11 | @implementation YVWindow 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /iOS/libyourview/libyourview.xcodeproj/project.xcworkspace/xcuserdata/bliss_ddo.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/iOS/libyourview/libyourview.xcodeproj/project.xcworkspace/xcuserdata/bliss_ddo.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /MacOS/YourView/YourView/view/cell/binding/YVStepperModel.m: -------------------------------------------------------------------------------- 1 | // 2 | // YVStepperModel.m 3 | // YourView 4 | // 5 | // Created by bliss_ddo on 2019/5/6. 6 | // Copyright © 2019 bliss_ddo. All rights reserved. 7 | // 8 | 9 | #import "YVStepperModel.h" 10 | 11 | @implementation YVStepperModel 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/TalkingDataSDKDemo.xcodeproj/project.xcworkspace/xcuserdata/bliss_ddo.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TalkingData/YourView/HEAD/iOS/TalkingDataSDKDemo/TalkingDataSDKDemo.xcodeproj/project.xcworkspace/xcuserdata/bliss_ddo.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /MacOS/YourView/YourView/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // YourView 4 | // 5 | // Created by bliss_ddo on 2019/4/24. 6 | // Copyright © 2019 bliss_ddo. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | int main(int argc, const char * argv[]) { 12 | return NSApplicationMain(argc, argv); 13 | } 14 | -------------------------------------------------------------------------------- /MacOS/YourView/YourView/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // YourView 4 | // 5 | // Created by bliss_ddo on 2019/4/24. 6 | // Copyright © 2019 bliss_ddo. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface AppDelegate : NSObject 12 | 13 | 14 | @end 15 | 16 | -------------------------------------------------------------------------------- /MacOS/YourView/YourView/view/cell/binding/YVObjectController.m: -------------------------------------------------------------------------------- 1 | // 2 | // YVObjectController.m 3 | // YourView 4 | // 5 | // Created by bliss_ddo on 2019/5/6. 6 | // Copyright © 2019 bliss_ddo. All rights reserved. 7 | // 8 | 9 | #import "YVObjectController.h" 10 | 11 | @implementation YVObjectController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/TDInfoViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // TDInfoViewController.h 3 | // TalkingDataSDKDemo 4 | // 5 | // Created by liweiqiang on 2017/5/22. 6 | // Copyright © 2017年 TendCloud. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface TDInfoViewController : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /iOS/libyourview/main/Main.h: -------------------------------------------------------------------------------- 1 | // 2 | // Main.h 3 | // libyourview 4 | // 5 | // Created by bliss_ddo on 2019/4/24. 6 | // Copyright © 2019 bliss_ddo. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface Main : NSObject 14 | 15 | @end 16 | 17 | NS_ASSUME_NONNULL_END 18 | -------------------------------------------------------------------------------- /MacOS/YourView/YourView.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/TDHomeViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // TDHomeViewController.h 3 | // TalkingDataSDKDemo 4 | // 5 | // Created by liweiqiang on 2017/5/22. 6 | // Copyright © 2017年 TendCloud. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface TDHomeViewController : UIViewController 12 | 13 | @end 14 | 15 | -------------------------------------------------------------------------------- /MacOS/YourView/YourView/Window/YVWindow.h: -------------------------------------------------------------------------------- 1 | // 2 | // YVWindow.h 3 | // YourView 4 | // 5 | // Created by bliss_ddo on 2019/4/24. 6 | // Copyright © 2019 bliss_ddo. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface YVWindow : NSWindow 14 | 15 | @end 16 | 17 | NS_ASSUME_NONNULL_END 18 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/eAuth/TDEAAuthViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // TDEAAuthViewController.h 3 | // TalkingDataSDKDemo 4 | // 5 | // Created by liweiqiang on 2018/1/9. 6 | // Copyright © 2018年 TendCloud. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface TDEAAuthViewController : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /iOS/libyourview/libyourview.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/AdTracking/TDATGameTableViewCell.h: -------------------------------------------------------------------------------- 1 | // 2 | // TDATGameTableViewCell.h 3 | // TalkingDataSDKDemo 4 | // 5 | // Created by liweiqiang on 2017/5/22. 6 | // Copyright © 2017年 TendCloud. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface TDATGameTableViewCell : UITableViewCell 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/AdTracking/TDATOtherTableViewCell.h: -------------------------------------------------------------------------------- 1 | // 2 | // TDATOtherTableViewCell.h 3 | // TalkingDataSDKDemo 4 | // 5 | // Created by liweiqiang on 2017/5/22. 6 | // Copyright © 2017年 TendCloud. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface TDATOtherTableViewCell : UITableViewCell 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/GameAnalytics/TDGAItemTableViewCell.h: -------------------------------------------------------------------------------- 1 | // 2 | // TDGAItemTableViewCell.h 3 | // TalkingDataSDKDemo 4 | // 5 | // Created by liweiqiang on 2017/5/22. 6 | // Copyright © 2017年 TendCloud. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface TDGAItemTableViewCell : UITableViewCell 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/eAuth/TDEACheckViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // TDEACheckViewController.h 3 | // TalkingDataSDKDemo 4 | // 5 | // Created by liweiqiang on 2018/1/9. 6 | // Copyright © 2018年 TendCloud. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface TDEACheckViewController : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/eAuth/TDEAMatchViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // TDEAMatchViewController.h 3 | // TalkingDataSDKDemo 4 | // 5 | // Created by liweiqiang on 2018/1/9. 6 | // Copyright © 2018年 TendCloud. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface TDEAMatchViewController : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/GameAnalytics/TDGAOtherTableViewCell.h: -------------------------------------------------------------------------------- 1 | // 2 | // TDGAOtherTableViewCell.h 3 | // TalkingDataSDKDemo 4 | // 5 | // Created by liweiqiang on 2017/5/22. 6 | // Copyright © 2017年 TendCloud. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface TDGAOtherTableViewCell : UITableViewCell 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/eAuth/TDEAUnbindViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // TDEAUnbindViewController.h 3 | // TalkingDataSDKDemo 4 | // 5 | // Created by liweiqiang on 2018/1/9. 6 | // Copyright © 2018年 TendCloud. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface TDEAUnbindViewController : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/AdTracking/TDATDeviceIDTableViewCell.h: -------------------------------------------------------------------------------- 1 | // 2 | // TDATDeviceIDTableViewCell.h 3 | // TalkingDataSDKDemo 4 | // 5 | // Created by liweiqiang on 2018/8/29. 6 | // Copyright © 2018年 TendCloud. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface TDATDeviceIDTableViewCell : UITableViewCell 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/AppAnalytics/TDAAAccountTableViewCell.h: -------------------------------------------------------------------------------- 1 | // 2 | // TDAAAccountTableViewCell.h 3 | // TalkingDataSDKDemo 4 | // 5 | // Created by liweiqiang on 2017/6/26. 6 | // Copyright © 2017年 TendCloud. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface TDAAAccountTableViewCell : UITableViewCell 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/AppAnalytics/TDAAVersionTableViewCell.h: -------------------------------------------------------------------------------- 1 | // 2 | // TDAAVersionTableViewCell.h 3 | // TalkingDataSDKDemo 4 | // 5 | // Created by liweiqiang on 2018/8/29. 6 | // Copyright © 2018年 TendCloud. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface TDAAVersionTableViewCell : UITableViewCell 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/GameAnalytics/TDGAAccountTableViewCell.h: -------------------------------------------------------------------------------- 1 | // 2 | // TDGAAccountTableViewCell.h 3 | // TalkingDataSDKDemo 4 | // 5 | // Created by liweiqiang on 2017/5/22. 6 | // Copyright © 2017年 TendCloud. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface TDGAAccountTableViewCell : UITableViewCell 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/GameAnalytics/TDGAMissionTableViewCell.h: -------------------------------------------------------------------------------- 1 | // 2 | // TDGAMissionTableViewCell.h 3 | // TalkingDataSDKDemo 4 | // 5 | // Created by liweiqiang on 2017/5/22. 6 | // Copyright © 2017年 TendCloud. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface TDGAMissionTableViewCell : UITableViewCell 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/TalkingDataSDKDemo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/AdTracking/TDATECommerceTableViewCell.h: -------------------------------------------------------------------------------- 1 | // 2 | // TDATECommerceTableViewCell.h 3 | // TalkingDataSDKDemo 4 | // 5 | // Created by liweiqiang on 2017/5/22. 6 | // Copyright © 2017年 TendCloud. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface TDATECommerceTableViewCell : UITableViewCell 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/AppAnalytics/TDAADeviceIDTableViewCell.h: -------------------------------------------------------------------------------- 1 | // 2 | // TDAADeviceIDTableViewCell.h 3 | // TalkingDataSDKDemo 4 | // 5 | // Created by liweiqiang on 2018/8/29. 6 | // Copyright © 2018年 TendCloud. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface TDAADeviceIDTableViewCell : UITableViewCell 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/AppAnalytics/TDAAExceptionTableViewCell.h: -------------------------------------------------------------------------------- 1 | // 2 | // TDAAExceptionTableViewCell.h 3 | // TalkingDataSDKDemo 4 | // 5 | // Created by liweiqiang on 2017/6/26. 6 | // Copyright © 2017年 TendCloud. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface TDAAExceptionTableViewCell : UITableViewCell 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/AppAnalytics/TDAALocationTableViewCell.h: -------------------------------------------------------------------------------- 1 | // 2 | // TDAALocationTableViewCell.h 3 | // TalkingDataSDKDemo 4 | // 5 | // Created by liweiqiang on 2017/6/26. 6 | // Copyright © 2017年 TendCloud. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface TDAALocationTableViewCell : UITableViewCell 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/GameAnalytics/TDGADeviceIDTableViewCell.h: -------------------------------------------------------------------------------- 1 | // 2 | // TDGADeviceIDTableViewCell.h 3 | // TalkingDataSDKDemo 4 | // 5 | // Created by liweiqiang on 2018/8/29. 6 | // Copyright © 2018年 TendCloud. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface TDGADeviceIDTableViewCell : UITableViewCell 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/AppAnalytics/TDAAPageFirstViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // TDAAPageFirstViewController.h 3 | // TalkingDataSDKDemo 4 | // 5 | // Created by liweiqiang on 2017/5/22. 6 | // Copyright © 2017年 TendCloud. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface TDAAPageFirstViewController : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/AppAnalytics/TDAAPageSecondViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // TDAAPageSecondViewController.h 3 | // TalkingDataSDKDemo 4 | // 5 | // Created by liweiqiang on 2017/5/22. 6 | // Copyright © 2017年 TendCloud. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface TDAAPageSecondViewController : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /MacOS/YourView/YourView/view/YVSelectableTextView.h: -------------------------------------------------------------------------------- 1 | // 2 | // YVSelectableTextView.h 3 | // YourView 4 | // 5 | // Created by bliss_ddo on 2019/5/5. 6 | // Copyright © 2019 bliss_ddo. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface YVSelectableTextView : NSTextView 14 | 15 | @end 16 | 17 | NS_ASSUME_NONNULL_END 18 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/GameAnalytics/TDGAVirtualCurrencyTableViewCell.h: -------------------------------------------------------------------------------- 1 | // 2 | // TDGAVirtualCurrencyTableViewCell.h 3 | // TalkingDataSDKDemo 4 | // 5 | // Created by liweiqiang on 2017/5/22. 6 | // Copyright © 2017年 TendCloud. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface TDGAVirtualCurrencyTableViewCell : UITableViewCell 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/TDTableViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // TDTableViewController.h 3 | // TalkingDataSDKDemo 4 | // 5 | // Created by liweiqiang on 2017/8/1. 6 | // Copyright © 2017年 TendCloud. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "TDGeneralViewController.h" 11 | 12 | @interface TDTableViewController : TDGeneralViewController 13 | 14 | @end 15 | -------------------------------------------------------------------------------- /MacOS/YourView/YourView/view/cell/binding/YVObjectController.h: -------------------------------------------------------------------------------- 1 | // 2 | // YVObjectController.h 3 | // YourView 4 | // 5 | // Created by bliss_ddo on 2019/5/6. 6 | // Copyright © 2019 bliss_ddo. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface YVObjectController : NSObjectController 14 | 15 | @end 16 | 17 | NS_ASSUME_NONNULL_END 18 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/PhoneDemo.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | aps-environment 6 | development 7 | com.apple.developer.networking.wifi-info 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/AdTracking/TDATCustomViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // TDATCustomViewController.h 3 | // TalkingDataSDKDemo 4 | // 5 | // Created by liweiqiang on 2017/5/22. 6 | // Copyright © 2017年 TendCloud. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "TDGeneralViewController.h" 11 | 12 | @interface TDATCustomViewController : TDGeneralViewController 13 | 14 | @end 15 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/AppAnalytics/TDAAPageViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // TDAAPageViewController.h 3 | // TalkingDataSDKDemo 4 | // 5 | // Created by liweiqiang on 2017/5/22. 6 | // Copyright © 2017年 TendCloud. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "TDGeneralViewController.h" 11 | 12 | @interface TDAAPageViewController : TDGeneralViewController 13 | 14 | @end 15 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/TDGeneralViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // TDGeneralViewController.h 3 | // TalkingDataSDKDemo 4 | // 5 | // Created by liweiqiang on 2017/5/22. 6 | // Copyright © 2017年 TendCloud. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface TDGeneralViewController : UIViewController 12 | 13 | @property (strong, nonatomic) NSDictionary *info; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/TDHomeTableViewCell.h: -------------------------------------------------------------------------------- 1 | // 2 | // TDHomeTableViewCell.m 3 | // TalkingDataSDKDemo 4 | // 5 | // Created by liweiqiang on 2017/5/22. 6 | // Copyright © 2017年 TendCloud. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface TDHomeTableViewCell : UITableViewCell 12 | 13 | @property (nonatomic, weak) IBOutlet UIImageView *selectImage; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /iOS/libyourview/serializer/NSObject+YVNodeInfo.h: -------------------------------------------------------------------------------- 1 | // 2 | // NSObject+YVNodeInfo.h 3 | // libyourview 4 | // 5 | // Created by bliss_ddo on 2019/4/24. 6 | // Copyright © 2019 bliss_ddo. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface NSObject (YVNodeInfo) 14 | -(NSDictionary*)nodeInfo; 15 | @end 16 | 17 | NS_ASSUME_NONNULL_END 18 | -------------------------------------------------------------------------------- /MacOS/YourView/YourView/Controller/split/YVLeftViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // YVLeftViewController.h 3 | // YourView 4 | // 5 | // Created by bliss_ddo on 2019/4/25. 6 | // Copyright © 2019 bliss_ddo. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface YVLeftViewController : NSViewController 14 | 15 | 16 | 17 | @end 18 | 19 | NS_ASSUME_NONNULL_END 20 | -------------------------------------------------------------------------------- /MacOS/YourView/YourView/Controller/split/YVSplitViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // YVSplitViewController.h 3 | // YourView 4 | // 5 | // Created by bliss_ddo on 2019/4/25. 6 | // Copyright © 2019 bliss_ddo. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface YVSplitViewController : NSSplitViewController 14 | 15 | @end 16 | 17 | NS_ASSUME_NONNULL_END 18 | -------------------------------------------------------------------------------- /MacOS/YourView/YourView/helper/SCNNode+YVBorder.h: -------------------------------------------------------------------------------- 1 | // 2 | // SCNNode+border.h 3 | // YourView 4 | // 5 | // Created by bliss_ddo on 2019/4/28. 6 | // Copyright © 2019 bliss_ddo. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface SCNNode (YVBorder) 14 | +(SCNNode*)borderNodeWithPlane:(SCNNode*)plane; 15 | @end 16 | 17 | NS_ASSUME_NONNULL_END 18 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/AppAnalytics/TDAACustomViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // TDAACustomViewController.h 3 | // TalkingDataSDKDemo 4 | // 5 | // Created by liweiqiang on 2017/5/22. 6 | // Copyright © 2017年 TendCloud. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "TDGeneralViewController.h" 11 | 12 | @interface TDAACustomViewController : TDGeneralViewController 13 | 14 | @end 15 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/GameAnalytics/TDGACustomViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // TDGACustomViewController.h 3 | // TalkingDataSDKDemo 4 | // 5 | // Created by liweiqiang on 2017/5/22. 6 | // Copyright © 2017年 TendCloud. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "TDGeneralViewController.h" 11 | 12 | @interface TDGACustomViewController : TDGeneralViewController 13 | 14 | @end 15 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/AppAnalytics/TDAAStandardViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // TDAAStandardViewController.h 3 | // TalkingDataSDKDemo 4 | // 5 | // Created by liweiqiang on 2017/6/26. 6 | // Copyright © 2017年 TendCloud. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "TDGeneralViewController.h" 11 | 12 | @interface TDAAStandardViewController : TDGeneralViewController 13 | 14 | @end 15 | -------------------------------------------------------------------------------- /MacOS/YourView/YourView/helper/SCNNode+YVIdentifier.h: -------------------------------------------------------------------------------- 1 | // 2 | // SCNNode+YVIdentifier.h 3 | // YourView 4 | // 5 | // Created by bliss_ddo on 2019/5/5. 6 | // Copyright © 2019 bliss_ddo. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface SCNNode (YVIdentifier) 14 | @property (nonatomic,strong) NSString * uniqueID; 15 | @end 16 | 17 | NS_ASSUME_NONNULL_END 18 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/AdTracking/TDATCustomViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // TDATCustomViewController.m 3 | // TalkingDataSDKDemo 4 | // 5 | // Created by liweiqiang on 2017/5/22. 6 | // Copyright © 2017年 TendCloud. All rights reserved. 7 | // 8 | 9 | #import "TDATCustomViewController.h" 10 | 11 | @implementation TDATCustomViewController 12 | 13 | - (IBAction)customEvent:(UIButton *)sender { 14 | 15 | } 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/AppAnalytics/TDAAAntiCheatingViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // TDAAAntiCheatingViewController.h 3 | // TalkingDataSDKDemo 4 | // 5 | // Created by liweiqiang on 2017/5/22. 6 | // Copyright © 2017年 TendCloud. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "TDGeneralViewController.h" 11 | 12 | @interface TDAAAntiCheatingViewController : TDGeneralViewController 13 | 14 | @end 15 | -------------------------------------------------------------------------------- /iOS/libyourview/serializer/UIView+YVNodeInfo.h: -------------------------------------------------------------------------------- 1 | // 2 | // UIView+YVNodeInfo.h 3 | // libyourview 4 | // 5 | // Created by bliss_ddo on 2019/4/24. 6 | // Copyright © 2019 bliss_ddo. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "NSObject+YVNodeInfo.h" 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | @interface UIView (YVNodeInfo) 15 | -(NSDictionary*)nodeInfo; 16 | @end 17 | 18 | NS_ASSUME_NONNULL_END 19 | -------------------------------------------------------------------------------- /MacOS/YourView/YourView/Controller/YVHomeViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // YVHomeViewController.h 3 | // YourView 4 | // 5 | // Created by bliss_ddo on 2019/4/24. 6 | // Copyright © 2019 bliss_ddo. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface YVHomeViewController : NSViewController 14 | -(IBAction)buttonPressed:(NSButton*)btn; 15 | @end 16 | 17 | NS_ASSUME_NONNULL_END 18 | -------------------------------------------------------------------------------- /iOS/libyourview/serializer/UIView+YVViewTree.h: -------------------------------------------------------------------------------- 1 | // 2 | // UIView+YVViewTree.h 3 | // libyourview 4 | // 5 | // Created by bliss_ddo on 2019/4/24. 6 | // Copyright © 2019 bliss_ddo. All rights reserved. 7 | // 8 | 9 | #import 10 | NS_ASSUME_NONNULL_BEGIN 11 | 12 | @interface UIView (YVViewTree) 13 | +(NSString*)rootViewTreeString; 14 | +(NSDictionary*)rootViewTreeDictionary; 15 | @end 16 | 17 | NS_ASSUME_NONNULL_END 18 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // TalkingDataSDKDemo 4 | // 5 | // Created by liweiqiang on 2017/5/22. 6 | // Copyright © 2017年 TendCloud. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "AppDelegate.h" 11 | 12 | int main(int argc, char * argv[]) { 13 | @autoreleasepool { 14 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /MacOS/YourView/YourView/helper/SCNNode+YVPlane.h: -------------------------------------------------------------------------------- 1 | // 2 | // SCNNode+plane.h 3 | // YourView 4 | // 5 | // Created by bliss_ddo on 2019/4/28. 6 | // Copyright © 2019 bliss_ddo. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface SCNNode (YVPlane) 14 | +(SCNNode*)yvplaneWithWidth:(CGFloat)width height:(CGFloat)height content:(id)content; 15 | @end 16 | 17 | NS_ASSUME_NONNULL_END 18 | -------------------------------------------------------------------------------- /MacOS/YourView/YourView/helper/SCNNode+YVSelected.h: -------------------------------------------------------------------------------- 1 | // 2 | // SCNNode+selected.h 3 | // YourView 4 | // 5 | // Created by bliss_ddo on 2019/4/28. 6 | // Copyright © 2019 bliss_ddo. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface SCNNode (YVSelected) 14 | +(SCNNode*)yvselectedNodeWithwidth:(CGFloat)width height:(CGFloat)height; 15 | 16 | @end 17 | 18 | NS_ASSUME_NONNULL_END 19 | -------------------------------------------------------------------------------- /MacOS/YourView/YourView/Controller/split/YVRightViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // YVRightViewController.h 3 | // YourView 4 | // 5 | // Created by bliss_ddo on 2019/4/25. 6 | // Copyright © 2019 bliss_ddo. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface YVRightViewController : NSViewController 14 | 15 | @property (nonatomic) IBOutlet NSTableView * viewtable; 16 | @end 17 | 18 | NS_ASSUME_NONNULL_END 19 | -------------------------------------------------------------------------------- /MacOS/YourView/YourView/helper/SCNNode+YVVisual.h: -------------------------------------------------------------------------------- 1 | // 2 | // SCNNode+YVVisual.h 3 | // YourView 4 | // 5 | // Created by bliss_ddo on 2019/5/5. 6 | // Copyright © 2019 bliss_ddo. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface SCNNode (YVVisual) 14 | 15 | -(void)hover; 16 | -(void)unhover; 17 | 18 | -(void)highlight; 19 | -(void)lowlight; 20 | 21 | @end 22 | 23 | NS_ASSUME_NONNULL_END 24 | -------------------------------------------------------------------------------- /MacOS/YourView/YourView/view/cell/binding/YVStepperModel.h: -------------------------------------------------------------------------------- 1 | // 2 | // YVStepperModel.h 3 | // YourView 4 | // 5 | // Created by bliss_ddo on 2019/5/6. 6 | // Copyright © 2019 bliss_ddo. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface YVStepperModel : NSObject 14 | { 15 | CGFloat x; 16 | CGFloat y; 17 | CGFloat w; 18 | CGFloat h; 19 | } 20 | @end 21 | 22 | NS_ASSUME_NONNULL_END 23 | -------------------------------------------------------------------------------- /MacOS/YourView/YourView.xcodeproj/xcuserdata/bliss_ddo.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | YourView.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /MacOS/YourView/YourView/view/YVSelectableTextView.m: -------------------------------------------------------------------------------- 1 | // 2 | // YVSelectableTextView.m 3 | // YourView 4 | // 5 | // Created by bliss_ddo on 2019/5/5. 6 | // Copyright © 2019 bliss_ddo. All rights reserved. 7 | // 8 | 9 | #import "YVSelectableTextView.h" 10 | 11 | @implementation YVSelectableTextView 12 | 13 | - (void)drawRect:(NSRect)dirtyRect { 14 | [super drawRect:dirtyRect]; 15 | } 16 | 17 | -(NSView *)hitTest:(NSPoint)point 18 | { 19 | return self.superview; 20 | } 21 | 22 | @end 23 | -------------------------------------------------------------------------------- /iOS/libyourview/manager/YVObjectManager.h: -------------------------------------------------------------------------------- 1 | // 2 | // YVObjectManager.h 3 | // libyourview 4 | // 5 | // Created by bliss_ddo on 2019/5/5. 6 | // Copyright © 2019 bliss_ddo. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "YVTraversalContext.h" 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface YVObjectManager : NSObject 14 | +(YVObjectManager *)sharedInstance; 15 | @property (nonatomic,strong) YVTraversalContext * context; 16 | @end 17 | 18 | NS_ASSUME_NONNULL_END 19 | -------------------------------------------------------------------------------- /MacOS/YourView/YourView/helper/YVCGRectHelper.h: -------------------------------------------------------------------------------- 1 | // 2 | // YVCGRectHelper.h 3 | // YourView 4 | // 5 | // Created by bliss_ddo on 2019/4/28. 6 | // Copyright © 2019 bliss_ddo. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface YVCGRectHelper : NSObject 14 | +(CGRect)CGRectExpand:(CGRect)rect; 15 | +(CGRect)UIKitRectTransformToSceneRect:(CGRect)UIKitRect withScreenSize:(CGSize)screenSize; 16 | @end 17 | 18 | NS_ASSUME_NONNULL_END 19 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/AppAnalytics/TDAAExceptionTableViewCell.m: -------------------------------------------------------------------------------- 1 | // 2 | // TDAAExceptionTableViewCell.m 3 | // TalkingDataSDKDemo 4 | // 5 | // Created by liweiqiang on 2017/6/26. 6 | // Copyright © 2017年 TendCloud. All rights reserved. 7 | // 8 | 9 | #import "TDAAExceptionTableViewCell.h" 10 | 11 | @implementation TDAAExceptionTableViewCell 12 | 13 | - (IBAction)exception:(UIButton *)sender { 14 | NSArray *array = [NSArray array]; 15 | [array objectAtIndex:0]; 16 | } 17 | 18 | @end 19 | -------------------------------------------------------------------------------- /MacOS/YourView/YourView/Controller/loading/YVLoadingViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // YVLoadingViewController.h 3 | // YourView 4 | // 5 | // Created by bliss_ddo on 2019/4/25. 6 | // Copyright © 2019 bliss_ddo. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface YVLoadingViewController : NSViewController 14 | @property (weak) IBOutlet NSTextField *infolabel; 15 | @property (nonatomic,copy) NSString * host; 16 | @end 17 | 18 | NS_ASSUME_NONNULL_END 19 | -------------------------------------------------------------------------------- /MacOS/YourView/YourView/Controller/split/YVSplitViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // YVSplitViewController.m 3 | // YourView 4 | // 5 | // Created by bliss_ddo on 2019/4/25. 6 | // Copyright © 2019 bliss_ddo. All rights reserved. 7 | // 8 | 9 | #import "YVSplitViewController.h" 10 | 11 | @interface YVSplitViewController () 12 | 13 | @end 14 | 15 | @implementation YVSplitViewController 16 | 17 | - (void)viewDidLoad { 18 | [super viewDidLoad]; 19 | NSLog(@"1123123123123"); 20 | } 21 | 22 | 23 | 24 | 25 | @end 26 | -------------------------------------------------------------------------------- /MacOS/YourView/YourView/YourView.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.app-sandbox 6 | 7 | com.apple.security.files.user-selected.read-only 8 | 9 | com.apple.security.network.client 10 | 11 | com.apple.security.network.server 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/TalkingDataSDKDemo.xcodeproj/xcuserdata/bliss_ddo.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | PhoneDemo.xcscheme_^#shared#^_ 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /MacOS/YourView/YourView/Controller/split/YVMiddleViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // YVMiddleViewController.h 3 | // YourView 4 | // 5 | // Created by bliss_ddo on 2019/4/25. 6 | // Copyright © 2019 bliss_ddo. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface YVMiddleViewController : NSViewController 14 | -(void)changeDisplayMode:(YVSceneViewDisplayMode)newmode; 15 | -(void)changeHiddenMode:(BOOL)newmode; 16 | -(void)reset; 17 | @end 18 | 19 | NS_ASSUME_NONNULL_END 20 | -------------------------------------------------------------------------------- /iOS/libyourview/serializer/YVTraversalStepin.h: -------------------------------------------------------------------------------- 1 | // 2 | // YVTraversalStepin.h 3 | // libyourview 4 | // 5 | // Created by bliss_ddo on 2019/4/24. 6 | // Copyright © 2019 bliss_ddo. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | @interface YVTraversalStepin : NSObject 15 | +(YVTraversalStepin*)stepInWithView:(UIView*)b parentInfo:(YVTraversalStepin*)parent; 16 | -(NSDictionary*)stepinfo; 17 | @end 18 | 19 | NS_ASSUME_NONNULL_END 20 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/AdTracking/TDATGameTableViewCell.m: -------------------------------------------------------------------------------- 1 | // 2 | // TDATGameTableViewCell.m 3 | // TalkingDataSDKDemo 4 | // 5 | // Created by liweiqiang on 2017/5/22. 6 | // Copyright © 2017年 TendCloud. All rights reserved. 7 | // 8 | 9 | #import "TDATGameTableViewCell.h" 10 | 11 | @interface TDATGameTableViewCell () 12 | 13 | @property (weak, nonatomic) IBOutlet UITextField *roleNameField; 14 | 15 | @end 16 | 17 | @implementation TDATGameTableViewCell 18 | 19 | - (IBAction)createRole { 20 | } 21 | 22 | @end 23 | -------------------------------------------------------------------------------- /MacOS/YourView/YourView/helper/YVNodeBackTracking.h: -------------------------------------------------------------------------------- 1 | // 2 | // YVNodeBackTracking.h 3 | // YourView 4 | // 5 | // Created by bliss_ddo on 2019/4/28. 6 | // Copyright © 2019 bliss_ddo. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface YVNodeBackTracking : NSObject 14 | +(NSInteger)findBestZFromlevelDict:(NSMutableDictionary*)levelDict minDepth:(NSInteger)minDeepth maxDepth:(NSInteger)maxDeepth frame:(CGRect)crect; 15 | @end 16 | 17 | NS_ASSUME_NONNULL_END 18 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/AdTracking/TDATDeviceIDTableViewCell.m: -------------------------------------------------------------------------------- 1 | // 2 | // TDATDeviceIDTableViewCell.m 3 | // TalkingDataSDKDemo 4 | // 5 | // Created by liweiqiang on 2018/8/29. 6 | // Copyright © 2018年 TendCloud. All rights reserved. 7 | // 8 | 9 | #import "TDATDeviceIDTableViewCell.h" 10 | 11 | @interface TDATDeviceIDTableViewCell () 12 | 13 | @property (weak, nonatomic) IBOutlet UITextField *deviceIDField; 14 | 15 | @end 16 | 17 | @implementation TDATDeviceIDTableViewCell 18 | 19 | - (IBAction)showDeviceID { 20 | } 21 | 22 | @end 23 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/AppAnalytics/TDAADeviceIDTableViewCell.m: -------------------------------------------------------------------------------- 1 | // 2 | // TDAADeviceIDTableViewCell.m 3 | // TalkingDataSDKDemo 4 | // 5 | // Created by liweiqiang on 2018/8/29. 6 | // Copyright © 2018年 TendCloud. All rights reserved. 7 | // 8 | 9 | #import "TDAADeviceIDTableViewCell.h" 10 | 11 | @interface TDAADeviceIDTableViewCell () 12 | 13 | @property (weak, nonatomic) IBOutlet UITextField *deviceIDField; 14 | 15 | @end 16 | 17 | @implementation TDAADeviceIDTableViewCell 18 | 19 | - (IBAction)showDeviceID { 20 | } 21 | 22 | @end 23 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/FunIcon/Base.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "FunIcon.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "FunIcon@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "FunIcon@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/FunIcon/Page.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "FunIcon.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "FunIcon@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "FunIcon@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/FunIcon/Push.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "FunIcon.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "FunIcon@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "FunIcon@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/AppAnalytics/TDAAPageViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // TDAAPageViewController.m 3 | // TalkingDataSDKDemo 4 | // 5 | // Created by liweiqiang on 2017/5/22. 6 | // Copyright © 2017年 TendCloud. All rights reserved. 7 | // 8 | 9 | #import "TDAAPageViewController.h" 10 | 11 | @implementation TDAAPageViewController 12 | 13 | - (void)viewDidAppear:(BOOL)animated { 14 | [super viewDidAppear:animated]; 15 | } 16 | 17 | - (void)viewWillDisappear:(BOOL)animated { 18 | [super viewWillDisappear:animated]; 19 | } 20 | 21 | @end 22 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/FunIcon/Codeless.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "FunIcon.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "FunIcon@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "FunIcon@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/FunIcon/Custom.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "FunIcon.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "FunIcon@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "FunIcon@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/FunIcon/Standard.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "FunIcon.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "FunIcon@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "FunIcon@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/FunIcon/eAuth.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "FunIcon.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "FunIcon@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "FunIcon@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/GameAnalytics/TDGADeviceIDTableViewCell.m: -------------------------------------------------------------------------------- 1 | // 2 | // TDGADeviceIDTableViewCell.m 3 | // TalkingDataSDKDemo 4 | // 5 | // Created by liweiqiang on 2018/8/29. 6 | // Copyright © 2018年 TendCloud. All rights reserved. 7 | // 8 | 9 | #import "TDGADeviceIDTableViewCell.h" 10 | 11 | @interface TDGADeviceIDTableViewCell () 12 | 13 | @property (weak, nonatomic) IBOutlet UITextField *deviceIDField; 14 | 15 | @end 16 | 17 | @implementation TDGADeviceIDTableViewCell 18 | 19 | - (IBAction)showDeviceID { 20 | } 21 | 22 | @end 23 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/CheckIcon/selected.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "selected.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "selected@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "selected@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/FunIcon/AntiCheating.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "FunIcon.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "FunIcon@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "FunIcon@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/FunIcon/BrandGrowth.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "FunIcon.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "FunIcon@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "FunIcon@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /iOS/libyourview/manager/YVObjectManager.m: -------------------------------------------------------------------------------- 1 | // 2 | // YVObjectManager.m 3 | // libyourview 4 | // 5 | // Created by bliss_ddo on 2019/5/5. 6 | // Copyright © 2019 bliss_ddo. All rights reserved. 7 | // 8 | 9 | #import "YVObjectManager.h" 10 | 11 | @implementation YVObjectManager 12 | static YVObjectManager * _signleton; 13 | +(YVObjectManager *)sharedInstance 14 | { 15 | static dispatch_once_t oneToken; 16 | dispatch_once(&oneToken, ^{ 17 | _signleton = [[YVObjectManager alloc]init]; 18 | }); 19 | return _signleton; 20 | } 21 | @end 22 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/CheckIcon/unselected.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "unselected.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "unselected@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "unselected@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/AppAnalytics/TDAAPageFirstViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // TDAAPageFirstViewController.m 3 | // TalkingDataSDKDemo 4 | // 5 | // Created by liweiqiang on 2017/5/22. 6 | // Copyright © 2017年 TendCloud. All rights reserved. 7 | // 8 | 9 | #import "TDAAPageFirstViewController.h" 10 | 11 | @implementation TDAAPageFirstViewController 12 | 13 | - (void)viewDidAppear:(BOOL)animated { 14 | [super viewDidAppear:animated]; 15 | } 16 | 17 | - (void)viewWillDisappear:(BOOL)animated { 18 | [super viewWillDisappear:animated]; 19 | } 20 | 21 | @end 22 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/PlaceholderImage.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "PlaceholderImage.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "PlaceholderImage.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "PlaceholderImage.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /iOS/libyourview/serializer/UIView+YVTraversal.h: -------------------------------------------------------------------------------- 1 | // 2 | // UIView+YVTraversal.h 3 | // libyourview 4 | // 5 | // Created by bliss_ddo on 2019/4/24. 6 | // Copyright © 2019 bliss_ddo. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "YVTraversalStepin.h" 11 | #import "YVTraversalContext.h" 12 | #import "UIView+YVNodeInfo.m" 13 | 14 | NS_ASSUME_NONNULL_BEGIN 15 | 16 | @interface UIView (YVTraversal) 17 | 18 | -(NSDictionary*)traversal:(YVTraversalStepin*)stepIn context:(YVTraversalContext*)context; 19 | 20 | @end 21 | 22 | NS_ASSUME_NONNULL_END 23 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/AppAnalytics/TDAAPageSecondViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // TDAAPageSecondViewController.m 3 | // TalkingDataSDKDemo 4 | // 5 | // Created by liweiqiang on 2017/5/22. 6 | // Copyright © 2017年 TendCloud. All rights reserved. 7 | // 8 | 9 | #import "TDAAPageSecondViewController.h" 10 | 11 | @implementation TDAAPageSecondViewController 12 | 13 | - (void)viewDidAppear:(BOOL)animated { 14 | [super viewDidAppear:animated]; 15 | } 16 | 17 | - (void)viewWillDisappear:(BOOL)animated { 18 | [super viewWillDisappear:animated]; 19 | } 20 | 21 | @end 22 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/IQKeyboardManager/Resources/IQKeyboardManager.bundle/zh-Hans/IQKeyboardManager.strings: -------------------------------------------------------------------------------- 1 | 2 | "enabled" = "开启"; 3 | 4 | "disabled" = "关闭"; 5 | 6 | "already disabled" = "已经开启"; 7 | 8 | "already enabled" = "已经关闭"; 9 | 10 | "You must set UIWindow.rootViewController in your AppDelegate to work with IQKeyboardManager" = "为了使用IQKeyboardManager,必须在你的 AppDelegate 中设置 UIWindow.rootViewController。"; 11 | 12 | "Previous" = "前一个"; 13 | "Next" = "下一个"; 14 | -------------------------------------------------------------------------------- /MacOS/YourView/YourView/Controller/script/YVScriptEditorViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // YVScriptEditorViewController.h 3 | // YourView 4 | // 5 | // Created by bliss_ddo on 2019/4/30. 6 | // Copyright © 2019 bliss_ddo. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface YVScriptEditorViewController : NSViewController 14 | @property (nonatomic,strong) NSString * host; 15 | -(IBAction)onSendingEvent:(NSButton*)sender; 16 | @property (nonatomic) IBOutlet NSTextView * tv; 17 | @end 18 | 19 | NS_ASSUME_NONNULL_END 20 | -------------------------------------------------------------------------------- /MacOS/YourView/YourView/helper/SCNNode+YVIdentifier.m: -------------------------------------------------------------------------------- 1 | // 2 | // SCNNode+YVIdentifier.m 3 | // YourView 4 | // 5 | // Created by bliss_ddo on 2019/5/5. 6 | // Copyright © 2019 bliss_ddo. All rights reserved. 7 | // 8 | 9 | #import "SCNNode+YVIdentifier.h" 10 | #import 11 | 12 | @implementation SCNNode (YVIdentifier) 13 | -(void)setUniqueID:(NSString *)uniqueID 14 | { 15 | objc_setAssociatedObject(self, "UniqueID", uniqueID, OBJC_ASSOCIATION_RETAIN); 16 | } 17 | -(NSString *)uniqueID 18 | { 19 | return objc_getAssociatedObject(self, "UniqueID"); 20 | } 21 | 22 | @end 23 | -------------------------------------------------------------------------------- /MacOS/YourView/YourView/helper/TravseralContext.h: -------------------------------------------------------------------------------- 1 | // 2 | // TravseralContext.h 3 | // revealY 4 | // 5 | // Created by bliss_ddo on 2019/4/22. 6 | // Copyright © 2019 bliss_ddo. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface TravseralContext : NSObject 14 | @property (nonatomic,assign,readonly) NSInteger objectCounter; 15 | @property (nonatomic,assign,readonly) NSInteger objectCounterWithoutOffScreenObject; 16 | -(void)stepin; 17 | -(void)stepinOffScreen:(BOOL)isoffScreen; 18 | @end 19 | 20 | NS_ASSUME_NONNULL_END 21 | -------------------------------------------------------------------------------- /MacOS/YourView/YourView/view/YVSceneView.h: -------------------------------------------------------------------------------- 1 | // 2 | // YVSceneView.h 3 | // YourView 4 | // 5 | // Created by bliss_ddo on 2019/4/28. 6 | // Copyright © 2019 bliss_ddo. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @protocol YVSceneViewDelegate 14 | 15 | -(void)sceneView:(SCNView*)scnview DidSelectedNode:(SCNNode*)node; 16 | 17 | @end 18 | 19 | @interface YVSceneView : SCNView 20 | @property(nonatomic,weak) id delegate; 21 | -(void)selectedNode:(NSString*)uuid; 22 | @end 23 | 24 | NS_ASSUME_NONNULL_END 25 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/GameAnalytics/TDGAOtherTableViewCell.m: -------------------------------------------------------------------------------- 1 | // 2 | // TDGAOtherTableViewCell.m 3 | // TalkingDataSDKDemo 4 | // 5 | // Created by liweiqiang on 2017/5/22. 6 | // Copyright © 2017年 TendCloud. All rights reserved. 7 | // 8 | 9 | #import "TDGAOtherTableViewCell.h" 10 | 11 | @interface TDGAOtherTableViewCell () 12 | 13 | @property (weak, nonatomic) IBOutlet UITextField *latitudeField; 14 | @property (weak, nonatomic) IBOutlet UITextField *longitudeField; 15 | 16 | @end 17 | 18 | @implementation TDGAOtherTableViewCell 19 | 20 | - (IBAction)setLocation { 21 | 22 | } 23 | 24 | @end 25 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/AppAnalytics/TDAAStandardViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // TDAAStandardViewController.m 3 | // TalkingDataSDKDemo 4 | // 5 | // Created by liweiqiang on 2017/6/26. 6 | // Copyright © 2017年 TendCloud. All rights reserved. 7 | // 8 | 9 | #import "TDAAStandardViewController.h" 10 | 11 | @implementation TDAAStandardViewController 12 | 13 | - (IBAction)placeOrder { 14 | 15 | } 16 | 17 | - (IBAction)payOrder { 18 | 19 | } 20 | 21 | - (IBAction)viewItem { 22 | } 23 | 24 | - (IBAction)addItem { 25 | } 26 | 27 | - (IBAction)viewShoppingCart { 28 | 29 | } 30 | 31 | 32 | @end 33 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/TDInfoViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // TDInfoViewController.m 3 | // TalkingDataSDKDemo 4 | // 5 | // Created by liweiqiang on 2017/5/22. 6 | // Copyright © 2017年 TendCloud. All rights reserved. 7 | // 8 | 9 | #import "TDInfoViewController.h" 10 | 11 | @implementation TDInfoViewController 12 | 13 | - (IBAction)back:(UIButton *)sender { 14 | [self dismissViewControllerAnimated:YES completion:nil]; 15 | } 16 | 17 | - (IBAction)reapply:(UIButton *)sender { 18 | [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://doc.talkingdata.com"]]; 19 | } 20 | 21 | @end 22 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/IQKeyboardManager/Resources/IQKeyboardManager.bundle/en.lproj/IQKeyboardManager.strings: -------------------------------------------------------------------------------- 1 | 2 | "enabled" = "enabled"; 3 | 4 | "disabled" = "disabled"; 5 | 6 | "already disabled" = "already disabled"; 7 | 8 | "already enabled" = "already enabled"; 9 | 10 | "You must set UIWindow.rootViewController in your AppDelegate to work with IQKeyboardManager" = "You must set UIWindow.rootViewController in your AppDelegate to work with IQKeyboardManager"; 11 | 12 | "Previous" = "Previous"; 13 | "Next" = "Next"; 14 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/AppAnalytics/TDAALocationTableViewCell.m: -------------------------------------------------------------------------------- 1 | // 2 | // TDAALocationTableViewCell.m 3 | // TalkingDataSDKDemo 4 | // 5 | // Created by liweiqiang on 2017/6/26. 6 | // Copyright © 2017年 TendCloud. All rights reserved. 7 | // 8 | 9 | #import "TDAALocationTableViewCell.h" 10 | 11 | @interface TDAALocationTableViewCell () 12 | 13 | @property (weak, nonatomic) IBOutlet UITextField *latitudeField; 14 | @property (weak, nonatomic) IBOutlet UITextField *longitudeField; 15 | 16 | @end 17 | 18 | @implementation TDAALocationTableViewCell 19 | 20 | - (IBAction)setLocation:(UIButton *)sender { 21 | 22 | } 23 | 24 | @end 25 | -------------------------------------------------------------------------------- /iOS/libyourview/yourviewdynamic/yourviewdynamic.h: -------------------------------------------------------------------------------- 1 | // 2 | // yourviewdynamic.h 3 | // yourviewdynamic 4 | // 5 | // Created by bliss_ddo on 2019/4/30. 6 | // Copyright © 2019 bliss_ddo. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | //! Project version number for yourviewdynamic. 12 | FOUNDATION_EXPORT double yourviewdynamicVersionNumber; 13 | 14 | //! Project version string for yourviewdynamic. 15 | FOUNDATION_EXPORT const unsigned char yourviewdynamicVersionString[]; 16 | 17 | // In this header, you should import all the public headers of your framework using statements like #import 18 | 19 | 20 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/AdTracking/TDATECommerceTableViewCell.m: -------------------------------------------------------------------------------- 1 | // 2 | // TDATECommerceTableViewCell.m 3 | // TalkingDataSDKDemo 4 | // 5 | // Created by liweiqiang on 2017/5/22. 6 | // Copyright © 2017年 TendCloud. All rights reserved. 7 | // 8 | 9 | #import "TDATECommerceTableViewCell.h" 10 | 11 | @implementation TDATECommerceTableViewCell 12 | 13 | - (IBAction)onPay1 { 14 | } 15 | 16 | - (IBAction)onPay2 { 17 | 18 | } 19 | 20 | - (IBAction)placeOrder { 21 | 22 | } 23 | 24 | - (IBAction)payOrder { 25 | } 26 | 27 | - (IBAction)viewItem { 28 | } 29 | 30 | - (IBAction)addItem { 31 | } 32 | 33 | - (IBAction)viewShoppingCart { 34 | 35 | } 36 | 37 | @end 38 | -------------------------------------------------------------------------------- /MacOS/YourView/YourView/view/cell/YVRightCellBase.h: -------------------------------------------------------------------------------- 1 | // 2 | // YVRightCellBase.h 3 | // YourView 4 | // 5 | // Created by bliss_ddo on 2019/5/6. 6 | // Copyright © 2019 bliss_ddo. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | @protocol YVRightCellProtocol 13 | -(void)cellDidClick:(NSView*)cell withData:(nullable id)data cmd:(NSString*)cmd; 14 | @end 15 | 16 | @interface YVRightCellBase : NSView 17 | +(instancetype)makeView:(NSTableView*)tableView owner:(id)owner identifer:(NSString*)identifer; 18 | -(void)fillData:(id)data; 19 | @property(nonatomic,weak) id delegate; 20 | @end 21 | 22 | NS_ASSUME_NONNULL_END 23 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // TalkingDataSDKDemo 4 | // 5 | // Created by liweiqiang on 2017/5/22. 6 | // Copyright © 2017年 TendCloud. All rights reserved. 7 | // 8 | 9 | #import 10 | #if __IPHONE_OS_VERSION_MAX_ALLOWED > 100000 11 | #import 12 | #endif 13 | #import 14 | 15 | @interface AppDelegate : UIResponder < 16 | #if __IPHONE_OS_VERSION_MAX_ALLOWED > 100000 17 | UNUserNotificationCenterDelegate, 18 | #endif 19 | CLLocationManagerDelegate, 20 | UIApplicationDelegate> 21 | 22 | @property (strong, nonatomic) UIWindow *window; 23 | 24 | @end 25 | 26 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/GameAnalytics/TDGAItemTableViewCell.m: -------------------------------------------------------------------------------- 1 | // 2 | // TDGAItemTableViewCell.m 3 | // TalkingDataSDKDemo 4 | // 5 | // Created by liweiqiang on 2017/5/22. 6 | // Copyright © 2017年 TendCloud. All rights reserved. 7 | // 8 | 9 | #import "TDGAItemTableViewCell.h" 10 | 11 | @interface TDGAItemTableViewCell () 12 | 13 | @property (weak, nonatomic) IBOutlet UITextField *itemIDField; 14 | @property (weak, nonatomic) IBOutlet UITextField *itemNumberField; 15 | @property (weak, nonatomic) IBOutlet UITextField *itemPriceField; 16 | 17 | @end 18 | 19 | @implementation TDGAItemTableViewCell 20 | 21 | - (IBAction)purchaseItem { 22 | 23 | } 24 | 25 | - (IBAction)useItem { 26 | 27 | } 28 | 29 | @end 30 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/GameAnalytics/TDGAMissionTableViewCell.m: -------------------------------------------------------------------------------- 1 | // 2 | // TDGAMissionTableViewCell.m 3 | // TalkingDataSDKDemo 4 | // 5 | // Created by liweiqiang on 2017/5/22. 6 | // Copyright © 2017年 TendCloud. All rights reserved. 7 | // 8 | 9 | #import "TDGAMissionTableViewCell.h" 10 | 11 | @interface TDGAMissionTableViewCell () 12 | 13 | @property (weak, nonatomic) IBOutlet UITextField *missionIDField; 14 | @property (weak, nonatomic) IBOutlet UITextField *failedCauseField; 15 | 16 | @end 17 | 18 | @implementation TDGAMissionTableViewCell 19 | 20 | - (IBAction)missionBegin { 21 | } 22 | 23 | - (IBAction)missionCompleted { 24 | } 25 | 26 | - (IBAction)missionFailed { 27 | 28 | } 29 | 30 | @end 31 | -------------------------------------------------------------------------------- /MacOS/YourView/YourView/helper/TravseralContext.m: -------------------------------------------------------------------------------- 1 | // 2 | // TravseralContext.m 3 | // revealY 4 | // 5 | // Created by bliss_ddo on 2019/4/22. 6 | // Copyright © 2019 bliss_ddo. All rights reserved. 7 | // 8 | 9 | #import "TravseralContext.h" 10 | 11 | @implementation TravseralContext 12 | -(instancetype)init 13 | { 14 | if (self = [super init]) { 15 | _objectCounter = -1; 16 | _objectCounterWithoutOffScreenObject = -1; 17 | } 18 | return self; 19 | } 20 | -(void)stepin 21 | { 22 | _objectCounter++; 23 | } 24 | -(void)stepinOffScreen:(BOOL)isoffScreen 25 | { 26 | _objectCounter++; 27 | if (!isoffScreen) { 28 | _objectCounterWithoutOffScreenObject++; 29 | } 30 | } 31 | @end 32 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/eAuth/TDEACheckViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // TDEACheckViewController.m 3 | // TalkingDataSDKDemo 4 | // 5 | // Created by liweiqiang on 2018/1/9. 6 | // Copyright © 2018年 TendCloud. All rights reserved. 7 | // 8 | 9 | #import "TDEACheckViewController.h" 10 | 11 | @interface TDEACheckViewController () 12 | 13 | @property (weak, nonatomic) IBOutlet UITextField *accountNameField; 14 | @property (weak, nonatomic) IBOutlet UILabel *statusLabel; 15 | 16 | @end 17 | 18 | @implementation TDEACheckViewController 19 | 20 | #pragma mark - Control event 21 | 22 | - (IBAction)useTDID { 23 | } 24 | 25 | - (IBAction)check { 26 | } 27 | 28 | #pragma mark - TalkingData eAuth Delegate 29 | 30 | 31 | @end 32 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/AppAnalytics/TDAAVersionTableViewCell.m: -------------------------------------------------------------------------------- 1 | // 2 | // TDAAVersionTableViewCell.m 3 | // TalkingDataSDKDemo 4 | // 5 | // Created by liweiqiang on 2018/8/29. 6 | // Copyright © 2018年 TendCloud. All rights reserved. 7 | // 8 | 9 | #import "TDAAVersionTableViewCell.h" 10 | 11 | @interface TDAAVersionTableViewCell () 12 | 13 | @property (weak, nonatomic) IBOutlet UITextField *versionCodeField; 14 | @property (weak, nonatomic) IBOutlet UITextField *versionNameField; 15 | 16 | @end 17 | 18 | @implementation TDAAVersionTableViewCell 19 | 20 | - (IBAction)setVersion { 21 | NSString *versionCode = self.versionCodeField.text; 22 | NSString *versionName = self.versionNameField.text; 23 | } 24 | 25 | @end 26 | -------------------------------------------------------------------------------- /MacOS/YourView/YourView/helper/YVDisplayControl.m: -------------------------------------------------------------------------------- 1 | // 2 | // YVDisplayControl.m 3 | // YourView 4 | // 5 | // Created by bliss_ddo on 2019/4/28. 6 | // Copyright © 2019 bliss_ddo. All rights reserved. 7 | // 8 | 9 | #import "YVDisplayControl.h" 10 | 11 | @implementation YVDisplayControl 12 | -(instancetype)init 13 | { 14 | if (self = [super init]) { 15 | _displayMode = YVSceneViewDisplayModeSmart; 16 | _displayHiddenObject = NO; 17 | _defaultDisplayFactor = 0.01; 18 | _defaultDisplayZFactor = 0.3; 19 | _maxZDFS = 0; 20 | _maxZDFSOffScreen = 0; 21 | _maxZFlatten = 0; 22 | _maxZFlattenOffScreen = 0; 23 | _maxZSmart = 0; 24 | _maxZSmartOoffScreen = 0; 25 | 26 | } 27 | return self; 28 | } 29 | @end 30 | -------------------------------------------------------------------------------- /iOS/libyourview/libyourview.xcodeproj/xcuserdata/bliss_ddo.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | libyourview.xcscheme 8 | 9 | orderHint 10 | 1 11 | 12 | youview.xcscheme 13 | 14 | orderHint 15 | 2 16 | 17 | 18 | SuppressBuildableAutocreation 19 | 20 | 80010DB12277E61B0057477D 21 | 22 | primary 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /iOS/libyourview/serializer/YVTraversalContext.h: -------------------------------------------------------------------------------- 1 | // 2 | // YVTraversalContext.h 3 | // libyourview 4 | // 5 | // Created by bliss_ddo on 2019/4/24. 6 | // Copyright © 2019 bliss_ddo. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | @interface YVTraversalContext : NSObject 15 | -(void)updateFromView:(UIView*)v; 16 | @property (nonatomic,assign,readonly) NSInteger objectCounter ; 17 | @property (nonatomic,assign,readonly) NSInteger hidenObjectCounter; 18 | @property (nonatomic,assign,readonly) NSInteger notHidenObjectCounter; 19 | @property (nonatomic,strong,readonly) NSDictionary * contextDict; 20 | @property (nonatomic,strong,readonly) NSMapTable * viewMap; 21 | @end 22 | 23 | NS_ASSUME_NONNULL_END 24 | -------------------------------------------------------------------------------- /MacOS/YourView/YourView/AppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.m 3 | // YourView 4 | // 5 | // Created by bliss_ddo on 2019/4/24. 6 | // Copyright © 2019 bliss_ddo. All rights reserved. 7 | // 8 | 9 | #import "AppDelegate.h" 10 | 11 | @interface AppDelegate () 12 | @property (strong) NSWindow * window; 13 | @end 14 | 15 | @implementation AppDelegate 16 | - (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 17 | self.window = NSApp.windows.firstObject; 18 | [self.window center]; 19 | } 20 | - (BOOL)applicationShouldHandleReopen:(NSApplication *)theApplication 21 | hasVisibleWindows:(BOOL)flag{ 22 | if (!flag){ 23 | [NSApp activateIgnoringOtherApps:NO]; 24 | [self.window makeKeyAndOrderFront:self]; 25 | } 26 | return YES; 27 | } 28 | @end 29 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/AppAnalytics/TDAAAntiCheatingViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // TDAAAntiCheatingViewController.m 3 | // TalkingDataSDKDemo 4 | // 5 | // Created by liweiqiang on 2017/5/22. 6 | // Copyright © 2017年 TendCloud. All rights reserved. 7 | // 8 | 9 | #import "TDAAAntiCheatingViewController.h" 10 | 11 | @interface TDAAAntiCheatingViewController () 12 | 13 | @property (weak, nonatomic) IBOutlet UISwitch *antiCheatingSwitch; 14 | 15 | @end 16 | 17 | @implementation TDAAAntiCheatingViewController 18 | 19 | static BOOL antiCheatingSwitchOn = YES; 20 | 21 | - (void)viewDidLoad { 22 | [super viewDidLoad]; 23 | self.antiCheatingSwitch.on = antiCheatingSwitchOn; 24 | } 25 | 26 | - (IBAction)enabledAntiCheating:(UISwitch *)sender { 27 | antiCheatingSwitchOn = sender.on; 28 | } 29 | 30 | @end 31 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/GameAnalytics/TDGACustomViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // TDGACustomViewController.m 3 | // TalkingDataSDKDemo 4 | // 5 | // Created by liweiqiang on 2017/5/22. 6 | // Copyright © 2017年 TendCloud. All rights reserved. 7 | // 8 | 9 | #import "TDGACustomViewController.h" 10 | 11 | @interface TDGACustomViewController () 12 | 13 | @property (weak, nonatomic) IBOutlet UITextField *eventIDField; 14 | @property (weak, nonatomic) IBOutlet UITextField *key1Field; 15 | @property (weak, nonatomic) IBOutlet UITextField *value1Field; 16 | @property (weak, nonatomic) IBOutlet UITextField *key2Field; 17 | @property (weak, nonatomic) IBOutlet UITextField *value2Field; 18 | 19 | @end 20 | 21 | @implementation TDGACustomViewController 22 | 23 | - (IBAction)submit:(UIButton *)sender { 24 | 25 | } 26 | 27 | @end 28 | -------------------------------------------------------------------------------- /MacOS/YourView/YourView/Theme/YVTheme.h: -------------------------------------------------------------------------------- 1 | // 2 | // YVTheme.h 3 | // YourView 4 | // 5 | // Created by bliss_ddo on 2019/4/27. 6 | // Copyright © 2019 bliss_ddo. All rights reserved. 7 | // 8 | 9 | #ifndef YVTheme_h 10 | #define YVTheme_h 11 | 12 | 13 | #define YVTHEME_TITLEBAR_BACKGROUNDCOLOR RGBCOLOR(240,240,240).CGColor 14 | #define YVTHEME_TITLEBAR_BORDERCOLOR RGBCOLOR(172,172,172).CGColor 15 | #define YVTHEME_NODE_HOVERBORDERCOLOR RGBCOLOR(80,131,219) 16 | #define YVTHEME_NODE_HOVERBORDERNORMALCOLOR RGBCOLOR(218,218,218) 17 | 18 | #define YVTHEME_NODE_HIGHLIGHTCOLOR RGBCOLOR(206,214,255) 19 | //#define YVTHEME_NODE_HIGHLIGHTCOLOR [NSColor blueColor] 20 | 21 | 22 | //#define YVTHEME_SCNVIEW_BACKGROUNDCOLOR RGBCOLOR(225,227,230) 23 | #define YVTHEME_SCNVIEW_BACKGROUNDCOLOR [NSColor blackColor] 24 | 25 | 26 | #endif /* YVTheme_h */ 27 | -------------------------------------------------------------------------------- /MacOS/YourView/YourView/view/cell/YVRightCellViewFrame.h: -------------------------------------------------------------------------------- 1 | // 2 | // YVRightCellViewFrame.h 3 | // YourView 4 | // 5 | // Created by bliss_ddo on 2019/5/6. 6 | // Copyright © 2019 bliss_ddo. All rights reserved. 7 | // 8 | 9 | #import "YVRightCellBase.h" 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface YVRightCellViewFrame : YVRightCellBase 14 | @property (weak) IBOutlet NSStepper *stepperx; 15 | @property (weak) IBOutlet NSTextField *fieldx; 16 | @property (weak) IBOutlet NSStepper *steppery; 17 | @property (weak) IBOutlet NSTextField *fieldy; 18 | @property (weak) IBOutlet NSStepper *stepperw; 19 | @property (weak) IBOutlet NSTextField *fieldw; 20 | @property (weak) IBOutlet NSStepper *stepperh; 21 | @property (weak) IBOutlet NSTextField *fieldh; 22 | - (IBAction)setFrameButtonPressed:(id)sender; 23 | 24 | @end 25 | 26 | NS_ASSUME_NONNULL_END 27 | -------------------------------------------------------------------------------- /iOS/libyourview/yourviewdynamic/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | $(CURRENT_PROJECT_VERSION) 21 | 22 | 23 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/eAuth/TDEAMatchViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // TDEAMatchViewController.m 3 | // TalkingDataSDKDemo 4 | // 5 | // Created by liweiqiang on 2018/1/9. 6 | // Copyright © 2018年 TendCloud. All rights reserved. 7 | // 8 | 9 | #import "TDEAMatchViewController.h" 10 | 11 | @interface TDEAMatchViewController () 12 | 13 | @property (weak, nonatomic) IBOutlet UITextField *accountNameField; 14 | @property (weak, nonatomic) IBOutlet UITextField *countryCodeField; 15 | @property (weak, nonatomic) IBOutlet UITextField *phoneNumberField; 16 | @property (weak, nonatomic) IBOutlet UILabel *statusLabel; 17 | 18 | @end 19 | 20 | @implementation TDEAMatchViewController 21 | 22 | #pragma mark - Control event 23 | 24 | - (IBAction)useTDID { 25 | } 26 | 27 | - (IBAction)check { 28 | } 29 | 30 | #pragma mark - TalkingData eAuth Delegate 31 | 32 | 33 | 34 | @end 35 | -------------------------------------------------------------------------------- /MacOS/YourView/YourView/helper/SCNNode+YVZIndex.h: -------------------------------------------------------------------------------- 1 | // 2 | // SCNNode+zstorage.h 3 | // revealY 4 | // 5 | // Created by bliss_ddo on 2019/4/23. 6 | // Copyright © 2019 bliss_ddo. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "YVDisplayControl.h" 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface SCNNode (YVZindex) 14 | -(void)reloadZ:(YVDisplayControl*)displayControl; 15 | @property (nonatomic,strong) NSNumber * ZSmart; 16 | @property (nonatomic,strong) NSNumber * ZSmartWihtoutOffScreenItem; 17 | @property (nonatomic,strong) NSNumber * ZDeepsFirst; 18 | @property (nonatomic,strong) NSNumber * ZDeepsFirstWithoutOffScreenItem; 19 | @property (nonatomic,strong) NSNumber * ZFlatten; 20 | @property (nonatomic,strong) NSNumber * ZFlattenWithoutOffScreenItem; 21 | @property (nonatomic,strong) NSNumber * isOffScreen; 22 | @end 23 | 24 | NS_ASSUME_NONNULL_END 25 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/eAuth/TDEAUnbindViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // TDEAUnbindViewController.m 3 | // TalkingDataSDKDemo 4 | // 5 | // Created by liweiqiang on 2018/1/9. 6 | // Copyright © 2018年 TendCloud. All rights reserved. 7 | // 8 | 9 | #import "TDEAUnbindViewController.h" 10 | 11 | @interface TDEAUnbindViewController () 12 | 13 | @property (weak, nonatomic) IBOutlet UITextField *accountNameField; 14 | @property (weak, nonatomic) IBOutlet UITextField *countryCodeField; 15 | @property (weak, nonatomic) IBOutlet UITextField *phoneNumberField; 16 | @property (weak, nonatomic) IBOutlet UILabel *statusLabel; 17 | 18 | @end 19 | 20 | @implementation TDEAUnbindViewController 21 | 22 | #pragma mark - Control event 23 | 24 | - (IBAction)useTDID { 25 | } 26 | 27 | - (IBAction)unbind { 28 | 29 | } 30 | 31 | #pragma mark - TalkingData eAuth Delegate 32 | 33 | 34 | 35 | @end 36 | -------------------------------------------------------------------------------- /iOS/libyourview/libyourview/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | CFBundleDevelopmentRegion 8 | $(DEVELOPMENT_LANGUAGE) 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | FMWK 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleVersion 22 | $(CURRENT_PROJECT_VERSION) 23 | 24 | 25 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/AdTracking/TDATOtherTableViewCell.m: -------------------------------------------------------------------------------- 1 | // 2 | // TDATOtherTableViewCell.m 3 | // TalkingDataSDKDemo 4 | // 5 | // Created by liweiqiang on 2017/5/22. 6 | // Copyright © 2017年 TendCloud. All rights reserved. 7 | // 8 | 9 | #import "TDATOtherTableViewCell.h" 10 | 11 | @interface TDATOtherTableViewCell () 12 | 13 | @property (weak, nonatomic) IBOutlet UITextField *accountField; 14 | @property (weak, nonatomic) IBOutlet UITextField *orderIDField; 15 | @property (weak, nonatomic) IBOutlet UITextField *amountField; 16 | @property (weak, nonatomic) IBOutlet UITextField *currencyTypeField; 17 | @property (weak, nonatomic) IBOutlet UITextField *payTypeField; 18 | 19 | @end 20 | 21 | @implementation TDATOtherTableViewCell 22 | 23 | - (IBAction)registerAccount { 24 | } 25 | 26 | - (IBAction)loginAccount { 27 | } 28 | 29 | - (IBAction)pay { 30 | 31 | } 32 | - (IBAction)adSearch:(id)sender { 33 | } 34 | @end 35 | -------------------------------------------------------------------------------- /iOS/libyourview/youview/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | NSHumanReadableCopyright 22 | Copyright © 2019 bliss_ddo. All rights reserved. 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /MacOS/YourView/YourView/view/cell/YVRightCellViewInfo.h: -------------------------------------------------------------------------------- 1 | // 2 | // YVRightCellViewInfo.h 3 | // YourView 4 | // 5 | // Created by bliss_ddo on 2019/5/6. 6 | // Copyright © 2019 bliss_ddo. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "YVRightCellBase.h" 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface YVRightCellViewInfo : YVRightCellBase 14 | @property (weak) IBOutlet NSTextField *addressfield; 15 | @property (weak) IBOutlet NSTextField *classfield; 16 | @property (weak) IBOutlet NSTextField *viewcontrollerfield; 17 | @property (weak) IBOutlet NSTextField *levelfield; 18 | @property (weak) IBOutlet NSTextField *depthfield; 19 | @property (weak) IBOutlet NSTextField *isintablefield; 20 | @property (weak) IBOutlet NSTextField *isincollectionfield; 21 | @property (weak) IBOutlet NSTextField *indexpathfield; 22 | @property (weak) IBOutlet NSTextField *inheritfield; 23 | 24 | -(IBAction)hereButtonPressed:(NSButton*)sender; 25 | @end 26 | 27 | NS_ASSUME_NONNULL_END 28 | -------------------------------------------------------------------------------- /iOS/libyourview/serializer/UIView+YVTraversal.m: -------------------------------------------------------------------------------- 1 | // 2 | // UIView+YVTraversal.m 3 | // libyourview 4 | // 5 | // Created by bliss_ddo on 2019/4/24. 6 | // Copyright © 2019 bliss_ddo. All rights reserved. 7 | // 8 | 9 | #import "UIView+YVTraversal.h" 10 | 11 | 12 | @implementation UIView (YVTraversal) 13 | -(NSDictionary*)traversal:(YVTraversalStepin*)stepIn context:(YVTraversalContext*)context 14 | { 15 | [context updateFromView:self]; 16 | YVTraversalStepin * stepined = [YVTraversalStepin stepInWithView:self parentInfo:stepIn]; 17 | NSMutableDictionary * resDict = [NSMutableDictionary dictionary]; 18 | NSMutableArray * children = [NSMutableArray array]; 19 | for (UIView * each in self.subviews) { 20 | [children addObject:[each traversal:stepined context:context]]; 21 | } 22 | resDict[@"children"] = children.copy; 23 | [resDict addEntriesFromDictionary:[stepined stepinfo]]; 24 | [resDict addEntriesFromDictionary:[self nodeInfo]]; 25 | return resDict.copy; 26 | } 27 | @end 28 | -------------------------------------------------------------------------------- /MacOS/YourView/YourView/helper/YVDisplayControl.h: -------------------------------------------------------------------------------- 1 | // 2 | // YVDisplayControl.h 3 | // YourView 4 | // 5 | // Created by bliss_ddo on 2019/4/28. 6 | // Copyright © 2019 bliss_ddo. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface YVDisplayControl : NSObject 14 | @property (nonatomic,assign)YVSceneViewDisplayMode displayMode; 15 | @property (nonatomic,assign)BOOL displayHiddenObject; 16 | @property (nonatomic,assign)CGFloat defaultDisplayFactor; 17 | @property (nonatomic,assign)CGFloat defaultDisplayZFactor; 18 | @property (nonatomic,assign)CGSize screenSize; 19 | 20 | @property (nonatomic,assign)NSInteger maxZDFS; 21 | @property (nonatomic,assign)NSInteger maxZDFSOffScreen; 22 | @property (nonatomic,assign)NSInteger maxZFlatten; 23 | @property (nonatomic,assign)NSInteger maxZFlattenOffScreen; 24 | @property (nonatomic,assign)NSInteger maxZSmart; 25 | @property (nonatomic,assign)NSInteger maxZSmartOoffScreen; 26 | 27 | @end 28 | 29 | NS_ASSUME_NONNULL_END 30 | -------------------------------------------------------------------------------- /MacOS/YourView/YourView/helper/SCNNode+YVSelected.m: -------------------------------------------------------------------------------- 1 | // 2 | // SCNNode+selected.m 3 | // YourView 4 | // 5 | // Created by bliss_ddo on 2019/4/28. 6 | // Copyright © 2019 bliss_ddo. All rights reserved. 7 | // 8 | 9 | #import "SCNNode+YVSelected.h" 10 | 11 | @implementation SCNNode (YVSelected) 12 | +(SCNNode*)yvselectedNodeWithwidth:(CGFloat)width height:(CGFloat)height 13 | { 14 | SCNPlane *planeMirror =[SCNPlane planeWithWidth:width height:height]; 15 | planeMirror.firstMaterial.diffuse.contents = YVTHEME_NODE_HIGHLIGHTCOLOR; 16 | planeMirror.firstMaterial.doubleSided = YES; 17 | // planeMirror.firstMaterial.writesToDepthBuffer = NO; 18 | // planeMirror.firstMaterial.readsFromDepthBuffer = NO; 19 | SCNNode *planeMirrorNode = [SCNNode nodeWithGeometry:planeMirror]; 20 | planeMirrorNode.opacity = 0.8; 21 | planeMirrorNode.hidden = YES; 22 | planeMirrorNode.categoryBitMask = YVHitTestOptionCategoryBitMask2SelectedIndicator; 23 | planeMirrorNode.name = YVNodeNameIndicator; 24 | 25 | return planeMirrorNode; 26 | } 27 | @end 28 | -------------------------------------------------------------------------------- /MacOS/YourView/YourView/Window/YVWindowController.h: -------------------------------------------------------------------------------- 1 | // 2 | // YVWindowController.h 3 | // YourView 4 | // 5 | // Created by bliss_ddo on 2019/4/24. 6 | // Copyright © 2019 bliss_ddo. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface YVWindowController : NSWindowController 14 | @property (weak) IBOutlet NSButton *loadingButton; 15 | @property (weak) IBOutlet NSProgressIndicator *progress; 16 | 17 | -(void)showToolbar:(BOOL)visable; 18 | -(void)updateAppInfo:(NSDictionary*)appinfo; 19 | -(void)updateViewTree:(NSDictionary*)dict; 20 | -(void)configureSplit; 21 | 22 | -(IBAction)onDisplayModeSegmentEvent:(NSSegmentedControl*)sender; 23 | -(IBAction)onSplitSegmentEvent:(NSSegmentedControl*)sender; 24 | -(IBAction)onDisplayCheckboxEvent:(NSButton*)sender; 25 | -(IBAction)onRefreshButtonEvent:(NSButton*)sender; 26 | -(IBAction)onResetButtonEvent:(NSButton*)sender; 27 | -(IBAction)onJSPatchButtonEvent:(NSButton*)sender; 28 | 29 | 30 | @property (nonatomic) NSString * host; 31 | @end 32 | 33 | NS_ASSUME_NONNULL_END 34 | -------------------------------------------------------------------------------- /MacOS/YourView/YourView/Controller/script/YVScriptEditorViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // YVScriptEditorViewController.m 3 | // YourView 4 | // 5 | // Created by bliss_ddo on 2019/4/30. 6 | // Copyright © 2019 bliss_ddo. All rights reserved. 7 | // 8 | 9 | #import "YVScriptEditorViewController.h" 10 | 11 | @implementation YVScriptEditorViewController 12 | -(IBAction)onSendingEvent:(NSButton*)sender 13 | { 14 | NSLog(@"%@",NSStringFromSelector(_cmd)); 15 | if (!self.tv.string) { 16 | return; 17 | } 18 | NSURL * url = [NSURL URLWithString:[NSString stringWithFormat:@"http://%@:8080?cmd=jspatch",self.host]]; 19 | NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url]; 20 | request.HTTPBody = [self.tv.string dataUsingEncoding:NSUTF8StringEncoding]; 21 | request.HTTPMethod = @"POST"; 22 | [request addValue:@"text/text" forHTTPHeaderField:@"Content-Type"]; 23 | [[[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { 24 | 25 | }]resume]; 26 | } 27 | @end 28 | -------------------------------------------------------------------------------- /iOS/libyourview/serializer/NSObject+YVNodeInfo.m: -------------------------------------------------------------------------------- 1 | // 2 | // NSObject+YVNodeInfo.m 3 | // libyourview 4 | // 5 | // Created by bliss_ddo on 2019/4/24. 6 | // Copyright © 2019 bliss_ddo. All rights reserved. 7 | // 8 | 9 | #import "NSObject+YVNodeInfo.h" 10 | 11 | @implementation NSObject (YVNodeInfo) 12 | -(NSDictionary*)nodeInfo 13 | { 14 | NSString * _class = [self _class]; 15 | NSString * _address = [self _address]; 16 | NSString * _inherit = [self _inherit]; 17 | 18 | return @{ 19 | @"class":_class, 20 | @"address":_address, 21 | @"inherit":_inherit, 22 | }; 23 | } 24 | 25 | -(NSString*)_class 26 | { 27 | return NSStringFromClass(self.class); 28 | } 29 | 30 | -(NSString*)_inherit 31 | { 32 | NSString * inherit = @""; 33 | Class c = self.class; 34 | while (c) { 35 | inherit = [NSString stringWithFormat:@"%@:%@",inherit,NSStringFromClass(c.class)]; 36 | c = c.superclass; 37 | } 38 | return [inherit substringFromIndex:1]; 39 | } 40 | 41 | -(NSString*)_address 42 | { 43 | return [NSString stringWithFormat:@"%p",self]; 44 | } 45 | @end 46 | -------------------------------------------------------------------------------- /MacOS/YourView/YourView/view/cell/YVRightCellBase.m: -------------------------------------------------------------------------------- 1 | // 2 | // YVRightCellBase.m 3 | // YourView 4 | // 5 | // Created by bliss_ddo on 2019/5/6. 6 | // Copyright © 2019 bliss_ddo. All rights reserved. 7 | // 8 | 9 | #import "YVRightCellBase.h" 10 | 11 | @implementation YVRightCellBase 12 | 13 | -(void)awakeFromNib 14 | { 15 | self.layer.backgroundColor = [NSColor clearColor].CGColor; 16 | } 17 | 18 | +(NSView*)makeView:(NSTableView*)tableView owner:(id)owner identifer:(NSString*)identifer 19 | { 20 | YVRightCellBase * t = [tableView makeViewWithIdentifier:identifer owner:owner]; 21 | if (t == nil) { 22 | NSArray * bundleviews; 23 | [[NSBundle mainBundle]loadNibNamed:identifer owner:owner topLevelObjects:&bundleviews]; 24 | for (id object in bundleviews) { 25 | if ([object isKindOfClass:[NSView class]]) { 26 | t = object; 27 | break; 28 | } 29 | } 30 | } 31 | return t; 32 | } 33 | 34 | -(void)fillData:(id)data 35 | { 36 | 37 | } 38 | 39 | - (void)drawRect:(NSRect)dirtyRect { 40 | [super drawRect:dirtyRect]; 41 | 42 | // Drawing code here. 43 | } 44 | 45 | @end 46 | -------------------------------------------------------------------------------- /MacOS/YourView/YourView/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIconFile 10 | 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleVersion 22 | 1 23 | LSMinimumSystemVersion 24 | $(MACOSX_DEPLOYMENT_TARGET) 25 | NSHumanReadableCopyright 26 | Copyright © 2019 bliss_ddo. All rights reserved. 27 | NSMainStoryboardFile 28 | Main 29 | NSPrincipalClass 30 | NSApplication 31 | 32 | 33 | -------------------------------------------------------------------------------- /MacOS/YourView/YourView/helper/SCNNode+YVVisual.m: -------------------------------------------------------------------------------- 1 | // 2 | // SCNNode+YVVisual.m 3 | // YourView 4 | // 5 | // Created by bliss_ddo on 2019/5/5. 6 | // Copyright © 2019 bliss_ddo. All rights reserved. 7 | // 8 | 9 | #import "SCNNode+YVVisual.h" 10 | 11 | @implementation SCNNode (YVVisual) 12 | -(void)hover 13 | { 14 | SCNNode * borderChild = [self childNodeWithName:YVNodeNameBorder recursively:YES]; 15 | if (borderChild) { 16 | borderChild.geometry.firstMaterial.diffuse.contents = YVTHEME_NODE_HOVERBORDERCOLOR; 17 | } 18 | } 19 | -(void)unhover 20 | { 21 | SCNNode * borderChild = [self childNodeWithName:YVNodeNameBorder recursively:YES]; 22 | if (borderChild) { 23 | borderChild.geometry.firstMaterial.diffuse.contents = YVTHEME_NODE_HOVERBORDERNORMALCOLOR; 24 | } 25 | } 26 | 27 | -(void)highlight 28 | { 29 | SCNNode * indicator = [self childNodeWithName:YVNodeNameIndicator recursively:YES]; 30 | if (indicator) { 31 | indicator.hidden = NO; 32 | } 33 | } 34 | -(void)lowlight 35 | { 36 | SCNNode * indicator = [self childNodeWithName:YVNodeNameIndicator recursively:YES]; 37 | if (indicator) { 38 | indicator.hidden = YES; 39 | } 40 | } 41 | @end 42 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/GameAnalytics/TDGAVirtualCurrencyTableViewCell.m: -------------------------------------------------------------------------------- 1 | // 2 | // TDGAVirtualCurrencyTableViewCell.m 3 | // TalkingDataSDKDemo 4 | // 5 | // Created by liweiqiang on 2017/5/22. 6 | // Copyright © 2017年 TendCloud. All rights reserved. 7 | // 8 | 9 | #import "TDGAVirtualCurrencyTableViewCell.h" 10 | 11 | @interface TDGAVirtualCurrencyTableViewCell () 12 | 13 | @property (weak, nonatomic) IBOutlet UITextField *orderIDField; 14 | @property (weak, nonatomic) IBOutlet UITextField *iapIDField; 15 | @property (weak, nonatomic) IBOutlet UITextField *currencyAmountField; 16 | @property (weak, nonatomic) IBOutlet UITextField *currencyTypeField; 17 | @property (weak, nonatomic) IBOutlet UITextField *virtualCurrencyAmountField; 18 | @property (weak, nonatomic) IBOutlet UITextField *paymentTypeField; 19 | @property (weak, nonatomic) IBOutlet UITextField *rewardVirtualCurrencyAmountField; 20 | @property (weak, nonatomic) IBOutlet UITextField *rewardReasonField; 21 | 22 | @end 23 | 24 | @implementation TDGAVirtualCurrencyTableViewCell 25 | 26 | - (IBAction)chargeRequst { 27 | 28 | } 29 | 30 | - (IBAction)chargeSuccess { 31 | } 32 | 33 | - (IBAction)rewardVirtualCurrency { 34 | 35 | } 36 | 37 | @end 38 | -------------------------------------------------------------------------------- /MacOS/YourView/YourView/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "mac", 5 | "size" : "16x16", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "mac", 10 | "size" : "16x16", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "mac", 15 | "size" : "32x32", 16 | "scale" : "1x" 17 | }, 18 | { 19 | "idiom" : "mac", 20 | "size" : "32x32", 21 | "scale" : "2x" 22 | }, 23 | { 24 | "idiom" : "mac", 25 | "size" : "128x128", 26 | "scale" : "1x" 27 | }, 28 | { 29 | "idiom" : "mac", 30 | "size" : "128x128", 31 | "scale" : "2x" 32 | }, 33 | { 34 | "idiom" : "mac", 35 | "size" : "256x256", 36 | "scale" : "1x" 37 | }, 38 | { 39 | "idiom" : "mac", 40 | "size" : "256x256", 41 | "scale" : "2x" 42 | }, 43 | { 44 | "idiom" : "mac", 45 | "size" : "512x512", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "mac", 50 | "size" : "512x512", 51 | "scale" : "2x" 52 | } 53 | ], 54 | "info" : { 55 | "version" : 1, 56 | "author" : "xcode" 57 | } 58 | } -------------------------------------------------------------------------------- /MacOS/YourView/YourView/Controller/YVHomeViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // YVHomeViewController.m 3 | // YourView 4 | // 5 | // Created by bliss_ddo on 2019/4/24. 6 | // Copyright © 2019 bliss_ddo. All rights reserved. 7 | // 8 | 9 | #import "YVHomeViewController.h" 10 | #import "YVLoadingViewController.h" 11 | 12 | @interface YVHomeViewController () 13 | 14 | @end 15 | 16 | @implementation YVHomeViewController 17 | -(IBAction)buttonPressed:(NSButton*)btn 18 | { 19 | NSTextField * tf = [self.view viewWithTag:666]; 20 | NSString * ip = tf.stringValue; 21 | if (ip) { 22 | [[NSUserDefaults standardUserDefaults]setObject:ip forKey:@"ip"]; 23 | } 24 | NSStoryboard * sb = [NSStoryboard storyboardWithName:@"Main" bundle:nil]; 25 | YVLoadingViewController * loadingVC =[sb instantiateControllerWithIdentifier:@"loading"]; 26 | loadingVC.host = ip; 27 | [NSApp.keyWindow.contentViewController presentViewControllerAsSheet:loadingVC];; 28 | } 29 | -(void)fillIP 30 | { 31 | NSString * ip = [[NSUserDefaults standardUserDefaults]objectForKey:@"ip"]; 32 | if (ip) { 33 | NSTextField * tf = [self.view viewWithTag:666]; 34 | tf.stringValue = ip; 35 | } 36 | } 37 | - (void)viewDidLoad { 38 | [super viewDidLoad]; 39 | [self fillIP]; 40 | } 41 | 42 | @end 43 | -------------------------------------------------------------------------------- /MacOS/YourView/YourView/helper/YVCGRectHelper.m: -------------------------------------------------------------------------------- 1 | // 2 | // YVCGRectHelper.m 3 | // YourView 4 | // 5 | // Created by bliss_ddo on 2019/4/28. 6 | // Copyright © 2019 bliss_ddo. All rights reserved. 7 | // 8 | 9 | #import "YVCGRectHelper.h" 10 | 11 | @implementation YVCGRectHelper 12 | +(CGRect)CGRectExpand:(CGRect)rect 13 | { 14 | return [self CGRectExpand:rect threashold:YVRectDefaultExpandThreshold]; 15 | } 16 | 17 | +(CGRect)CGRectExpand:(CGRect)rect threashold:(CGFloat)threshold 18 | { 19 | CGFloat x = rect.origin.x - threshold / 2; 20 | CGFloat y = rect.origin.y - threshold / 2; 21 | CGFloat w = rect.size.width + threshold; 22 | CGFloat h = rect.size.height + threshold; 23 | return CGRectMake(x, y, w, h); 24 | } 25 | 26 | +(CGRect)UIKitRectTransformToSceneRect:(CGRect)UIKitRect withScreenSize:(CGSize)screenSize; 27 | { 28 | CGFloat x = UIKitRect.origin.x; 29 | CGFloat y = UIKitRect.origin.y; 30 | CGFloat w = UIKitRect.size.width; 31 | CGFloat h = UIKitRect.size.height; 32 | CGFloat xOffSet = -screenSize.width / 2; 33 | CGFloat yOffSet = screenSize.height / 2; 34 | CGFloat x_transformed = (x + w / 2 + xOffSet) ; 35 | CGFloat y_transformed = (-(y + h / 2) + yOffSet) ; 36 | return CGRectMake(x_transformed, y_transformed, w, h); 37 | } 38 | 39 | @end 40 | -------------------------------------------------------------------------------- /MacOS/YourView/YourView/helper/SCNNode+YVPlane.m: -------------------------------------------------------------------------------- 1 | // 2 | // SCNNode+plane.m 3 | // YourView 4 | // 5 | // Created by bliss_ddo on 2019/4/28. 6 | // Copyright © 2019 bliss_ddo. All rights reserved. 7 | // 8 | 9 | #import "SCNNode+YVPlane.h" 10 | 11 | @implementation SCNNode (YVPlane) 12 | +(SCNNode*)yvplaneWithWidth:(CGFloat)width height:(CGFloat)height content:(id)content 13 | { 14 | SCNPlane *plane =[SCNPlane planeWithWidth:width height:height]; 15 | NSString * snapshot = content; 16 | NSImage *image; 17 | if (snapshot && snapshot.length > 0) { 18 | NSData *imageData = [[NSData alloc] initWithBase64EncodedString:snapshot options:NSDataBase64DecodingIgnoreUnknownCharacters]; 19 | image =[[NSImage alloc]initWithData:imageData]; 20 | } 21 | if (image) { 22 | plane.firstMaterial.diffuse.contents = image; 23 | }else{ 24 | plane.firstMaterial.diffuse.contents = [NSColor clearColor]; 25 | } 26 | plane.firstMaterial.doubleSided = YES; 27 | // plane.firstMaterial.writesToDepthBuffer = NO; 28 | // plane.firstMaterial.readsFromDepthBuffer = NO; 29 | SCNNode *planeNode = [SCNNode nodeWithGeometry:plane]; 30 | planeNode.categoryBitMask = YVHitTestOptionCategoryBitMaskPlaneNode; 31 | planeNode.name = YVNodeNamePlane; 32 | return planeNode; 33 | } 34 | @end 35 | -------------------------------------------------------------------------------- /iOS/libyourview/serializer/UIView+YVViewTree.m: -------------------------------------------------------------------------------- 1 | // 2 | // UIView+YVViewTree.m 3 | // libyourview 4 | // 5 | // Created by bliss_ddo on 2019/4/24. 6 | // Copyright © 2019 bliss_ddo. All rights reserved. 7 | // 8 | 9 | #import "UIView+YVViewTree.h" 10 | #import "UIView+YVTraversal.h" 11 | #import "YVTraversalStepin.h" 12 | #import "YVTraversalContext.h" 13 | #import "YVObjectManager.h" 14 | 15 | @implementation UIView (YVViewTree) 16 | 17 | +(UIView*)_defaultRootView 18 | { 19 | return [UIApplication sharedApplication].keyWindow; 20 | } 21 | 22 | +(NSString*)rootViewTreeString 23 | { 24 | NSData * viewtreedata = [NSJSONSerialization dataWithJSONObject:[self rootViewTreeDictionary] options:0 error:nil]; 25 | return [[NSString alloc]initWithData:viewtreedata encoding:NSUTF8StringEncoding]; 26 | } 27 | +(NSDictionary*)rootViewTreeDictionary 28 | { 29 | YVTraversalStepin * stepIn = [[YVTraversalStepin alloc]init]; 30 | YVTraversalContext * context = [[YVTraversalContext alloc]init]; 31 | NSDictionary * viewtree = [[UIView _defaultRootView]traversal:stepIn context:context]; 32 | NSDictionary * extraInfo = [context contextDict]; 33 | [YVObjectManager sharedInstance].context = context; 34 | return @{ 35 | @"viewtree":viewtree, 36 | @"extrainfo":extraInfo, 37 | }; 38 | } 39 | @end 40 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/AppAnalytics/TDAACustomViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // TDAACustomViewController.m 3 | // TalkingDataSDKDemo 4 | // 5 | // Created by liweiqiang on 2017/5/22. 6 | // Copyright © 2017年 TendCloud. All rights reserved. 7 | // 8 | 9 | #import "TDAACustomViewController.h" 10 | 11 | @interface TDAACustomViewController () 12 | 13 | @property (weak, nonatomic) IBOutlet UITextField *eventIDField; 14 | @property (weak, nonatomic) IBOutlet UITextField *eventLableField; 15 | @property (weak, nonatomic) IBOutlet UITextField *key1Field; 16 | @property (weak, nonatomic) IBOutlet UITextField *value1Field; 17 | @property (weak, nonatomic) IBOutlet UITextField *key2Field; 18 | @property (weak, nonatomic) IBOutlet UITextField *value2Field; 19 | 20 | @end 21 | 22 | @implementation TDAACustomViewController 23 | 24 | - (IBAction)submit:(UIButton *)sender { 25 | if (self.eventIDField.text.length == 0) { 26 | return; 27 | } 28 | 29 | NSMutableDictionary *eventData = [NSMutableDictionary dictionary]; 30 | if (self.key1Field.text.length > 0 && self.value1Field.text.length > 0) { 31 | [eventData setObject:self.value1Field.text forKey:self.key1Field.text]; 32 | } 33 | if (self.key2Field.text.length > 0 && self.value2Field.text.length > 0) { 34 | [eventData setObject:self.value2Field.text forKey:self.key2Field.text]; 35 | } 36 | 37 | 38 | } 39 | 40 | @end 41 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/IQKeyboardManager/IQToolbar/IQPreviousNextView.m: -------------------------------------------------------------------------------- 1 | // 2 | // IQPreviousNextView.m 3 | // https://github.com/hackiftekhar/IQKeyboardManager 4 | // Copyright (c) 2013-16 Iftekhar Qurashi. 5 | // 6 | // Permission is hereby granted, free of charge, to any person obtaining a copy 7 | // of this software and associated documentation files (the "Software"), to deal 8 | // in the Software without restriction, including without limitation the rights 9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | // copies of the Software, and to permit persons to whom the Software is 11 | // furnished to do so, subject to the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included in 14 | // all copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | // THE SOFTWARE. 23 | 24 | #import "IQPreviousNextView.h" 25 | 26 | @implementation IQPreviousNextView 27 | 28 | @end 29 | -------------------------------------------------------------------------------- /MacOS/YourView/YourView/view/cell/YVRightCellViewFrame.m: -------------------------------------------------------------------------------- 1 | // 2 | // YVRightCellViewFrame.m 3 | // YourView 4 | // 5 | // Created by bliss_ddo on 2019/5/6. 6 | // Copyright © 2019 bliss_ddo. All rights reserved. 7 | // 8 | 9 | #import "YVRightCellViewFrame.h" 10 | 11 | @implementation YVRightCellViewFrame 12 | 13 | - (void)drawRect:(NSRect)dirtyRect { 14 | [super drawRect:dirtyRect]; 15 | 16 | // Drawing code here. 17 | } 18 | 19 | 20 | -(void)fillData:(NSDictionary*)data 21 | { 22 | NSString * frameStr = data[@"localframe"]; 23 | CGRect frame = NSRectFromString(frameStr); 24 | self.fieldx.floatValue = frame.origin.x; 25 | self.stepperx.floatValue = frame.origin.x; 26 | self.fieldy.floatValue = frame.origin.y; 27 | self.steppery.floatValue = frame.origin.y; 28 | self.fieldw.floatValue = frame.size.width; 29 | self.stepperw.floatValue = frame.size.width; 30 | self.fieldh.floatValue = frame.size.height; 31 | self.stepperh.floatValue = frame.size.height; 32 | } 33 | - (IBAction)setFrameButtonPressed:(id)sender { 34 | if (self.delegate && [self.delegate respondsToSelector:@selector(cellDidClick:withData:cmd:)]) { 35 | CGRect frame = CGRectMake(self.fieldx.floatValue, self.fieldy.floatValue, self.fieldw.floatValue, self.fieldh.floatValue); 36 | NSString * framestring = NSStringFromRect(frame); 37 | [self.delegate cellDidClick:self withData:framestring cmd:@"setframe"]; 38 | } 39 | } 40 | @end 41 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/IQKeyboardManager/IQToolbar/IQBarButtonItem.h: -------------------------------------------------------------------------------- 1 | // 2 | // IQBarButtonItem.h 3 | // https://github.com/hackiftekhar/IQKeyboardManager 4 | // Copyright (c) 2013-16 Iftekhar Qurashi. 5 | // 6 | // Permission is hereby granted, free of charge, to any person obtaining a copy 7 | // of this software and associated documentation files (the "Software"), to deal 8 | // in the Software without restriction, including without limitation the rights 9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | // copies of the Software, and to permit persons to whom the Software is 11 | // furnished to do so, subject to the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included in 14 | // all copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | // THE SOFTWARE. 23 | 24 | 25 | #import 26 | 27 | /** 28 | IQBarButtonItem used for IQToolbar. 29 | */ 30 | @interface IQBarButtonItem : UIBarButtonItem 31 | 32 | @end 33 | -------------------------------------------------------------------------------- /MacOS/YourView/YourView/define/defines.h: -------------------------------------------------------------------------------- 1 | // 2 | // defines.h 3 | // YourView 4 | // 5 | // Created by bliss_ddo on 2019/4/28. 6 | // Copyright © 2019 bliss_ddo. All rights reserved. 7 | // 8 | 9 | #ifndef defines_h 10 | #define defines_h 11 | #import 12 | 13 | typedef enum:NSInteger { 14 | YVWindowDisplayStatusHome, 15 | YVWindowDisplayStatusInspect, 16 | }YVWindowDisplayStatus; 17 | 18 | typedef enum:NSInteger { 19 | YVSceneViewDisplayModeNone = -1, 20 | YVSceneViewDisplayModeDeepsFirst, 21 | YVSceneViewDisplayModeSmart, 22 | YVSceneViewDisplayModeFlatten, 23 | }YVSceneViewDisplayMode; 24 | 25 | static NSString * const YVViewTreeDidLoadNotificationName = @"YVViewTreeDidLoadNotificationName"; 26 | static NSString * const YVSelectionChangeMiddleToLeft = @"YVSelectionChangeMiddleToLeft"; 27 | static NSString * const YVSelectionChangeLeftToMiddle = @"YVSelectionChangeLeftToMiddle"; 28 | static NSString * const YVSelectionChangeLeftToRight = @"YVSelectionChangeLeftToRight"; 29 | static NSString * const YVNodeNamePlane = @"YVNodeNamePlane"; 30 | static NSString * const YVNodeNameIndicator = @"YVNodeNameIndicator"; 31 | static NSString * const YVNodeNameCamera = @"YVNodeNameCamera"; 32 | static NSString * const YVNodeNameBorder = @"YVNodeNameBorder"; 33 | 34 | static NSInteger const YVHitTestOptionCategoryBitMaskPlaneNode = 1<<1; 35 | static NSInteger const YVHitTestOptionCategoryBitMask2SelectedIndicator = 1<<2; 36 | static NSInteger const YVHitTestOptionCategoryBitMask3HoverBorder = 1<<3; 37 | 38 | static CGFloat const YVRectDefaultExpandThreshold = 1.0f; 39 | 40 | 41 | #endif /* defines_h */ 42 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/IQKeyboardManager/IQToolbar/IQPreviousNextView.h: -------------------------------------------------------------------------------- 1 | // 2 | // IQPreviousNextView.h 3 | // https://github.com/hackiftekhar/IQKeyboardManager 4 | // Copyright (c) 2013-16 Iftekhar Qurashi. 5 | // 6 | // Permission is hereby granted, free of charge, to any person obtaining a copy 7 | // of this software and associated documentation files (the "Software"), to deal 8 | // in the Software without restriction, including without limitation the rights 9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | // copies of the Software, and to permit persons to whom the Software is 11 | // furnished to do so, subject to the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included in 14 | // all copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | // THE SOFTWARE. 23 | 24 | #import 25 | 26 | /** 27 | If you need to enable previous/next toolbar button with some complex hierarchy where your textFields are not in same view, then make the top view as IQPreviousNextView. 28 | */ 29 | @interface IQPreviousNextView : UIView 30 | 31 | @end 32 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/IQKeyboardManager/Categories/IQUIScrollView+Additions.h: -------------------------------------------------------------------------------- 1 | // 2 | // IQUIScrollView+Additions.h 3 | // https://github.com/hackiftekhar/IQKeyboardManager 4 | // Copyright (c) 2013-16 Iftekhar Qurashi. 5 | // 6 | // Permission is hereby granted, free of charge, to any person obtaining a copy 7 | // of this software and associated documentation files (the "Software"), to deal 8 | // in the Software without restriction, including without limitation the rights 9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | // copies of the Software, and to permit persons to whom the Software is 11 | // furnished to do so, subject to the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included in 14 | // all copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | // THE SOFTWARE. 23 | 24 | #import 25 | 26 | 27 | @interface UIScrollView (Additions) 28 | 29 | /** 30 | Restore scrollViewContentOffset when resigning from scrollView. Default is NO. 31 | */ 32 | @property(nonatomic, assign) BOOL shouldRestoreScrollViewContentOffset; 33 | 34 | 35 | @end 36 | -------------------------------------------------------------------------------- /iOS/libyourview/serializer/YVTraversalContext.m: -------------------------------------------------------------------------------- 1 | // 2 | // YVTraversalContext.m 3 | // libyourview 4 | // 5 | // Created by bliss_ddo on 2019/4/24. 6 | // Copyright © 2019 bliss_ddo. All rights reserved. 7 | // 8 | 9 | #import "YVTraversalContext.h" 10 | 11 | 12 | 13 | @implementation YVTraversalContext 14 | @synthesize objectCounter = _objectCounter; 15 | @synthesize hidenObjectCounter = _hidenObjectCounter; 16 | @synthesize notHidenObjectCounter = _notHidenObjectCounter; 17 | 18 | -(instancetype)init 19 | { 20 | if (self = [super init]) { 21 | _objectCounter = 0; 22 | _hidenObjectCounter = 0; 23 | _notHidenObjectCounter = 0; 24 | _viewMap = [NSMapTable mapTableWithKeyOptions:NSMapTableCopyIn valueOptions:NSMapTableWeakMemory]; 25 | } 26 | return self; 27 | } 28 | 29 | -(NSInteger)objectCounter 30 | { 31 | return _objectCounter; 32 | } 33 | 34 | -(NSInteger)hidenObjectCounter 35 | { 36 | return _hidenObjectCounter; 37 | } 38 | 39 | -(NSInteger)notHidenObjectCounter 40 | { 41 | return _notHidenObjectCounter; 42 | } 43 | 44 | -(void)updateFromView:(UIView*)v 45 | { 46 | _objectCounter++; 47 | if (v.hidden) { 48 | _hidenObjectCounter++; 49 | }else{ 50 | _notHidenObjectCounter++; 51 | } 52 | NSString * memoryKey = [NSString stringWithFormat:@"%p",v]; 53 | [self.viewMap setObject:v forKey:memoryKey]; 54 | } 55 | 56 | -(NSDictionary *)contextDict 57 | { 58 | 59 | return @{ 60 | @"screeninfo":NSStringFromCGRect([UIScreen mainScreen].bounds), 61 | @"totalcount":@(_objectCounter), 62 | }; 63 | } 64 | 65 | @end 66 | -------------------------------------------------------------------------------- /MacOS/YourView/YourView/helper/SCNNode+YVBorder.m: -------------------------------------------------------------------------------- 1 | // 2 | // SCNNode+border.m 3 | // YourView 4 | // 5 | // Created by bliss_ddo on 2019/4/28. 6 | // Copyright © 2019 bliss_ddo. All rights reserved. 7 | // 8 | 9 | #import "SCNNode+YVBorder.h" 10 | 11 | @implementation SCNNode (YVBorder) 12 | +(SCNNode*)borderNodeWithPlane:(SCNNode*)planeNode 13 | { 14 | SCNVector3 max,min; 15 | [planeNode getBoundingBoxMin:&min max:&max]; 16 | CGFloat xx = max.x - min.x; 17 | CGFloat yy = max.y - min.y; 18 | SCNVector3 vec[] = 19 | { 20 | max, 21 | SCNVector3Make(max.x, max.y-yy, max.z), 22 | SCNVector3Make(max.x-xx, max.y-yy, max.z), 23 | SCNVector3Make(max.x-xx, max.y, max.z), 24 | }; 25 | GLubyte indexs[] ={ 26 | 0,1,1,2,2,3,3,0 27 | }; 28 | SCNGeometrySource * vecSource = [SCNGeometrySource geometrySourceWithVertices:vec count:4]; 29 | NSData * indexData = [NSData dataWithBytes:indexs length:8]; 30 | SCNGeometryElement * indexElement = [SCNGeometryElement geometryElementWithData:indexData primitiveType:SCNGeometryPrimitiveTypeLine primitiveCount:4 bytesPerIndex:sizeof(GLubyte)]; 31 | SCNGeometry * geometry = [SCNGeometry geometryWithSources:@[vecSource] elements:@[indexElement]]; 32 | geometry.firstMaterial.diffuse.contents = [NSColor colorWithRed:215.f/255.f green:215.f/255.f blue:215.f/255.f alpha:1]; 33 | geometry.firstMaterial.doubleSided = YES; 34 | SCNNode * borderNode = [SCNNode nodeWithGeometry:geometry]; 35 | borderNode.name = YVNodeNameBorder; 36 | borderNode.categoryBitMask = YVHitTestOptionCategoryBitMask3HoverBorder; 37 | return borderNode; 38 | } 39 | @end 40 | -------------------------------------------------------------------------------- /MacOS/YourView/YourView/helper/YVNodeBackTracking.m: -------------------------------------------------------------------------------- 1 | // 2 | // YVNodeBackTracking.m 3 | // YourView 4 | // 5 | // Created by bliss_ddo on 2019/4/28. 6 | // Copyright © 2019 bliss_ddo. All rights reserved. 7 | // 8 | 9 | #import "YVNodeBackTracking.h" 10 | #import "YVCGRectHelper.h" 11 | 12 | @implementation YVNodeBackTracking 13 | +(NSInteger)findBestZFromlevelDict:(NSMutableDictionary*)levelDict minDepth:(NSInteger)minDeepth maxDepth:(NSInteger)maxDeepth frame:(CGRect)crect 14 | { 15 | CGRect crect_expand = [YVCGRectHelper CGRectExpand:crect]; 16 | NSInteger bestZ = 0; 17 | while (YES) { 18 | if (maxDeepth < 0 || maxDeepth < minDeepth) { 19 | break; 20 | } 21 | NSMutableArray * levelArray = levelDict[@(maxDeepth)]; 22 | if (levelArray == nil) { 23 | bestZ = maxDeepth--; 24 | }else{ 25 | BOOL hit = NO; 26 | for (NSValue * eachValue in levelArray) { 27 | CGRect eachFrame; 28 | [eachValue getValue:&eachFrame size:sizeof(CGRect)]; 29 | if (CGRectIntersectsRect(crect_expand, eachFrame)) { 30 | hit = YES; 31 | break; 32 | } 33 | } 34 | if (hit) { 35 | break; 36 | } 37 | bestZ = maxDeepth--; 38 | } 39 | } 40 | NSMutableArray * levelArray = levelDict[@(bestZ)]; 41 | if (!levelArray) { 42 | levelArray = [NSMutableArray array]; 43 | levelDict[@(bestZ)] = levelArray; 44 | } 45 | [levelArray addObject:[NSValue valueWithRect:crect]]; 46 | return bestZ; 47 | } 48 | @end 49 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/IQKeyboardManager/Categories/IQUIViewController+Additions.h: -------------------------------------------------------------------------------- 1 | // 2 | // IQUIViewController+Additions.h 3 | // https://github.com/hackiftekhar/IQKeyboardManager 4 | // Copyright (c) 2013-16 Iftekhar Qurashi. 5 | // 6 | // Permission is hereby granted, free of charge, to any person obtaining a copy 7 | // of this software and associated documentation files (the "Software"), to deal 8 | // in the Software without restriction, including without limitation the rights 9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | // copies of the Software, and to permit persons to whom the Software is 11 | // furnished to do so, subject to the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included in 14 | // all copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | // THE SOFTWARE. 23 | 24 | #import 25 | 26 | @interface UIViewController (Additions) 27 | 28 | /** 29 | Top/Bottom Layout constraint which help library to manage keyboardTextField distance 30 | */ 31 | @property(nullable, nonatomic, strong) IBOutlet NSLayoutConstraint *IQLayoutGuideConstraint; 32 | 33 | @end 34 | -------------------------------------------------------------------------------- /MacOS/YourView/YourView.xcodeproj/xcuserdata/bliss_ddo.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 8 | 20 | 21 | 22 | 24 | 36 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | zh_CN 7 | CFBundleDisplayName 8 | TD SDK Demo 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.1 21 | CFBundleVersion 22 | 1 23 | LSRequiresIPhoneOS 24 | 25 | NSLocationWhenInUseUsageDescription 26 | TalkingData SDK Demo需要获取您的位置信息 27 | UILaunchStoryboardName 28 | LaunchScreen 29 | UIMainStoryboardFile 30 | Main 31 | UIRequiredDeviceCapabilities 32 | 33 | armv7 34 | 35 | UISupportedInterfaceOrientations 36 | 37 | UIInterfaceOrientationPortrait 38 | UIInterfaceOrientationLandscapeLeft 39 | UIInterfaceOrientationLandscapeRight 40 | 41 | UISupportedInterfaceOrientations~ipad 42 | 43 | UIInterfaceOrientationPortrait 44 | UIInterfaceOrientationPortraitUpsideDown 45 | UIInterfaceOrientationLandscapeLeft 46 | UIInterfaceOrientationLandscapeRight 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/IQKeyboardManager/Categories/IQUIViewController+Additions.m: -------------------------------------------------------------------------------- 1 | // 2 | // IQUIViewController+Additions.m 3 | // https://github.com/hackiftekhar/IQKeyboardManager 4 | // Copyright (c) 2013-16 Iftekhar Qurashi. 5 | // 6 | // Permission is hereby granted, free of charge, to any person obtaining a copy 7 | // of this software and associated documentation files (the "Software"), to deal 8 | // in the Software without restriction, including without limitation the rights 9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | // copies of the Software, and to permit persons to whom the Software is 11 | // furnished to do so, subject to the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included in 14 | // all copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | // THE SOFTWARE. 23 | 24 | #import "IQUIViewController+Additions.h" 25 | #import 26 | 27 | @implementation UIViewController (Additions) 28 | 29 | -(void)setIQLayoutGuideConstraint:(NSLayoutConstraint *)IQLayoutGuideConstraint 30 | { 31 | objc_setAssociatedObject(self, @selector(IQLayoutGuideConstraint), IQLayoutGuideConstraint, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 32 | } 33 | 34 | -(NSLayoutConstraint *)IQLayoutGuideConstraint 35 | { 36 | return objc_getAssociatedObject(self, @selector(IQLayoutGuideConstraint)); 37 | } 38 | 39 | @end 40 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/IQKeyboardManager/Categories/IQNSArray+Sort.h: -------------------------------------------------------------------------------- 1 | // 2 | // NSArray+Sort.h 3 | // https://github.com/hackiftekhar/IQKeyboardManager 4 | // Copyright (c) 2013-16 Iftekhar Qurashi. 5 | // 6 | // Permission is hereby granted, free of charge, to any person obtaining a copy 7 | // of this software and associated documentation files (the "Software"), to deal 8 | // in the Software without restriction, including without limitation the rights 9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | // copies of the Software, and to permit persons to whom the Software is 11 | // furnished to do so, subject to the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included in 14 | // all copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | // THE SOFTWARE. 23 | 24 | #import 25 | 26 | /** 27 | UIView.subviews sorting category. 28 | */ 29 | @interface NSArray (IQ_NSArray_Sort) 30 | 31 | ///-------------- 32 | /// @name Sorting 33 | ///-------------- 34 | 35 | /** 36 | Returns the array by sorting the UIView's by their tag property. 37 | */ 38 | @property (nonatomic, readonly, copy) NSArray * _Nonnull sortedArrayByTag; 39 | 40 | /** 41 | Returns the array by sorting the UIView's by their tag property. 42 | */ 43 | @property (nonatomic, readonly, copy) NSArray * _Nonnull sortedArrayByPosition; 44 | 45 | @end 46 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/IQKeyboardManager/Categories/IQUITextFieldView+Additions.h: -------------------------------------------------------------------------------- 1 | // 2 | // IQUITextFieldView+Additions.h 3 | // https://github.com/hackiftekhar/IQKeyboardManager 4 | // Copyright (c) 2013-16 Iftekhar Qurashi. 5 | // 6 | // Permission is hereby granted, free of charge, to any person obtaining a copy 7 | // of this software and associated documentation files (the "Software"), to deal 8 | // in the Software without restriction, including without limitation the rights 9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | // copies of the Software, and to permit persons to whom the Software is 11 | // furnished to do so, subject to the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included in 14 | // all copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | // THE SOFTWARE. 23 | 24 | #import 25 | 26 | /** 27 | UIView category for managing UITextField/UITextView 28 | */ 29 | 30 | @interface UIView (Additions) 31 | 32 | /** 33 | To set customized distance from keyboard for textField/textView. Can't be less than zero 34 | */ 35 | @property(nonatomic, assign) CGFloat keyboardDistanceFromTextField; 36 | 37 | @end 38 | 39 | ///------------------------------------------- 40 | /// @name Custom KeyboardDistanceFromTextField 41 | ///------------------------------------------- 42 | 43 | /** 44 | Uses default keyboard distance for textField. 45 | */ 46 | extern CGFloat const kIQUseDefaultKeyboardDistance; 47 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/IQKeyboardManager/Categories/IQUIScrollView+Additions.m: -------------------------------------------------------------------------------- 1 | // 2 | // IQUIScrollView+Additions.m 3 | // https://github.com/hackiftekhar/IQKeyboardManager 4 | // Copyright (c) 2013-16 Iftekhar Qurashi. 5 | // 6 | // Permission is hereby granted, free of charge, to any person obtaining a copy 7 | // of this software and associated documentation files (the "Software"), to deal 8 | // in the Software without restriction, including without limitation the rights 9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | // copies of the Software, and to permit persons to whom the Software is 11 | // furnished to do so, subject to the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included in 14 | // all copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | // THE SOFTWARE. 23 | 24 | #import "IQUIScrollView+Additions.h" 25 | #import 26 | 27 | @implementation UIScrollView (Additions) 28 | 29 | -(void)setShouldRestoreScrollViewContentOffset:(BOOL)shouldRestoreScrollViewContentOffset 30 | { 31 | objc_setAssociatedObject(self, @selector(shouldRestoreScrollViewContentOffset), @(shouldRestoreScrollViewContentOffset), OBJC_ASSOCIATION_RETAIN_NONATOMIC); 32 | } 33 | 34 | -(BOOL)shouldRestoreScrollViewContentOffset 35 | { 36 | NSNumber *shouldRestoreScrollViewContentOffset = objc_getAssociatedObject(self, @selector(shouldRestoreScrollViewContentOffset)); 37 | 38 | return [shouldRestoreScrollViewContentOffset boolValue]; 39 | } 40 | 41 | @end 42 | -------------------------------------------------------------------------------- /MacOS/YourView/YourView/view/cell/YVRightCellViewInfo.m: -------------------------------------------------------------------------------- 1 | // 2 | // YVRightCellViewInfo.m 3 | // YourView 4 | // 5 | // Created by bliss_ddo on 2019/5/6. 6 | // Copyright © 2019 bliss_ddo. All rights reserved. 7 | // 8 | 9 | #import "YVRightCellViewInfo.h" 10 | 11 | @implementation YVRightCellViewInfo 12 | 13 | -(void)fillData:(NSDictionary*)data 14 | { 15 | NSString * address = data[@"address"]; 16 | NSString * class = data[@"class"]; 17 | NSString * vc = data[@"assign_to_viewcontroller"]; 18 | NSString * level =data[@"view_level"]; 19 | NSNumber * depth = data[@"view_deepth"]; 20 | NSNumber * isintable = data[@"is_in_tableview"]; 21 | NSNumber * isincollection = data[@"is_in_collectionview"]; 22 | NSString * indexrow = data[@"index_row"]; 23 | NSString * indexsection = data[@"index_section"]; 24 | NSString * inherit = data[@"inherit"]; 25 | self.addressfield.stringValue = [NSString stringWithFormat:@"%@",address]; 26 | self.classfield.stringValue = [NSString stringWithFormat:@"%@",class]; 27 | self.viewcontrollerfield.stringValue = [NSString stringWithFormat:@"%@",vc]; 28 | self.levelfield.stringValue = [NSString stringWithFormat:@"%@",level]; 29 | self.depthfield.stringValue = [NSString stringWithFormat:@"%@",depth]; 30 | self.isintablefield.stringValue = [NSString stringWithFormat:@"%@",isintable]; 31 | self.isincollectionfield.stringValue = [NSString stringWithFormat:@"%@",isincollection]; 32 | self.indexpathfield.stringValue = [NSString stringWithFormat:@"(%@,%@)",indexsection,indexrow]; 33 | self.inheritfield.stringValue = [NSString stringWithFormat:@"%@",inherit]; 34 | 35 | } 36 | -(IBAction)hereButtonPressed:(NSButton*)sender 37 | { 38 | NSLog(@"btn pressed"); 39 | if (self.delegate && [self.delegate respondsToSelector:@selector(cellDidClick:withData:cmd:)]) { 40 | [self.delegate cellDidClick:self withData:nil cmd:@"shake"]; 41 | } 42 | } 43 | - (void)drawRect:(NSRect)dirtyRect { 44 | [super drawRect:dirtyRect]; 45 | 46 | // Drawing code here. 47 | } 48 | 49 | @end 50 | -------------------------------------------------------------------------------- /MacOS/YourView/YourView/YourView.pch: -------------------------------------------------------------------------------- 1 | // 2 | // YourView.pch 3 | // YourView 4 | // 5 | // Created by bliss_ddo on 2019/4/25. 6 | // Copyright © 2019 bliss_ddo. All rights reserved. 7 | // 8 | 9 | #ifndef YourView_pch 10 | #define YourView_pch 11 | 12 | #ifdef DEBUG 13 | #define NSLog(FORMAT, ...) fprintf(stderr,"%s:%d\t%s\n",[[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String], __LINE__, [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]); 14 | #else 15 | #define NSLog(FORMAT, ...) nil 16 | #endif 17 | 18 | 19 | 20 | #ifndef weakify 21 | #if DEBUG 22 | #if __has_feature(objc_arc) 23 | #define weakify(object) autoreleasepool{} __weak __typeof__(object) weak##_##object = object; 24 | #else 25 | #define weakify(object) autoreleasepool{} __block __typeof__(object) block##_##object = object; 26 | #endif 27 | #else 28 | #if __has_feature(objc_arc) 29 | #define weakify(object) try{} @finally{} {} __weak __typeof__(object) weak##_##object = object; 30 | #else 31 | #define weakify(object) try{} @finally{} {} __block __typeof__(object) block##_##object = object; 32 | #endif 33 | #endif 34 | #endif 35 | 36 | #ifndef strongify 37 | #if DEBUG 38 | #if __has_feature(objc_arc) 39 | #define strongify(object) autoreleasepool{} __typeof__(object) object = weak##_##object; 40 | #else 41 | #define strongify(object) autoreleasepool{} __typeof__(object) object = block##_##object; 42 | #endif 43 | #else 44 | #if __has_feature(objc_arc) 45 | #define strongify(object) try{} @finally{} __typeof__(object) object = weak##_##object; 46 | #else 47 | #define strongify(object) try{} @finally{} __typeof__(object) object = block##_##object; 48 | #endif 49 | #endif 50 | #endif 51 | 52 | /** 53 | * Creates an opaque UIColor object from a byte-value color definition. 54 | */ 55 | #define RGBCOLOR(r,g,b) [NSColor colorWithRed:(r)/255.0f green:(g)/255.0f blue:(b)/255.0f alpha:1] 56 | 57 | /** 58 | * Creates a UIColor object from a byte-value color definition and alpha transparency. 59 | */ 60 | #define RGBACOLOR(r,g,b,a) [NSColor colorWithRed:(r)/255.0f green:(g)/255.0f blue:(b)/255.0f alpha:(a)] 61 | 62 | #import "YVTheme.h" 63 | #import "defines.h" 64 | 65 | #endif /* YourView_pch */ 66 | -------------------------------------------------------------------------------- /iOS/libyourview/vendor/GCDWebServer/Requests/GCDWebServerFileRequest.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (c) 2012-2019, Pierre-Olivier Latour 3 | All rights reserved. 4 | 5 | Redistribution and use in source and binary forms, with or without 6 | modification, are permitted provided that the following conditions are met: 7 | * Redistributions of source code must retain the above copyright 8 | notice, this list of conditions and the following disclaimer. 9 | * Redistributions in binary form must reproduce the above copyright 10 | notice, this list of conditions and the following disclaimer in the 11 | documentation and/or other materials provided with the distribution. 12 | * The name of Pierre-Olivier Latour may not be used to endorse 13 | or promote products derived from this software without specific 14 | prior written permission. 15 | 16 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 17 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 18 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 19 | DISCLAIMED. IN NO EVENT SHALL PIERRE-OLIVIER LATOUR BE LIABLE FOR ANY 20 | DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 21 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 22 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 23 | ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 25 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 | */ 27 | 28 | #import "GCDWebServerRequest.h" 29 | 30 | NS_ASSUME_NONNULL_BEGIN 31 | 32 | /** 33 | * The GCDWebServerFileRequest subclass of GCDWebServerRequest stores the body 34 | * of the HTTP request to a file on disk. 35 | */ 36 | @interface GCDWebServerFileRequest : GCDWebServerRequest 37 | 38 | /** 39 | * Returns the path to the temporary file containing the request body. 40 | * 41 | * @warning This temporary file will be automatically deleted when the 42 | * GCDWebServerFileRequest is deallocated. If you want to preserve this file, 43 | * you must move it to a different location beforehand. 44 | */ 45 | @property(nonatomic, readonly) NSString* temporaryPath; 46 | 47 | @end 48 | 49 | NS_ASSUME_NONNULL_END 50 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/IQKeyboardManager/IQToolbar/IQToolbar.h: -------------------------------------------------------------------------------- 1 | // 2 | // IQToolbar.h 3 | // https://github.com/hackiftekhar/IQKeyboardManager 4 | // Copyright (c) 2013-16 Iftekhar Qurashi. 5 | // 6 | // Permission is hereby granted, free of charge, to any person obtaining a copy 7 | // of this software and associated documentation files (the "Software"), to deal 8 | // in the Software without restriction, including without limitation the rights 9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | // copies of the Software, and to permit persons to whom the Software is 11 | // furnished to do so, subject to the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included in 14 | // all copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | // THE SOFTWARE. 23 | 24 | #import 25 | 26 | /** 27 | IQToolbar for IQKeyboardManager. 28 | */ 29 | @interface IQToolbar : UIToolbar 30 | 31 | /** 32 | Title font for toolbar. 33 | */ 34 | @property(nullable, nonatomic, strong) UIFont *titleFont; 35 | 36 | /** 37 | Toolbar done title 38 | */ 39 | @property(nullable, nonatomic, strong) NSString *doneTitle; 40 | 41 | /** 42 | Toolbar done image 43 | */ 44 | @property(nullable, nonatomic, strong) UIImage *doneImage; 45 | 46 | /** 47 | Toolbar title 48 | */ 49 | @property(nullable, nonatomic, strong) NSString *title; 50 | 51 | /** 52 | Optional target & action to behave toolbar title button as clickable button 53 | 54 | @param target Target object. 55 | @param action Target Selector. 56 | */ 57 | -(void)setTitleTarget:(nullable id)target action:(nullable SEL)action; 58 | 59 | /** 60 | Customized Invocation to be called on title button action. titleInvocation is internally created using setTitleTarget:action: method. 61 | */ 62 | @property (nullable, strong, nonatomic) NSInvocation *titleInvocation; 63 | 64 | @end 65 | 66 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | **YourView** is a desktop App in MacOS. You can use it to view iOS App's view hierarchy. I think it could be a `basic project` in app view visualization. Depend on it, you may do your add-on functions's development such as visual tracking like mixpanel, iOS reverse tool just like reveal, frida, even though, you can develop android studio plugin for view debugging. Now I treat it as a iOS reverse tool. Now it is a version of 0.1, I will maintain continuedly. 2 | 3 | ## Quick Start 4 | 5 | - Open `YourView/iOS/TalkingDataSDKDemo/TalkingDataSDKDemo.xcodeproj`. It's a demo project with the libyourview source code as framework in it. Build and Run,keep the demo app in foreground. 6 | 7 | - Open `YourView/MacOS/YourView/YourView.xcodeproj`.Build and Run. 8 | 9 | ![](./img/buildrun.png) 10 | 11 | - Input IP(only ip,without port and scheme) address ,click connect 12 | 13 | ![](./img/connect.png) 14 | 15 | - Enjoy it! 16 | 17 | ![](./img/usage.png) 18 | 19 | ## Demo 20 | 21 | Camera control: 22 | 23 | ![](./img/camera.gif) 24 | 25 | 26 | 27 | Search and Live edit 28 | 29 | ![](./img/shake.gif) 30 | 31 | ## Tips 32 | 33 | - Now the `libyourview.framework` is build as a static libiary. If you want to get a dynamic libiary,you must change the mach-o type in the project settings and build it by yourself. 34 | - You don't need write any code. Once the framework is loaded,it will start a server automatily 35 | - The iOS UIView serilization operation will block the main thread.It maybe faster in Simulator than iOS devices. 36 | 37 | ## TODO 38 | - Auto network scan using bonjour service like reveal. 39 | - Make the right panel powerful. Now it is hard coded.Make it dynamic,more functions in Object explore just like flex. 40 | - Add the the layout,gesture,viewController infomation to the left tree,just like reveal or Xcode. 41 | - User experience improvment. 42 | - Art works. 43 | - Script editor and inject support,such as JSPatch. 44 | - bug fix. 45 | 46 | ## Explore others App 47 | 48 | - Build this project as a dynamic lib and inject the dynamic lib into others app by using MonkeyDev,IPAPatch,etc. Do it yourself. 49 | 50 | ![](./img/wechat.jpg) 51 | 52 | 53 | ## Thanks 54 | 55 | [swisspol/GCDWebServer](https://github.com/swisspol/GCDWebServer ) This project provide a good http service in iOS App. 56 | 57 | ## Links 58 | - [TalkingData](https://github.com/TalkingData) 59 | 60 | ## License 61 | 62 | [LICENSE](./LICENSE) 63 | 64 | 65 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/IQKeyboardManager/Constants/IQKeyboardManagerConstantsInternal.h: -------------------------------------------------------------------------------- 1 | // 2 | // IQKeyboardManagerConstantsInternal.h 3 | // https://github.com/hackiftekhar/IQKeyboardManager 4 | // Copyright (c) 2013-16 Iftekhar Qurashi. 5 | // 6 | // Permission is hereby granted, free of charge, to any person obtaining a copy 7 | // of this software and associated documentation files (the "Software"), to deal 8 | // in the Software without restriction, including without limitation the rights 9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | // copies of the Software, and to permit persons to whom the Software is 11 | // furnished to do so, subject to the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included in 14 | // all copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | // THE SOFTWARE. 23 | 24 | #ifndef IQKeyboardManagerConstantsInternal_h 25 | #define IQKeyboardManagerConstantsInternal_h 26 | 27 | 28 | ///----------------------------------- 29 | /// @name IQLayoutGuidePosition 30 | ///----------------------------------- 31 | 32 | /** 33 | `IQLayoutGuidePositionNone` 34 | If there are no IQLayoutGuideConstraint associated with viewController 35 | 36 | `IQLayoutGuidePositionTop` 37 | If provided IQLayoutGuideConstraint is associated with with viewController topLayoutGuide 38 | 39 | `IQLayoutGuidePositionBottom` 40 | If provided IQLayoutGuideConstraint is associated with with viewController bottomLayoutGuide 41 | */ 42 | typedef NS_ENUM(NSInteger, IQLayoutGuidePosition) { 43 | IQLayoutGuidePositionNone, 44 | IQLayoutGuidePositionTop, 45 | IQLayoutGuidePositionBottom, 46 | }; 47 | 48 | //Xcode 8 compatibility check 49 | #ifdef NSFoundationVersionNumber_iOS_9_x_Max 50 | #define IQ_IS_IOS10_OR_GREATER (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_9_x_Max) 51 | #else 52 | #define IQ_IS_IOS10_OR_GREATER NO 53 | #endif 54 | 55 | 56 | #endif 57 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/IQKeyboardManager/Categories/IQUITextFieldView+Additions.m: -------------------------------------------------------------------------------- 1 | // 2 | // IQUITextFieldView+Additions.m 3 | // https://github.com/hackiftekhar/IQKeyboardManager 4 | // Copyright (c) 2013-16 Iftekhar Qurashi. 5 | // 6 | // Permission is hereby granted, free of charge, to any person obtaining a copy 7 | // of this software and associated documentation files (the "Software"), to deal 8 | // in the Software without restriction, including without limitation the rights 9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | // copies of the Software, and to permit persons to whom the Software is 11 | // furnished to do so, subject to the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included in 14 | // all copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | // THE SOFTWARE. 23 | 24 | #import "IQUITextFieldView+Additions.h" 25 | #import 26 | 27 | @implementation UIView (Additions) 28 | 29 | -(void)setKeyboardDistanceFromTextField:(CGFloat)keyboardDistanceFromTextField 30 | { 31 | //Can't be less than zero. Minimum is zero. 32 | keyboardDistanceFromTextField = MAX(keyboardDistanceFromTextField, 0); 33 | 34 | objc_setAssociatedObject(self, @selector(keyboardDistanceFromTextField), [NSNumber numberWithFloat:keyboardDistanceFromTextField], OBJC_ASSOCIATION_RETAIN_NONATOMIC); 35 | } 36 | 37 | -(CGFloat)keyboardDistanceFromTextField 38 | { 39 | NSNumber *keyboardDistanceFromTextField = objc_getAssociatedObject(self, @selector(keyboardDistanceFromTextField)); 40 | 41 | return (keyboardDistanceFromTextField)?[keyboardDistanceFromTextField floatValue]:kIQUseDefaultKeyboardDistance; 42 | } 43 | 44 | @end 45 | 46 | ///------------------------------------ 47 | /// @name keyboardDistanceFromTextField 48 | ///------------------------------------ 49 | 50 | /** 51 | Uses default keyboard distance for textField. 52 | */ 53 | CGFloat const kIQUseDefaultKeyboardDistance = CGFLOAT_MAX; 54 | 55 | -------------------------------------------------------------------------------- /iOS/libyourview/vendor/GCDWebServer/Requests/GCDWebServerURLEncodedFormRequest.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (c) 2012-2019, Pierre-Olivier Latour 3 | All rights reserved. 4 | 5 | Redistribution and use in source and binary forms, with or without 6 | modification, are permitted provided that the following conditions are met: 7 | * Redistributions of source code must retain the above copyright 8 | notice, this list of conditions and the following disclaimer. 9 | * Redistributions in binary form must reproduce the above copyright 10 | notice, this list of conditions and the following disclaimer in the 11 | documentation and/or other materials provided with the distribution. 12 | * The name of Pierre-Olivier Latour may not be used to endorse 13 | or promote products derived from this software without specific 14 | prior written permission. 15 | 16 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 17 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 18 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 19 | DISCLAIMED. IN NO EVENT SHALL PIERRE-OLIVIER LATOUR BE LIABLE FOR ANY 20 | DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 21 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 22 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 23 | ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 25 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 | */ 27 | 28 | #import "GCDWebServerDataRequest.h" 29 | 30 | NS_ASSUME_NONNULL_BEGIN 31 | 32 | /** 33 | * The GCDWebServerURLEncodedFormRequest subclass of GCDWebServerRequest 34 | * parses the body of the HTTP request as a URL encoded form using 35 | * GCDWebServerParseURLEncodedForm(). 36 | */ 37 | @interface GCDWebServerURLEncodedFormRequest : GCDWebServerDataRequest 38 | 39 | /** 40 | * Returns the unescaped control names and values for the URL encoded form. 41 | * 42 | * The text encoding used to interpret the data is extracted from the 43 | * "Content-Type" header or defaults to UTF-8. 44 | */ 45 | @property(nonatomic, readonly) NSDictionary* arguments; 46 | 47 | /** 48 | * Returns the MIME type for URL encoded forms 49 | * i.e. "application/x-www-form-urlencoded". 50 | */ 51 | + (NSString*)mimeType; 52 | 53 | @end 54 | 55 | NS_ASSUME_NONNULL_END 56 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/AppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.m 3 | // TalkingDataSDKDemo 4 | // 5 | // Created by liweiqiang on 2017/5/22. 6 | // Copyright © 2017年 TendCloud. All rights reserved. 7 | // 8 | 9 | #import "AppDelegate.h" 10 | 11 | 12 | @interface AppDelegate () 13 | #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 100000 14 | 15 | #endif 16 | 17 | @property (strong, nonatomic) CLLocationManager *locationManager; 18 | 19 | @end 20 | 21 | @implementation AppDelegate 22 | 23 | 24 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 25 | // Override point for customization after application launch. 26 | 27 | 28 | 29 | 30 | 31 | self.locationManager = [[CLLocationManager alloc] init]; 32 | _locationManager.delegate = self; 33 | _locationManager.distanceFilter = 10.0; 34 | _locationManager.desiredAccuracy = kCLLocationAccuracyBest; 35 | if ([UIDevice currentDevice].systemVersion.floatValue >= 8.0f) { 36 | [_locationManager requestWhenInUseAuthorization]; 37 | } 38 | [_locationManager startUpdatingLocation]; 39 | 40 | return YES; 41 | } 42 | 43 | - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { 44 | NSLog(@"Register for notifications with device token:%@", deviceToken); 45 | 46 | } 47 | 48 | - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error { 49 | NSLog(@"Fail to register for remote notifications with error:%@", error); 50 | } 51 | 52 | - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { 53 | NSLog(@"Receive remote notification:%@", userInfo); 54 | 55 | } 56 | 57 | #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 100000 58 | - (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)())completionHandler { 59 | 60 | completionHandler(); 61 | } 62 | #endif 63 | 64 | - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations { 65 | NSLog(@"Update location:%@", locations); 66 | } 67 | 68 | 69 | 70 | 71 | -(BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url{ 72 | return YES; 73 | 74 | } 75 | -(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{ 76 | return YES; 77 | } 78 | 79 | 80 | @end 81 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/eAuth/TDEAAuthViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // TDEAAuthViewController.m 3 | // TalkingDataSDKDemo 4 | // 5 | // Created by liweiqiang on 2018/1/9. 6 | // Copyright © 2018年 TendCloud. All rights reserved. 7 | // 8 | 9 | #import "TDEAAuthViewController.h" 10 | 11 | @interface TDEAAuthViewController () 12 | 13 | @property (weak, nonatomic) IBOutlet UITextField *accountNameField; 14 | @property (weak, nonatomic) IBOutlet UITextField *countryCodeField; 15 | @property (weak, nonatomic) IBOutlet UITextField *phoneNumberField; 16 | @property (weak, nonatomic) IBOutlet UITextField *authCodeTypeField; 17 | @property (weak, nonatomic) IBOutlet UITextField *smsIDField; 18 | @property (weak, nonatomic) IBOutlet UITextField *authCodeField; 19 | @property (weak, nonatomic) IBOutlet UIButton *applyAuthCodeButton; 20 | @property (strong, nonatomic) NSMutableArray *typePickerData; 21 | @property (strong, nonatomic) UIPickerView *typePickerView; 22 | @property (strong, nonatomic) NSString *requestId; 23 | 24 | @end 25 | 26 | @implementation TDEAAuthViewController 27 | 28 | - (void)viewDidLoad { 29 | [super viewDidLoad]; 30 | // Do any additional setup after loading the view. 31 | self.typePickerData = [NSMutableArray array]; 32 | [self.typePickerData addObject:@"短信认证"]; 33 | [self.typePickerData addObject:@"语音认证"]; 34 | 35 | self.typePickerView = [[UIPickerView alloc] init]; 36 | self.typePickerView.dataSource = self; 37 | self.typePickerView.delegate = self; 38 | self.typePickerView.showsSelectionIndicator = YES; 39 | 40 | self.authCodeTypeField.inputView = self.typePickerView; 41 | self.authCodeTypeField.text = self.typePickerData[0]; 42 | } 43 | #pragma mark - Picker view data source 44 | 45 | - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView { 46 | return 1; 47 | } 48 | 49 | - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component { 50 | return self.typePickerData.count; 51 | } 52 | 53 | #pragma mark Picker Delegate Methods 54 | 55 | - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component { 56 | return [self.typePickerData objectAtIndex:row]; 57 | } 58 | 59 | - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component { 60 | self.authCodeTypeField.text = [self.typePickerData objectAtIndex:row]; 61 | } 62 | 63 | #pragma mark - Control event 64 | 65 | - (IBAction)useTDID { 66 | } 67 | 68 | - (IBAction)apply { 69 | 70 | } 71 | 72 | - (IBAction)verify { 73 | 74 | } 75 | 76 | #pragma mark - TalkingData eAuth Delegate 77 | 78 | 79 | 80 | 81 | @end 82 | -------------------------------------------------------------------------------- /iOS/libyourview/vendor/GCDWebServer/Requests/GCDWebServerURLEncodedFormRequest.m: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (c) 2012-2019, Pierre-Olivier Latour 3 | All rights reserved. 4 | 5 | Redistribution and use in source and binary forms, with or without 6 | modification, are permitted provided that the following conditions are met: 7 | * Redistributions of source code must retain the above copyright 8 | notice, this list of conditions and the following disclaimer. 9 | * Redistributions in binary form must reproduce the above copyright 10 | notice, this list of conditions and the following disclaimer in the 11 | documentation and/or other materials provided with the distribution. 12 | * The name of Pierre-Olivier Latour may not be used to endorse 13 | or promote products derived from this software without specific 14 | prior written permission. 15 | 16 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 17 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 18 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 19 | DISCLAIMED. IN NO EVENT SHALL PIERRE-OLIVIER LATOUR BE LIABLE FOR ANY 20 | DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 21 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 22 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 23 | ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 25 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 | */ 27 | 28 | #if !__has_feature(objc_arc) 29 | #error GCDWebServer requires ARC 30 | #endif 31 | 32 | #import "GCDWebServerPrivate.h" 33 | 34 | @implementation GCDWebServerURLEncodedFormRequest 35 | 36 | + (NSString*)mimeType { 37 | return @"application/x-www-form-urlencoded"; 38 | } 39 | 40 | - (BOOL)close:(NSError**)error { 41 | if (![super close:error]) { 42 | return NO; 43 | } 44 | 45 | NSString* charset = GCDWebServerExtractHeaderValueParameter(self.contentType, @"charset"); 46 | NSString* string = [[NSString alloc] initWithData:self.data encoding:GCDWebServerStringEncodingFromCharset(charset)]; 47 | _arguments = GCDWebServerParseURLEncodedForm(string); 48 | return YES; 49 | } 50 | 51 | - (NSString*)description { 52 | NSMutableString* description = [NSMutableString stringWithString:[super description]]; 53 | [description appendString:@"\n"]; 54 | for (NSString* argument in [[_arguments allKeys] sortedArrayUsingSelector:@selector(compare:)]) { 55 | [description appendFormat:@"\n%@ = %@", argument, [_arguments objectForKey:argument]]; 56 | } 57 | return description; 58 | } 59 | 60 | @end 61 | -------------------------------------------------------------------------------- /iOS/libyourview/vendor/GCDWebServer/Requests/GCDWebServerDataRequest.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (c) 2012-2019, Pierre-Olivier Latour 3 | All rights reserved. 4 | 5 | Redistribution and use in source and binary forms, with or without 6 | modification, are permitted provided that the following conditions are met: 7 | * Redistributions of source code must retain the above copyright 8 | notice, this list of conditions and the following disclaimer. 9 | * Redistributions in binary form must reproduce the above copyright 10 | notice, this list of conditions and the following disclaimer in the 11 | documentation and/or other materials provided with the distribution. 12 | * The name of Pierre-Olivier Latour may not be used to endorse 13 | or promote products derived from this software without specific 14 | prior written permission. 15 | 16 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 17 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 18 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 19 | DISCLAIMED. IN NO EVENT SHALL PIERRE-OLIVIER LATOUR BE LIABLE FOR ANY 20 | DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 21 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 22 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 23 | ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 25 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 | */ 27 | 28 | #import "GCDWebServerRequest.h" 29 | 30 | NS_ASSUME_NONNULL_BEGIN 31 | 32 | /** 33 | * The GCDWebServerDataRequest subclass of GCDWebServerRequest stores the body 34 | * of the HTTP request in memory. 35 | */ 36 | @interface GCDWebServerDataRequest : GCDWebServerRequest 37 | 38 | /** 39 | * Returns the data for the request body. 40 | */ 41 | @property(nonatomic, readonly) NSData* data; 42 | 43 | @end 44 | 45 | @interface GCDWebServerDataRequest (Extensions) 46 | 47 | /** 48 | * Returns the data for the request body interpreted as text. If the content 49 | * type of the body is not a text one, or if an error occurs, nil is returned. 50 | * 51 | * The text encoding used to interpret the data is extracted from the 52 | * "Content-Type" header or defaults to UTF-8. 53 | */ 54 | @property(nonatomic, readonly, nullable) NSString* text; 55 | 56 | /** 57 | * Returns the data for the request body interpreted as a JSON object. If the 58 | * content type of the body is not JSON, or if an error occurs, nil is returned. 59 | */ 60 | @property(nonatomic, readonly, nullable) id jsonObject; 61 | 62 | @end 63 | 64 | NS_ASSUME_NONNULL_END 65 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "20x20", 5 | "idiom" : "iphone", 6 | "filename" : "Icon-20@2x.png", 7 | "scale" : "2x" 8 | }, 9 | { 10 | "size" : "20x20", 11 | "idiom" : "iphone", 12 | "filename" : "Icon-20@3x.png", 13 | "scale" : "3x" 14 | }, 15 | { 16 | "size" : "29x29", 17 | "idiom" : "iphone", 18 | "filename" : "Icon-29@2x.png", 19 | "scale" : "2x" 20 | }, 21 | { 22 | "size" : "29x29", 23 | "idiom" : "iphone", 24 | "filename" : "Icon-29@3x.png", 25 | "scale" : "3x" 26 | }, 27 | { 28 | "size" : "40x40", 29 | "idiom" : "iphone", 30 | "filename" : "Icon-40@2x.png", 31 | "scale" : "2x" 32 | }, 33 | { 34 | "size" : "40x40", 35 | "idiom" : "iphone", 36 | "filename" : "Icon-40@3x.png", 37 | "scale" : "3x" 38 | }, 39 | { 40 | "size" : "60x60", 41 | "idiom" : "iphone", 42 | "filename" : "Icon-60@2x.png", 43 | "scale" : "2x" 44 | }, 45 | { 46 | "size" : "60x60", 47 | "idiom" : "iphone", 48 | "filename" : "Icon-60@3x.png", 49 | "scale" : "3x" 50 | }, 51 | { 52 | "size" : "20x20", 53 | "idiom" : "ipad", 54 | "filename" : "Icon-20.png", 55 | "scale" : "1x" 56 | }, 57 | { 58 | "size" : "20x20", 59 | "idiom" : "ipad", 60 | "filename" : "Icon-20@2x.png", 61 | "scale" : "2x" 62 | }, 63 | { 64 | "size" : "29x29", 65 | "idiom" : "ipad", 66 | "filename" : "Icon-29.png", 67 | "scale" : "1x" 68 | }, 69 | { 70 | "size" : "29x29", 71 | "idiom" : "ipad", 72 | "filename" : "Icon-29@2x.png", 73 | "scale" : "2x" 74 | }, 75 | { 76 | "size" : "40x40", 77 | "idiom" : "ipad", 78 | "filename" : "Icon-40.png", 79 | "scale" : "1x" 80 | }, 81 | { 82 | "size" : "40x40", 83 | "idiom" : "ipad", 84 | "filename" : "Icon-40@2x.png", 85 | "scale" : "2x" 86 | }, 87 | { 88 | "size" : "76x76", 89 | "idiom" : "ipad", 90 | "filename" : "Icon-76.png", 91 | "scale" : "1x" 92 | }, 93 | { 94 | "size" : "76x76", 95 | "idiom" : "ipad", 96 | "filename" : "Icon-76@2x.png", 97 | "scale" : "2x" 98 | }, 99 | { 100 | "size" : "83.5x83.5", 101 | "idiom" : "ipad", 102 | "filename" : "Icon-83.5@2x.png", 103 | "scale" : "2x" 104 | }, 105 | { 106 | "idiom" : "ios-marketing", 107 | "size" : "1024x1024", 108 | "scale" : "1x" 109 | } 110 | ], 111 | "info" : { 112 | "version" : 1, 113 | "author" : "xcode" 114 | } 115 | } -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/IQKeyboardManager/Categories/IQNSArray+Sort.m: -------------------------------------------------------------------------------- 1 | // 2 | // NSArray+Sort.m 3 | // https://github.com/hackiftekhar/IQKeyboardManager 4 | // Copyright (c) 2013-16 Iftekhar Qurashi. 5 | // 6 | // Permission is hereby granted, free of charge, to any person obtaining a copy 7 | // of this software and associated documentation files (the "Software"), to deal 8 | // in the Software without restriction, including without limitation the rights 9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | // copies of the Software, and to permit persons to whom the Software is 11 | // furnished to do so, subject to the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included in 14 | // all copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | // THE SOFTWARE. 23 | 24 | #import "IQNSArray+Sort.h" 25 | #import "IQUIView+Hierarchy.h" 26 | 27 | #import 28 | 29 | @implementation NSArray (IQ_NSArray_Sort) 30 | 31 | - (NSArray*)sortedArrayByTag 32 | { 33 | return [self sortedArrayUsingComparator:^NSComparisonResult(UIView *view1, UIView *view2) { 34 | 35 | if ([view1 respondsToSelector:@selector(tag)] && [view2 respondsToSelector:@selector(tag)]) 36 | { 37 | if ([view1 tag] < [view2 tag]) return NSOrderedAscending; 38 | 39 | else if ([view1 tag] > [view2 tag]) return NSOrderedDescending; 40 | 41 | else return NSOrderedSame; 42 | } 43 | else 44 | return NSOrderedSame; 45 | }]; 46 | } 47 | 48 | - (NSArray*)sortedArrayByPosition 49 | { 50 | return [self sortedArrayUsingComparator:^NSComparisonResult(UIView *view1, UIView *view2) { 51 | 52 | CGFloat x1 = CGRectGetMinX(view1.frame); 53 | CGFloat y1 = CGRectGetMinY(view1.frame); 54 | CGFloat x2 = CGRectGetMinX(view2.frame); 55 | CGFloat y2 = CGRectGetMinY(view2.frame); 56 | 57 | if (y1 < y2) return NSOrderedAscending; 58 | 59 | else if (y1 > y2) return NSOrderedDescending; 60 | 61 | //Else both y are same so checking for x positions 62 | else if (x1 < x2) return NSOrderedAscending; 63 | 64 | else if (x1 > x2) return NSOrderedDescending; 65 | 66 | else return NSOrderedSame; 67 | }]; 68 | } 69 | 70 | 71 | @end 72 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/IQKeyboardManager/IQToolbar/IQTitleBarButtonItem.h: -------------------------------------------------------------------------------- 1 | // 2 | // IQTitleBarButtonItem.h 3 | // https://github.com/hackiftekhar/IQKeyboardManager 4 | // Copyright (c) 2013-16 Iftekhar Qurashi. 5 | // 6 | // Permission is hereby granted, free of charge, to any person obtaining a copy 7 | // of this software and associated documentation files (the "Software"), to deal 8 | // in the Software without restriction, including without limitation the rights 9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | // copies of the Software, and to permit persons to whom the Software is 11 | // furnished to do so, subject to the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included in 14 | // all copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | // THE SOFTWARE. 23 | 24 | #import 25 | #import "IQKeyboardManagerConstants.h" 26 | #import "IQBarButtonItem.h" 27 | 28 | /** 29 | BarButtonItem with title text. 30 | */ 31 | @interface IQTitleBarButtonItem : IQBarButtonItem 32 | 33 | /** 34 | Font to be used in bar button. Default is (system font 12.0 bold). 35 | */ 36 | @property(nullable, nonatomic, strong) UIFont *font; 37 | 38 | /** 39 | selectableTextColor to be used for displaying button text when button is enabled. 40 | */ 41 | @property(nullable, nonatomic, strong) UIColor *selectableTextColor; 42 | 43 | /** 44 | Initialize with frame and title. 45 | 46 | @param title Title of barButtonItem. 47 | */ 48 | -(nonnull instancetype)initWithTitle:(nullable NSString *)title NS_DESIGNATED_INITIALIZER; 49 | 50 | /** 51 | Optional target & action to behave toolbar title button as clickable button 52 | 53 | @param target Target object. 54 | @param action Target Selector. 55 | */ 56 | -(void)setTitleTarget:(nullable id)target action:(nullable SEL)action; 57 | 58 | /** 59 | Customized Invocation to be called on title button action. titleInvocation is internally created using setTitleTarget:action: method. 60 | */ 61 | @property (nullable, strong, nonatomic) NSInvocation *titleInvocation; 62 | 63 | /** 64 | Unavailable. Please use initWithFrame:title: method 65 | */ 66 | -(nonnull instancetype)init NS_UNAVAILABLE; 67 | 68 | /** 69 | Unavailable. Please use initWithFrame:title: method 70 | */ 71 | -(nonnull instancetype)initWithCoder:(nullable NSCoder *)aDecoder NS_UNAVAILABLE; 72 | 73 | /** 74 | Unavailable. Please use initWithFrame:title: method 75 | */ 76 | + (nonnull instancetype)new NS_UNAVAILABLE; 77 | 78 | @end 79 | -------------------------------------------------------------------------------- /iOS/libyourview/serializer/UIView+YVNodeInfo.m: -------------------------------------------------------------------------------- 1 | // 2 | // UIView+YVNodeInfo.m 3 | // libyourview 4 | // 5 | // Created by bliss_ddo on 2019/4/24. 6 | // Copyright © 2019 bliss_ddo. All rights reserved. 7 | // 8 | 9 | #import "UIView+YVNodeInfo.h" 10 | 11 | @implementation UIView (YVNodeInfo) 12 | -(NSDictionary*)nodeInfo 13 | { 14 | NSString * _snapshot = [self _snapWithSublayer:NO]; 15 | NSString * _localframe = [self _localframe]; 16 | NSString * _windowframe = [self _windowFrame]; 17 | NSNumber * _isOffScreen = [self _isOffScreen]; 18 | NSDictionary * selfinfo = @{ 19 | @"snapshot":_snapshot, 20 | @"localframe":_localframe, 21 | @"windowframe":_windowframe, 22 | @"isoffscreen":_isOffScreen 23 | }; 24 | NSDictionary * superinfo = [super nodeInfo]; 25 | NSMutableDictionary * result = [NSMutableDictionary dictionary]; 26 | [result addEntriesFromDictionary:selfinfo]; 27 | [result addEntriesFromDictionary:superinfo]; 28 | return result.copy; 29 | } 30 | 31 | -(NSString*)_windowFrame 32 | { 33 | CGRect windowRect = [UIScreen mainScreen].bounds; 34 | windowRect = [self convertRect:self.bounds toView:nil]; 35 | return NSStringFromCGRect(windowRect); 36 | } 37 | 38 | -(NSString*)_localframe 39 | { 40 | return NSStringFromCGRect(self.frame); 41 | } 42 | 43 | 44 | -(NSString*)_snapWithSublayer:(BOOL)containSublayer 45 | { 46 | 47 | NSMutableArray * restoreArray = [NSMutableArray array]; 48 | if (!containSublayer) { 49 | for (CALayer*ly in self.layer.sublayers) { 50 | if (!ly.hidden && ![ly isKindOfClass:NSClassFromString(@"_UILabelContentLayer")]) { 51 | ly.hidden = YES; 52 | [restoreArray addObject:ly]; 53 | } 54 | } 55 | } 56 | UIGraphicsBeginImageContextWithOptions(self.frame.size, NO, 0.0); 57 | [self.layer renderInContext:UIGraphicsGetCurrentContext()]; 58 | UIImage *snapshot = UIGraphicsGetImageFromCurrentImageContext(); 59 | UIGraphicsEndImageContext(); 60 | NSData * imageData = UIImagePNGRepresentation(snapshot); 61 | NSString * imageStringBase64 = [imageData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed]; 62 | if (!containSublayer) { 63 | for (CALayer*ly in restoreArray) { 64 | ly.hidden = NO; 65 | } 66 | } 67 | if (imageStringBase64 == nil) { 68 | NSLog(@"view snap shot is nil"); 69 | NSLog(@"[❌%@]",self); 70 | } 71 | return imageStringBase64==nil ?@"":imageStringBase64; 72 | } 73 | 74 | -(NSNumber*)_isOffScreen 75 | { 76 | CGRect windowRect = [UIScreen mainScreen].bounds; 77 | windowRect = [self convertRect:self.bounds toView:nil]; 78 | CGFloat x = windowRect.origin.x; 79 | CGFloat y = windowRect.origin.y; 80 | CGFloat screenWidth = [[UIScreen mainScreen]bounds].size.width; 81 | CGFloat screenHeight = [[UIScreen mainScreen]bounds].size.height; 82 | BOOL isoffscreen = NO; 83 | if (x < 0 || y < 0 || x >= screenWidth || y >= screenHeight) { 84 | isoffscreen = YES; 85 | } 86 | return @(isoffscreen); 87 | } 88 | 89 | @end 90 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/TDHomeTableViewCell.m: -------------------------------------------------------------------------------- 1 | // 2 | // TDHomeTableViewCell.m 3 | // TalkingDataSDKDemo 4 | // 5 | // Created by liweiqiang on 2017/5/22. 6 | // Copyright © 2017年 TendCloud. All rights reserved. 7 | // 8 | 9 | #import "TDHomeTableViewCell.h" 10 | 11 | @implementation TDHomeTableViewCell 12 | 13 | - (void)awakeFromNib { 14 | [super awakeFromNib]; 15 | // Initialization code 16 | self.selectImage.translatesAutoresizingMaskIntoConstraints = NO; 17 | 18 | NSLayoutConstraint *top = [NSLayoutConstraint constraintWithItem:self.selectImage 19 | attribute:NSLayoutAttributeTop 20 | relatedBy:NSLayoutRelationEqual 21 | toItem:self.textLabel 22 | attribute:NSLayoutAttributeTop 23 | multiplier:1 24 | constant:0]; 25 | NSLayoutConstraint *right = [NSLayoutConstraint constraintWithItem:self.selectImage 26 | attribute:NSLayoutAttributeRight 27 | relatedBy:NSLayoutRelationEqual 28 | toItem:self.contentView 29 | attribute:NSLayoutAttributeRight 30 | multiplier:1 31 | constant:-8]; 32 | NSLayoutConstraint *width = [NSLayoutConstraint constraintWithItem:self.selectImage 33 | attribute:NSLayoutAttributeWidth 34 | relatedBy:NSLayoutRelationEqual 35 | toItem:self.textLabel 36 | attribute:NSLayoutAttributeHeight 37 | multiplier:1 38 | constant:0]; 39 | NSLayoutConstraint *height = [NSLayoutConstraint constraintWithItem:self.selectImage 40 | attribute:NSLayoutAttributeHeight 41 | relatedBy:NSLayoutRelationEqual 42 | toItem:self.textLabel 43 | attribute:NSLayoutAttributeHeight 44 | multiplier:1 45 | constant:0]; 46 | [self.contentView addConstraints:@[top, right, width, height]]; 47 | } 48 | 49 | @end 50 | -------------------------------------------------------------------------------- /iOS/libyourview/vendor/GCDWebServer/Responses/GCDWebServerStreamedResponse.m: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (c) 2012-2019, Pierre-Olivier Latour 3 | All rights reserved. 4 | 5 | Redistribution and use in source and binary forms, with or without 6 | modification, are permitted provided that the following conditions are met: 7 | * Redistributions of source code must retain the above copyright 8 | notice, this list of conditions and the following disclaimer. 9 | * Redistributions in binary form must reproduce the above copyright 10 | notice, this list of conditions and the following disclaimer in the 11 | documentation and/or other materials provided with the distribution. 12 | * The name of Pierre-Olivier Latour may not be used to endorse 13 | or promote products derived from this software without specific 14 | prior written permission. 15 | 16 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 17 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 18 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 19 | DISCLAIMED. IN NO EVENT SHALL PIERRE-OLIVIER LATOUR BE LIABLE FOR ANY 20 | DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 21 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 22 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 23 | ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 25 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 | */ 27 | 28 | #if !__has_feature(objc_arc) 29 | #error GCDWebServer requires ARC 30 | #endif 31 | 32 | #import "GCDWebServerPrivate.h" 33 | 34 | @implementation GCDWebServerStreamedResponse { 35 | GCDWebServerAsyncStreamBlock _block; 36 | } 37 | 38 | @dynamic contentType; 39 | 40 | + (instancetype)responseWithContentType:(NSString*)type streamBlock:(GCDWebServerStreamBlock)block { 41 | return [(GCDWebServerStreamedResponse*)[[self class] alloc] initWithContentType:type streamBlock:block]; 42 | } 43 | 44 | + (instancetype)responseWithContentType:(NSString*)type asyncStreamBlock:(GCDWebServerAsyncStreamBlock)block { 45 | return [(GCDWebServerStreamedResponse*)[[self class] alloc] initWithContentType:type asyncStreamBlock:block]; 46 | } 47 | 48 | - (instancetype)initWithContentType:(NSString*)type streamBlock:(GCDWebServerStreamBlock)block { 49 | return [self initWithContentType:type 50 | asyncStreamBlock:^(GCDWebServerBodyReaderCompletionBlock completionBlock) { 51 | NSError* error = nil; 52 | NSData* data = block(&error); 53 | completionBlock(data, error); 54 | }]; 55 | } 56 | 57 | - (instancetype)initWithContentType:(NSString*)type asyncStreamBlock:(GCDWebServerAsyncStreamBlock)block { 58 | if ((self = [super init])) { 59 | _block = [block copy]; 60 | 61 | self.contentType = type; 62 | } 63 | return self; 64 | } 65 | 66 | - (void)asyncReadDataWithCompletion:(GCDWebServerBodyReaderCompletionBlock)block { 67 | _block(block); 68 | } 69 | 70 | - (NSString*)description { 71 | NSMutableString* description = [NSMutableString stringWithString:[super description]]; 72 | [description appendString:@"\n\n"]; 73 | return description; 74 | } 75 | 76 | @end 77 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/AppAnalytics/TDAAAccountTableViewCell.m: -------------------------------------------------------------------------------- 1 | // 2 | // TDAAAccountTableViewCell.m 3 | // TalkingDataSDKDemo 4 | // 5 | // Created by liweiqiang on 2017/6/26. 6 | // Copyright © 2017年 TendCloud. All rights reserved. 7 | // 8 | 9 | #import "TDAAAccountTableViewCell.h" 10 | 11 | @interface TDAAAccountTableViewCell () 12 | 13 | @property (weak, nonatomic) IBOutlet UITextField *accountIDField; 14 | @property (weak, nonatomic) IBOutlet UITextField *accountTypeField; 15 | @property (weak, nonatomic) IBOutlet UITextField *accountNameField; 16 | @property (strong, nonatomic) NSMutableArray *typePickerData; 17 | @property (strong, nonatomic) UIPickerView *typePickerView; 18 | 19 | @end 20 | 21 | 22 | @implementation TDAAAccountTableViewCell 23 | 24 | - (void)awakeFromNib { 25 | [super awakeFromNib]; 26 | // Initialization code 27 | self.typePickerData = [NSMutableArray array]; 28 | [self.typePickerData addObject:@"匿名账户"]; 29 | [self.typePickerData addObject:@"显性注册账户"]; 30 | [self.typePickerData addObject:@"新浪微博"]; 31 | [self.typePickerData addObject:@"QQ账户"]; 32 | [self.typePickerData addObject:@"腾讯微博"]; 33 | [self.typePickerData addObject:@"91账户"]; 34 | [self.typePickerData addObject:@"微信"]; 35 | [self.typePickerData addObject:@"预留1"]; 36 | [self.typePickerData addObject:@"预留2"]; 37 | [self.typePickerData addObject:@"预留3"]; 38 | [self.typePickerData addObject:@"预留4"]; 39 | [self.typePickerData addObject:@"预留5"]; 40 | [self.typePickerData addObject:@"预留6"]; 41 | [self.typePickerData addObject:@"预留7"]; 42 | [self.typePickerData addObject:@"预留8"]; 43 | [self.typePickerData addObject:@"预留9"]; 44 | [self.typePickerData addObject:@"预留10"]; 45 | 46 | self.typePickerView = [[UIPickerView alloc] init]; 47 | self.typePickerView.dataSource = self; 48 | self.typePickerView.delegate = self; 49 | self.typePickerView.tag = 1; 50 | self.typePickerView.showsSelectionIndicator = YES; 51 | self.accountTypeField.inputView = self.typePickerView; 52 | } 53 | 54 | #pragma mark - Picker view data source 55 | 56 | - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView { 57 | return 1; 58 | } 59 | 60 | - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component { 61 | switch (pickerView.tag) { 62 | case 1: 63 | return self.typePickerData.count; 64 | break; 65 | default: 66 | break; 67 | } 68 | 69 | return 0; 70 | } 71 | 72 | #pragma mark Picker Delegate Methods 73 | 74 | - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component { 75 | switch (pickerView.tag) { 76 | case 1: 77 | return [self.typePickerData objectAtIndex:row]; 78 | break; 79 | default: 80 | break; 81 | } 82 | 83 | return nil; 84 | } 85 | 86 | - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component { 87 | switch (pickerView.tag) { 88 | case 1: 89 | self.accountTypeField.text = [self.typePickerData objectAtIndex:row]; 90 | break; 91 | default: 92 | break; 93 | } 94 | } 95 | 96 | #pragma mark - Control event 97 | 98 | - (IBAction)registerAccount { 99 | 100 | } 101 | 102 | - (IBAction)loginAccount { 103 | 104 | } 105 | 106 | 107 | @end 108 | -------------------------------------------------------------------------------- /iOS/libyourview/vendor/GCDWebServer/Responses/GCDWebServerStreamedResponse.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (c) 2012-2019, Pierre-Olivier Latour 3 | All rights reserved. 4 | 5 | Redistribution and use in source and binary forms, with or without 6 | modification, are permitted provided that the following conditions are met: 7 | * Redistributions of source code must retain the above copyright 8 | notice, this list of conditions and the following disclaimer. 9 | * Redistributions in binary form must reproduce the above copyright 10 | notice, this list of conditions and the following disclaimer in the 11 | documentation and/or other materials provided with the distribution. 12 | * The name of Pierre-Olivier Latour may not be used to endorse 13 | or promote products derived from this software without specific 14 | prior written permission. 15 | 16 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 17 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 18 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 19 | DISCLAIMED. IN NO EVENT SHALL PIERRE-OLIVIER LATOUR BE LIABLE FOR ANY 20 | DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 21 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 22 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 23 | ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 25 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 | */ 27 | 28 | #import "GCDWebServerResponse.h" 29 | 30 | NS_ASSUME_NONNULL_BEGIN 31 | 32 | /** 33 | * The GCDWebServerStreamBlock is called to stream the data for the HTTP body. 34 | * The block must return either a chunk of data, an empty NSData when done, or 35 | * nil on error and set the "error" argument which is guaranteed to be non-NULL. 36 | */ 37 | typedef NSData* _Nullable (^GCDWebServerStreamBlock)(NSError** error); 38 | 39 | /** 40 | * The GCDWebServerAsyncStreamBlock works like the GCDWebServerStreamBlock 41 | * except the streamed data can be returned at a later time allowing for 42 | * truly asynchronous generation of the data. 43 | * 44 | * The block must call "completionBlock" passing the new chunk of data when ready, 45 | * an empty NSData when done, or nil on error and pass a NSError. 46 | * 47 | * The block cannot call "completionBlock" more than once per invocation. 48 | */ 49 | typedef void (^GCDWebServerAsyncStreamBlock)(GCDWebServerBodyReaderCompletionBlock completionBlock); 50 | 51 | /** 52 | * The GCDWebServerStreamedResponse subclass of GCDWebServerResponse streams 53 | * the body of the HTTP response using a GCD block. 54 | */ 55 | @interface GCDWebServerStreamedResponse : GCDWebServerResponse 56 | @property(nonatomic, copy) NSString* contentType; // Redeclare as non-null 57 | 58 | /** 59 | * Creates a response with streamed data and a given content type. 60 | */ 61 | + (instancetype)responseWithContentType:(NSString*)type streamBlock:(GCDWebServerStreamBlock)block; 62 | 63 | /** 64 | * Creates a response with async streamed data and a given content type. 65 | */ 66 | + (instancetype)responseWithContentType:(NSString*)type asyncStreamBlock:(GCDWebServerAsyncStreamBlock)block; 67 | 68 | /** 69 | * Initializes a response with streamed data and a given content type. 70 | */ 71 | - (instancetype)initWithContentType:(NSString*)type streamBlock:(GCDWebServerStreamBlock)block; 72 | 73 | /** 74 | * This method is the designated initializer for the class. 75 | */ 76 | - (instancetype)initWithContentType:(NSString*)type asyncStreamBlock:(GCDWebServerAsyncStreamBlock)block; 77 | 78 | @end 79 | 80 | NS_ASSUME_NONNULL_END 81 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/TalkingDataSDKDemo.xcodeproj/xcshareddata/xcschemes/PhoneDemo.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 43 | 44 | 54 | 56 | 62 | 63 | 64 | 65 | 66 | 67 | 73 | 75 | 81 | 82 | 83 | 84 | 86 | 87 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /iOS/libyourview/serializer/YVTraversalStepin.m: -------------------------------------------------------------------------------- 1 | // 2 | // YVTraversalStepin.m 3 | // libyourview 4 | // 5 | // Created by bliss_ddo on 2019/4/24. 6 | // Copyright © 2019 bliss_ddo. All rights reserved. 7 | // 8 | 9 | #import "YVTraversalStepin.h" 10 | 11 | @interface YVTraversalStepin() 12 | @property (nonatomic,copy) NSString * assignToViewController; 13 | @property (nonatomic,copy) NSString * viewLevel; 14 | @property (nonatomic,assign) NSInteger viewDeepth; 15 | @property (nonatomic,assign) NSInteger indexRow; 16 | @property (nonatomic,assign) NSInteger indexSection; 17 | @property (nonatomic,assign) BOOL isInTableView; 18 | @property (nonatomic,assign) BOOL isInCollectionView; 19 | @end 20 | 21 | @implementation YVTraversalStepin 22 | 23 | -(instancetype)init 24 | { 25 | if (self = [super init]) { 26 | _assignToViewController = @""; 27 | _viewLevel = @""; 28 | _viewDeepth = -1; 29 | _indexSection = -1; 30 | _indexRow = -1; 31 | _isInTableView = NO; 32 | _isInCollectionView = NO; 33 | } 34 | return self; 35 | } 36 | 37 | +(YVTraversalStepin*)stepInWithView:(UIView*)v parentInfo:(YVTraversalStepin*)parent 38 | { 39 | YVTraversalStepin * stenIn = [[YVTraversalStepin alloc]init]; 40 | NSString * assignToViewController = parent.assignToViewController; 41 | NSInteger indexRow = parent.indexRow; 42 | NSInteger indexSection = parent.indexSection; 43 | BOOL isInTableView = parent.isInTableView; 44 | BOOL isInCollectionView = parent.isInCollectionView; 45 | 46 | UIResponder * nextResponder = v.nextResponder; 47 | if ([nextResponder isKindOfClass:[UIViewController class]]) { 48 | assignToViewController = NSStringFromClass(nextResponder.class); 49 | }else if ([nextResponder isKindOfClass:[UITableView class]] && [v isKindOfClass:[UITableViewCell class]]) { 50 | isInTableView = YES; 51 | UITableView * tableview = (UITableView *)nextResponder; 52 | UITableViewCell * cv = (UITableViewCell *)v; 53 | NSIndexPath * indexpath = [tableview indexPathForCell:cv]; 54 | if (indexpath) { 55 | indexRow = indexpath.row; 56 | indexSection = indexpath.section; 57 | } 58 | }else if ([nextResponder isKindOfClass:[UICollectionView class]] && [v isKindOfClass:[UICollectionViewCell class]]){ 59 | isInCollectionView = YES; 60 | UICollectionView * collectionview = (UICollectionView *)nextResponder; 61 | UICollectionViewCell * cv = (UICollectionViewCell *)v; 62 | NSIndexPath * indexpath = [collectionview indexPathForCell:cv]; 63 | if (indexpath) { 64 | indexRow = indexpath.row; 65 | indexSection = indexpath.section; 66 | } 67 | } 68 | 69 | stenIn.assignToViewController = assignToViewController; 70 | stenIn.viewLevel = [NSString stringWithFormat:@"%@/%ld",parent.viewLevel,[v.superview.subviews indexOfObject:v]]; 71 | stenIn.viewDeepth = parent.viewDeepth + 1; 72 | stenIn.indexRow = indexRow; 73 | stenIn.indexSection = indexSection; 74 | stenIn.isInTableView = isInTableView; 75 | stenIn.isInCollectionView = isInCollectionView; 76 | return stenIn; 77 | } 78 | 79 | -(NSDictionary*)stepinfo 80 | { 81 | return @{ 82 | @"assign_to_viewcontroller":self.assignToViewController, 83 | @"view_level":self.viewLevel, 84 | @"view_deepth":@(self.viewDeepth), 85 | @"index_row":@(self.indexRow), 86 | @"index_section":@(self.indexSection), 87 | @"is_in_tableview":@(self.isInTableView), 88 | @"is_in_collectionview":@(self.isInCollectionView), 89 | }; 90 | } 91 | @end 92 | -------------------------------------------------------------------------------- /iOS/TalkingDataSDKDemo/PhoneDemo/TDHomeViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // TDHomeViewController.m 3 | // TalkingDataSDKDemo 4 | // 5 | // Created by liweiqiang on 2017/5/22. 6 | // Copyright © 2017年 TendCloud. All rights reserved. 7 | // 8 | 9 | #import "TDHomeViewController.h" 10 | #import "TDHomeTableViewCell.h" 11 | #import "TDGeneralViewController.h" 12 | 13 | static NSString *cellIdentifier = @"Cell"; 14 | static NSString *headerIdentifier = @"Header"; 15 | 16 | @interface TDHomeViewController () 17 | 18 | @property (strong, nonatomic) NSArray *items; 19 | 20 | @end 21 | 22 | @implementation TDHomeViewController 23 | 24 | - (void)viewDidLoad { 25 | [super viewDidLoad]; 26 | // Do any additional setup after loading the view, typically from a nib. 27 | NSString *path = [[NSBundle mainBundle].bundlePath stringByAppendingPathComponent:@"Data.plist"]; 28 | self.items = [NSArray arrayWithContentsOfFile:path]; 29 | } 30 | 31 | #pragma mark - Table view data source 32 | 33 | - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 34 | return self.items.count; 35 | } 36 | 37 | - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 38 | NSDictionary *dic = self.items[section]; 39 | NSArray *funs = dic[@"functions"]; 40 | 41 | return funs.count; 42 | } 43 | 44 | - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 45 | NSDictionary *dic = self.items[indexPath.section]; 46 | NSArray *functions = dic[@"functions"]; 47 | NSDictionary *item = functions[indexPath.row]; 48 | 49 | TDHomeTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 50 | cell.imageView.image = [UIImage imageNamed:item[@"name"]]; 51 | cell.textLabel.text = item[@"title"]; 52 | cell.detailTextLabel.text = item[@"subtitle"]; 53 | cell.detailTextLabel.numberOfLines = 2; 54 | cell.selectImage.highlighted = [item[@"selected"] boolValue]; 55 | 56 | return cell; 57 | } 58 | 59 | #pragma mark - Table view delegate 60 | 61 | - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { 62 | return 28; 63 | } 64 | 65 | - (nullable UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { 66 | UITableViewHeaderFooterView *view = [tableView dequeueReusableHeaderFooterViewWithIdentifier:headerIdentifier]; 67 | if (!view) { 68 | view = [[UITableViewHeaderFooterView alloc] initWithReuseIdentifier:headerIdentifier]; 69 | } 70 | NSDictionary *dic = self.items[section]; 71 | view.textLabel.text = dic[@"name"]; 72 | 73 | return view; 74 | } 75 | 76 | - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 77 | NSDictionary *product = self.items[indexPath.section]; 78 | NSString *productName = product[@"name"]; 79 | NSArray *functions = product[@"functions"]; 80 | NSDictionary *function = functions[indexPath.row]; 81 | NSString *functionTitle = function[@"title"]; 82 | NSString *functionName = function[@"name"]; 83 | NSString *identifier = [NSString stringWithFormat:@"%@-%@", productName, functionName]; 84 | 85 | TDGeneralViewController *viewController = nil; 86 | UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; 87 | @try { 88 | viewController = [mainStoryboard instantiateViewControllerWithIdentifier:identifier]; 89 | } @catch (NSException *exception) { 90 | viewController = [mainStoryboard instantiateViewControllerWithIdentifier:@"TalkingData-General"]; 91 | } 92 | viewController.info = function; 93 | viewController.navigationItem.title = [NSString stringWithFormat:@"%@ %@", productName, functionTitle]; 94 | [self.navigationController pushViewController:viewController animated:YES]; 95 | } 96 | 97 | @end 98 | --------------------------------------------------------------------------------