chengyanfang

init

Showing 97 changed files with 3893 additions and 0 deletions
No preview for this file type
# Xcode
#
# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
## Build generated
build/
DerivedData/
Pods/
Podfile.lock
fastlane/
firim/
Gemfile
Gemfile.lock
## Various settings
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
xcuserdata/
## Other
*.moved-aside
*.xccheckout
*.xcscmblueprint
## Obj-C/Swift specific
*.hmap
*.ipa
*.dSYM.zip
*.dSYM
## Playgrounds
timeline.xctimeline
playground.xcworkspace
# Swift Package Manager
#
# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.
# Packages/
# Package.pins
# Package.resolved
.build/
# CocoaPods
#
# We recommend against adding the Pods directory to your .gitignore. However
# you should judge for yourself, the pros and cons are mentioned at:
# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
#
# Pods/
# Carthage
#
# Add this line if you want to avoid checking in source code from Carthage dependencies.
# Carthage/Checkouts
Carthage/Build
# fastlane
#
# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the
# screenshots whenever they are needed.
# For more information about the recommended setup visit:
# https://docs.fastlane.tools/best-practices/source-control/#source-control
fastlane/report.xml
fastlane/Preview.html
fastlane/screenshots/**/*.png
fastlane/test_output
... ...
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 51;
objects = {
/* Begin PBXBuildFile section */
6AF58710F6F4704A0DDB54DA /* BuildFile in Frameworks */ = {isa = PBXBuildFile; };
7ECF5CBC25627CCE001B60C2 /* PreviewTransitionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7ECF5CA725627CCE001B60C2 /* PreviewTransitionViewController.swift */; };
7ECF5CBD25627CCE001B60C2 /* WebviewPreviewViewContoller.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7ECF5CA825627CCE001B60C2 /* WebviewPreviewViewContoller.swift */; };
7ECF5CBE25627CCE001B60C2 /* FileListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7ECF5CA925627CCE001B60C2 /* FileListViewController.swift */; };
7ECF5CBF25627CCE001B60C2 /* FileParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7ECF5CAA25627CCE001B60C2 /* FileParser.swift */; };
7ECF5CC025627CCE001B60C2 /* PreviewManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7ECF5CAB25627CCE001B60C2 /* PreviewManager.swift */; };
7ECF5CC125627CCE001B60C2 /* FileListSearch.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7ECF5CAC25627CCE001B60C2 /* FileListSearch.swift */; };
7ECF5CC225627CCE001B60C2 /* FBFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7ECF5CAD25627CCE001B60C2 /* FBFile.swift */; };
7ECF5CC325627CCE001B60C2 /* FileListTableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7ECF5CAF25627CCE001B60C2 /* FileListTableView.swift */; };
7ECF5CC425627CCE001B60C2 /* FileBrowser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7ECF5CB025627CCE001B60C2 /* FileBrowser.swift */; };
7ECF5CC525627CCF001B60C2 /* FileListPreview.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7ECF5CB125627CCE001B60C2 /* FileListPreview.swift */; };
7ECF5CC625627CCF001B60C2 /* folder@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 7ECF5CB325627CCE001B60C2 /* folder@2x.png */; };
7ECF5CC725627CCF001B60C2 /* zip@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 7ECF5CB425627CCE001B60C2 /* zip@2x.png */; };
7ECF5CC825627CCF001B60C2 /* WebviewPreviewViewContoller.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7ECF5CB525627CCE001B60C2 /* WebviewPreviewViewContoller.xib */; };
7ECF5CC925627CCF001B60C2 /* image@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 7ECF5CB625627CCE001B60C2 /* image@2x.png */; };
7ECF5CCA25627CCF001B60C2 /* documents@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 7ECF5CB725627CCE001B60C2 /* documents@2x.png */; };
7ECF5CCB25627CCF001B60C2 /* file@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 7ECF5CB825627CCE001B60C2 /* file@2x.png */; };
7ECF5CCC25627CCF001B60C2 /* FileBrowser.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7ECF5CB925627CCE001B60C2 /* FileBrowser.xib */; };
7ECF5CCD25627CCF001B60C2 /* pdf@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 7ECF5CBA25627CCE001B60C2 /* pdf@2x.png */; };
7ECF5CCE25627CCF001B60C2 /* PreviewTransitionViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7ECF5CBB25627CCE001B60C2 /* PreviewTransitionViewController.xib */; };
7ECF5CD125627CDE001B60C2 /* SettingVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7ECF5CD025627CDE001B60C2 /* SettingVC.swift */; };
8CDC226071D1655432DC3BCC /* Pods_HHMSDKDemo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B8EF2823F6F38130867DF23A /* Pods_HHMSDKDemo.framework */; };
952594822293906E00053058 /* HHWebBrowser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 952594812293906E00053058 /* HHWebBrowser.swift */; };
95844E312153A4E800D836F1 /* CoreMotion.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 95844E302153A4E800D836F1 /* CoreMotion.framework */; };
95CC5FD020D8A64100310344 /* UIView+xib.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95CC5FCF20D8A64100310344 /* UIView+xib.swift */; };
95F31C4120D0F8C9000BDAC4 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95F31C4020D0F8C9000BDAC4 /* AppDelegate.swift */; };
95F31C4620D0F8C9000BDAC4 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 95F31C4420D0F8C9000BDAC4 /* Main.storyboard */; };
95F31C4820D0F8CA000BDAC4 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 95F31C4720D0F8CA000BDAC4 /* Assets.xcassets */; };
95F31C4B20D0F8CA000BDAC4 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 95F31C4920D0F8CA000BDAC4 /* LaunchScreen.storyboard */; };
95F31C5520D24789000BDAC4 /* LoginVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95F31C5420D24789000BDAC4 /* LoginVC.swift */; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
17CA3CCBE1A55DDD5C3CA3C4 /* Pods-HHMSDKDemo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-HHMSDKDemo.debug.xcconfig"; path = "Pods/Target Support Files/Pods-HHMSDKDemo/Pods-HHMSDKDemo.debug.xcconfig"; sourceTree = "<group>"; };
4D6DB950D99E74522E220E53 /* Pods-HHMSDKDemo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-HHMSDKDemo.release.xcconfig"; path = "Pods/Target Support Files/Pods-HHMSDKDemo/Pods-HHMSDKDemo.release.xcconfig"; sourceTree = "<group>"; };
7ECF5CA725627CCE001B60C2 /* PreviewTransitionViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PreviewTransitionViewController.swift; sourceTree = "<group>"; };
7ECF5CA825627CCE001B60C2 /* WebviewPreviewViewContoller.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WebviewPreviewViewContoller.swift; sourceTree = "<group>"; };
7ECF5CA925627CCE001B60C2 /* FileListViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FileListViewController.swift; sourceTree = "<group>"; };
7ECF5CAA25627CCE001B60C2 /* FileParser.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FileParser.swift; sourceTree = "<group>"; };
7ECF5CAB25627CCE001B60C2 /* PreviewManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PreviewManager.swift; sourceTree = "<group>"; };
7ECF5CAC25627CCE001B60C2 /* FileListSearch.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FileListSearch.swift; sourceTree = "<group>"; };
7ECF5CAD25627CCE001B60C2 /* FBFile.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FBFile.swift; sourceTree = "<group>"; };
7ECF5CAE25627CCE001B60C2 /* FileBrowser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FileBrowser.h; sourceTree = "<group>"; };
7ECF5CAF25627CCE001B60C2 /* FileListTableView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FileListTableView.swift; sourceTree = "<group>"; };
7ECF5CB025627CCE001B60C2 /* FileBrowser.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FileBrowser.swift; sourceTree = "<group>"; };
7ECF5CB125627CCE001B60C2 /* FileListPreview.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FileListPreview.swift; sourceTree = "<group>"; };
7ECF5CB325627CCE001B60C2 /* folder@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "folder@2x.png"; sourceTree = "<group>"; };
7ECF5CB425627CCE001B60C2 /* zip@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "zip@2x.png"; sourceTree = "<group>"; };
7ECF5CB525627CCE001B60C2 /* WebviewPreviewViewContoller.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = WebviewPreviewViewContoller.xib; sourceTree = "<group>"; };
7ECF5CB625627CCE001B60C2 /* image@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "image@2x.png"; sourceTree = "<group>"; };
7ECF5CB725627CCE001B60C2 /* documents@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "documents@2x.png"; sourceTree = "<group>"; };
7ECF5CB825627CCE001B60C2 /* file@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "file@2x.png"; sourceTree = "<group>"; };
7ECF5CB925627CCE001B60C2 /* FileBrowser.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = FileBrowser.xib; sourceTree = "<group>"; };
7ECF5CBA25627CCE001B60C2 /* pdf@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "pdf@2x.png"; sourceTree = "<group>"; };
7ECF5CBB25627CCE001B60C2 /* PreviewTransitionViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = PreviewTransitionViewController.xib; sourceTree = "<group>"; };
7ECF5CD025627CDE001B60C2 /* SettingVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingVC.swift; sourceTree = "<group>"; };
7ECF5CF125627FA0001B60C2 /* bridging-header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "bridging-header.h"; sourceTree = "<group>"; };
95030D28229D2F8D00AD6290 /* zh-Hant */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hant"; path = "zh-Hant.lproj/Main.strings"; sourceTree = "<group>"; };
95030D29229D2F8D00AD6290 /* zh-Hant */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hant"; path = "zh-Hant.lproj/LaunchScreen.strings"; sourceTree = "<group>"; };
952594812293906E00053058 /* HHWebBrowser.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HHWebBrowser.swift; sourceTree = "<group>"; };
95844E302153A4E800D836F1 /* CoreMotion.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMotion.framework; path = System/Library/Frameworks/CoreMotion.framework; sourceTree = SDKROOT; };
95CC5FCF20D8A64100310344 /* UIView+xib.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIView+xib.swift"; sourceTree = "<group>"; };
95E3293120D9F76A003906D4 /* HHMSDKDemo.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = HHMSDKDemo.entitlements; sourceTree = "<group>"; };
95F31C3D20D0F8C9000BDAC4 /* HHMSDKDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = HHMSDKDemo.app; sourceTree = BUILT_PRODUCTS_DIR; };
95F31C4020D0F8C9000BDAC4 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
95F31C4520D0F8C9000BDAC4 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
95F31C4720D0F8CA000BDAC4 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
95F31C4A20D0F8CA000BDAC4 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
95F31C4C20D0F8CA000BDAC4 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
95F31C5420D24789000BDAC4 /* LoginVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoginVC.swift; sourceTree = "<group>"; };
B8EF2823F6F38130867DF23A /* Pods_HHMSDKDemo.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_HHMSDKDemo.framework; sourceTree = BUILT_PRODUCTS_DIR; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
95F31C3A20D0F8C9000BDAC4 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
95844E312153A4E800D836F1 /* CoreMotion.framework in Frameworks */,
6AF58710F6F4704A0DDB54DA /* BuildFile in Frameworks */,
8CDC226071D1655432DC3BCC /* Pods_HHMSDKDemo.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
2965255EF491A8B0F6027603 /* Frameworks */ = {
isa = PBXGroup;
children = (
95844E302153A4E800D836F1 /* CoreMotion.framework */,
B8EF2823F6F38130867DF23A /* Pods_HHMSDKDemo.framework */,
);
name = Frameworks;
sourceTree = "<group>";
};
7ECF5CA625627CAE001B60C2 /* FileBrowser */ = {
isa = PBXGroup;
children = (
7ECF5CAD25627CCE001B60C2 /* FBFile.swift */,
7ECF5CAE25627CCE001B60C2 /* FileBrowser.h */,
7ECF5CB025627CCE001B60C2 /* FileBrowser.swift */,
7ECF5CB125627CCE001B60C2 /* FileListPreview.swift */,
7ECF5CAC25627CCE001B60C2 /* FileListSearch.swift */,
7ECF5CAF25627CCE001B60C2 /* FileListTableView.swift */,
7ECF5CA925627CCE001B60C2 /* FileListViewController.swift */,
7ECF5CAA25627CCE001B60C2 /* FileParser.swift */,
7ECF5CAB25627CCE001B60C2 /* PreviewManager.swift */,
7ECF5CA725627CCE001B60C2 /* PreviewTransitionViewController.swift */,
7ECF5CB225627CCE001B60C2 /* Resources */,
7ECF5CA825627CCE001B60C2 /* WebviewPreviewViewContoller.swift */,
);
path = FileBrowser;
sourceTree = "<group>";
};
7ECF5CB225627CCE001B60C2 /* Resources */ = {
isa = PBXGroup;
children = (
7ECF5CB325627CCE001B60C2 /* folder@2x.png */,
7ECF5CB425627CCE001B60C2 /* zip@2x.png */,
7ECF5CB525627CCE001B60C2 /* WebviewPreviewViewContoller.xib */,
7ECF5CB625627CCE001B60C2 /* image@2x.png */,
7ECF5CB725627CCE001B60C2 /* documents@2x.png */,
7ECF5CB825627CCE001B60C2 /* file@2x.png */,
7ECF5CB925627CCE001B60C2 /* FileBrowser.xib */,
7ECF5CBA25627CCE001B60C2 /* pdf@2x.png */,
7ECF5CBB25627CCE001B60C2 /* PreviewTransitionViewController.xib */,
);
path = Resources;
sourceTree = "<group>";
};
9525949C22939A6000053058 /* Res */ = {
isa = PBXGroup;
children = (
95F31C4420D0F8C9000BDAC4 /* Main.storyboard */,
95F31C4720D0F8CA000BDAC4 /* Assets.xcassets */,
95F31C4920D0F8CA000BDAC4 /* LaunchScreen.storyboard */,
95F31C4C20D0F8CA000BDAC4 /* Info.plist */,
);
path = Res;
sourceTree = "<group>";
};
95CC5FCE20D8A5FB00310344 /* Utils */ = {
isa = PBXGroup;
children = (
952594812293906E00053058 /* HHWebBrowser.swift */,
95CC5FCF20D8A64100310344 /* UIView+xib.swift */,
);
path = Utils;
sourceTree = "<group>";
};
95F31C3420D0F8C9000BDAC4 = {
isa = PBXGroup;
children = (
95F31C3F20D0F8C9000BDAC4 /* HHMSDKDemo */,
95F31C3E20D0F8C9000BDAC4 /* Products */,
FD5EC59F725CD960E73D7FB2 /* Pods */,
2965255EF491A8B0F6027603 /* Frameworks */,
);
sourceTree = "<group>";
};
95F31C3E20D0F8C9000BDAC4 /* Products */ = {
isa = PBXGroup;
children = (
95F31C3D20D0F8C9000BDAC4 /* HHMSDKDemo.app */,
);
name = Products;
sourceTree = "<group>";
};
95F31C3F20D0F8C9000BDAC4 /* HHMSDKDemo */ = {
isa = PBXGroup;
children = (
7ECF5CA625627CAE001B60C2 /* FileBrowser */,
95E3293120D9F76A003906D4 /* HHMSDKDemo.entitlements */,
95F31C4020D0F8C9000BDAC4 /* AppDelegate.swift */,
95F31C5420D24789000BDAC4 /* LoginVC.swift */,
95CC5FCE20D8A5FB00310344 /* Utils */,
9525949C22939A6000053058 /* Res */,
7ECF5CD025627CDE001B60C2 /* SettingVC.swift */,
7ECF5CF125627FA0001B60C2 /* bridging-header.h */,
);
path = HHMSDKDemo;
sourceTree = "<group>";
};
FD5EC59F725CD960E73D7FB2 /* Pods */ = {
isa = PBXGroup;
children = (
17CA3CCBE1A55DDD5C3CA3C4 /* Pods-HHMSDKDemo.debug.xcconfig */,
4D6DB950D99E74522E220E53 /* Pods-HHMSDKDemo.release.xcconfig */,
);
name = Pods;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
95F31C3C20D0F8C9000BDAC4 /* HHMSDKDemo */ = {
isa = PBXNativeTarget;
buildConfigurationList = 95F31C4F20D0F8CA000BDAC4 /* Build configuration list for PBXNativeTarget "HHMSDKDemo" */;
buildPhases = (
3F70574BEF14EFDDBC2276D7 /* [CP] Check Pods Manifest.lock */,
95F31C3920D0F8C9000BDAC4 /* Sources */,
95F31C3A20D0F8C9000BDAC4 /* Frameworks */,
95F31C3B20D0F8C9000BDAC4 /* Resources */,
2F2866C9626CA31B9760B5C4 /* [CP] Embed Pods Frameworks */,
F8948772789F21F588832CFB /* [CP] Copy Pods Resources */,
);
buildRules = (
);
dependencies = (
);
name = HHMSDKDemo;
productName = HHMSDKDemo;
productReference = 95F31C3D20D0F8C9000BDAC4 /* HHMSDKDemo.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
95F31C3520D0F8C9000BDAC4 /* Project object */ = {
isa = PBXProject;
attributes = {
LastSwiftUpdateCheck = 0940;
LastUpgradeCheck = 0940;
ORGANIZATIONNAME = shmily;
TargetAttributes = {
95F31C3C20D0F8C9000BDAC4 = {
CreatedOnToolsVersion = 9.4;
LastSwiftMigration = 1020;
SystemCapabilities = {
com.apple.BackgroundModes = {
enabled = 1;
};
com.apple.Push = {
enabled = 1;
};
};
};
};
};
buildConfigurationList = 95F31C3820D0F8C9000BDAC4 /* Build configuration list for PBXProject "HHMSDKDemo" */;
compatibilityVersion = "Xcode 9.3";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
"zh-Hant",
);
mainGroup = 95F31C3420D0F8C9000BDAC4;
productRefGroup = 95F31C3E20D0F8C9000BDAC4 /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
95F31C3C20D0F8C9000BDAC4 /* HHMSDKDemo */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
95F31C3B20D0F8C9000BDAC4 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
7ECF5CCC25627CCF001B60C2 /* FileBrowser.xib in Resources */,
7ECF5CC925627CCF001B60C2 /* image@2x.png in Resources */,
7ECF5CCD25627CCF001B60C2 /* pdf@2x.png in Resources */,
7ECF5CC825627CCF001B60C2 /* WebviewPreviewViewContoller.xib in Resources */,
7ECF5CCE25627CCF001B60C2 /* PreviewTransitionViewController.xib in Resources */,
95F31C4B20D0F8CA000BDAC4 /* LaunchScreen.storyboard in Resources */,
7ECF5CC725627CCF001B60C2 /* zip@2x.png in Resources */,
95F31C4820D0F8CA000BDAC4 /* Assets.xcassets in Resources */,
7ECF5CC625627CCF001B60C2 /* folder@2x.png in Resources */,
95F31C4620D0F8C9000BDAC4 /* Main.storyboard in Resources */,
7ECF5CCB25627CCF001B60C2 /* file@2x.png in Resources */,
7ECF5CCA25627CCF001B60C2 /* documents@2x.png in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
2F2866C9626CA31B9760B5C4 /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-HHMSDKDemo/Pods-HHMSDKDemo-frameworks-${CONFIGURATION}-input-files.xcfilelist",
);
name = "[CP] Embed Pods Frameworks";
outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-HHMSDKDemo/Pods-HHMSDKDemo-frameworks-${CONFIGURATION}-output-files.xcfilelist",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-HHMSDKDemo/Pods-HHMSDKDemo-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
3F70574BEF14EFDDBC2276D7 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-HHMSDKDemo-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
F8948772789F21F588832CFB /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-HHMSDKDemo/Pods-HHMSDKDemo-resources-${CONFIGURATION}-input-files.xcfilelist",
);
name = "[CP] Copy Pods Resources";
outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-HHMSDKDemo/Pods-HHMSDKDemo-resources-${CONFIGURATION}-output-files.xcfilelist",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-HHMSDKDemo/Pods-HHMSDKDemo-resources.sh\"\n";
showEnvVarsInLog = 0;
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
95F31C3920D0F8C9000BDAC4 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
7ECF5CBF25627CCE001B60C2 /* FileParser.swift in Sources */,
95CC5FD020D8A64100310344 /* UIView+xib.swift in Sources */,
7ECF5CC525627CCF001B60C2 /* FileListPreview.swift in Sources */,
7ECF5CC025627CCE001B60C2 /* PreviewManager.swift in Sources */,
7ECF5CC125627CCE001B60C2 /* FileListSearch.swift in Sources */,
7ECF5CBE25627CCE001B60C2 /* FileListViewController.swift in Sources */,
952594822293906E00053058 /* HHWebBrowser.swift in Sources */,
7ECF5CD125627CDE001B60C2 /* SettingVC.swift in Sources */,
95F31C4120D0F8C9000BDAC4 /* AppDelegate.swift in Sources */,
7ECF5CC225627CCE001B60C2 /* FBFile.swift in Sources */,
7ECF5CBC25627CCE001B60C2 /* PreviewTransitionViewController.swift in Sources */,
7ECF5CC325627CCE001B60C2 /* FileListTableView.swift in Sources */,
7ECF5CBD25627CCE001B60C2 /* WebviewPreviewViewContoller.swift in Sources */,
95F31C5520D24789000BDAC4 /* LoginVC.swift in Sources */,
7ECF5CC425627CCE001B60C2 /* FileBrowser.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXVariantGroup section */
95F31C4420D0F8C9000BDAC4 /* Main.storyboard */ = {
isa = PBXVariantGroup;
children = (
95F31C4520D0F8C9000BDAC4 /* Base */,
95030D28229D2F8D00AD6290 /* zh-Hant */,
);
name = Main.storyboard;
sourceTree = "<group>";
};
95F31C4920D0F8CA000BDAC4 /* LaunchScreen.storyboard */ = {
isa = PBXVariantGroup;
children = (
95F31C4A20D0F8CA000BDAC4 /* Base */,
95030D29229D2F8D00AD6290 /* zh-Hant */,
);
name = LaunchScreen.storyboard;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
95F31C4D20D0F8CA000BDAC4 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_IDENTITY = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 11.4;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 4.0;
};
name = Debug;
};
95F31C4E20D0F8CA000BDAC4 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_IDENTITY = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 11.4;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_OPTIMIZATION_LEVEL = "-O";
SWIFT_VERSION = 4.0;
VALIDATE_PRODUCT = YES;
};
name = Release;
};
95F31C5020D0F8CA000BDAC4 /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 17CA3CCBE1A55DDD5C3CA3C4 /* Pods-HHMSDKDemo.debug.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = HHMSDKDemo/HHMSDKDemo.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 2020.1113.13;
DEVELOPMENT_TEAM = SX7LU85BSD;
ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = "$(inherited)";
INFOPLIST_FILE = "$(SRCROOT)/HHMSDKDemo/Res/Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 9.3;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 3.0.6;
PRODUCT_BUNDLE_IDENTIFIER = com.hh.hhvdoctorSDK;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_OBJC_BRIDGING_HEADER = "/Users/chengyanfang/Documents/hh/iOS_SDK/SDKs/HHDoctorSDK_TX_demo_iOS/HHMSDKDemo/bridging-header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = 1;
};
name = Debug;
};
95F31C5120D0F8CA000BDAC4 /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 4D6DB950D99E74522E220E53 /* Pods-HHMSDKDemo.release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = HHMSDKDemo/HHMSDKDemo.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 2020.1113.13;
DEVELOPMENT_TEAM = SX7LU85BSD;
ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = "$(inherited)";
INFOPLIST_FILE = "$(SRCROOT)/HHMSDKDemo/Res/Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 9.3;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 3.0.6;
PRODUCT_BUNDLE_IDENTIFIER = com.hh.hhvdoctorSDK;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_OBJC_BRIDGING_HEADER = "/Users/chengyanfang/Documents/hh/iOS_SDK/SDKs/HHDoctorSDK_TX_demo_iOS/HHMSDKDemo/bridging-header.h";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = 1;
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
95F31C3820D0F8C9000BDAC4 /* Build configuration list for PBXProject "HHMSDKDemo" */ = {
isa = XCConfigurationList;
buildConfigurations = (
95F31C4D20D0F8CA000BDAC4 /* Debug */,
95F31C4E20D0F8CA000BDAC4 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
95F31C4F20D0F8CA000BDAC4 /* Build configuration list for PBXNativeTarget "HHMSDKDemo" */ = {
isa = XCConfigurationList;
buildConfigurations = (
95F31C5020D0F8CA000BDAC4 /* Debug */,
95F31C5120D0F8CA000BDAC4 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 95F31C3520D0F8C9000BDAC4 /* Project object */;
}
... ...
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:HHMSDKDemo.xcodeproj">
</FileRef>
</Workspace>
... ...
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>
... ...
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1020"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "95F31C3C20D0F8C9000BDAC4"
BuildableName = "HHMSDKDemo.app"
BlueprintName = "HHMSDKDemo"
ReferencedContainer = "container:HHMSDKDemo.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "95F31C3C20D0F8C9000BDAC4"
BuildableName = "HHMSDKDemo.app"
BlueprintName = "HHMSDKDemo"
ReferencedContainer = "container:HHMSDKDemo.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
disableMainThreadChecker = "YES"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "95F31C3C20D0F8C9000BDAC4"
BuildableName = "HHMSDKDemo.app"
BlueprintName = "HHMSDKDemo"
ReferencedContainer = "container:HHMSDKDemo.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "95F31C3C20D0F8C9000BDAC4"
BuildableName = "HHMSDKDemo.app"
BlueprintName = "HHMSDKDemo"
ReferencedContainer = "container:HHMSDKDemo.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
... ...
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1020"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "95259483229392B200053058"
BuildableName = "HHMedicineDemo.app"
BlueprintName = "HHMedicineDemo"
ReferencedContainer = "container:HHMSDKDemo.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "95259483229392B200053058"
BuildableName = "HHMedicineDemo.app"
BlueprintName = "HHMedicineDemo"
ReferencedContainer = "container:HHMSDKDemo.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
disableMainThreadChecker = "YES"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "95259483229392B200053058"
BuildableName = "HHMedicineDemo.app"
BlueprintName = "HHMedicineDemo"
ReferencedContainer = "container:HHMSDKDemo.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "95259483229392B200053058"
BuildableName = "HHMedicineDemo.app"
BlueprintName = "HHMedicineDemo"
ReferencedContainer = "container:HHMSDKDemo.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
... ...
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "group:HHMSDKDemo.xcodeproj">
</FileRef>
<FileRef
location = "group:Pods/Pods.xcodeproj">
</FileRef>
</Workspace>
... ...
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>
... ...
No preview for this file type
//
// AppDelegate.swift
// hhVDoctorSDK
//
// Created by shmilyshijian@foxmail.com on 07/10/2019.
// Copyright (c) 2019 shmilyshijian@foxmail.com. All rights reserved.
//
import UIKit
import hhVDoctorSDK
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
let option = HHSDKOptions(productId: "3000", isDebug: true, isDevelop: true)
option.logCallback = {
print($0)
}
HHMSDK.default.start(option: option)
return true
}
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
print(url)
return true
}
func applicationWillResignActive(_ application: UIApplication) {
// Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
// Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
}
func applicationDidEnterBackground(_ application: UIApplication) {
// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
}
func applicationWillEnterForeground(_ application: UIApplication) {
// Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
}
func applicationDidBecomeActive(_ application: UIApplication) {
// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
}
func applicationWillTerminate(_ application: UIApplication) {
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}
}
... ...
No preview for this file type
//
// FBFile.swift
// FileBrowser
//
// Created by Roy Marmelstein on 14/02/2016.
// Copyright © 2016 Roy Marmelstein. All rights reserved.
//
import Foundation
import UIKit
/// FBFile is a class representing a file in FileBrowser
@objc open class FBFile: NSObject {
/// Display name. String.
@objc public let displayName: String
// is Directory. Bool.
public let isDirectory: Bool
/// File extension.
public let fileExtension: String?
/// File attributes (including size, creation date etc).
public let fileAttributes: NSDictionary?
/// NSURL file path.
public let filePath: URL
// FBFileType
public let type: FBFileType
open func delete()
{
do
{
try FileManager.default.removeItem(at: self.filePath)
}
catch
{
print("An error occured when trying to delete file:\(self.filePath) Error:\(error)")
}
}
/**
Initialize an FBFile object with a filePath
- parameter filePath: NSURL filePath
- returns: FBFile object.
*/
init(filePath: URL) {
self.filePath = filePath
let isDirectory = checkDirectory(filePath)
self.isDirectory = isDirectory
if self.isDirectory {
self.fileAttributes = nil
self.fileExtension = nil
self.type = .Directory
}
else {
self.fileAttributes = getFileAttributes(self.filePath)
self.fileExtension = filePath.pathExtension
if let fileExtension = fileExtension {
self.type = FBFileType(rawValue: fileExtension) ?? .Default
}
else {
self.type = .Default
}
}
self.displayName = filePath.lastPathComponent
}
}
/**
FBFile type
*/
public enum FBFileType: String {
/// Directory
case Directory = "directory"
/// GIF file
case GIF = "gif"
/// JPG file
case JPG = "jpg"
/// PLIST file
case JSON = "json"
/// PDF file
case PDF = "pdf"
/// PLIST file
case PLIST = "plist"
/// PNG file
case PNG = "png"
/// ZIP file
case ZIP = "zip"
/// Any file
case Default = "file"
/**
Get representative image for file type
- returns: UIImage for file type
*/
public func image() -> UIImage? {
let bundle = Bundle(for: FileParser.self)
var fileName = String()
switch self {
case .Directory: fileName = "folder@2x.png"
case .JPG, .PNG, .GIF: fileName = "image@2x.png"
case .PDF: fileName = "pdf@2x.png"
case .ZIP: fileName = "zip@2x.png"
default: fileName = "file@2x.png"
}
let file = UIImage(named: fileName, in: bundle, compatibleWith: nil)
return file
}
}
/**
Check if file path NSURL is directory or file.
- parameter filePath: NSURL file path.
- returns: isDirectory Bool.
*/
func checkDirectory(_ filePath: URL) -> Bool {
var isDirectory = false
do {
var resourceValue: AnyObject?
try (filePath as NSURL).getResourceValue(&resourceValue, forKey: URLResourceKey.isDirectoryKey)
if let number = resourceValue as? NSNumber , number == true {
isDirectory = true
}
}
catch { }
return isDirectory
}
func getFileAttributes(_ filePath: URL) -> NSDictionary? {
let path = filePath.path
let fileManager = FileParser.sharedInstance.fileManager
do {
let attributes = try fileManager.attributesOfItem(atPath: path) as NSDictionary
return attributes
} catch {}
return nil
}
... ...
//
// FileBrowser.h
// FileBrowser
//
// Created by Roy Marmelstein on 07/02/2016.
// Copyright © 2016 Roy Marmelstein. All rights reserved.
//
#import <UIKit/UIKit.h>
//! Project version number for FileBrowser.
FOUNDATION_EXPORT double FileBrowserVersionNumber;
//! Project version string for FileBrowser.
FOUNDATION_EXPORT const unsigned char FileBrowserVersionString[];
// In this header, you should import all the public headers of your framework using statements like #import <FileBrowser/PublicHeader.h>
... ...
//
// FileBrowser.swift
// FileBrowser
//
// Created by Roy Marmelstein on 14/02/2016.
// Copyright © 2016 Roy Marmelstein. All rights reserved.
//
import UIKit
/// File browser containing navigation controller.
open class FileBrowser: UINavigationController {
let parser = FileParser.sharedInstance
var fileList: FileListViewController?
/// File types to exclude from the file browser.
open var excludesFileExtensions: [String]? {
didSet {
parser.excludesFileExtensions = excludesFileExtensions
}
}
/// File paths to exclude from the file browser.
open var excludesFilepaths: [URL]? {
didSet {
parser.excludesFilepaths = excludesFilepaths
}
}
/// Override default preview and actionsheet behaviour in favour of custom file handling.
open var didSelectFile: ((FBFile) -> ())? {
didSet {
fileList?.didSelectFile = didSelectFile
}
}
public convenience init() {
let parser = FileParser.sharedInstance
let path = parser.documentsURL()
self.init(initialPath: path, allowEditing: true)
}
/// Initialise file browser.
///
/// - Parameters:
/// - initialPath: NSURL filepath to containing directory.
/// - allowEditing: Whether to allow editing.
/// - showCancelButton: Whether to show the cancel button.
public convenience init(initialPath: URL? = nil, allowEditing: Bool = false, showCancelButton: Bool = true) {
let validInitialPath = initialPath ?? FileParser.sharedInstance.documentsURL()
let fileListViewController = FileListViewController(initialPath: validInitialPath, showCancelButton: showCancelButton)
fileListViewController.allowEditing = allowEditing
self.init(rootViewController: fileListViewController)
self.view.backgroundColor = UIColor.white
self.fileList = fileListViewController
}
}
... ...
//
// FileListPreview.swift
// FileBrowser
//
// Created by Roy Marmelstein on 13/02/2016.
// Copyright © 2016 Roy Marmelstein. All rights reserved.
//
import Foundation
import QuickLook
extension FileListViewController: UIViewControllerPreviewingDelegate {
//MARK: UIViewControllerPreviewingDelegate
func registerFor3DTouch() {
if #available(iOS 9.0, *) {
if self.traitCollection.forceTouchCapability == UIForceTouchCapability.available {
registerForPreviewing(with: self, sourceView: tableView)
}
}
}
func previewingContext(_ previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {
if #available(iOS 9.0, *) {
if let indexPath = tableView.indexPathForRow(at: location) {
let selectedFile = fileForIndexPath(indexPath)
previewingContext.sourceRect = tableView.rectForRow(at: indexPath)
if selectedFile.isDirectory == false {
return previewManager.previewViewControllerForFile(selectedFile, fromNavigation: false)
}
}
}
return nil
}
func previewingContext(_ previewingContext: UIViewControllerPreviewing, commit viewControllerToCommit: UIViewController) {
if let previewTransitionViewController = viewControllerToCommit as? PreviewTransitionViewController {
self.navigationController?.pushViewController(previewTransitionViewController.quickLookPreviewController, animated: true)
}
else {
self.navigationController?.pushViewController(viewControllerToCommit, animated: true)
}
}
}
... ...
//
// FileListSearch.swift
// FileBrowser
//
// Created by Roy Marmelstein on 14/02/2016.
// Copyright © 2016 Roy Marmelstein. All rights reserved.
//
import Foundation
import UIKit
extension FileListViewController: UISearchBarDelegate, UISearchControllerDelegate, UISearchResultsUpdating {
// MARK: UISearchControllerDelegate
func willPresentSearchController(_ searchController: UISearchController) {
self.tableView.contentInset = UIEdgeInsets.init(top: 20, left: 0, bottom: 0, right: 0)
}
func willDismissSearchController(_ searchController: UISearchController) {
self.tableView.contentInset = UIEdgeInsets.init(top: 0, left: 0, bottom: 0, right: 0)
}
// MARK: UISearchBarDelegate
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
filterContentForSearchText(searchBar.text!)
}
// MARK: UISearchResultsUpdating
func updateSearchResults(for searchController: UISearchController) {
filterContentForSearchText(searchController.searchBar.text!)
}
}
... ...
//
// FlieListTableView.swift
// FileBrowser
//
// Created by Roy Marmelstein on 14/02/2016.
// Copyright © 2016 Roy Marmelstein. All rights reserved.
//
import Foundation
import UIKit
extension FileListViewController: UITableViewDataSource, UITableViewDelegate {
//MARK: UITableViewDataSource, UITableViewDelegate
func numberOfSections(in tableView: UITableView) -> Int {
if searchController.isActive {
return 1
}
return sections.count
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if searchController.isActive {
return filteredFiles.count
}
return sections[section].count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cellIdentifier = "FileCell"
var cell = UITableViewCell(style: .subtitle, reuseIdentifier: cellIdentifier)
if let reuseCell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier) {
cell = reuseCell
}
cell.selectionStyle = .blue
let selectedFile = fileForIndexPath(indexPath)
cell.textLabel?.text = selectedFile.displayName
cell.imageView?.image = selectedFile.type.image()
return cell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let selectedFile = fileForIndexPath(indexPath)
searchController.isActive = false
if selectedFile.isDirectory {
let fileListViewController = FileListViewController(initialPath: selectedFile.filePath)
fileListViewController.didSelectFile = didSelectFile
self.navigationController?.pushViewController(fileListViewController, animated: true)
}
else {
if let didSelectFile = didSelectFile {
self.dismiss()
didSelectFile(selectedFile)
}
else {
let filePreview = previewManager.previewViewControllerForFile(selectedFile, fromNavigation: true)
self.navigationController?.pushViewController(filePreview, animated: true)
}
}
tableView.deselectRow(at: indexPath, animated: true)
}
func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
if searchController.isActive {
return nil
}
if sections[section].count > 0 {
return collation.sectionTitles[section]
}
else {
return nil
}
}
func sectionIndexTitles(for tableView: UITableView) -> [String]? {
if searchController.isActive {
return nil
}
return collation.sectionIndexTitles
}
func tableView(_ tableView: UITableView, sectionForSectionIndexTitle title: String, at index: Int) -> Int {
if searchController.isActive {
return 0
}
return collation.section(forSectionIndexTitle: index)
}
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
if (editingStyle == UITableViewCell.EditingStyle.delete) {
let selectedFile = fileForIndexPath(indexPath)
selectedFile.delete()
prepareData()
tableView.reloadSections([indexPath.section], with: UITableView.RowAnimation.automatic)
}
}
func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
return allowEditing
}
}
... ...
//
// FileListViewController.swift
// FileBrowser
//
// Created by Roy Marmelstein on 12/02/2016.
// Copyright © 2016 Roy Marmelstein. All rights reserved.
//
import UIKit
class FileListViewController: UIViewController {
// TableView
@IBOutlet weak var tableView: UITableView!
let collation = UILocalizedIndexedCollation.current()
/// Data
var didSelectFile: ((FBFile) -> ())?
var files = [FBFile]()
var initialPath: URL?
let parser = FileParser.sharedInstance
let previewManager = PreviewManager()
var sections: [[FBFile]] = []
var allowEditing: Bool = false
// Search controller
var filteredFiles = [FBFile]()
let searchController: UISearchController = {
let searchController = UISearchController(searchResultsController: nil)
searchController.searchBar.searchBarStyle = .minimal
searchController.searchBar.backgroundColor = UIColor.white
searchController.dimsBackgroundDuringPresentation = false
return searchController
}()
//MARK: Lifecycle
convenience init (initialPath: URL) {
self.init(initialPath: initialPath, showCancelButton: true)
}
convenience init (initialPath: URL, showCancelButton: Bool) {
self.init(nibName: "FileBrowser", bundle: Bundle(for: FileListViewController.self))
self.edgesForExtendedLayout = UIRectEdge()
// Set initial path
self.initialPath = initialPath
self.title = initialPath.lastPathComponent
// Set search controller delegates
searchController.searchResultsUpdater = self
searchController.searchBar.delegate = self
searchController.delegate = self
if showCancelButton {
// Add dismiss button
let dismissButton = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(FileListViewController.dismiss(button:)))
self.navigationItem.rightBarButtonItem = dismissButton
}
}
deinit{
if #available(iOS 9.0, *) {
searchController.loadViewIfNeeded()
} else {
searchController.loadView()
}
}
func prepareData() {
// Prepare data
if let initialPath = initialPath {
files = parser.filesForDirectory(initialPath)
indexFiles()
}
}
//MARK: UIViewController
override func viewDidLoad() {
prepareData()
// Set search bar
tableView.tableHeaderView = searchController.searchBar
// Register for 3D touch
self.registerFor3DTouch()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
// Scroll to hide search bar
self.tableView.contentOffset = CGPoint(x: 0, y: searchController.searchBar.frame.size.height)
// Make sure navigation bar is visible
self.navigationController?.isNavigationBarHidden = false
}
@objc func dismiss(button: UIBarButtonItem = UIBarButtonItem()) {
self.dismiss(animated: true, completion: nil)
}
//MARK: Data
func indexFiles() {
let selector: Selector = #selector(getter: FBFile.displayName)
sections = Array(repeating: [], count: collation.sectionTitles.count)
if let sortedObjects = collation.sortedArray(from: files, collationStringSelector: selector) as? [FBFile]{
for object in sortedObjects {
let sectionNumber = collation.section(for: object, collationStringSelector: selector)
sections[sectionNumber].append(object)
}
}
}
func fileForIndexPath(_ indexPath: IndexPath) -> FBFile {
var file: FBFile
if searchController.isActive {
file = filteredFiles[(indexPath as NSIndexPath).row]
}
else {
file = sections[(indexPath as NSIndexPath).section][(indexPath as NSIndexPath).row]
}
return file
}
func filterContentForSearchText(_ searchText: String) {
filteredFiles = files.filter({ (file: FBFile) -> Bool in
return file.displayName.lowercased().contains(searchText.lowercased())
})
tableView.reloadData()
}
}
... ...
//
// FileParser.swift
// FileBrowser
//
// Created by Roy Marmelstein on 13/02/2016.
// Copyright © 2016 Roy Marmelstein. All rights reserved.
//
import Foundation
class FileParser {
static let sharedInstance = FileParser()
var _excludesFileExtensions = [String]()
/// Mapped for case insensitivity
var excludesFileExtensions: [String]? {
get {
return _excludesFileExtensions.map({$0.lowercased()})
}
set {
if let newValue = newValue {
_excludesFileExtensions = newValue
}
}
}
var excludesFilepaths: [URL]?
let fileManager = FileManager.default
func documentsURL() -> URL {
return fileManager.urls(for: .documentDirectory, in: .userDomainMask)[0] as URL
}
func filesForDirectory(_ directoryPath: URL) -> [FBFile] {
var files = [FBFile]()
var filePaths = [URL]()
// Get contents
do {
filePaths = try self.fileManager.contentsOfDirectory(at: directoryPath, includingPropertiesForKeys: [], options: [.skipsHiddenFiles])
} catch {
return files
}
// Parse
for filePath in filePaths {
let file = FBFile(filePath: filePath)
if let excludesFileExtensions = excludesFileExtensions, let fileExtensions = file.fileExtension , excludesFileExtensions.contains(fileExtensions) {
continue
}
if let excludesFilepaths = excludesFilepaths , excludesFilepaths.contains(file.filePath) {
continue
}
if file.displayName.isEmpty == false {
files.append(file)
}
}
// Sort
files = files.sorted(){$0.displayName < $1.displayName}
return files
}
}
... ...
//
// PreviewManager.swift
// FileBrowser
//
// Created by Roy Marmelstein on 16/02/2016.
// Copyright © 2016 Roy Marmelstein. All rights reserved.
//
import Foundation
import QuickLook
class PreviewManager: NSObject, QLPreviewControllerDataSource {
var filePath: URL?
func previewViewControllerForFile(_ file: FBFile, fromNavigation: Bool) -> UIViewController {
if file.type == .PLIST || file.type == .JSON{
let webviewPreviewViewContoller = WebviewPreviewViewContoller(nibName: "WebviewPreviewViewContoller", bundle: Bundle(for: WebviewPreviewViewContoller.self))
webviewPreviewViewContoller.file = file
return webviewPreviewViewContoller
}
else {
let previewTransitionViewController = PreviewTransitionViewController(nibName: "PreviewTransitionViewController", bundle: Bundle(for: PreviewTransitionViewController.self))
previewTransitionViewController.quickLookPreviewController.dataSource = self
self.filePath = file.filePath as URL
if fromNavigation == true {
return previewTransitionViewController.quickLookPreviewController
}
return previewTransitionViewController
}
}
func numberOfPreviewItems(in controller: QLPreviewController) -> Int {
return 1
}
func previewController(_ controller: QLPreviewController, previewItemAt index: Int) -> QLPreviewItem {
let item = PreviewItem()
if let filePath = filePath {
item.filePath = filePath
}
return item
}
}
class PreviewItem: NSObject, QLPreviewItem {
/*!
* @abstract The URL of the item to preview.
* @discussion The URL must be a file URL.
*/
var filePath: URL?
public var previewItemURL: URL? {
if let filePath = filePath {
return filePath
}
return nil
}
}
... ...
//
// PreviewTransitionViewController.swift
// FileBrowser
//
// Created by Roy Marmelstein on 16/02/2016.
// Copyright © 2016 Roy Marmelstein. All rights reserved.
//
import UIKit
import QuickLook
/// Preview Transition View Controller was created because of a bug in QLPreviewController. It seems that QLPreviewController has issues being presented from a 3D touch peek-pop gesture and is produced an unbalanced presentation warning. By wrapping it in a container, we are solving this issue.
class PreviewTransitionViewController: UIViewController {
@IBOutlet weak var containerView: UIView!
let quickLookPreviewController = QLPreviewController()
override func viewDidLoad() {
super.viewDidLoad()
self.addChild(quickLookPreviewController)
containerView.addSubview(quickLookPreviewController.view)
quickLookPreviewController.view.frame = containerView.bounds
quickLookPreviewController.didMove(toParent: self)
}
}
... ...
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="9532" systemVersion="15C50" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES">
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="9530"/>
</dependencies>
<objects>
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="FileBrowser" customModule="FileBrowser" customModuleProvider="target">
<connections>
<outlet property="tableView" destination="DSW-B9-8cg" id="7xS-pS-2d4"/>
<outlet property="view" destination="iN0-l3-epB" id="2JG-i3-EEX"/>
</connections>
</placeholder>
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
<view contentMode="scaleToFill" id="iN0-l3-epB">
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="28" sectionFooterHeight="28" translatesAutoresizingMaskIntoConstraints="NO" id="DSW-B9-8cg">
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<connections>
<outlet property="dataSource" destination="-1" id="Hco-nQ-PWA"/>
<outlet property="delegate" destination="-1" id="UPO-be-USP"/>
</connections>
</tableView>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
<constraints>
<constraint firstAttribute="bottom" secondItem="DSW-B9-8cg" secondAttribute="bottom" id="D1e-43-tqH"/>
<constraint firstItem="DSW-B9-8cg" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="mNB-8b-mrx"/>
<constraint firstAttribute="trailing" secondItem="DSW-B9-8cg" secondAttribute="trailing" id="pvd-E6-fRi"/>
<constraint firstItem="DSW-B9-8cg" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" id="s7s-YR-TLU"/>
</constraints>
</view>
</objects>
</document>
... ...
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="9532" systemVersion="15C50" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES">
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="9532"/>
</dependencies>
<objects>
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="PreviewTransitionViewController" customModule="FileBrowser" customModuleProvider="target">
<connections>
<outlet property="containerView" destination="XU1-oS-O9g" id="1iD-NB-doP"/>
<outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
</connections>
</placeholder>
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
<view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="i5M-Pr-FkT">
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="XU1-oS-O9g">
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</view>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
<constraints>
<constraint firstItem="XU1-oS-O9g" firstAttribute="leading" secondItem="i5M-Pr-FkT" secondAttribute="leading" id="16b-EN-UAr"/>
<constraint firstItem="XU1-oS-O9g" firstAttribute="top" secondItem="i5M-Pr-FkT" secondAttribute="top" id="LcQ-I8-kyx"/>
<constraint firstAttribute="bottom" secondItem="XU1-oS-O9g" secondAttribute="bottom" id="VKY-GO-mL1"/>
<constraint firstAttribute="trailing" secondItem="XU1-oS-O9g" secondAttribute="trailing" id="kGR-cW-okX"/>
</constraints>
</view>
</objects>
</document>
... ...
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="9532" systemVersion="15C50" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES">
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="9530"/>
</dependencies>
<objects>
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="WebviewPreviewViewContoller" customModule="FileBrowser" customModuleProvider="target">
<connections>
<outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
</connections>
</placeholder>
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
<view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="i5M-Pr-FkT">
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
</view>
</objects>
</document>
... ...
//
// WebviewPreviewViewContoller.swift
// FileBrowser
//
// Created by Roy Marmelstein on 16/02/2016.
// Copyright © 2016 Roy Marmelstein. All rights reserved.
//
import UIKit
import WebKit
/// Webview for rendering items QuickLook will struggle with.
class WebviewPreviewViewContoller: UIViewController {
var webView = WKWebView()
var file: FBFile? {
didSet {
self.title = file?.displayName
self.processForDisplay()
}
}
//MARK: Lifecycle
override func viewDidLoad() {
super.viewDidLoad()
self.view.addSubview(webView)
// Add share button
let shareButton = UIBarButtonItem(barButtonSystemItem: .action, target: self, action: #selector(WebviewPreviewViewContoller.shareFile(_:)))
self.navigationItem.rightBarButtonItem = shareButton
}
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
webView.frame = self.view.bounds
}
//MARK: Share
@objc func shareFile(_ sender: UIBarButtonItem) {
guard let file = file else {
return
}
let activityViewController = UIActivityViewController(activityItems: [file.filePath], applicationActivities: nil)
if UIDevice.current.userInterfaceIdiom == .pad &&
activityViewController.responds(to: #selector(getter: popoverPresentationController)) {
activityViewController.popoverPresentationController?.barButtonItem = sender
}
self.present(activityViewController, animated: true, completion: nil)
}
//MARK: Processing
func processForDisplay() {
guard let file = file, let data = try? Data(contentsOf: file.filePath as URL) else {
return
}
var rawString: String?
// Prepare plist for display
if file.type == .PLIST {
do {
if let plistDescription = try (PropertyListSerialization.propertyList(from: data, options: [], format: nil) as AnyObject).description {
rawString = plistDescription
}
} catch {}
}
// Prepare json file for display
else if file.type == .JSON {
do {
let jsonObject = try JSONSerialization.jsonObject(with: data, options: [])
if JSONSerialization.isValidJSONObject(jsonObject) {
let prettyJSON = try JSONSerialization.data(withJSONObject: jsonObject, options: .prettyPrinted)
var jsonString = String(data: prettyJSON, encoding: String.Encoding.utf8)
// Unescape forward slashes
jsonString = jsonString?.replacingOccurrences(of: "\\/", with: "/")
rawString = jsonString
}
} catch {}
}
// Default prepare for display
if rawString == nil {
rawString = String(data: data, encoding: String.Encoding.utf8)
}
// Convert and display string
if let convertedString = convertSpecialCharacters(rawString) {
let htmlString = "<html><head><meta name='viewport' content='initial-scale=1.0, user-scalable=no'></head><body><pre>\(convertedString)</pre></body></html>"
webView.loadHTMLString(htmlString, baseURL: nil)
}
}
// Make sure we convert HTML special characters
// Code from https://gist.github.com/mikesteele/70ae98d04fdc35cb1d5f
func convertSpecialCharacters(_ string: String?) -> String? {
guard let string = string else {
return nil
}
var newString = string
let char_dictionary = [
"&amp;": "&",
"&lt;": "<",
"&gt;": ">",
"&quot;": "\"",
"&apos;": "'"
];
for (escaped_char, unescaped_char) in char_dictionary {
newString = newString.replacingOccurrences(of: escaped_char, with: unescaped_char, options: NSString.CompareOptions.regularExpression, range: nil)
}
return newString
}
}
... ...
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>aps-environment</key>
<string>development</string>
</dict>
</plist>
... ...
//
// LoginVC.swift
// hhVDoctorSDK_Example
//
// Created by Shi Jian on 2019/8/13.
// Copyright © 2019 CocoaPods. All rights reserved.
//
import UIKit
import hhVDoctorSDK
class LoginVC: UIViewController {
@IBOutlet weak var mTextView: UITextView!
@IBOutlet weak var mDescLbl: UILabel!
@IBOutlet weak var mCallBtn: UIButton!
@IBOutlet weak var mLoginBtn: UIButton!
@IBOutlet weak var mMemberBtn: UIButton!
@IBOutlet weak var mPidText: UITextField!
@IBOutlet weak var mSkipHomeBt : UIButton!
fileprivate lazy var mTestBt : UIButton = {
let view = UIButton()
view.setTitle("自定义View", for: .normal)
return view
}()
override func viewDidLoad() {
super.viewDidLoad()
HHMSDK.default.add(delegate: self)
NotificationCenter.default.addObserver(self, selector: #selector(logout), name: Notification.Name(rawValue: "onEnvChange"), object: nil)
}
deinit {
NotificationCenter.default.removeObserver(self)
}
@IBAction func doLogin(_ sender: UIButton) {
HMDefaultOpt.productId = mPidText.text ?? ""
self.mDescLbl.text = "登录中。。。。。"
if let userToken = mTextView.text {
HHMSDK.default.login(userToken: userToken) { [weak self] in
self?.loginComplete($0)
}
return
}
HHMSDK.default.login(userToken: mTextView.text) { [weak self] in
self?.loginComplete($0)
}
}
private func loginComplete(_ error: String?) {
self.view.endEditing(true)
if let aError = error {
self.mDescLbl.text = aError
} else {
self.mDescLbl.text = "登录成功啦"
mLoginBtn.isHidden = true
mCallBtn.isHidden = false
mMemberBtn.isHidden = false
mSkipHomeBt.isHidden = false
}
}
@IBAction func doCallDoctor(_ sender: UIButton) {
HHMSDK.default.startCall(.adult)
}
func doFetchLog(_ sender: UIBarButtonItem) {
present(FileBrowser(), animated: true, completion: nil)
}
@IBAction func doSelectMem(_ sender: UIButton) {
HHMSDK.default.startMemberCall()
}
@IBAction func doLogout(_ sender: UIBarButtonItem) {
logout()
}
@IBAction func skipToSetting(_ sender: UIBarButtonItem) {
self.navigationController?.pushViewController(SettingVC(), animated: true)
}
@IBAction func skipToHome(_ sender : UIButton) {
HHMSDK.default.skipChatHome()
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.view.endEditing(true)
}
@objc func logout() {
HHMSDK.default.logout { [weak self] in
self?.mLoginBtn.isHidden = false
self?.mCallBtn.isHidden = true
self?.mMemberBtn.isHidden = true
self?.mSkipHomeBt.isHidden = true
if let aError = $0 {
self?.mDescLbl.text = "退出登录失败:\(aError)"
} else {
self?.mDescLbl.text = "退出登录成功"
}
}
}
}
extension LoginVC: HHMVideoDelegate {
func callStateChange(_ state: HHMCallingState) {
}
func callDidEstablish() {
}
func onFail(error: Error) {
}
func getChatParentView(_ view: UIView) {
}
func onCancel() {
}
func receivedOrder(_ orderId: String) {
}
func callDidFinish() {
}
func onExtensionDoctor() {
}
func onReceive(_ callID: String) {
}
func onResponse(_ accept: Bool) {
}
func onLeakPermission(_ type: PermissionType) {
}
}
... ...
No preview for this file type
{
"images" : [
{
"size" : "20x20",
"idiom" : "iphone",
"filename" : "icon-iphone-20@2x.png",
"scale" : "2x"
},
{
"size" : "20x20",
"idiom" : "iphone",
"filename" : "icon-iphone-20@3x.png",
"scale" : "3x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "icon-iphone-29@1x.png",
"scale" : "1x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "icon-iphone-29@2x.png",
"scale" : "2x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "icon-iphone-29@3x.png",
"scale" : "3x"
},
{
"size" : "40x40",
"idiom" : "iphone",
"filename" : "icon-iphone-40@2x.png",
"scale" : "2x"
},
{
"size" : "40x40",
"idiom" : "iphone",
"filename" : "icon-iphone-40@3x.png",
"scale" : "3x"
},
{
"size" : "57x57",
"idiom" : "iphone",
"filename" : "icon-iphone-57@1x.png",
"scale" : "1x"
},
{
"size" : "57x57",
"idiom" : "iphone",
"filename" : "icon-iphone-57@2x.png",
"scale" : "2x"
},
{
"size" : "60x60",
"idiom" : "iphone",
"filename" : "icon-iphone-60@2x.png",
"scale" : "2x"
},
{
"size" : "60x60",
"idiom" : "iphone",
"filename" : "icon-iphone-60@3x.png",
"scale" : "3x"
},
{
"size" : "20x20",
"idiom" : "ipad",
"filename" : "icon-ipad-20@1x.png",
"scale" : "1x"
},
{
"size" : "20x20",
"idiom" : "ipad",
"filename" : "icon-ipad-20@2x.png",
"scale" : "2x"
},
{
"size" : "29x29",
"idiom" : "ipad",
"filename" : "icon-ipad-29@1x.png",
"scale" : "1x"
},
{
"size" : "29x29",
"idiom" : "ipad",
"filename" : "icon-ipad-29@2x.png",
"scale" : "2x"
},
{
"size" : "40x40",
"idiom" : "ipad",
"filename" : "icon-ipad-40@1x.png",
"scale" : "1x"
},
{
"size" : "40x40",
"idiom" : "ipad",
"filename" : "icon-ipad-40@2x.png",
"scale" : "2x"
},
{
"size" : "76x76",
"idiom" : "ipad",
"filename" : "icon-ipad-76@1x.png",
"scale" : "1x"
},
{
"size" : "76x76",
"idiom" : "ipad",
"filename" : "icon-ipad-76@2x.png",
"scale" : "2x"
},
{
"size" : "83.5x83.5",
"idiom" : "ipad",
"filename" : "icon-ipad-83.5@2x.png",
"scale" : "2x"
},
{
"size" : "1024x1024",
"idiom" : "ios-marketing",
"filename" : "icon-ios-marketing-1024@1x.png",
"scale" : "1x"
},
{
"size" : "60x60",
"idiom" : "car",
"filename" : "icon-car-60@2x.png",
"scale" : "2x"
},
{
"size" : "60x60",
"idiom" : "car",
"filename" : "icon-car-60@3x.png",
"scale" : "3x"
},
{
"size" : "24x24",
"idiom" : "watch",
"filename" : "icon-watch-24@2x.png",
"scale" : "2x",
"role" : "notificationCenter",
"subtype" : "38mm"
},
{
"size" : "27.5x27.5",
"idiom" : "watch",
"filename" : "icon-watch-27.5@2x.png",
"scale" : "2x",
"role" : "notificationCenter",
"subtype" : "42mm"
},
{
"size" : "29x29",
"idiom" : "watch",
"filename" : "icon-watch-29@2x.png",
"role" : "companionSettings",
"scale" : "2x"
},
{
"size" : "29x29",
"idiom" : "watch",
"filename" : "icon-watch-29@3x.png",
"role" : "companionSettings",
"scale" : "3x"
},
{
"size" : "40x40",
"idiom" : "watch",
"filename" : "icon-watch-40@2x.png",
"scale" : "2x",
"role" : "appLauncher",
"subtype" : "38mm"
},
{
"size" : "44x44",
"idiom" : "watch",
"scale" : "2x",
"role" : "appLauncher",
"subtype" : "40mm"
},
{
"size" : "50x50",
"idiom" : "watch",
"scale" : "2x",
"role" : "appLauncher",
"subtype" : "44mm"
},
{
"size" : "86x86",
"idiom" : "watch",
"filename" : "icon-watch-86@2x.png",
"scale" : "2x",
"role" : "quickLook",
"subtype" : "38mm"
},
{
"size" : "98x98",
"idiom" : "watch",
"filename" : "icon-watch-98@2x.png",
"scale" : "2x",
"role" : "quickLook",
"subtype" : "42mm"
},
{
"size" : "108x108",
"idiom" : "watch",
"scale" : "2x",
"role" : "quickLook",
"subtype" : "44mm"
},
{
"size" : "1024x1024",
"idiom" : "watch-marketing",
"filename" : "icon-watch-marketing-1024@1x.png",
"scale" : "1x"
},
{
"size" : "16x16",
"idiom" : "mac",
"filename" : "icon-mac-16@1x.png",
"scale" : "1x"
},
{
"size" : "16x16",
"idiom" : "mac",
"filename" : "icon-mac-16@2x.png",
"scale" : "2x"
},
{
"size" : "32x32",
"idiom" : "mac",
"filename" : "icon-mac-32@1x.png",
"scale" : "1x"
},
{
"size" : "32x32",
"idiom" : "mac",
"filename" : "icon-mac-32@2x.png",
"scale" : "2x"
},
{
"size" : "128x128",
"idiom" : "mac",
"filename" : "icon-mac-128@1x.png",
"scale" : "1x"
},
{
"size" : "128x128",
"idiom" : "mac",
"filename" : "icon-mac-128@2x.png",
"scale" : "2x"
},
{
"size" : "256x256",
"idiom" : "mac",
"filename" : "icon-mac-256@1x.png",
"scale" : "1x"
},
{
"size" : "256x256",
"idiom" : "mac",
"filename" : "icon-mac-256@2x.png",
"scale" : "2x"
},
{
"size" : "512x512",
"idiom" : "mac",
"filename" : "icon-mac-512@1x.png",
"scale" : "1x"
},
{
"size" : "512x512",
"idiom" : "mac",
"filename" : "icon-mac-512@2x.png",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
\ No newline at end of file
... ...
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
\ No newline at end of file
... ...
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "未命名.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
\ No newline at end of file
... ...
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "未命名.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
\ No newline at end of file
... ...
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14113" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
<device id="retina4_7" orientation="portrait">
<adaptation id="fullscreen"/>
</device>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14088"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--View Controller-->
<scene sceneID="EHf-IW-A2E">
<objects>
<viewController id="01J-lp-oVM" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="mxh-vO-G0r"/>
<viewControllerLayoutGuide type="bottom" id="KRc-2I-rx2"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="53" y="375"/>
</scene>
</scenes>
</document>
... ...
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="17506" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="gh6-uF-nli">
<device id="retina4_7" orientation="portrait" appearance="light"/>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="17505"/>
<capability name="System colors in document resources" minToolsVersion="11.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--LoginVC-->
<scene sceneID="ZuK-Ew-nhs">
<objects>
<viewController id="H9G-Cx-5aF" customClass="LoginVC" customModule="HHTMedicSDK" customModuleProvider="target" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="pvb-0q-YKi"/>
<viewControllerLayoutGuide type="bottom" id="N1D-F5-d1D"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="Hxg-q0-rWs">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="UserToken" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="WDq-Dc-IOR">
<rect key="frame" x="36" y="142" width="72.5" height="21"/>
<constraints>
<constraint firstAttribute="height" constant="21" id="Qym-cy-jy5"/>
</constraints>
<fontDescription key="fontDescription" type="system" pointSize="15"/>
<color key="textColor" red="0.39215686274509803" green="0.39215686274509803" blue="0.39215686274509803" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
<textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" text="EC313F3198AF4F1972484E49E718D4DED7B294C6D4F4B9CB52C7CC1AF9E5140B" textAlignment="natural" translatesAutoresizingMaskIntoConstraints="NO" id="tXq-br-C4i">
<rect key="frame" x="141" y="102.5" width="198" height="100"/>
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
<constraints>
<constraint firstAttribute="height" constant="100" id="Zws-8I-LUM"/>
</constraints>
<color key="textColor" systemColor="labelColor"/>
<fontDescription key="fontDescription" type="system" pointSize="14"/>
<textInputTraits key="textInputTraits" autocapitalizationType="sentences"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
<real key="value" value="5"/>
</userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="color" keyPath="borderColor">
<color key="value" white="0.66666666666666663" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="number" keyPath="borderWidth">
<real key="value" value="1"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
</textView>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="poL-z9-aP0">
<rect key="frame" x="46" y="222.5" width="283" height="50"/>
<color key="backgroundColor" red="0.4823529412" green="0.81176470590000005" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstAttribute="height" constant="50" id="fmI-rh-0vj"/>
</constraints>
<fontDescription key="fontDescription" type="system" pointSize="18"/>
<state key="normal" title="登录">
<color key="titleColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</state>
<connections>
<action selector="doLogin:" destination="H9G-Cx-5aF" eventType="touchUpInside" id="IZB-Q4-BaE"/>
</connections>
</button>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="3Ez-hY-hE0">
<rect key="frame" x="187.5" y="632" width="0.0" height="0.0"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" systemColor="systemRedColor"/>
<nil key="highlightedColor"/>
</label>
<button hidden="YES" opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="8W4-aR-lG5">
<rect key="frame" x="46" y="297.5" width="283" height="50"/>
<color key="backgroundColor" red="0.4823529412" green="0.81176470590000005" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstAttribute="height" constant="50" id="f5W-D8-mbx"/>
</constraints>
<fontDescription key="fontDescription" type="system" pointSize="18"/>
<state key="normal" title="呼叫">
<color key="titleColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</state>
<connections>
<action selector="doCallDoctor:" destination="H9G-Cx-5aF" eventType="touchUpInside" id="pFm-6N-W2f"/>
</connections>
</button>
<button hidden="YES" opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="8oo-l9-0xS">
<rect key="frame" x="46" y="367.5" width="283" height="50"/>
<color key="backgroundColor" red="0.4823529412" green="0.81176470590000005" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstAttribute="height" constant="50" id="7i8-xT-rsZ"/>
</constraints>
<fontDescription key="fontDescription" type="system" pointSize="18"/>
<state key="normal" title="选成员呼叫">
<color key="titleColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</state>
<connections>
<action selector="doSelectMem:" destination="H9G-Cx-5aF" eventType="touchUpInside" id="SnD-7P-d52"/>
</connections>
</button>
<button hidden="YES" opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="HAJ-cu-o1I">
<rect key="frame" x="46" y="427.5" width="283" height="50"/>
<color key="backgroundColor" red="0.026365790516138077" green="0.7069585919380188" blue="0.95850151777267456" alpha="0.9990234375" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstAttribute="height" constant="50" id="VyT-1E-E2P"/>
</constraints>
<state key="normal" title="跳转首页">
<color key="titleColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</state>
<connections>
<action selector="skipToHome:" destination="H9G-Cx-5aF" eventType="touchUpInside" id="Ogg-hL-Exq"/>
</connections>
</button>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="SDKProductID" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="vGE-5O-Jnp">
<rect key="frame" x="36" y="74" width="99" height="18"/>
<fontDescription key="fontDescription" type="system" pointSize="15"/>
<color key="textColor" red="0.39215686274509803" green="0.39215686274509803" blue="0.39215686274509803" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" text="3000" borderStyle="roundedRect" placeholder="PID" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="LMZ-Wb-ONz">
<rect key="frame" x="150" y="64" width="150" height="34"/>
<constraints>
<constraint firstAttribute="width" constant="150" id="prH-ou-yPD"/>
</constraints>
<fontDescription key="fontDescription" type="system" pointSize="14"/>
<textInputTraits key="textInputTraits"/>
</textField>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstItem="poL-z9-aP0" firstAttribute="leading" secondItem="Hxg-q0-rWs" secondAttribute="leadingMargin" constant="30" id="08P-cp-x8V"/>
<constraint firstItem="N1D-F5-d1D" firstAttribute="top" secondItem="3Ez-hY-hE0" secondAttribute="bottom" constant="35" id="3Cc-qG-aGS"/>
<constraint firstAttribute="trailingMargin" secondItem="tXq-br-C4i" secondAttribute="trailing" constant="20" id="5SM-6s-gZW"/>
<constraint firstItem="8W4-aR-lG5" firstAttribute="leading" secondItem="poL-z9-aP0" secondAttribute="leading" id="759-Km-ew6"/>
<constraint firstItem="8oo-l9-0xS" firstAttribute="top" secondItem="8W4-aR-lG5" secondAttribute="bottom" constant="20" id="EAP-M1-bdr"/>
<constraint firstItem="8W4-aR-lG5" firstAttribute="trailing" secondItem="poL-z9-aP0" secondAttribute="trailing" id="F1C-Hs-hbp"/>
<constraint firstItem="LMZ-Wb-ONz" firstAttribute="top" secondItem="pvb-0q-YKi" secondAttribute="bottom" constant="20" id="Iah-4z-DFT"/>
<constraint firstItem="vGE-5O-Jnp" firstAttribute="leading" secondItem="Hxg-q0-rWs" secondAttribute="leadingMargin" constant="20" id="Iya-4o-Iwp"/>
<constraint firstItem="poL-z9-aP0" firstAttribute="centerX" secondItem="Hxg-q0-rWs" secondAttribute="centerX" id="JXA-Aj-bZr"/>
<constraint firstItem="tXq-br-C4i" firstAttribute="leading" secondItem="WDq-Dc-IOR" secondAttribute="trailing" constant="32.5" id="NTI-wJ-aEi"/>
<constraint firstAttribute="trailingMargin" secondItem="poL-z9-aP0" secondAttribute="trailing" constant="30" id="Rmf-K6-ydN"/>
<constraint firstItem="vGE-5O-Jnp" firstAttribute="top" secondItem="pvb-0q-YKi" secondAttribute="bottom" constant="30" id="Rsv-UR-KGj"/>
<constraint firstItem="WDq-Dc-IOR" firstAttribute="top" secondItem="vGE-5O-Jnp" secondAttribute="bottom" constant="50" id="UuJ-ZL-pny"/>
<constraint firstItem="8oo-l9-0xS" firstAttribute="leading" secondItem="8W4-aR-lG5" secondAttribute="leading" id="ZWz-DC-qe9"/>
<constraint firstItem="tXq-br-C4i" firstAttribute="centerY" secondItem="WDq-Dc-IOR" secondAttribute="centerY" id="d6z-rc-7Hm"/>
<constraint firstItem="HAJ-cu-o1I" firstAttribute="leading" secondItem="Hxg-q0-rWs" secondAttribute="leadingMargin" constant="30" id="gbT-y9-FiN"/>
<constraint firstItem="8oo-l9-0xS" firstAttribute="trailing" secondItem="8W4-aR-lG5" secondAttribute="trailing" id="hEl-M1-WZ9"/>
<constraint firstItem="8W4-aR-lG5" firstAttribute="centerX" secondItem="Hxg-q0-rWs" secondAttribute="centerX" id="k7H-CD-dJB"/>
<constraint firstItem="8W4-aR-lG5" firstAttribute="top" secondItem="poL-z9-aP0" secondAttribute="bottom" constant="25" id="lbY-4y-PGG"/>
<constraint firstAttribute="trailingMargin" secondItem="HAJ-cu-o1I" secondAttribute="trailing" constant="30" id="n3M-dU-lw9"/>
<constraint firstItem="LMZ-Wb-ONz" firstAttribute="leading" secondItem="Hxg-q0-rWs" secondAttribute="leading" constant="150" id="n6s-bX-QgY"/>
<constraint firstItem="3Ez-hY-hE0" firstAttribute="centerX" secondItem="Hxg-q0-rWs" secondAttribute="centerX" id="tNe-km-eME"/>
<constraint firstItem="WDq-Dc-IOR" firstAttribute="leading" secondItem="Hxg-q0-rWs" secondAttribute="leadingMargin" constant="20" id="wmc-fH-91m"/>
<constraint firstItem="poL-z9-aP0" firstAttribute="top" secondItem="tXq-br-C4i" secondAttribute="bottom" constant="20" id="xXs-dA-lRG"/>
<constraint firstItem="HAJ-cu-o1I" firstAttribute="top" secondItem="8oo-l9-0xS" secondAttribute="bottom" constant="10" id="xc5-7d-vGv"/>
</constraints>
</view>
<navigationItem key="navigationItem" id="83O-Gf-RkC">
<barButtonItem key="leftBarButtonItem" title="Logout" id="3UJ-cd-D74">
<connections>
<action selector="doLogout:" destination="H9G-Cx-5aF" id="Fig-Ir-vhd"/>
</connections>
</barButtonItem>
<barButtonItem key="rightBarButtonItem" title="Setting" id="b2y-iJ-fLR">
<connections>
<action selector="skipToSetting:" destination="H9G-Cx-5aF" id="pUD-da-DSc"/>
<segue destination="o3F-Mf-qyV" kind="show" id="hvD-3C-d6A"/>
</connections>
</barButtonItem>
</navigationItem>
<connections>
<outlet property="mCallBtn" destination="8W4-aR-lG5" id="2EB-0y-WTr"/>
<outlet property="mDescLbl" destination="3Ez-hY-hE0" id="qh2-su-Z4g"/>
<outlet property="mLoginBtn" destination="poL-z9-aP0" id="iZz-fi-zBw"/>
<outlet property="mMemberBtn" destination="8oo-l9-0xS" id="jkY-bH-DFI"/>
<outlet property="mPidText" destination="LMZ-Wb-ONz" id="3LE-zP-K1g"/>
<outlet property="mSkipHomeBt" destination="HAJ-cu-o1I" id="TNg-Ha-66n"/>
<outlet property="mTextView" destination="tXq-br-C4i" id="jhn-qC-kjs"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="v4Z-Mu-IOA" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="1276" y="-564.46776611694156"/>
</scene>
<!--SettingVC-->
<scene sceneID="pv9-J4-of0">
<objects>
<viewController id="o3F-Mf-qyV" customClass="SettingVC" customModule="HHTMedicSDK" customModuleProvider="target" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="B3S-wn-Uqm"/>
<viewControllerLayoutGuide type="bottom" id="YOS-cd-yhV"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="ikE-2s-Q0T">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="-1" estimatedRowHeight="-1" sectionHeaderHeight="28" sectionFooterHeight="28" translatesAutoresizingMaskIntoConstraints="NO" id="eh5-6k-Uxb">
<rect key="frame" x="0.0" y="44" width="375" height="623"/>
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
<prototypes>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" reuseIdentifier="SettingCell" id="Bgf-fW-wAR" customClass="SettingCell" customModule="HHTMedicSDK" customModuleProvider="target">
<rect key="frame" x="0.0" y="28" width="375" height="43.5"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="Bgf-fW-wAR" id="Ied-xa-MDf">
<rect key="frame" x="0.0" y="0.0" width="375" height="43.5"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="我的会员" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="qh8-Mt-OiA">
<rect key="frame" x="24" y="13" width="61.5" height="18"/>
<fontDescription key="fontDescription" type="system" pointSize="15"/>
<color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Ccv-Ta-jof" userLabel="bottomSegView">
<rect key="frame" x="15" y="43" width="345" height="0.5"/>
<color key="backgroundColor" red="0.82352941180000006" green="0.82352941180000006" blue="0.82352941180000006" alpha="1" colorSpace="calibratedRGB"/>
<constraints>
<constraint firstAttribute="height" constant="0.5" id="Hs2-19-L0z"/>
</constraints>
</view>
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Zbo-Ef-REA">
<rect key="frame" x="314" y="6.5" width="51" height="31"/>
<connections>
<action selector="onSwitch:" destination="Bgf-fW-wAR" eventType="valueChanged" id="fsQ-f1-F3c"/>
</connections>
</switch>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="arrow" translatesAutoresizingMaskIntoConstraints="NO" id="ouN-jM-aYb">
<rect key="frame" x="347" y="12.5" width="12" height="19"/>
<constraints>
<constraint firstAttribute="width" constant="12" id="4sn-RK-Yle"/>
<constraint firstAttribute="height" constant="19" id="cd4-xL-CV1"/>
</constraints>
</imageView>
</subviews>
<constraints>
<constraint firstAttribute="bottom" secondItem="Ccv-Ta-jof" secondAttribute="bottom" id="4tv-UT-sC0"/>
<constraint firstAttribute="trailing" secondItem="Ccv-Ta-jof" secondAttribute="trailing" constant="15" id="CQB-Br-Dcz"/>
<constraint firstAttribute="trailing" secondItem="ouN-jM-aYb" secondAttribute="trailing" constant="16" id="ST8-J9-K8Z"/>
<constraint firstItem="Zbo-Ef-REA" firstAttribute="centerY" secondItem="Ied-xa-MDf" secondAttribute="centerY" id="a3J-Lx-2dJ"/>
<constraint firstItem="Zbo-Ef-REA" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="qh8-Mt-OiA" secondAttribute="trailing" constant="8" symbolic="YES" id="d1F-ka-Lpo"/>
<constraint firstItem="qh8-Mt-OiA" firstAttribute="centerY" secondItem="Ied-xa-MDf" secondAttribute="centerY" id="dIf-jB-2Aa"/>
<constraint firstAttribute="trailing" secondItem="Zbo-Ef-REA" secondAttribute="trailing" constant="12" id="iEC-zB-Dx3"/>
<constraint firstItem="Ccv-Ta-jof" firstAttribute="leading" secondItem="Ied-xa-MDf" secondAttribute="leading" constant="15" id="kT1-L4-hKw"/>
<constraint firstItem="ouN-jM-aYb" firstAttribute="centerY" secondItem="Ied-xa-MDf" secondAttribute="centerY" id="nS2-Xg-HjM"/>
<constraint firstItem="qh8-Mt-OiA" firstAttribute="leading" secondItem="Ied-xa-MDf" secondAttribute="leadingMargin" constant="8" id="xE3-E4-gep"/>
</constraints>
</tableViewCellContentView>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<connections>
<outlet property="mArrow" destination="ouN-jM-aYb" id="MBw-6c-SMX"/>
<outlet property="mSwitch" destination="Zbo-Ef-REA" id="0GG-mU-DNJ"/>
<outlet property="mTitleLabel" destination="qh8-Mt-OiA" id="5C1-GX-cGS"/>
</connections>
</tableViewCell>
</prototypes>
</tableView>
</subviews>
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
<constraints>
<constraint firstItem="eh5-6k-Uxb" firstAttribute="top" secondItem="B3S-wn-Uqm" secondAttribute="bottom" id="8Xy-Ig-Yrc"/>
<constraint firstItem="eh5-6k-Uxb" firstAttribute="leading" secondItem="ikE-2s-Q0T" secondAttribute="leading" id="NZa-4U-bs1"/>
<constraint firstAttribute="trailing" secondItem="eh5-6k-Uxb" secondAttribute="trailing" id="izp-CQ-b8W"/>
<constraint firstItem="YOS-cd-yhV" firstAttribute="top" secondItem="eh5-6k-Uxb" secondAttribute="bottom" id="vxB-av-hT1"/>
</constraints>
</view>
<navigationItem key="navigationItem" id="iuy-if-vaC"/>
<connections>
<outlet property="mTableView" destination="eh5-6k-Uxb" id="6LO-na-jqN"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="dpQ-t3-68Q" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="2416" y="-561"/>
</scene>
<!--Navigation Controller-->
<scene sceneID="Ua6-og-koi">
<objects>
<navigationController automaticallyAdjustsScrollViewInsets="NO" id="gh6-uF-nli" sceneMemberID="viewController">
<toolbarItems/>
<navigationBar key="navigationBar" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" id="cEw-75-F2t">
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
</navigationBar>
<nil name="viewControllers"/>
<connections>
<segue destination="H9G-Cx-5aF" kind="relationship" relationship="rootViewController" id="5Cg-Jb-tFa"/>
</connections>
</navigationController>
<placeholder placeholderIdentifier="IBFirstResponder" id="AC6-lg-e6E" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="133.59999999999999" y="-564.46776611694156"/>
</scene>
</scenes>
<resources>
<image name="arrow" width="6" height="9.5"/>
<systemColor name="labelColor">
<color white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</systemColor>
<systemColor name="systemBackgroundColor">
<color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</systemColor>
<systemColor name="systemRedColor">
<color red="1" green="0.23137254901960785" blue="0.18823529411764706" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</systemColor>
</resources>
</document>
... ...
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key>
<string>视频SDK&lt;腾讯版&gt;</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>$(MARKETING_VERSION)</string>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLName</key>
<string>jtDoctors</string>
</dict>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLName</key>
<string>eleme</string>
<key>CFBundleURLSchemes</key>
<array>
<string>cash.tb.ele.me</string>
</array>
</dict>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLSchemes</key>
<array>
<string>HHPay</string>
</array>
</dict>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLSchemes</key>
<array>
<string>hh-medic.com</string>
</array>
</dict>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLSchemes</key>
<array>
<string>alipays</string>
</array>
</dict>
</array>
<key>CFBundleVersion</key>
<string>$(CURRENT_PROJECT_VERSION)</string>
<key>LSApplicationQueriesSchemes</key>
<array>
<string>jtDoctors</string>
</array>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>NSCameraUsageDescription</key>
<string>应用需使用相机权限,以便您向医生进行视频咨询。</string>
<key>NSMicrophoneUsageDescription</key>
<string>应用需使用麦克风权限,以便您向医生进行视频咨询。</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>应用需要使用相册权限,以便您向医生发送健康资料。</string>
<key>UIBackgroundModes</key>
<array>
<string>audio</string>
</array>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIMainStoryboardFile</key>
<string>Main</string>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
</array>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
</dict>
</plist>
... ...
/* Class = "UIButton"; normalTitle = "登录"; ObjectID = "2kg-pY-iKv"; */
"2kg-pY-iKv.normalTitle" = "登录";
/* Class = "UIBarButtonItem"; title = "退出登录"; ObjectID = "4RM-f4-f9F"; */
"4RM-f4-f9F.title" = "退出登录";
/* Class = "UINavigationItem"; title = "选择功能"; ObjectID = "4yA-pt-Rni"; */
"4yA-pt-Rni.title" = "选择功能";
/* Class = "UILabel"; text = "病历详情"; ObjectID = "5GK-Mz-7TS"; */
"5GK-Mz-7TS.text" = "病历详情";
/* Class = "UILabel"; text = "病历列表"; ObjectID = "6kM-Rr-8VS"; */
"6kM-Rr-8VS.text" = "病历列表";
/* Class = "UILabel"; text = "呼叫 + 代理"; ObjectID = "B2q-aP-Gz6"; */
"B2q-aP-Gz6.text" = "呼叫 + 代理";
/* Class = "UIViewController"; title = "基础呼叫"; ObjectID = "BYZ-38-t0r"; */
"BYZ-38-t0r.title" = "基础呼叫";
/* Class = "UITableViewSection"; headerTitle = "基础功能"; ObjectID = "CJa-GO-2lr"; */
"CJa-GO-2lr.headerTitle" = "基础功能";
/* Class = "UIViewController"; title = "呼叫+代理"; ObjectID = "Lgg-lI-rF9"; */
"Lgg-lI-rF9.title" = "呼叫+代理";
/* Class = "UIButton"; normalTitle = "成人"; ObjectID = "PcZ-Ef-iOf"; */
"PcZ-Ef-iOf.normalTitle" = "成人";
/* Class = "UINavigationItem"; title = "HHMSDK demo"; ObjectID = "Qyt-dy-OuG"; */
"Qyt-dy-OuG.title" = "HHMSDK demo";
/* Class = "UIButton"; normalTitle = "成人"; ObjectID = "cFf-AB-SPw"; */
"cFf-AB-SPw.normalTitle" = "成人";
/* Class = "UIButton"; normalTitle = "儿童"; ObjectID = "cKb-i3-JxQ"; */
"cKb-i3-JxQ.normalTitle" = "儿童";
/* Class = "UIViewController"; title = "HHMSDK demo"; ObjectID = "cO3-cq-YaO"; */
"cO3-cq-YaO.title" = "HHMSDK demo";
/* Class = "UIButton"; normalTitle = "儿童"; ObjectID = "iae-tc-tmZ"; */
"iae-tc-tmZ.normalTitle" = "儿童";
/* Class = "UITableViewSection"; headerTitle = "病历"; ObjectID = "nLB-DQ-UD2"; */
"nLB-DQ-UD2.headerTitle" = "病历";
/* Class = "UILabel"; text = "基础呼叫"; ObjectID = "rX9-H9-IL5"; */
"rX9-H9-IL5.text" = "基础呼叫";
... ...
//
// SettingVC.swift
// hhVDoctorSDK
//
// Created by 程言方 on 2020/11/13.
// Copyright © 2020 CocoaPods. All rights reserved.
//
import UIKit
import hhVDoctorSDK
class SettingVC : UIViewController {
@IBOutlet weak var mTableView : UITableView!
private var sections = [(String,[(String,Bool,Bool)])]()
override public func viewDidLoad() {
super.viewDidLoad()
setUpUI()
setUpData()
}
override func viewWillAppear(_ animated: Bool) {
}
func setUpUI(){
title = "设置"
mTableView.separatorStyle = .none
mTableView.rowHeight = UITableView.automaticDimension
mTableView.delegate = self
mTableView.dataSource = self
mTableView.separatorStyle = .none
}
func setUpData() {
let baseSetting = ("基础设置",[
("测试环境",HHSDKOptions.default.isDevelopment,true),
("扩展参数",false,false),
])
sections.append(baseSetting)
let videoSetting = ("音视频设置", [
("呼叫是否过滤生日性别",HHSDKOptions.default.mVideoOptions.filterCallerInfo,true),
("是否开启美颜",HHSDKOptions.default.mVideoOptions.allowBeauty,true),
("是否可以选择多人视频",HHSDKOptions.default.mVideoOptions.allowMulti,true),
("是否可以增加成员",HHSDKOptions.default.mVideoOptions.allowAddMember,true),
("视频完成后是否有评价",HHSDKOptions.default.mVideoOptions.allowEvaluate,true),
])
sections.append(videoSetting)
let infoListSetting = ("信息流设置",[
("是否过滤总结卡片",HHSDKOptions.default.mMessageOptions.isFilterSummary,true),
("是否过滤药卡",HHSDKOptions.default.mMessageOptions.isFilterMedicinal,true),
("小助手默认头像",false,false),
("小助手默认昵称",false,false),
("信息流默认标题",false,false),
("开启定位",false,true),
])
sections.append(infoListSetting)
let userCenterSetting = ("个人中心设置",[
("是否隐藏个人中心入口",HHSDKOptions.default.mUserCenterOptions.hideUserCenter,true),
("是否展示激活码入口",HHSDKOptions.default.mUserCenterOptions.enableActivate,true),
("是否展示档案库入口",HHSDKOptions.default.mUserCenterOptions.enableMedical,true),
("档案库是否可以添加成员",HHSDKOptions.default.mUserCenterOptions.canAddMember,true),
])
sections.append(userCenterSetting)
mTableView.reloadData()
}
}
extension SettingVC : UITableViewDelegate,UITableViewDataSource {
func numberOfSections(in tableView: UITableView) -> Int {
return sections.count
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return sections[section].1.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "SettingCell") as? SettingCell
let cellInfo = sections[indexPath.section].1[indexPath.row]
cell?.configCell(title: cellInfo.0, isOpen: cellInfo.1,isSwitch: cellInfo.2)
let view = UIView()
view.backgroundColor = .white
cell?.selectedBackgroundView = view
cell?.switchCallback = { [weak self] isOn in
self?.onConfigChange(indexPath: indexPath, isOpen: isOn)
}
return cell ?? UITableViewCell()
}
func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
sections[section].0
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
switch (indexPath.section,indexPath.row) {
case (0,1):
showEditAlter(title: "扩展参数",info: HHSDKOptions.default.mExtension) { info in
HHSDKOptions.default.mExtension = info
}
break
case (2,2):
showEditAlter(title: "小助手默认头像",info: HHSDKOptions.default.mExtension) { info in
HHSDKOptions.default.mMessageOptions.defaultDocHeader = info
}
break
case (2,3):
showEditAlter(title: "小助手默认昵称",info: HHSDKOptions.default.mExtension) { info in
HHSDKOptions.default.mMessageOptions.defaultDocName = info
}
break
case (2,4):
showEditAlter(title: "信息流默认标题",info: HHSDKOptions.default.mExtension) { info in
HHSDKOptions.default.mMessageOptions.messageTitle = info
}
break
default:
break
}
}
}
extension SettingVC {
func onConfigChange(indexPath : IndexPath , isOpen : Bool) {
switch (indexPath.section,indexPath.row) {
case (0,0):
HHMSDK.default.switchEnv(isOpen)
NotificationCenter.default.post(name: Notification.Name(rawValue: "onEnvChange"), object: nil)
break
case (1,0):
HHSDKOptions.default.mVideoOptions.filterCallerInfo = isOpen
case (1,1):
HHSDKOptions.default.mVideoOptions.allowBeauty = isOpen
case (1,2):
HHSDKOptions.default.mVideoOptions.allowMulti = isOpen
case (1,3):
HHSDKOptions.default.mVideoOptions.allowAddMember = isOpen
case (1,4):
HHSDKOptions.default.mVideoOptions.allowEvaluate = isOpen
case (2,0):
HHSDKOptions.default.mMessageOptions.isFilterSummary = isOpen
case (2,1):
HHSDKOptions.default.mMessageOptions.isFilterMedicinal = isOpen
case (2,5):
// if isOpen {
// HHMSDK.default.aliPayHook = {(url,scheme,callback) in
// let isOk = AlipaySDK.defaultService()?.payInterceptor(withUrl: url, fromScheme: scheme, callback: { (result) in
// callback(result as? [String : Any] ?? ["test":""])
// })
//
//
// return isOk ?? false
// }
// }else{
//
// HHMSDK.default.aliPayHook = nil
// }
if isOpen {
HHLocation.default.startLocation(lng: "116.431941", lat: "39.940199")
}else{
HHLocation.default.closeLocation()
}
case (3,0):
HHSDKOptions.default.mUserCenterOptions.hideUserCenter = isOpen
case (3,1):
HHSDKOptions.default.mUserCenterOptions.enableActivate = isOpen
case (3,2):
HHSDKOptions.default.mUserCenterOptions.enableMedical = isOpen
case (3,3):
HHSDKOptions.default.mUserCenterOptions.canAddMember = isOpen
default:
break
}
}
func showEditAlter(title : String , info : String , callback : @escaping ((String)->Void)) {
let alert = UIAlertController(title: title, message: nil, preferredStyle: .alert)
alert.addTextField { (textField) in
textField.text = info
}
let cancelAction = UIAlertAction(title: "取消", style: .cancel) { _ in
alert.dismiss(animated: true, completion: nil)
}
cancelAction.setValue(UIColor.gray, forKey: "titleTextColor")
alert.addAction(cancelAction)
alert.addAction(UIAlertAction(title: "确定", style: .default, handler: {(_) in
let info = alert.textFields?.first?.text
guard info?.count ?? 0 > 0 else { return }
callback(info ?? "")
}))
present(alert, animated: true, completion: nil)
}
}
class SettingCell: UITableViewCell {
@IBOutlet weak var mTitleLabel: UILabel!
@IBOutlet weak var mSwitch : UISwitch!
@IBOutlet weak var mArrow : UIImageView!
var switchCallback : ((Bool) -> Void)?
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
func configCell(title: String, isOpen : Bool, isSwitch: Bool) {
mTitleLabel.text = title
mSwitch.isOn = isOpen
if isSwitch {
mSwitch.isHidden = false
mArrow.isHidden = true
}else{
mSwitch.isHidden = true
mArrow.isHidden = false
}
}
@IBAction func onSwitch(_ sender : UISwitch) {
switchCallback?(sender.isOn)
}
}
... ...
No preview for this file type
//
// CavsBrowser.swift
// Cavs
//
// Created by mk on 2017/10/30.
// Copyright © 2017年 Johnson. All rights reserved.
//
import UIKit
import SnapKit
import WebKit
let ob_progress = "estimatedProgress"
let ob_title = "title"
class HHWebBrowser: UIViewController, WKUIDelegate, WKNavigationDelegate {
/// 网页url
var urlString: String?
// {
// didSet {
// loadUrl()
// }
// }
/// 网页名称
var titleString: String?
/// webView
lazy var mWebView: WKWebView = {
let configuretion = WKWebViewConfiguration()
configuretion.preferences.javaScriptCanOpenWindowsAutomatically = true
let wkView = WKWebView(frame: CGRect.zero , configuration: configuretion)
return wkView
}()
/// 进度条
lazy var mProgress: UIProgressView = {
let webPV = UIProgressView(frame: CGRect(x: 0, y: 0, width: self.view.bounds.size.width, height: 5))
webPV.transform = CGAffineTransform(scaleX: 1.0, y: 2.0)
return webPV
}()
private var navi: UINavigationController?
private var gesDelegate: UIGestureRecognizerDelegate?
init(_ URL: String, title: String = "") {
self.urlString = URL
self.titleString = title
super.init(nibName: nil, bundle: nil)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override public func viewDidLoad() {
super.viewDidLoad()
initUI()
print("122222")
self.navi = self.navigationController
self.gesDelegate = self.navigationController?.interactivePopGestureRecognizer?.delegate
}
private func initUI() {
view.addSubview(mWebView)
view.addSubview(mProgress)
mWebView.snp.makeConstraints({ (make) in
make.edges.equalTo(self.view).inset(UIEdgeInsets.init(top: 0, left: 0, bottom: 0, right: 0))
})
navigationItem.rightBarButtonItem = nil
navigationItem.leftBarButtonItem = UIBarButtonItem(image: UIImage(named: "back_app2"), style: .done, target: self, action: #selector(clickGoBackBtn))
// navigationItem.leftBarButtonItem?.target = self
// navigationItem.leftBarButtonItem?.action = #selector(clickGoBackBtn)
settingWeb()
loadUrl()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.navi?.interactivePopGestureRecognizer?.delegate = nil
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
self.navi?.interactivePopGestureRecognizer?.delegate = self.gesDelegate
}
fileprivate func settingWeb() {
mWebView.uiDelegate = self
mWebView.navigationDelegate = self
mWebView.allowsBackForwardNavigationGestures = true
mWebView.addObserver(self, forKeyPath: ob_progress, options: .new, context: nil)
mWebView.addObserver(self, forKeyPath: ob_title, options: .new, context: nil)
}
@objc func clickGoBackBtn() {
guard mWebView.canGoBack else { clickCloseBtn(); return }
mWebView.goBack()
}
@objc func clickCloseBtn() {
guard let navVC = navigationController else { return }
navVC.popViewController(animated: true)
}
private func loadUrl() {
if let webURL = URL(string: urlString ?? "") {
let request = URLRequest(url: webURL)
mWebView.load(request)
}
}
public override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
guard let path = keyPath else { return }
switch path
{
case ob_title:
bindTitle(change)
case ob_progress:
updateProgress()
default:
break
}
}
// 此代理方法如果不实现,则不会实现网页跳转
public func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
if navigationAction.targetFrame == nil {
webView.load(navigationAction.request)
}
decisionHandler(.allow)
}
public func webView(_ webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping () -> Void)
{
let alertC = UIAlertController(title: "提示", message: message, preferredStyle: .alert)
alertC.addAction(UIAlertAction(title: "确定", style: .default, handler: { (aAction) in
completionHandler()
}))
alertC.addAction(UIAlertAction(title: "取消", style: .default, handler: { (_) in
completionHandler()
}))
present(alertC, animated: true, completion: nil)
}
func webView(_ webView: WKWebView, runJavaScriptConfirmPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping (Bool) -> Void) {
print("runJavaScriptConfirmPanelWithMessage")
let alert = UIAlertController(title: "提示", message: message, preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "取消", style: .default, handler: { (_) in
completionHandler(false)
}))
alert.addAction(UIAlertAction(title: "确认", style: .default, handler: { (_) in
completionHandler(true)
}))
self.present(alert, animated: true, completion: nil)
}
func webView(_ webView: WKWebView, runJavaScriptTextInputPanelWithPrompt prompt: String, defaultText: String?, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping (String?) -> Void) {
let alert = UIAlertController(title: prompt, message: "", preferredStyle: .alert)
alert.addTextField { (textField) in
textField.text = defaultText
}
alert.addAction(UIAlertAction(title: "完成", style: .default, handler: { (_) in
completionHandler(alert.textFields?.first?.text)
}))
self.present(alert, animated: true, completion: nil)
}
public func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
webView.canGoBack ? addCloseItem() : delCloseItem()
}
public func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
// print("start")
}
func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
print("----------- something error")
print(error.localizedDescription)
}
private func addCloseItem() {
guard navigationItem.rightBarButtonItem == nil else { return }
let item = UIBarButtonItem(title: "关闭", style: .plain, target: self, action: #selector(clickCloseBtn))
item.setTitleTextAttributes([NSAttributedString.Key.font: UIFont.systemFont(ofSize: 15)], for: .normal)
navigationItem.rightBarButtonItem = item
}
private func delCloseItem() {
guard let _ = navigationItem.rightBarButtonItem else { return }
navigationItem.rightBarButtonItem = nil
}
deinit {
mWebView.removeObserver(self, forKeyPath: ob_progress)
mWebView.removeObserver(self, forKeyPath: ob_title)
}
}
extension HHWebBrowser {
fileprivate func bindTitle(_ change: [NSKeyValueChangeKey : Any]?) {
if !(titleString ?? "").isEmpty {
title = titleString
} else {
if let aDic = change {
title = aDic[NSKeyValueChangeKey(rawValue: "new")] as? String
}
}
}
fileprivate func updateProgress() {
// print("progress: \(mWebView.estimatedProgress)")
mProgress.isHidden = mWebView.estimatedProgress == 1
mProgress.setProgress(Float((mWebView.estimatedProgress)), animated: true)
}
}
... ...
//
// UIView+xib.swift
// HHMSDKDemo
//
// Created by Shi Jian on 2018/6/19.
// Copyright © 2018年 shmily. All rights reserved.
//
import UIKit
// MARK: - Interface Builder中显示UIView的属性
extension UIView
{
// 圆角
@IBInspectable var cornerRadius: CGFloat {
get {
return layer.cornerRadius
}
set {
self.layer.masksToBounds = true
layer.cornerRadius = newValue
}
}
// 边界宽度
@IBInspectable var borderWidth: CGFloat {
get {
return layer.borderWidth
}
set {
self.layer.masksToBounds = true
layer.borderWidth = newValue
}
}
// 边界颜色
@IBInspectable var borderColor: UIColor {
get {
return UIColor(cgColor: layer.borderColor!)
}
set {
layer.borderColor = newValue.cgColor
}
}
}
... ...
No preview for this file type
//
// bridging-header.h
// HHMSDKDemo
//
// Created by 程言方 on 2020/11/16.
// Copyright © 2020 shmily. All rights reserved.
//
... ...
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key>
<string>药SDK demo</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.2.0</string>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLSchemes</key>
<array>
<string>hh-medic.com</string>
</array>
</dict>
</array>
<key>CFBundleVersion</key>
<string>19.05.3015</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>NSCameraUsageDescription</key>
<string>应用需使用相机权限,以便您向医生进行视频咨询。</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>应用需要使用定位权限,以帮您推荐合适的医院</string>
<key>NSMicrophoneUsageDescription</key>
<string>应用需使用麦克风权限,以便您向医生进行视频咨询。</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>应用需要使用相册权限,以便您向医生发送健康资料。</string>
<key>UIBackgroundModes</key>
<array>
<string>audio</string>
</array>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIMainStoryboardFile</key>
<string>Main</string>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
</array>
<key>UIRequiresFullScreen</key>
<true/>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
</dict>
</plist>
... ...
MIT License
Copyright (c) 2018 HHMedic
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
... ...
platform :ios, '9.0'
use_frameworks!
# 和缓视频医生 SDK demo
target 'HHMSDKDemo' do
project './HHMSDKDemo.xcodeproj'
pod 'SVProgressHUD'
pod 'SnapKit'
pod 'HHVDoctorSDK', :git => "http://code.hh-medic.com/hh_public/hhvDoctorSDK.ios.git", :branch => 'feature/medic'
end
... ...
# HHVDoctorSDK 接入说明
<p align="right">
北京和缓医疗科技有限公司<br/>
网址:https://www.hh-medic.com <br/>
地址:北京市东城区东直门来福士7层
</p>
* [HHDoctorSDK 接入说明](#hhdoctorsdk-接入说明)
* [0. 更新日志](#0-更新日志)
* [1. 集成方式](#1-集成方式)
* [1.1. 手动集成](#11-手动集成)
* [1.2. 自动集成(推荐)](#12-自动集成推荐)
* [1.3. 调用规则](#13-调用规则)
* [2. 初始化](#2-初始化)
* [3. 登录账户](#3-登录账户)
* [3.1. 登录](#31-登录)
* [3.2. 登出](#32-登出)
* [4. 视频呼叫](#4-视频呼叫)
* [5. 代理(delegate)(可选)](#5-代理delegate可选)
* [5.1. 加入](#51-加入)
* [5.2. 移除](#52-移除)
* [6. 其他配置](#6-其他配置)
* [6.1. APNs](#61-apns)
* [6.2. Background Modes](#62-background-modes)
* [6.3. 扩展参数](#63-extension-params)
* [问题说明](#问题说明)
* [支付宝 SDK 冲突](#支付宝-sdk-冲突)
* [swift 4.1](#swift-41)
## 0. 更新日志
> 3.0.6
- HHMVideoDelegate增加getChatParentView(_ view : UIView),以便开发者在呼叫页面添加自定义view
> 2.0.2
- 适配 Xcode 10, swift4.2
## 1. 集成方式
说明: 接入 HHDoctorSDK 大概会使 ipa 包增加 15M.
HHDoctorSDK 提供两种集成方式:您既可以通过 CocoaPods 自动集成我们的 SDK,也可以通过手动下载 SDK, 然后添加到您的项目中。
我们提供的下载地址:
我们提供了发布仓库: [HHVDoctorSDK](https://code.hh-medic.com/hh_public/h'hhhvDoctorSDK.ios)
集成demo地址: [HHDoctorSDK_demo_iOS](https://github.com/HHMedic/HHDoctorSDK_demo_iOS)
由于呼叫视频需要相机相册权限,需要在info.plist中添加对应的权限,否则会导致无法调用。
```
<key>NSPhotoLibraryUsageDescription</key>
<string>应用需要使用相册权限,以便您向医生发送健康资料。</string>
<key>NSCameraUsageDescription</key>
<string>应用需使用相机权限,以便您向医生进行视频咨询。</string>
<key>NSMicrophoneUsageDescription</key>
<string>应用需使用麦克风权限,以便您向医生进行视频咨询。</string>
```
### 1.1. 手动集成
1. 根据自己工程需要,下载对应版本的 HHMSDK,得到 NIMSDK.framework ,NIMAVChat.framework,NVS.framework,SecurityKit.framework 和 HHDoctorSDK.framework,以及未链接的全部三方依赖库 ,将他们导入工程。
2. 添加其他 HHDoctorSDK 依赖库。
- SystemConfiguration.framework
- MobileCoreServices.framework
- AVFoundation.framwork
- CoreTelephony.framework
- CoreMedia.framework
- VideoToolbox.framework
- AudioToolbox.framework
- libz
- libsqlite3.0
- libc++
3.`Build Settings` -> `Other Linker Flags` 里,添加选项 `-ObjC`
4.`Build Settings` -> `Enable Bitcode` 里,设置为 `No`
5. 如果需要在后台时保持音频通话状态,在 `Capabilities` -> `Background Modes` 里勾选 `audio, airplay, and Picture in Picture`
### 1.2. 自动集成(推荐)
*`Podfile` 文件中加入
```shell
use_frameworks!
pod 'HHVDoctorSDK', :git => "http://code.hh-medic.com/hh_public/hhvDoctorSDK.ios.git"
```
* 安装
``` shell
pod install
```
### 1.3. 调用规则
所有 HHDoctorSDK 业务均通过 HHMSDK 单例调用
```swift
public class HHMSDK : NSObject {
public static let `default`: HHDoctorSDK.HHMSDK
}
```
## 2. 初始化
在使用 HHDoctorSDK 任何方法之前,都应该首先调用初始化方法。正常业务情况下,初始化方法有仅只应调用一次。
HHSDKOptions 选项参数列表
参数|类型|说明
------|---|--------
productId|String|和缓分配的产品ID(必填)
isDevelopment|Bool|服务器模式(测试/正式)
isDebug|Bool|调试模式(是否打印日志)
APNs|String |推送证书名(由和缓生成)
hudManager| HHHUDable|自定义 progressHUD
hudDisTime| Double|hud 自动消失时间
调用示例
```swift
let option = HHSDKOptions(isDebug: true, isDevelop: true)
option.cerName = "2cDevTest"
// let option = HHSDKOptions()
// option.isDevelopment = true
// option.isDebug = true
// option.hudDisTime = 2
HHMSDK.default.start(option: option)
```
## 3. 登录账户
在对医生视频呼叫之前,需要先登录账号信息。账号的 uuid 由和缓提供。
### 3.1. 登录
*注意: 不能多次调用登录 SDK,否则会导致视频故障。*
* 原型
```swift
public class HHMSDK : NSObject {
/// 登录账号
///
/// - Parameters:
/// - uuid: 用户的 唯一标志符
/// - completion: 完成回调
public func login(uuid: Int, completion: @escaping HHMedicSDK.HHLoginHandler)
}
```
* 调用示例
```swift
// 登录
HHMSDK.default.login(uuid: 100001531) { (error) in
if let aError = error {
print("登录错误: " + aError.localizedDescription)
}
}
```
error 为登录错误信息,成功则为 nil。
### 3.2. 登出
应用层登出/注销/切换自己的账号时需要调用 HHMSDK 的登出操作,该操作会通知和缓服务器进行 APNs 推送信息的解绑操作,避免用户已登出但推送依然发送到当前设备的情况发生。
* 原型
```swift
public class HHMSDK : NSObject {
/// 登出
public func logout()
}
```
* 调用示例
```swift
// 登出
HHMSDK.default.logout()
```
## 4. 视频呼叫
根据实际场景的不同,可以进行成人、儿童方向的向医生咨询。
* 原型
```swift
public class HHMSDK : NSObject {
/// 主叫发起通话
///
/// - Parameter type: 呼叫类型
public func startCall(_ type: HHMedicSDK.HHCallType)
}
```
* 调用示例
```swift
// 咨询儿童问题
HHMSDK.default.startCall(.child)
// 咨询成人问题
HHMSDK.default.startCall(.adult)
```
HHCallType 枚举列表
值 | 说明
--------- | -------------
child | 儿童
adult | 成人
## 5. 代理(delegate)(可选)
代理主要用于视频过程中的状态反馈。如果不需要状态反馈,可以不考虑该代理。
所有的代理方法都是可选的,可以根据自己的实际需要实现不同的代理方法。
* 原型
```swift
/// 视频管理器代理
public protocol HHMVideoDelegate : NSObjectProtocol {
/// 主动视频时的呼叫状态变化
///
/// - Parameter state: 当前呼叫状态
public func callStateChange(_ state: HHMedicSDK.HHMCallingState)
/// 通话已接通
public func callDidEstablish()
/// 呼叫失败
public func onFail(error: Error)
public func onCancel()
/// 通话已结束 (接通之后才有结束)
public func callDidFinish()
/// 转呼医生
public func onExtensionDoctor()
/// 接收到呼叫(被呼叫方)
///
/// - Parameters:
/// - callID: 呼叫的 id
/// - from: 呼叫人 id
public func onReceive(_ callID: String, from: String)
/// 收到视频呼入时的操作(被呼叫方)
///
/// - Parameter accept: 接受或者拒接
public func onResponse(_ accept: Bool)
/// 缺少必要权限
///
/// - Parameter type: 缺少的权限类型
public func onLeakPermission(_ type: HHMedicSDK.PermissionType)
}
```
### 5.1. 加入
代理支持同时设置多个。
```swift
HHMSDK.default.add(delegate: self)
```
### 5.2. 移除
```swift
HHMSDK.default.remove(delegate: self)
```
## 6. 其他配置
### 6.1. APNs
在 appDelegate 中向 SDK 传入 deviceToken 即可。
```swift
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
HHMSDK.default.updateAPNS(token: deviceToken)
}
```
*注意:需要上传 APNs 的 p12 文件,请联系我们上传。*
### 6.2. Background Modes
为了支持用户压后台后音视频的正常使用,需要设置 Background Modes。具体设置如下:
```
xxx target -> Capabilities -> Background Modes -> 勾选 Audio,Airplay and Picture in Picture
```
### 6.3. 扩展参数
为了支持收集渠道日志,SDK支持在初始化时传递自定义参数。
```
let option = HHSDKOptions(productId: "3000", isDebug: true, isDevelop: true)
option.asyncLogin = false
option.mExtension = ""
```
## 问题说明
### 支付宝 SDK 冲突
若出现UTDID冲突错误,请切换支付宝 SDK 到无UTDID版本.
[官方说明](https://docs.open.alipay.com/54/104509/)
### swift 4.1
master 分支已经支持 swift4.2, 如果需要支持 swift4.1, 请切换到对应分支 `swift4.1`
```
pod 'HHDoctorSDK', :git => "http://code.hh-medic.com/hh_public/HHDoctorSDK.ios.git", :branch => 'swift4.1'
```
... ...