Commit 2f7abd9a authored by jz's avatar jz

update

parent 426def2a
......@@ -61,11 +61,11 @@
6003F5BB195388D20070C39A /* Tests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Tests.m; sourceTree = "<group>"; };
606FC2411953D9B200FFA9A0 /* Tests-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Tests-Prefix.pch"; sourceTree = "<group>"; };
71719F9E1E33DC2100824A3D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
73587ABC77058C5C2D7A1CAF /* GMShareSDK.podspec */ = {isa = PBXFileReference; includeInIndex = 1; name = GMShareSDK.podspec; path = ../GMShareSDK.podspec; sourceTree = "<group>"; };
7B345725C8E08530D8EDB12A /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; name = LICENSE; path = ../LICENSE; sourceTree = "<group>"; };
73587ABC77058C5C2D7A1CAF /* GMShareSDK.podspec */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = GMShareSDK.podspec; path = ../GMShareSDK.podspec; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.ruby; };
7B345725C8E08530D8EDB12A /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = LICENSE; path = ../LICENSE; sourceTree = "<group>"; };
873B8AEA1B1F5CCA007FD442 /* Main.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = Main.storyboard; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
B0EC0126CB08246293DA5519 /* Pods-GMShareSDK_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-GMShareSDK_Example.debug.xcconfig"; path = "Target Support Files/Pods-GMShareSDK_Example/Pods-GMShareSDK_Example.debug.xcconfig"; sourceTree = "<group>"; };
CB31F369DA0CC8DE5739239C /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; name = README.md; path = ../README.md; sourceTree = "<group>"; };
CB31F369DA0CC8DE5739239C /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = ../README.md; sourceTree = "<group>"; };
DB21F612ECB7A93A9931CD51 /* Pods_GMShareSDK_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_GMShareSDK_Tests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
/* End PBXFileReference section */
......@@ -193,7 +193,6 @@
5EFECF96C065D7562836F22B /* Pods-GMShareSDK_Tests.debug.xcconfig */,
035B645BC46FB80B490A9FBE /* Pods-GMShareSDK_Tests.release.xcconfig */,
);
name = Pods;
path = Pods;
sourceTree = "<group>";
};
......@@ -258,6 +257,7 @@
developmentRegion = English;
hasScannedForEncodings = 0;
knownRegions = (
English,
en,
Base,
);
......
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "group:GMShareSDK.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>
PODS:
- GMShareSDK (0.1.0)
DEPENDENCIES:
- GMShareSDK (from `../`)
EXTERNAL SOURCES:
GMShareSDK:
:path: "../"
SPEC CHECKSUMS:
GMShareSDK: 2c3a3b816eae7ca8614333605a5c0615321c7215
PODFILE CHECKSUM: 9ff4536b9b3f79ff5f4703b2beaf332c9d475030
COCOAPODS: 1.7.4
{
"name": "GMShareSDK",
"version": "0.1.0",
"summary": "A short description of GMShareSDK.",
"description": "TODO: Add long description of the pod here.",
"homepage": "https://github.com/Q14/GMShareSDK",
"license": {
"type": "MIT",
"file": "LICENSE"
},
"authors": {
"Q14": "qiaojinzhu@igengmei.com"
},
"source": {
"git": "https://github.com/Q14/GMShareSDK.git",
"tag": "0.1.0"
},
"platforms": {
"ios": "8.0"
},
"source_files": "GMShareSDK/Classes/**/*"
}
PODS:
- GMShareSDK (0.1.0)
DEPENDENCIES:
- GMShareSDK (from `../`)
EXTERNAL SOURCES:
GMShareSDK:
:path: "../"
SPEC CHECKSUMS:
GMShareSDK: 2c3a3b816eae7ca8614333605a5c0615321c7215
PODFILE CHECKSUM: 9ff4536b9b3f79ff5f4703b2beaf332c9d475030
COCOAPODS: 1.7.4
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 46;
objects = {
/* Begin PBXBuildFile section */
01F3CEE3864700C75E884DEBDAB558A0 /* NSURLRequest+IgnoreSSL.m in Sources */ = {isa = PBXBuildFile; fileRef = 9BCAAC5F88E724152D45A0021990484B /* NSURLRequest+IgnoreSSL.m */; };
0217D168C91F0381072A84F2011EF9AB /* GMShareSDK.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E126309CC1DB777448B52462F712259 /* GMShareSDK.h */; settings = {ATTRIBUTES = (Public, ); }; };
04267E7E061FA3A4D3C9FC976AB8CC85 /* UIImage+Compress.h in Headers */ = {isa = PBXBuildFile; fileRef = F648A5AC05DFE30F95B4D7A1D5EE58F1 /* UIImage+Compress.h */; settings = {ATTRIBUTES = (Public, ); }; };
0D92731B0C36C8E495D786AE59D579BD /* Pods-GMShareSDK_Tests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = C57C8AE5333B1F938FD9CA937FCB5BAB /* Pods-GMShareSDK_Tests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
21497749178587CD7535943A79D93DB7 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3212113385A8FBBDB272BD23C409FF61 /* Foundation.framework */; };
327CB037615B550328C7538802602F1D /* NSURLRequest+IgnoreSSL.h in Headers */ = {isa = PBXBuildFile; fileRef = 7F3F4F2D2AF19AEC6AB518E21B434483 /* NSURLRequest+IgnoreSSL.h */; settings = {ATTRIBUTES = (Public, ); }; };
3315E3D0E581D4576197AF737103C28C /* UIView+SafeArea.m in Sources */ = {isa = PBXBuildFile; fileRef = 0362EA6F6D1E040859EEB2D11CA0FEA4 /* UIView+SafeArea.m */; };
34E6652504B3001332B24D77A2CC71A5 /* TencentOAuth.h in Headers */ = {isa = PBXBuildFile; fileRef = 98CBC7BCDEB32856C707601F6F5A6884 /* TencentOAuth.h */; settings = {ATTRIBUTES = (Public, ); }; };
35A797CF81617057EB8B36EFF064642D /* GMShareSDK.m in Sources */ = {isa = PBXBuildFile; fileRef = 51B7F0EE129F55DC0B258903F7D1B606 /* GMShareSDK.m */; };
396BB87E60E6132CAFC7707424A507CD /* GMShareSDK-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 309FF81AB19BDC021B45B8C57AAAFFA0 /* GMShareSDK-dummy.m */; };
45743B38A1FC307EED67136BBB75972E /* TencentOpenAPI in Sources */ = {isa = PBXBuildFile; fileRef = 9390872765CD314BF381356428F0A850 /* TencentOpenAPI */; };
486CED0A0B9F7C638C82F57E819297CC /* UIView+SafeArea.h in Headers */ = {isa = PBXBuildFile; fileRef = F8752AF7BBCE42D5522BD3160351A3D2 /* UIView+SafeArea.h */; settings = {ATTRIBUTES = (Public, ); }; };
58D4DCE620F8049D4CDCF8649F55AAD7 /* WMShareObject.h in Headers */ = {isa = PBXBuildFile; fileRef = F0D6C392D3B47D79B1ED78C53189B8A2 /* WMShareObject.h */; settings = {ATTRIBUTES = (Public, ); }; };
59DF2B74C697CC8BE3016C1B67136A89 /* Pods-GMShareSDK_Tests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 0AF528A3CAEFFD16E852BD5C14DF2C43 /* Pods-GMShareSDK_Tests-dummy.m */; };
5A9505F5D3475DFAFA8E98B5234E1981 /* QQApiInterface.h in Headers */ = {isa = PBXBuildFile; fileRef = 9F1EED5743D280DF440124C821BB613B /* QQApiInterface.h */; settings = {ATTRIBUTES = (Public, ); }; };
5FC3AA06F244FDD9C6E96FD9A3607897 /* GMPopupBgView.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E6B7EFF051FD0F8B8328DBD1447E14E /* GMPopupBgView.h */; settings = {ATTRIBUTES = (Public, ); }; };
61E235C0FAA804FFAB73FF242C3A8555 /* QQApiInterfaceObject.h in Headers */ = {isa = PBXBuildFile; fileRef = 86E86C1358521997C680E9738BE4BFAF /* QQApiInterfaceObject.h */; settings = {ATTRIBUTES = (Public, ); }; };
68E1636B1E947A8CB72268490B71D7FE /* GMShareSDK-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 9600D4DE6E82E2CB65B5044588BCEED8 /* GMShareSDK-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
7AF06A6265851BE6C91A92FC57908A6C /* GMThirdPartyDefine.h in Headers */ = {isa = PBXBuildFile; fileRef = 9DA2DCF4ACE0A72320C8806288FCE54E /* GMThirdPartyDefine.h */; settings = {ATTRIBUTES = (Public, ); }; };
7E087ADF825EFCDC9C1C055D93FED93C /* UIImage+Compress.m in Sources */ = {isa = PBXBuildFile; fileRef = ABC0A5F1F0C904992A5072BF8607C950 /* UIImage+Compress.m */; };
7EFA376ACB94B67AEF074DEF85352CE2 /* WMShareObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 540D467BF0B7CDD730CCD9BEC8DCCDD5 /* WMShareObject.m */; };
95E749D6D578DB80D77812F0A5C5E667 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3212113385A8FBBDB272BD23C409FF61 /* Foundation.framework */; };
9890C6DC2F1E9AC0F8CAF4E7FCF78952 /* GMThirdPartyOauthManager.m in Sources */ = {isa = PBXBuildFile; fileRef = ED089DD7B4ACA1F095B1D8126C6AB727 /* GMThirdPartyOauthManager.m */; };
AB320EC14F89F5FE7B976B716B6C84BF /* GMThirdPartyOauthManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 27B1F8883015E086444E23C94CC65571 /* GMThirdPartyOauthManager.h */; settings = {ATTRIBUTES = (Public, ); }; };
B0FC242D39C97A5DD912F9DEF0434A62 /* GMSafeValue.m in Sources */ = {isa = PBXBuildFile; fileRef = B81006F18D71AEB724DF7232D79E2BFA /* GMSafeValue.m */; };
B964D044A453B89829D24607EBF3D268 /* GMPopupBgView.m in Sources */ = {isa = PBXBuildFile; fileRef = FD03FBE7F5AC8B9912EBAA32F8E804B4 /* GMPopupBgView.m */; };
CD512AD7A26D34101962FFC97D9CD250 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3212113385A8FBBDB272BD23C409FF61 /* Foundation.framework */; };
DA1701B364EAF146EBA8908D5D953464 /* sdkdef.h in Headers */ = {isa = PBXBuildFile; fileRef = CDE1514DBE365DD92544914F330E530E /* sdkdef.h */; settings = {ATTRIBUTES = (Public, ); }; };
E088668DB6778758083EBBB1BFE75A1C /* Pods-GMShareSDK_Example-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = D8C74E9992F5DDBA705B0A5B6160CEBD /* Pods-GMShareSDK_Example-dummy.m */; };
EAB7563416A2E44FBB17B4757E641B24 /* GMSafeValue.h in Headers */ = {isa = PBXBuildFile; fileRef = 12D564BBB61E7EEB64B1056B0C63654B /* GMSafeValue.h */; settings = {ATTRIBUTES = (Public, ); }; };
EB766BBAA2A370FAF22DBFC4BC387E34 /* NSMutableDictionary+GMShareSDK.h in Headers */ = {isa = PBXBuildFile; fileRef = 2033BC21F7BFD6E97BF3C51B17D7CDC0 /* NSMutableDictionary+GMShareSDK.h */; settings = {ATTRIBUTES = (Public, ); }; };
EFFB795C6037286366D17678B52EAC17 /* NSMutableDictionary+GMShareSDK.m in Sources */ = {isa = PBXBuildFile; fileRef = 474093523D6FA7CF0619E6ED891C49DB /* NSMutableDictionary+GMShareSDK.m */; };
F40D7A48FF6148B3D3D5AC81F08C8A8F /* Pods-GMShareSDK_Example-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 7236A34345D0349BCA032188E085F0E0 /* Pods-GMShareSDK_Example-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
F63217B8B671951F55D2E5644C201D14 /* GMThirdPartyLoginHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 8801BA8946774CA3BE396145BAFF1C82 /* GMThirdPartyLoginHelper.h */; settings = {ATTRIBUTES = (Public, ); }; };
FC882104760219EB33B3CC210351541B /* GMThirdPartyLoginHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = F21197241B614C441D6C58E62B5989CA /* GMThirdPartyLoginHelper.m */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
E0412773A32EA329577BFBFA99098683 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 3AA4D1719D5A3E80B58DCD4B68D493ED;
remoteInfo = GMShareSDK;
};
EDAE5174337DA093978E15B4AD6B584C /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 342DFE9BEBD39BF0026057666E744439;
remoteInfo = "Pods-GMShareSDK_Example";
};
/* End PBXContainerItemProxy section */
/* Begin PBXFileReference section */
0362EA6F6D1E040859EEB2D11CA0FEA4 /* UIView+SafeArea.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "UIView+SafeArea.m"; sourceTree = "<group>"; };
0AF528A3CAEFFD16E852BD5C14DF2C43 /* Pods-GMShareSDK_Tests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-GMShareSDK_Tests-dummy.m"; sourceTree = "<group>"; };
12D564BBB61E7EEB64B1056B0C63654B /* GMSafeValue.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = GMSafeValue.h; sourceTree = "<group>"; };
2033BC21F7BFD6E97BF3C51B17D7CDC0 /* NSMutableDictionary+GMShareSDK.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "NSMutableDictionary+GMShareSDK.h"; sourceTree = "<group>"; };
27B1F8883015E086444E23C94CC65571 /* GMThirdPartyOauthManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = GMThirdPartyOauthManager.h; sourceTree = "<group>"; };
28682EFE97EA5E256F6FF49DAF24DCDD /* GMShareSDK.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = GMShareSDK.modulemap; sourceTree = "<group>"; };
309FF81AB19BDC021B45B8C57AAAFFA0 /* GMShareSDK-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "GMShareSDK-dummy.m"; sourceTree = "<group>"; };
3212113385A8FBBDB272BD23C409FF61 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.2.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; };
3400F77C35411934580FF2F42B4BDCE8 /* Pods-GMShareSDK_Example-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-GMShareSDK_Example-frameworks.sh"; sourceTree = "<group>"; };
3B50D122F75F0E41FE9F0D4C71063FFF /* Pods-GMShareSDK_Example-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-GMShareSDK_Example-Info.plist"; sourceTree = "<group>"; };
43D059316664A1FD5ABDD4ED8B1BE18C /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; path = LICENSE; sourceTree = "<group>"; };
44E9F8BC8C99B32C9DC50880DADB3ED9 /* Pods-GMShareSDK_Example-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-GMShareSDK_Example-acknowledgements.plist"; sourceTree = "<group>"; };
474093523D6FA7CF0619E6ED891C49DB /* NSMutableDictionary+GMShareSDK.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "NSMutableDictionary+GMShareSDK.m"; sourceTree = "<group>"; };
51B7F0EE129F55DC0B258903F7D1B606 /* GMShareSDK.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = GMShareSDK.m; sourceTree = "<group>"; };
540D467BF0B7CDD730CCD9BEC8DCCDD5 /* WMShareObject.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = WMShareObject.m; sourceTree = "<group>"; };
54171F95829391499F1C97C01D8A411B /* Pods-GMShareSDK_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-GMShareSDK_Example.release.xcconfig"; sourceTree = "<group>"; };
5581C2F400350487B5BE75605595AAF1 /* Pods_GMShareSDK_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_GMShareSDK_Example.framework; path = "Pods-GMShareSDK_Example.framework"; sourceTree = BUILT_PRODUCTS_DIR; };
575259DD7E3B5E929389333646369551 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; path = README.md; sourceTree = "<group>"; };
67AF293FB8C58A2BD46C2BC1E1D18A0D /* Pods-GMShareSDK_Tests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-GMShareSDK_Tests-acknowledgements.plist"; sourceTree = "<group>"; };
68FAC640624C5830266947A9C70EA2D7 /* Pods-GMShareSDK_Example.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-GMShareSDK_Example.modulemap"; sourceTree = "<group>"; };
7236A34345D0349BCA032188E085F0E0 /* Pods-GMShareSDK_Example-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-GMShareSDK_Example-umbrella.h"; sourceTree = "<group>"; };
7D4DCE2715F9612615C39E5FAF9F8704 /* Pods-GMShareSDK_Example-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-GMShareSDK_Example-acknowledgements.markdown"; sourceTree = "<group>"; };
7F3F4F2D2AF19AEC6AB518E21B434483 /* NSURLRequest+IgnoreSSL.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "NSURLRequest+IgnoreSSL.h"; sourceTree = "<group>"; };
86E86C1358521997C680E9738BE4BFAF /* QQApiInterfaceObject.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = QQApiInterfaceObject.h; sourceTree = "<group>"; };
8801BA8946774CA3BE396145BAFF1C82 /* GMThirdPartyLoginHelper.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = GMThirdPartyLoginHelper.h; sourceTree = "<group>"; };
8E126309CC1DB777448B52462F712259 /* GMShareSDK.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = GMShareSDK.h; sourceTree = "<group>"; };
8E6B7EFF051FD0F8B8328DBD1447E14E /* GMPopupBgView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = GMPopupBgView.h; sourceTree = "<group>"; };
90C2308CE1E48F0683F22339244D91DA /* GMShareSDK.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; path = GMShareSDK.podspec; sourceTree = "<group>"; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; };
918801938CC030ECD55F63983965EFDF /* Pods-GMShareSDK_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-GMShareSDK_Tests.debug.xcconfig"; sourceTree = "<group>"; };
9390872765CD314BF381356428F0A850 /* TencentOpenAPI */ = {isa = PBXFileReference; includeInIndex = 1; path = TencentOpenAPI; sourceTree = "<group>"; };
9600D4DE6E82E2CB65B5044588BCEED8 /* GMShareSDK-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "GMShareSDK-umbrella.h"; sourceTree = "<group>"; };
98CBC7BCDEB32856C707601F6F5A6884 /* TencentOAuth.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = TencentOAuth.h; sourceTree = "<group>"; };
98F7A14340FEE9282A7E9373B4CD5BEC /* Pods-GMShareSDK_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-GMShareSDK_Example.debug.xcconfig"; sourceTree = "<group>"; };
9BCAAC5F88E724152D45A0021990484B /* NSURLRequest+IgnoreSSL.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "NSURLRequest+IgnoreSSL.m"; sourceTree = "<group>"; };
9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; };
9DA2DCF4ACE0A72320C8806288FCE54E /* GMThirdPartyDefine.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = GMThirdPartyDefine.h; sourceTree = "<group>"; };
9E064A9EED11E81EA9231A4D19B95A33 /* Pods_GMShareSDK_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_GMShareSDK_Tests.framework; path = "Pods-GMShareSDK_Tests.framework"; sourceTree = BUILT_PRODUCTS_DIR; };
9F1EED5743D280DF440124C821BB613B /* QQApiInterface.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = QQApiInterface.h; sourceTree = "<group>"; };
A44E93C99DF5FC6424F382F98BC90D7F /* Pods-GMShareSDK_Tests-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-GMShareSDK_Tests-Info.plist"; sourceTree = "<group>"; };
A6F78600594ED1A3F82BEB3D1514E48D /* GMShareSDK-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "GMShareSDK-prefix.pch"; sourceTree = "<group>"; };
ABC0A5F1F0C904992A5072BF8607C950 /* UIImage+Compress.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "UIImage+Compress.m"; sourceTree = "<group>"; };
AC85D83A6539B434002B7B6C6E22192C /* GMShareSDK-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "GMShareSDK-Info.plist"; sourceTree = "<group>"; };
B81006F18D71AEB724DF7232D79E2BFA /* GMSafeValue.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = GMSafeValue.m; sourceTree = "<group>"; };
BB49DCA00D8782F92D43DE6E85CBA24C /* Pods-GMShareSDK_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-GMShareSDK_Tests.release.xcconfig"; sourceTree = "<group>"; };
C57C8AE5333B1F938FD9CA937FCB5BAB /* Pods-GMShareSDK_Tests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-GMShareSDK_Tests-umbrella.h"; sourceTree = "<group>"; };
CD5C5EEC5602B2D008D6804712D98C53 /* GMShareSDK.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = GMShareSDK.framework; path = GMShareSDK.framework; sourceTree = BUILT_PRODUCTS_DIR; };
CDE1514DBE365DD92544914F330E530E /* sdkdef.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = sdkdef.h; sourceTree = "<group>"; };
D4396D0B425455C242AF491EEF6D4993 /* Pods-GMShareSDK_Tests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-GMShareSDK_Tests-acknowledgements.markdown"; sourceTree = "<group>"; };
D6A9A9DCC9340762ACE1D1525255E791 /* Pods-GMShareSDK_Tests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-GMShareSDK_Tests.modulemap"; sourceTree = "<group>"; };
D8C74E9992F5DDBA705B0A5B6160CEBD /* Pods-GMShareSDK_Example-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-GMShareSDK_Example-dummy.m"; sourceTree = "<group>"; };
DC00AFDA3F290179F33FB15B719768D9 /* GMShareSDK.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = GMShareSDK.xcconfig; sourceTree = "<group>"; };
ED089DD7B4ACA1F095B1D8126C6AB727 /* GMThirdPartyOauthManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = GMThirdPartyOauthManager.m; sourceTree = "<group>"; };
F0D6C392D3B47D79B1ED78C53189B8A2 /* WMShareObject.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = WMShareObject.h; sourceTree = "<group>"; };
F21197241B614C441D6C58E62B5989CA /* GMThirdPartyLoginHelper.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = GMThirdPartyLoginHelper.m; sourceTree = "<group>"; };
F648A5AC05DFE30F95B4D7A1D5EE58F1 /* UIImage+Compress.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "UIImage+Compress.h"; sourceTree = "<group>"; };
F8752AF7BBCE42D5522BD3160351A3D2 /* UIView+SafeArea.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "UIView+SafeArea.h"; sourceTree = "<group>"; };
FD03FBE7F5AC8B9912EBAA32F8E804B4 /* GMPopupBgView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = GMPopupBgView.m; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
4A1DF08E26EA6772A076A046F8C2EC4F /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
21497749178587CD7535943A79D93DB7 /* Foundation.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
639EDAE24293AEBD675A01BC554E6399 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
95E749D6D578DB80D77812F0A5C5E667 /* Foundation.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
C127E9958107772E7149656338383A37 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
CD512AD7A26D34101962FFC97D9CD250 /* Foundation.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
1050F59109A18B3DE13B72EA1C7CE0F6 /* Support Files */ = {
isa = PBXGroup;
children = (
28682EFE97EA5E256F6FF49DAF24DCDD /* GMShareSDK.modulemap */,
DC00AFDA3F290179F33FB15B719768D9 /* GMShareSDK.xcconfig */,
309FF81AB19BDC021B45B8C57AAAFFA0 /* GMShareSDK-dummy.m */,
AC85D83A6539B434002B7B6C6E22192C /* GMShareSDK-Info.plist */,
A6F78600594ED1A3F82BEB3D1514E48D /* GMShareSDK-prefix.pch */,
9600D4DE6E82E2CB65B5044588BCEED8 /* GMShareSDK-umbrella.h */,
);
name = "Support Files";
path = "Example/Pods/Target Support Files/GMShareSDK";
sourceTree = "<group>";
};
1E56379CC111A0085E307DB6365AF954 /* Development Pods */ = {
isa = PBXGroup;
children = (
7BE484A862A27A397B93D7DEC7BC712C /* GMShareSDK */,
);
name = "Development Pods";
sourceTree = "<group>";
};
3A11F6D04E87F7F91D3CA6EFC5EBE360 /* Products */ = {
isa = PBXGroup;
children = (
CD5C5EEC5602B2D008D6804712D98C53 /* GMShareSDK.framework */,
5581C2F400350487B5BE75605595AAF1 /* Pods_GMShareSDK_Example.framework */,
9E064A9EED11E81EA9231A4D19B95A33 /* Pods_GMShareSDK_Tests.framework */,
);
name = Products;
sourceTree = "<group>";
};
3EBC718F118C207735E56DA7E129C1E4 /* Headers */ = {
isa = PBXGroup;
children = (
9F1EED5743D280DF440124C821BB613B /* QQApiInterface.h */,
86E86C1358521997C680E9738BE4BFAF /* QQApiInterfaceObject.h */,
CDE1514DBE365DD92544914F330E530E /* sdkdef.h */,
98CBC7BCDEB32856C707601F6F5A6884 /* TencentOAuth.h */,
);
name = Headers;
path = Headers;
sourceTree = "<group>";
};
565B47B573CC7017B40661495E53C17B /* Pods-GMShareSDK_Example */ = {
isa = PBXGroup;
children = (
68FAC640624C5830266947A9C70EA2D7 /* Pods-GMShareSDK_Example.modulemap */,
7D4DCE2715F9612615C39E5FAF9F8704 /* Pods-GMShareSDK_Example-acknowledgements.markdown */,
44E9F8BC8C99B32C9DC50880DADB3ED9 /* Pods-GMShareSDK_Example-acknowledgements.plist */,
D8C74E9992F5DDBA705B0A5B6160CEBD /* Pods-GMShareSDK_Example-dummy.m */,
3400F77C35411934580FF2F42B4BDCE8 /* Pods-GMShareSDK_Example-frameworks.sh */,
3B50D122F75F0E41FE9F0D4C71063FFF /* Pods-GMShareSDK_Example-Info.plist */,
7236A34345D0349BCA032188E085F0E0 /* Pods-GMShareSDK_Example-umbrella.h */,
98F7A14340FEE9282A7E9373B4CD5BEC /* Pods-GMShareSDK_Example.debug.xcconfig */,
54171F95829391499F1C97C01D8A411B /* Pods-GMShareSDK_Example.release.xcconfig */,
);
name = "Pods-GMShareSDK_Example";
path = "Target Support Files/Pods-GMShareSDK_Example";
sourceTree = "<group>";
};
58171706739E4AFCDFC56FE0AE3031FC /* Pod */ = {
isa = PBXGroup;
children = (
90C2308CE1E48F0683F22339244D91DA /* GMShareSDK.podspec */,
43D059316664A1FD5ABDD4ED8B1BE18C /* LICENSE */,
575259DD7E3B5E929389333646369551 /* README.md */,
);
name = Pod;
sourceTree = "<group>";
};
70E1BBCEEB7D1E82F6A19D7B31EF5054 /* Targets Support Files */ = {
isa = PBXGroup;
children = (
565B47B573CC7017B40661495E53C17B /* Pods-GMShareSDK_Example */,
9056D7B410D3B3DF3F4916C1C8A44886 /* Pods-GMShareSDK_Tests */,
);
name = "Targets Support Files";
sourceTree = "<group>";
};
7BE484A862A27A397B93D7DEC7BC712C /* GMShareSDK */ = {
isa = PBXGroup;
children = (
58171706739E4AFCDFC56FE0AE3031FC /* Pod */,
D4AA3FB9B2BDA3A2CE294D26BE71402D /* ShareObj */,
C92D13368B1A2F36D19D354D290B84F8 /* ShareSDK */,
8D702F099E654761D4386C8D7698B4E6 /* ShareSDKPlatforms */,
1050F59109A18B3DE13B72EA1C7CE0F6 /* Support Files */,
A10C5411DD1F6D798968D568F4D1FEDE /* Util */,
);
name = GMShareSDK;
path = ../..;
sourceTree = "<group>";
};
8D702F099E654761D4386C8D7698B4E6 /* ShareSDKPlatforms */ = {
isa = PBXGroup;
children = (
F1C5FB7C4E25BB651B1134C48384D8FE /* Frameworks */,
);
name = ShareSDKPlatforms;
path = GMShareSDK/Classes/ShareSDKPlatforms;
sourceTree = "<group>";
};
9056D7B410D3B3DF3F4916C1C8A44886 /* Pods-GMShareSDK_Tests */ = {
isa = PBXGroup;
children = (
D6A9A9DCC9340762ACE1D1525255E791 /* Pods-GMShareSDK_Tests.modulemap */,
D4396D0B425455C242AF491EEF6D4993 /* Pods-GMShareSDK_Tests-acknowledgements.markdown */,
67AF293FB8C58A2BD46C2BC1E1D18A0D /* Pods-GMShareSDK_Tests-acknowledgements.plist */,
0AF528A3CAEFFD16E852BD5C14DF2C43 /* Pods-GMShareSDK_Tests-dummy.m */,
A44E93C99DF5FC6424F382F98BC90D7F /* Pods-GMShareSDK_Tests-Info.plist */,
C57C8AE5333B1F938FD9CA937FCB5BAB /* Pods-GMShareSDK_Tests-umbrella.h */,
918801938CC030ECD55F63983965EFDF /* Pods-GMShareSDK_Tests.debug.xcconfig */,
BB49DCA00D8782F92D43DE6E85CBA24C /* Pods-GMShareSDK_Tests.release.xcconfig */,
);
name = "Pods-GMShareSDK_Tests";
path = "Target Support Files/Pods-GMShareSDK_Tests";
sourceTree = "<group>";
};
A10C5411DD1F6D798968D568F4D1FEDE /* Util */ = {
isa = PBXGroup;
children = (
8E6B7EFF051FD0F8B8328DBD1447E14E /* GMPopupBgView.h */,
FD03FBE7F5AC8B9912EBAA32F8E804B4 /* GMPopupBgView.m */,
12D564BBB61E7EEB64B1056B0C63654B /* GMSafeValue.h */,
B81006F18D71AEB724DF7232D79E2BFA /* GMSafeValue.m */,
F648A5AC05DFE30F95B4D7A1D5EE58F1 /* UIImage+Compress.h */,
ABC0A5F1F0C904992A5072BF8607C950 /* UIImage+Compress.m */,
F8752AF7BBCE42D5522BD3160351A3D2 /* UIView+SafeArea.h */,
0362EA6F6D1E040859EEB2D11CA0FEA4 /* UIView+SafeArea.m */,
);
name = Util;
path = GMShareSDK/Classes/Util;
sourceTree = "<group>";
};
C0834CEBB1379A84116EF29F93051C60 /* iOS */ = {
isa = PBXGroup;
children = (
3212113385A8FBBDB272BD23C409FF61 /* Foundation.framework */,
);
name = iOS;
sourceTree = "<group>";
};
C92D13368B1A2F36D19D354D290B84F8 /* ShareSDK */ = {
isa = PBXGroup;
children = (
8E126309CC1DB777448B52462F712259 /* GMShareSDK.h */,
51B7F0EE129F55DC0B258903F7D1B606 /* GMShareSDK.m */,
9DA2DCF4ACE0A72320C8806288FCE54E /* GMThirdPartyDefine.h */,
8801BA8946774CA3BE396145BAFF1C82 /* GMThirdPartyLoginHelper.h */,
F21197241B614C441D6C58E62B5989CA /* GMThirdPartyLoginHelper.m */,
27B1F8883015E086444E23C94CC65571 /* GMThirdPartyOauthManager.h */,
ED089DD7B4ACA1F095B1D8126C6AB727 /* GMThirdPartyOauthManager.m */,
2033BC21F7BFD6E97BF3C51B17D7CDC0 /* NSMutableDictionary+GMShareSDK.h */,
474093523D6FA7CF0619E6ED891C49DB /* NSMutableDictionary+GMShareSDK.m */,
7F3F4F2D2AF19AEC6AB518E21B434483 /* NSURLRequest+IgnoreSSL.h */,
9BCAAC5F88E724152D45A0021990484B /* NSURLRequest+IgnoreSSL.m */,
);
name = ShareSDK;
path = GMShareSDK/Classes/ShareSDK;
sourceTree = "<group>";
};
CF1408CF629C7361332E53B88F7BD30C = {
isa = PBXGroup;
children = (
9D940727FF8FB9C785EB98E56350EF41 /* Podfile */,
1E56379CC111A0085E307DB6365AF954 /* Development Pods */,
D210D550F4EA176C3123ED886F8F87F5 /* Frameworks */,
3A11F6D04E87F7F91D3CA6EFC5EBE360 /* Products */,
70E1BBCEEB7D1E82F6A19D7B31EF5054 /* Targets Support Files */,
);
sourceTree = "<group>";
};
D210D550F4EA176C3123ED886F8F87F5 /* Frameworks */ = {
isa = PBXGroup;
children = (
C0834CEBB1379A84116EF29F93051C60 /* iOS */,
);
name = Frameworks;
sourceTree = "<group>";
};
D4AA3FB9B2BDA3A2CE294D26BE71402D /* ShareObj */ = {
isa = PBXGroup;
children = (
F0D6C392D3B47D79B1ED78C53189B8A2 /* WMShareObject.h */,
540D467BF0B7CDD730CCD9BEC8DCCDD5 /* WMShareObject.m */,
);
name = ShareObj;
path = GMShareSDK/Classes/ShareObj;
sourceTree = "<group>";
};
DE2AF5F0992B7B3DD87CCFF97EEF62DE /* TencentOpenAPI.framework */ = {
isa = PBXGroup;
children = (
9390872765CD314BF381356428F0A850 /* TencentOpenAPI */,
3EBC718F118C207735E56DA7E129C1E4 /* Headers */,
);
name = TencentOpenAPI.framework;
path = TencentOpenAPI.framework;
sourceTree = "<group>";
};
F1C5FB7C4E25BB651B1134C48384D8FE /* Frameworks */ = {
isa = PBXGroup;
children = (
DE2AF5F0992B7B3DD87CCFF97EEF62DE /* TencentOpenAPI.framework */,
);
name = Frameworks;
path = Frameworks;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXHeadersBuildPhase section */
421825F03BAA30DDAAEA39DFBEB9DE19 /* Headers */ = {
isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647;
files = (
F40D7A48FF6148B3D3D5AC81F08C8A8F /* Pods-GMShareSDK_Example-umbrella.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
797261FC77A96110F7020B3E443625A0 /* Headers */ = {
isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647;
files = (
0D92731B0C36C8E495D786AE59D579BD /* Pods-GMShareSDK_Tests-umbrella.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
EFB30DE717913D867D27E1E31B094EDC /* Headers */ = {
isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647;
files = (
5FC3AA06F244FDD9C6E96FD9A3607897 /* GMPopupBgView.h in Headers */,
EAB7563416A2E44FBB17B4757E641B24 /* GMSafeValue.h in Headers */,
68E1636B1E947A8CB72268490B71D7FE /* GMShareSDK-umbrella.h in Headers */,
0217D168C91F0381072A84F2011EF9AB /* GMShareSDK.h in Headers */,
7AF06A6265851BE6C91A92FC57908A6C /* GMThirdPartyDefine.h in Headers */,
F63217B8B671951F55D2E5644C201D14 /* GMThirdPartyLoginHelper.h in Headers */,
AB320EC14F89F5FE7B976B716B6C84BF /* GMThirdPartyOauthManager.h in Headers */,
EB766BBAA2A370FAF22DBFC4BC387E34 /* NSMutableDictionary+GMShareSDK.h in Headers */,
327CB037615B550328C7538802602F1D /* NSURLRequest+IgnoreSSL.h in Headers */,
5A9505F5D3475DFAFA8E98B5234E1981 /* QQApiInterface.h in Headers */,
61E235C0FAA804FFAB73FF242C3A8555 /* QQApiInterfaceObject.h in Headers */,
DA1701B364EAF146EBA8908D5D953464 /* sdkdef.h in Headers */,
34E6652504B3001332B24D77A2CC71A5 /* TencentOAuth.h in Headers */,
04267E7E061FA3A4D3C9FC976AB8CC85 /* UIImage+Compress.h in Headers */,
486CED0A0B9F7C638C82F57E819297CC /* UIView+SafeArea.h in Headers */,
58D4DCE620F8049D4CDCF8649F55AAD7 /* WMShareObject.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXHeadersBuildPhase section */
/* Begin PBXNativeTarget section */
14BC4C19CE81C8C0173BCED0CAB2FDA1 /* Pods-GMShareSDK_Tests */ = {
isa = PBXNativeTarget;
buildConfigurationList = 2100026D4EAD66F78A7FFA794EA84424 /* Build configuration list for PBXNativeTarget "Pods-GMShareSDK_Tests" */;
buildPhases = (
797261FC77A96110F7020B3E443625A0 /* Headers */,
64A2F57AB73170B523B8746EF1FD9F46 /* Sources */,
4A1DF08E26EA6772A076A046F8C2EC4F /* Frameworks */,
F088625EDB383E358C8CF78AFCAB1251 /* Resources */,
);
buildRules = (
);
dependencies = (
CD8AB5CBFB63553AEBE4872B8002CC19 /* PBXTargetDependency */,
);
name = "Pods-GMShareSDK_Tests";
productName = "Pods-GMShareSDK_Tests";
productReference = 9E064A9EED11E81EA9231A4D19B95A33 /* Pods_GMShareSDK_Tests.framework */;
productType = "com.apple.product-type.framework";
};
342DFE9BEBD39BF0026057666E744439 /* Pods-GMShareSDK_Example */ = {
isa = PBXNativeTarget;
buildConfigurationList = 27749EBE8A2D4568EFEE2B8775B313DD /* Build configuration list for PBXNativeTarget "Pods-GMShareSDK_Example" */;
buildPhases = (
421825F03BAA30DDAAEA39DFBEB9DE19 /* Headers */,
524D5E82976BF5ECA0B5A1C3148C7A02 /* Sources */,
639EDAE24293AEBD675A01BC554E6399 /* Frameworks */,
85677F7DFE047115DBD4CE309876EF19 /* Resources */,
);
buildRules = (
);
dependencies = (
406B5995CF64B3D4E4891361DCAA0671 /* PBXTargetDependency */,
);
name = "Pods-GMShareSDK_Example";
productName = "Pods-GMShareSDK_Example";
productReference = 5581C2F400350487B5BE75605595AAF1 /* Pods_GMShareSDK_Example.framework */;
productType = "com.apple.product-type.framework";
};
3AA4D1719D5A3E80B58DCD4B68D493ED /* GMShareSDK */ = {
isa = PBXNativeTarget;
buildConfigurationList = A200758977887B2BCB999E511511EBEE /* Build configuration list for PBXNativeTarget "GMShareSDK" */;
buildPhases = (
EFB30DE717913D867D27E1E31B094EDC /* Headers */,
E65EEBE5AC179E172475E7E4E27FD49B /* Sources */,
C127E9958107772E7149656338383A37 /* Frameworks */,
FCCAACFECB15CB8F824D5AB73312E92E /* Resources */,
);
buildRules = (
);
dependencies = (
);
name = GMShareSDK;
productName = GMShareSDK;
productReference = CD5C5EEC5602B2D008D6804712D98C53 /* GMShareSDK.framework */;
productType = "com.apple.product-type.framework";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
BFDFE7DC352907FC980B868725387E98 /* Project object */ = {
isa = PBXProject;
attributes = {
LastSwiftUpdateCheck = 1100;
LastUpgradeCheck = 1100;
};
buildConfigurationList = 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */;
compatibilityVersion = "Xcode 3.2";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
);
mainGroup = CF1408CF629C7361332E53B88F7BD30C;
productRefGroup = 3A11F6D04E87F7F91D3CA6EFC5EBE360 /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
3AA4D1719D5A3E80B58DCD4B68D493ED /* GMShareSDK */,
342DFE9BEBD39BF0026057666E744439 /* Pods-GMShareSDK_Example */,
14BC4C19CE81C8C0173BCED0CAB2FDA1 /* Pods-GMShareSDK_Tests */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
85677F7DFE047115DBD4CE309876EF19 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
F088625EDB383E358C8CF78AFCAB1251 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
FCCAACFECB15CB8F824D5AB73312E92E /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
524D5E82976BF5ECA0B5A1C3148C7A02 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
E088668DB6778758083EBBB1BFE75A1C /* Pods-GMShareSDK_Example-dummy.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
64A2F57AB73170B523B8746EF1FD9F46 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
59DF2B74C697CC8BE3016C1B67136A89 /* Pods-GMShareSDK_Tests-dummy.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
E65EEBE5AC179E172475E7E4E27FD49B /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
B964D044A453B89829D24607EBF3D268 /* GMPopupBgView.m in Sources */,
B0FC242D39C97A5DD912F9DEF0434A62 /* GMSafeValue.m in Sources */,
396BB87E60E6132CAFC7707424A507CD /* GMShareSDK-dummy.m in Sources */,
35A797CF81617057EB8B36EFF064642D /* GMShareSDK.m in Sources */,
FC882104760219EB33B3CC210351541B /* GMThirdPartyLoginHelper.m in Sources */,
9890C6DC2F1E9AC0F8CAF4E7FCF78952 /* GMThirdPartyOauthManager.m in Sources */,
EFFB795C6037286366D17678B52EAC17 /* NSMutableDictionary+GMShareSDK.m in Sources */,
01F3CEE3864700C75E884DEBDAB558A0 /* NSURLRequest+IgnoreSSL.m in Sources */,
45743B38A1FC307EED67136BBB75972E /* TencentOpenAPI in Sources */,
7E087ADF825EFCDC9C1C055D93FED93C /* UIImage+Compress.m in Sources */,
3315E3D0E581D4576197AF737103C28C /* UIView+SafeArea.m in Sources */,
7EFA376ACB94B67AEF074DEF85352CE2 /* WMShareObject.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
406B5995CF64B3D4E4891361DCAA0671 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
name = GMShareSDK;
target = 3AA4D1719D5A3E80B58DCD4B68D493ED /* GMShareSDK */;
targetProxy = E0412773A32EA329577BFBFA99098683 /* PBXContainerItemProxy */;
};
CD8AB5CBFB63553AEBE4872B8002CC19 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
name = "Pods-GMShareSDK_Example";
target = 342DFE9BEBD39BF0026057666E744439 /* Pods-GMShareSDK_Example */;
targetProxy = EDAE5174337DA093978E15B4AD6B584C /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
/* Begin XCBuildConfiguration section */
1659BEDE217429FB716670FB73E2DC39 /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 918801938CC030ECD55F63983965EFDF /* Pods-GMShareSDK_Tests.debug.xcconfig */;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;
CODE_SIGN_IDENTITY = "";
"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
CURRENT_PROJECT_VERSION = 1;
DEFINES_MODULE = YES;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
INFOPLIST_FILE = "Target Support Files/Pods-GMShareSDK_Tests/Pods-GMShareSDK_Tests-Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
MACH_O_TYPE = staticlib;
MODULEMAP_FILE = "Target Support Files/Pods-GMShareSDK_Tests/Pods-GMShareSDK_Tests.modulemap";
OTHER_LDFLAGS = "";
OTHER_LIBTOOLFLAGS = "";
PODS_ROOT = "$(SRCROOT)";
PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}";
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
SDKROOT = iphoneos;
SKIP_INSTALL = YES;
TARGETED_DEVICE_FAMILY = "1,2";
VERSIONING_SYSTEM = "apple-generic";
VERSION_INFO_PREFIX = "";
};
name = Debug;
};
300741D5A3C44C4DE0506185AC3C9DE4 /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = DC00AFDA3F290179F33FB15B719768D9 /* GMShareSDK.xcconfig */;
buildSettings = {
CODE_SIGN_IDENTITY = "";
"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
CURRENT_PROJECT_VERSION = 1;
DEFINES_MODULE = YES;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
GCC_PREFIX_HEADER = "Target Support Files/GMShareSDK/GMShareSDK-prefix.pch";
INFOPLIST_FILE = "Target Support Files/GMShareSDK/GMShareSDK-Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
MODULEMAP_FILE = "Target Support Files/GMShareSDK/GMShareSDK.modulemap";
PRODUCT_MODULE_NAME = GMShareSDK;
PRODUCT_NAME = GMShareSDK;
SDKROOT = iphoneos;
SKIP_INSTALL = YES;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
SWIFT_VERSION = 4.0;
TARGETED_DEVICE_FAMILY = "1,2";
VERSIONING_SYSTEM = "apple-generic";
VERSION_INFO_PREFIX = "";
};
name = Debug;
};
4BE66A09A74FD25164AAB3C2645B9B93 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
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;
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_PREPROCESSOR_DEFINITIONS = (
"POD_CONFIGURATION_RELEASE=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 = 8.0;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
PRODUCT_NAME = "$(TARGET_NAME)";
STRIP_INSTALLED_PRODUCT = NO;
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_OPTIMIZATION_LEVEL = "-O";
SWIFT_VERSION = 5.0;
SYMROOT = "${SRCROOT}/../build";
};
name = Release;
};
4C4EE1869D1C8034C3328B4F92D4DF34 /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 54171F95829391499F1C97C01D8A411B /* Pods-GMShareSDK_Example.release.xcconfig */;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;
CODE_SIGN_IDENTITY = "";
"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
CURRENT_PROJECT_VERSION = 1;
DEFINES_MODULE = YES;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
INFOPLIST_FILE = "Target Support Files/Pods-GMShareSDK_Example/Pods-GMShareSDK_Example-Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
MACH_O_TYPE = staticlib;
MODULEMAP_FILE = "Target Support Files/Pods-GMShareSDK_Example/Pods-GMShareSDK_Example.modulemap";
OTHER_LDFLAGS = "";
OTHER_LIBTOOLFLAGS = "";
PODS_ROOT = "$(SRCROOT)";
PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}";
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
SDKROOT = iphoneos;
SKIP_INSTALL = YES;
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
VERSIONING_SYSTEM = "apple-generic";
VERSION_INFO_PREFIX = "";
};
name = Release;
};
6CEB88E0FD331F5098F7DD536E2715C6 /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 98F7A14340FEE9282A7E9373B4CD5BEC /* Pods-GMShareSDK_Example.debug.xcconfig */;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;
CODE_SIGN_IDENTITY = "";
"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
CURRENT_PROJECT_VERSION = 1;
DEFINES_MODULE = YES;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
INFOPLIST_FILE = "Target Support Files/Pods-GMShareSDK_Example/Pods-GMShareSDK_Example-Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
MACH_O_TYPE = staticlib;
MODULEMAP_FILE = "Target Support Files/Pods-GMShareSDK_Example/Pods-GMShareSDK_Example.modulemap";
OTHER_LDFLAGS = "";
OTHER_LIBTOOLFLAGS = "";
PODS_ROOT = "$(SRCROOT)";
PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}";
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
SDKROOT = iphoneos;
SKIP_INSTALL = YES;
TARGETED_DEVICE_FAMILY = "1,2";
VERSIONING_SYSTEM = "apple-generic";
VERSION_INFO_PREFIX = "";
};
name = Debug;
};
7EF7227D9B20A1D549000096ACCB23D7 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
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;
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 = (
"POD_CONFIGURATION_DEBUG=1",
"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 = 8.0;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = YES;
PRODUCT_NAME = "$(TARGET_NAME)";
STRIP_INSTALLED_PRODUCT = NO;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
SYMROOT = "${SRCROOT}/../build";
};
name = Debug;
};
86BCB26584C1E34F3B723DD862922234 /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = DC00AFDA3F290179F33FB15B719768D9 /* GMShareSDK.xcconfig */;
buildSettings = {
CODE_SIGN_IDENTITY = "";
"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
CURRENT_PROJECT_VERSION = 1;
DEFINES_MODULE = YES;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
GCC_PREFIX_HEADER = "Target Support Files/GMShareSDK/GMShareSDK-prefix.pch";
INFOPLIST_FILE = "Target Support Files/GMShareSDK/GMShareSDK-Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
MODULEMAP_FILE = "Target Support Files/GMShareSDK/GMShareSDK.modulemap";
PRODUCT_MODULE_NAME = GMShareSDK;
PRODUCT_NAME = GMShareSDK;
SDKROOT = iphoneos;
SKIP_INSTALL = YES;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
SWIFT_VERSION = 4.0;
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
VERSIONING_SYSTEM = "apple-generic";
VERSION_INFO_PREFIX = "";
};
name = Release;
};
D513D6E53E5108C25C57574EFC907935 /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = BB49DCA00D8782F92D43DE6E85CBA24C /* Pods-GMShareSDK_Tests.release.xcconfig */;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;
CODE_SIGN_IDENTITY = "";
"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
CURRENT_PROJECT_VERSION = 1;
DEFINES_MODULE = YES;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
INFOPLIST_FILE = "Target Support Files/Pods-GMShareSDK_Tests/Pods-GMShareSDK_Tests-Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
MACH_O_TYPE = staticlib;
MODULEMAP_FILE = "Target Support Files/Pods-GMShareSDK_Tests/Pods-GMShareSDK_Tests.modulemap";
OTHER_LDFLAGS = "";
OTHER_LIBTOOLFLAGS = "";
PODS_ROOT = "$(SRCROOT)";
PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}";
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
SDKROOT = iphoneos;
SKIP_INSTALL = YES;
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
VERSIONING_SYSTEM = "apple-generic";
VERSION_INFO_PREFIX = "";
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
2100026D4EAD66F78A7FFA794EA84424 /* Build configuration list for PBXNativeTarget "Pods-GMShareSDK_Tests" */ = {
isa = XCConfigurationList;
buildConfigurations = (
1659BEDE217429FB716670FB73E2DC39 /* Debug */,
D513D6E53E5108C25C57574EFC907935 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
27749EBE8A2D4568EFEE2B8775B313DD /* Build configuration list for PBXNativeTarget "Pods-GMShareSDK_Example" */ = {
isa = XCConfigurationList;
buildConfigurations = (
6CEB88E0FD331F5098F7DD536E2715C6 /* Debug */,
4C4EE1869D1C8034C3328B4F92D4DF34 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = {
isa = XCConfigurationList;
buildConfigurations = (
7EF7227D9B20A1D549000096ACCB23D7 /* Debug */,
4BE66A09A74FD25164AAB3C2645B9B93 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
A200758977887B2BCB999E511511EBEE /* Build configuration list for PBXNativeTarget "GMShareSDK" */ = {
isa = XCConfigurationList;
buildConfigurations = (
300741D5A3C44C4DE0506185AC3C9DE4 /* Debug */,
86BCB26584C1E34F3B723DD862922234 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = BFDFE7DC352907FC980B868725387E98 /* Project object */;
}
<?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>en</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>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>0.1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>${CURRENT_PROJECT_VERSION}</string>
<key>NSPrincipalClass</key>
<string></string>
</dict>
</plist>
#import <Foundation/Foundation.h>
@interface PodsDummy_GMShareSDK : NSObject
@end
@implementation PodsDummy_GMShareSDK
@end
#ifdef __OBJC__
#import <UIKit/UIKit.h>
#else
#ifndef FOUNDATION_EXPORT
#if defined(__cplusplus)
#define FOUNDATION_EXPORT extern "C"
#else
#define FOUNDATION_EXPORT extern
#endif
#endif
#endif
#ifdef __OBJC__
#import <UIKit/UIKit.h>
#else
#ifndef FOUNDATION_EXPORT
#if defined(__cplusplus)
#define FOUNDATION_EXPORT extern "C"
#else
#define FOUNDATION_EXPORT extern
#endif
#endif
#endif
#import "WMShareObject.h"
#import "GMShareSDK.h"
#import "GMThirdPartyDefine.h"
#import "GMThirdPartyLoginHelper.h"
#import "GMThirdPartyOauthManager.h"
#import "NSMutableDictionary+GMShareSDK.h"
#import "NSURLRequest+IgnoreSSL.h"
#import "QQApiInterface.h"
#import "QQApiInterfaceObject.h"
#import "sdkdef.h"
#import "TencentOAuth.h"
#import "GMPopupBgView.h"
#import "GMSafeValue.h"
#import "UIImage+Compress.h"
#import "UIView+SafeArea.h"
FOUNDATION_EXPORT double GMShareSDKVersionNumber;
FOUNDATION_EXPORT const unsigned char GMShareSDKVersionString[];
framework module GMShareSDK {
umbrella header "GMShareSDK-umbrella.h"
export *
module * { export * }
}
CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/GMShareSDK
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
PODS_BUILD_DIR = ${BUILD_DIR}
PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
PODS_ROOT = ${SRCROOT}
PODS_TARGET_SRCROOT = ${PODS_ROOT}/../..
PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
SKIP_INSTALL = YES
<?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>en</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>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>1.0.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>${CURRENT_PROJECT_VERSION}</string>
<key>NSPrincipalClass</key>
<string></string>
</dict>
</plist>
# Acknowledgements
This application makes use of the following third party libraries:
## GMShareSDK
Copyright (c) 2019 Q14 <qiaojinzhu@igengmei.com>
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.
Generated by CocoaPods - https://cocoapods.org
<?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>PreferenceSpecifiers</key>
<array>
<dict>
<key>FooterText</key>
<string>This application makes use of the following third party libraries:</string>
<key>Title</key>
<string>Acknowledgements</string>
<key>Type</key>
<string>PSGroupSpecifier</string>
</dict>
<dict>
<key>FooterText</key>
<string>Copyright (c) 2019 Q14 &lt;qiaojinzhu@igengmei.com&gt;
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.
</string>
<key>License</key>
<string>MIT</string>
<key>Title</key>
<string>GMShareSDK</string>
<key>Type</key>
<string>PSGroupSpecifier</string>
</dict>
<dict>
<key>FooterText</key>
<string>Generated by CocoaPods - https://cocoapods.org</string>
<key>Title</key>
<string></string>
<key>Type</key>
<string>PSGroupSpecifier</string>
</dict>
</array>
<key>StringsTable</key>
<string>Acknowledgements</string>
<key>Title</key>
<string>Acknowledgements</string>
</dict>
</plist>
#import <Foundation/Foundation.h>
@interface PodsDummy_Pods_GMShareSDK_Example : NSObject
@end
@implementation PodsDummy_Pods_GMShareSDK_Example
@end
#!/bin/sh
set -e
set -u
set -o pipefail
function on_error {
echo "$(realpath -mq "${0}"):$1: error: Unexpected failure"
}
trap 'on_error $LINENO' ERR
if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then
# If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy
# frameworks to, so exit 0 (signalling the script phase was successful).
exit 0
fi
echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}"
SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}"
# Used as a return value for each invocation of `strip_invalid_archs` function.
STRIP_BINARY_RETVAL=0
# This protects against multiple targets copying the same framework dependency at the same time. The solution
# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html
RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????")
# Copies and strips a vendored framework
install_framework()
{
if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then
local source="${BUILT_PRODUCTS_DIR}/$1"
elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then
local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")"
elif [ -r "$1" ]; then
local source="$1"
fi
local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
if [ -L "${source}" ]; then
echo "Symlinked..."
source="$(readlink "${source}")"
fi
# Use filter instead of exclude so missing patterns don't throw errors.
echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\""
rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}"
local basename
basename="$(basename -s .framework "$1")"
binary="${destination}/${basename}.framework/${basename}"
if ! [ -r "$binary" ]; then
binary="${destination}/${basename}"
elif [ -L "${binary}" ]; then
echo "Destination binary is symlinked..."
dirname="$(dirname "${binary}")"
binary="${dirname}/$(readlink "${binary}")"
fi
# Strip invalid architectures so "fat" simulator / device frameworks work on device
if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then
strip_invalid_archs "$binary"
fi
# Resign the code if required by the build settings to avoid unstable apps
code_sign_if_enabled "${destination}/$(basename "$1")"
# Embed linked Swift runtime libraries. No longer necessary as of Xcode 7.
if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then
local swift_runtime_libs
swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u)
for lib in $swift_runtime_libs; do
echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\""
rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}"
code_sign_if_enabled "${destination}/${lib}"
done
fi
}
# Copies and strips a vendored dSYM
install_dsym() {
local source="$1"
if [ -r "$source" ]; then
# Copy the dSYM into a the targets temp dir.
echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\""
rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DERIVED_FILES_DIR}"
local basename
basename="$(basename -s .framework.dSYM "$source")"
binary="${DERIVED_FILES_DIR}/${basename}.framework.dSYM/Contents/Resources/DWARF/${basename}"
# Strip invalid architectures so "fat" simulator / device frameworks work on device
if [[ "$(file "$binary")" == *"Mach-O "*"dSYM companion"* ]]; then
strip_invalid_archs "$binary"
fi
if [[ $STRIP_BINARY_RETVAL == 1 ]]; then
# Move the stripped file into its final destination.
echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\""
rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.framework.dSYM" "${DWARF_DSYM_FOLDER_PATH}"
else
# The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing.
touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.framework.dSYM"
fi
fi
}
# Copies the bcsymbolmap files of a vendored framework
install_bcsymbolmap() {
local bcsymbolmap_path="$1"
local destination="${BUILT_PRODUCTS_DIR}"
echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}""
rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}"
}
# Signs a framework with the provided identity
code_sign_if_enabled() {
if [ -n "${EXPANDED_CODE_SIGN_IDENTITY:-}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then
# Use the current code_sign_identity
echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}"
local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'"
if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then
code_sign_cmd="$code_sign_cmd &"
fi
echo "$code_sign_cmd"
eval "$code_sign_cmd"
fi
}
# Strip invalid architectures
strip_invalid_archs() {
binary="$1"
# Get architectures for current target binary
binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)"
# Intersect them with the architectures we are building for
intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)"
# If there are no archs supported by this binary then warn the user
if [[ -z "$intersected_archs" ]]; then
echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)."
STRIP_BINARY_RETVAL=0
return
fi
stripped=""
for arch in $binary_archs; do
if ! [[ "${ARCHS}" == *"$arch"* ]]; then
# Strip non-valid architectures in-place
lipo -remove "$arch" -output "$binary" "$binary"
stripped="$stripped $arch"
fi
done
if [[ "$stripped" ]]; then
echo "Stripped $binary of architectures:$stripped"
fi
STRIP_BINARY_RETVAL=1
}
if [[ "$CONFIGURATION" == "Debug" ]]; then
install_framework "${BUILT_PRODUCTS_DIR}/GMShareSDK/GMShareSDK.framework"
fi
if [[ "$CONFIGURATION" == "Release" ]]; then
install_framework "${BUILT_PRODUCTS_DIR}/GMShareSDK/GMShareSDK.framework"
fi
if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then
wait
fi
#ifdef __OBJC__
#import <UIKit/UIKit.h>
#else
#ifndef FOUNDATION_EXPORT
#if defined(__cplusplus)
#define FOUNDATION_EXPORT extern "C"
#else
#define FOUNDATION_EXPORT extern
#endif
#endif
#endif
FOUNDATION_EXPORT double Pods_GMShareSDK_ExampleVersionNumber;
FOUNDATION_EXPORT const unsigned char Pods_GMShareSDK_ExampleVersionString[];
FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/GMShareSDK"
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/GMShareSDK/GMShareSDK.framework/Headers"
LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks'
OTHER_LDFLAGS = $(inherited) -framework "GMShareSDK"
PODS_BUILD_DIR = ${BUILD_DIR}
PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
PODS_PODFILE_DIR_PATH = ${SRCROOT}/.
PODS_ROOT = ${SRCROOT}/Pods
framework module Pods_GMShareSDK_Example {
umbrella header "Pods-GMShareSDK_Example-umbrella.h"
export *
module * { export * }
}
FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/GMShareSDK"
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/GMShareSDK/GMShareSDK.framework/Headers"
LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks'
OTHER_LDFLAGS = $(inherited) -framework "GMShareSDK"
PODS_BUILD_DIR = ${BUILD_DIR}
PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
PODS_PODFILE_DIR_PATH = ${SRCROOT}/.
PODS_ROOT = ${SRCROOT}/Pods
<?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>en</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>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>1.0.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>${CURRENT_PROJECT_VERSION}</string>
<key>NSPrincipalClass</key>
<string></string>
</dict>
</plist>
# Acknowledgements
This application makes use of the following third party libraries:
Generated by CocoaPods - https://cocoapods.org
<?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>PreferenceSpecifiers</key>
<array>
<dict>
<key>FooterText</key>
<string>This application makes use of the following third party libraries:</string>
<key>Title</key>
<string>Acknowledgements</string>
<key>Type</key>
<string>PSGroupSpecifier</string>
</dict>
<dict>
<key>FooterText</key>
<string>Generated by CocoaPods - https://cocoapods.org</string>
<key>Title</key>
<string></string>
<key>Type</key>
<string>PSGroupSpecifier</string>
</dict>
</array>
<key>StringsTable</key>
<string>Acknowledgements</string>
<key>Title</key>
<string>Acknowledgements</string>
</dict>
</plist>
#import <Foundation/Foundation.h>
@interface PodsDummy_Pods_GMShareSDK_Tests : NSObject
@end
@implementation PodsDummy_Pods_GMShareSDK_Tests
@end
#ifdef __OBJC__
#import <UIKit/UIKit.h>
#else
#ifndef FOUNDATION_EXPORT
#if defined(__cplusplus)
#define FOUNDATION_EXPORT extern "C"
#else
#define FOUNDATION_EXPORT extern
#endif
#endif
#endif
FOUNDATION_EXPORT double Pods_GMShareSDK_TestsVersionNumber;
FOUNDATION_EXPORT const unsigned char Pods_GMShareSDK_TestsVersionString[];
FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/GMShareSDK"
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/GMShareSDK/GMShareSDK.framework/Headers"
OTHER_LDFLAGS = $(inherited) -framework "GMShareSDK"
PODS_BUILD_DIR = ${BUILD_DIR}
PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
PODS_PODFILE_DIR_PATH = ${SRCROOT}/.
PODS_ROOT = ${SRCROOT}/Pods
framework module Pods_GMShareSDK_Tests {
umbrella header "Pods-GMShareSDK_Tests-umbrella.h"
export *
module * { export * }
}
FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/GMShareSDK"
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/GMShareSDK/GMShareSDK.framework/Headers"
OTHER_LDFLAGS = $(inherited) -framework "GMShareSDK"
PODS_BUILD_DIR = ${BUILD_DIR}
PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
PODS_PODFILE_DIR_PATH = ${SRCROOT}/.
PODS_ROOT = ${SRCROOT}/Pods
//
// WMShareObject.h
// Gengmei
//
// Created by Sean Lee on 7/22/15.
// Copyright (c) 2015 Wanmeichuangyi. All rights reserved.
//
#import <GMBase/GMObject.h>
@protocol WMShareBasicObject @end
@interface WMShareBasicObject : GMObject
@property (nonatomic,strong) NSString * title;
@property (nonatomic,strong) NSString * content;
@end
@protocol GMWechatminiObject @end
@interface GMWechatminiObject : GMObject
@property (nonatomic,strong) NSString * desc;
@property (nonatomic,strong) NSString * title;
@property (nonatomic,strong) NSString * hdImageUrl;
@property (nonatomic,strong) NSString * path;
@property (nonatomic,strong) NSString * userName;
@property (nonatomic,strong) NSString * thumbImageUrl;
@end
@protocol WMShareObject @end
@interface WMShareObject : GMObject
@property (nonatomic,strong) NSString * image;
@property (nonatomic,strong) NSString * url;
@property (nonatomic,strong) NSString * from;
@property (nonatomic,strong) NSString * showPrice;
@property (nonatomic,strong) NSString * organizationName;
@property (nonatomic,strong) WMShareBasicObject <WMShareBasicObject>* wechat;
@property (nonatomic,strong) WMShareBasicObject <WMShareBasicObject>* wechatline;
@property (nonatomic,strong) WMShareBasicObject <WMShareBasicObject>* wechatScreenshot;
@property (nonatomic,strong) WMShareBasicObject <WMShareBasicObject>* wechatlineScreenshot;
@property (nonatomic,strong) WMShareBasicObject <WMShareBasicObject>* qq;
@property (nonatomic,strong) WMShareBasicObject <WMShareBasicObject>* qqzone;
@property (nonatomic,strong) WMShareBasicObject <WMShareBasicObject>* weibo;
@property (nonatomic,strong) GMWechatminiObject <GMWechatminiObject>* wechatmini;
@property (nonatomic,strong) WMShareBasicObject <WMShareBasicObject>* douyin; // 分享到抖音 扫脸1.5
@property (nonatomic, copy) NSString *page_name;// 埋点使用
@property (nonatomic, copy) NSString *business_id;// 埋点使用
@property (nonatomic, copy) NSString *is_like;//埋点使用
@property (nonatomic, copy) NSString *videoUrl;//视频URL(分享视频时)扫脸1.5
@end
@protocol GMDiaryShareObject @end
@interface GMDiaryShareObject : GMObject
@property (nonatomic,strong) NSString *id;
@property (nonatomic,strong) NSString *title;
@property (nonatomic,strong) WMShareObject *shareData;
@end
@protocol GMShareConfigObject @end
@interface GMShareConfigObject : GMObject
@property (nonatomic,strong) NSString *hideCopyLink;
@property (nonatomic,strong) NSString *hideRefresh;
@property (nonatomic,strong) NSString *hideReport;
@property (nonatomic,strong) NSString *shareCallback;
@property (nonatomic,strong) NSString *shareTip;
@property (nonatomic,strong) NSString *shareTitle;
@property (nonatomic,strong) NSString *shareInfo;
@property (nonatomic, copy) NSString *taskType;
@property (nonatomic, copy) NSString *isReportShareResult;
@end
//
// WMShareObject.m
// Gengmei
//
// Created by Sean Lee on 7/22/15.
// Copyright (c) 2015 Wanmeichuangyi. All rights reserved.
//
#import "WMShareObject.h"
@implementation WMShareBasicObject
@end
@implementation GMWechatminiObject
@end
@implementation WMShareObject
@end
@implementation GMDiaryShareObject
@end
@implementation GMShareConfigObject
@end
//
// GMShareSDK.h
// Gengmei
//
// Created by licong on 2017/8/16.
// Copyright © 2017年 更美互动信息科技有限公司. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "NSMutableDictionary+GMShareSDK.h"
/**
* 分享内容状态变更回调处理器
*
* @param state 状态
* @param userData 附加数据, 返回状态以外的一些数据描述,如:邮件分享取消时,标识是否保存草稿等
* @param error 错误信息,当且仅当state为SSDKResponseStateFail时返回
*/
typedef void(^GMSDKShareStateChangedHandler) (GMShareResponseState state, NSError *error);
@interface GMShareSDK : NSObject
+ (instancetype)shareInstance;
/** 判断微博、微信、QQ是否已经安装*/
+ (BOOL)isClientInstalled:(GMSharePlatform)platformType;
+ (UIImage *)compressWithUrl:(NSString *)url;
+ (UIImage *)compressImage:(UIImage *)image;
+ (NSString *)shareChannel:(GMSharePlatform)platformType;
- (void)share:(GMSharePlatform)platformType
parameters:(NSMutableDictionary *)parameters
onStateChanged:(GMSDKShareStateChangedHandler)stateChangedHandler;
- (void)shareImage:(UIImage *)image platform:(GMSharePlatform)platformType;
@end
//
// GMShareSDK.m
// Gengmei
//
// Created by licong on 2017/8/16.
// Copyright © 2017年 更美互动信息科技有限公司. All rights reserved.
//
#import "GMShareSDK.h"
#import <Weibo_SDK/WeiboSDK.h>
#import <TencentOpenAPI/TencentOAuth.h>
#import <TencentOpenAPI/QQApiInterfaceObject.h>
#import <TencentOpenAPI/QQApiInterface.h>
#import "WXApiObject.h"
#import "GMThirdPartyOauthManager.h"
#import "GMThirdPartyDefine.h"
#import "WeiboSDK.h"
#import "Gengmei-Swift.h"
#import <GMKit/UIImage+GM.h>
#import "UIImage+Compress.h"
#import "DouyinOpenSDKApi.h"
@interface GMShareSDK ()<WBMediaTransferProtocol>
@property (nonatomic, strong) WBMessageObject *messageObject;
@end
@implementation GMShareSDK
+ (instancetype)shareInstance
{
static dispatch_once_t onceToken;
static id instance = nil;
dispatch_once(&onceToken, ^{
instance = [[[self class] alloc] init];
});
return instance;
}
+ (BOOL)isClientInstalled:(GMSharePlatform)platformType{
if (platformType == GMSharePlatformQQ) {
return [QQApiInterface isQQInstalled] ? YES : NO;
} else if (platformType == GMSharePlatformWechatTimeline | platformType == GMSharePlatformWechatSession | GMSharePlatformWechat) {
return [WXApi isWXAppInstalled] ? YES : NO;
} else if (platformType == GMSharePlatformSinaWeibo){
return [WeiboSDK isWeiboAppInstalled] ? YES : NO;
} else if (platformType == GMSharePlatformDouyin) {
return [DouyinOpenSDKApi isAppInstalled];
} else {
return YES;
}
}
// 获取分享平台渠道(H5 埋点使用)
+ (NSString *)shareChannel:(GMSharePlatform)platformType {
switch (platformType) {
case GMSharePlatformQQFriend:{
return @"qq";
}
break;
case GMSharePlatformQQSpace:{
return @"qzone";
break;
}
case GMSharePlatformWechatSession:{
return @"wechat";
break;
}
case GMSharePlatformWechatTimeline:{
return @"wechatline";
break;
}
case GMSharePlatformWechatSessionSnapShot:{
return @"wechat_snapshot";
break;
}
case GMSharePlatformWechatTimelineSnapShot:{
return @"wechatline_snapshot";
break;
}
case GMSharePlatformWechatMiniProgram:{
return @"xcx";
break;
}
case GMSharePlatformSinaWeibo:{
return @"tsina";
break;
}
case GMSharePlatformDouyin:{
return @"Douyin";
break;
}
default:
return @"Default";
break;
}
}
//TODO 换一种方式压缩图片
+ (UIImage *)compressWithUrl:(NSString *)url{
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:1.5];
NSURLResponse *response = nil;
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil];
UIImage* image = [UIImage imageWithData: data];
//如果远程的图片下载不下来,则使用默认图
if (image == nil) {
image = [UIImage imageNamed:@"icon"];
}
image = [GMShareSDK compressImage:image];
return image;
}
+ (UIImage *)compressImage:(UIImage *)image{
// 图片下载成功后,分享到微信的图片不能太大
if (image.size.width * image.size.height> 300 * 300) {
CGFloat scale = sqrt(300 * 300 / (image.size.width * image.size.height));
image = [image resizedImageWithSize:CGSizeMake(image.size.width * scale, image.size.height * scale)];
}
return image;
}
- (void)share:(GMSharePlatform)platformType parameters:(NSMutableDictionary *)parameters onStateChanged:(GMSDKShareStateChangedHandler)stateChangedHandler{
GMShareContentType contentType = (GMShareContentType)[parameters[@"type"] integerValue];
if (contentType == GMShareContentTypeMiniProgram) {
platformType = GMSharePlatformWechatMiniProgram;
}
switch (platformType) {
case GMSharePlatformQQFriend:{
[self QQFriendShareWithParameters:parameters];
[self shareWithName:kQQShare onStateChanged:stateChangedHandler];
}
break;
case GMSharePlatformQQSpace:{
[self QQSpaceShareWithParameters:parameters];
[self shareWithName:kQQShare onStateChanged:stateChangedHandler];
break;
}
case GMSharePlatformWechatSession:{
[self wechatSessionShareWithParameters:parameters scene:WXSceneSession];
[self shareWithName:kWechatShare onStateChanged:stateChangedHandler];
break;
}
case GMSharePlatformWechatTimeline:{
[self wechatSessionShareWithParameters:parameters scene:WXSceneTimeline];
[self shareWithName:kWechatShare onStateChanged:stateChangedHandler];
break;
}
case GMSharePlatformWechatSessionSnapShot:{
[self wechatSessionShareWithParameters:parameters scene:WXSceneSession];
[self shareWithName:kWechatShare onStateChanged:stateChangedHandler];
break;
}
case GMSharePlatformWechatTimelineSnapShot:{
[self wechatSessionShareWithParameters:parameters scene:WXSceneTimeline];
[self shareWithName:kWechatShare onStateChanged:stateChangedHandler];
break;
}
case GMSharePlatformWechatMiniProgram:{
[self wechatSessionShareWithParameters:parameters scene:WXSceneSession];
[self shareWithName:kWechatShare onStateChanged:stateChangedHandler];
break;
}
case GMSharePlatformSinaWeibo:{
[self weiboShareWithParameters:parameters];
[self shareWithName:kSinaShare onStateChanged:stateChangedHandler];
break;
}
case GMSharePlatformDouyin:{
[self douYinShareWithParameters:parameters];
[self shareWithName:kDouyinShare onStateChanged:stateChangedHandler];
break;
}
default:
break;
}
}
- (void)shareWithName:(NSString *)name onStateChanged:(GMSDKShareStateChangedHandler)stateChangedHandler {
__block id observer = [[NSNotificationCenter defaultCenter] addObserverForName:name object:nil queue: [NSOperationQueue mainQueue] usingBlock:^(NSNotification * _Nonnull note) {
GMShareResponseState state = (GMShareResponseState )[note.userInfo[@"state"] integerValue];
stateChangedHandler(state, nil);
[[NSNotificationCenter defaultCenter] removeObserver:observer];
}];
}
/**
只分享一张图片
*/
- (void)shareImage:(UIImage *)image platform:(GMSharePlatform)platformType {
switch (platformType) {
case GMSharePlatformQQFriend: {
[self QQFriendShareWithImage:image];
}
break;
case GMSharePlatformWechatSession: {
[self wechatImageShareWithParameters:@{@"images": image} scene:WXSceneSession];
}
break;
case GMSharePlatformWechatTimeline:{
[self wechatImageShareWithParameters:@{@"images": image} scene:WXSceneTimeline];
}
break;
case GMSharePlatformSinaWeibo:{
[self weiboShareWithParameters:@{@"images": image}];
}
break;
default:
break;
}
}
#pragma mark -- QQShare
- (void)QQFriendShareWithImage:(UIImage *)image {
NSData *imageData = UIImagePNGRepresentation(image);
//如果图片大于10M 需要对图片压缩 不然分享不出去 微信qq 要求图片在10m 以内
if (imageData.length > (10*1024*1024)) {
imageData = UIImageJPEGRepresentation(image, 0.1);
} else if (imageData.length > (1024*1024)) {
imageData = UIImageJPEGRepresentation(image, 0.6);
}
QQApiImageObject *imgObj = [QQApiImageObject objectWithData:imageData previewImageData:nil title:@"更美app" description:@"我是图片"];
SendMessageToQQReq* req = [SendMessageToQQReq reqWithContent:imgObj];
imgObj.shareDestType = ShareDestTypeQQ;
QQApiSendResultCode sent = [QQApiInterface sendReq:req];
[self handleSendResult:sent];
}
- (void)QQFriendShareWithParameters: (NSDictionary *)parameters {
id image = parameters[@"images"];
UIImage * thumbImage = image;
NSURL* url = parameters[@"url"];
NSString *title = parameters[@"title"];
NSString *description = parameters[@"text"];
QQApiNewsObject* img = [QQApiNewsObject objectWithURL:url title:title description:description previewImageData:UIImagePNGRepresentation(thumbImage)];
SendMessageToQQReq* req = [SendMessageToQQReq reqWithContent:img];
img.shareDestType = ShareDestTypeQQ;
QQApiSendResultCode sent = [QQApiInterface sendReq:req];
[self handleSendResult:sent];
}
- (void)QQSpaceShareWithParameters: (NSDictionary *)parameters {
UIImage * previewImage = nil;
id images = parameters[@"images"];
if ([images isKindOfClass:[NSArray class]]) {
NSArray * tmp = (NSArray *)images;
previewImage = tmp.firstObject;
} else {
previewImage = images;
}
NSURL* url = parameters[@"url"];
NSString *title = parameters[@"title"];
NSString *description = parameters[@"text"];
NSData *data = UIImagePNGRepresentation(previewImage);
QQApiNewsObject * imgObj = [QQApiNewsObject objectWithURL:url title:title description:description previewImageData:data];
[imgObj setTitle:title ? : @""];
[imgObj setCflag:kQQAPICtrlFlagQZoneShareOnStart]; //不要忘记设置这个flag
SendMessageToQQReq* req = [SendMessageToQQReq reqWithContent:imgObj];
QQApiSendResultCode sent = [QQApiInterface sendReq:req];
[self handleSendResult:sent];
}
- (void)handleSendResult:(QQApiSendResultCode)sendResult{
switch (sendResult)
{
case EQQAPIAPPNOTREGISTED:
{
[UIAlertController showOKAlertWithTitle:@"Error" message:@"App未注册" actionTitle:@"取消" actionHandler:^{
}];
break;
}
case EQQAPIMESSAGECONTENTINVALID:
case EQQAPIMESSAGECONTENTNULL:
case EQQAPIMESSAGETYPEINVALID:
{
[UIAlertController showOKAlertWithTitle:@"Error" message:@"发送参数错误" actionTitle:@"取消" actionHandler:^{
}];
break;
}
case EQQAPIQQNOTINSTALLED:
{
// UIAlertView *msgbox = [[UIAlertView alloc] initWithTitle:@"Error" message:@"未安装手Q" delegate:nil cancelButtonTitle:@"取消" otherButtonTitles:nil];
[UIAlertController showOKAlertWithTitle:@"Error" message:@"未安装手Q" actionTitle:@"取消" actionHandler:^{
}];
// [msgbox show];
NSLog(@"未安装手Q");
[[NSNotificationCenter defaultCenter] postNotificationName:kQQShare object:nil userInfo:@{@"state": @(GMShareResponseStateFail)}];
break;
}
case EQQAPITIMNOTINSTALLED:
{
// UIAlertView *msgbox = [[UIAlertView alloc] initWithTitle:@"Error" message:@"未安装TIM" delegate:nil cancelButtonTitle:@"取消" otherButtonTitles:nil];
[UIAlertController showOKAlertWithTitle:@"Error" message:@"未安装TIM" actionTitle:@"取消" actionHandler:^{
}];
break;
}
case EQQAPIQQNOTSUPPORTAPI:
case EQQAPITIMNOTSUPPORTAPI:
{
[UIAlertController showOKAlertWithTitle:@"Error" message:@"API接口不支持" actionTitle:@"取消" actionHandler:^{
}];
break;
}
case EQQAPISENDFAILD:
{
// UIAlertView *msgbox = [[UIAlertView alloc] initWithTitle:@"Error" message:@"发送失败" delegate:nil cancelButtonTitle:@"取消" otherButtonTitles:nil];
// [msgbox show];
NSLog(@"发送失败");
[[NSNotificationCenter defaultCenter] postNotificationName:kQQShare object:nil userInfo:@{@"state": @(GMShareResponseStateFail)}];
break;
}
case EQQAPIVERSIONNEEDUPDATE:
{
// UIAlertView *msgbox = [[UIAlertView alloc] initWithTitle:@"Error" message:@"当前QQ版本太低,需要更新" delegate:nil cancelButtonTitle:@"取消" otherButtonTitles:nil];
// [msgbox show];
[UIAlertController showOKAlertWithTitle:@"Error" message:@"当前QQ版本太低,需要更新" actionTitle:@"取消" actionHandler:^{
}];
break;
}
case ETIMAPIVERSIONNEEDUPDATE:
{
[UIAlertController showOKAlertWithTitle:@"Error" message:@"当前QQ版本太低,需要更新" actionTitle:@"取消" actionHandler:^{
}];
break;
}
default:
{
break;
}
}
}
#pragma mark -- WeiBoShare
- (void)weiboShareWithParameters: (NSDictionary *)parameters{
_messageObject = [self manageWeiboMessageWithParameters:parameters];
[self messageShare];
}
- (void)messageShare{
WBAuthorizeRequest *authRequest = [WBAuthorizeRequest request];
authRequest.redirectURI = SINAWEIBO_REDIRECTURI;
authRequest.scope = @"all";
WBSendMessageToWeiboRequest *request = [WBSendMessageToWeiboRequest requestWithMessage:_messageObject authInfo:authRequest access_token:[GMThirdPartyOauthManager shareInstance].wbtoken];
request.userInfo = @{@"flag": @"share"};
[WeiboSDK sendRequest:request];
}
- (WBMessageObject *)manageWeiboMessageWithParameters: (NSDictionary *)parameters{
id image = parameters[@"images"];
UIImage * thumbImage = image;
NSString *description = parameters[@"text"];
WBMessageObject *message = [WBMessageObject message];
message.text = description;
WBImageObject *imageObject = [WBImageObject object];
imageObject.delegate = self;
imageObject.imageData = UIImageJPEGRepresentation(thumbImage, 1);
//这句话会crash
// [imageObject addImages:@[,thumbImage]];
message.imageObject = imageObject;
return message;
}
-(void)wbsdk_TransferDidReceiveObject:(id)object{
[self messageShare];
}
-(void)wbsdk_TransferDidFailWithErrorCode:(WBSDKMediaTransferErrorCode)errorCode andError:(NSError*)error{
}
#pragma mark -- weChatShare
- (void)wechatSessionShareWithParameters: (NSDictionary *)parameters scene:(int)scene {
GMShareContentType contentType = (GMShareContentType)[parameters[@"type"] integerValue];
switch (contentType) {
case GMShareContentTypeAuto:{
NSURL* url = parameters[@"url"];
if (url) {
[self wechatLinkShareWith:parameters scene:scene];
} else {
[self wechatImageShareWithParameters:parameters scene:scene];
}
}
break;
case GMShareContentTypeText:
break;
case GMShareContentTypeImage:
[self wechatImageShareWithParameters:parameters scene:scene];
break;
case GMShareContentTypeWebPage:
[self wechatLinkShareWith:parameters scene:scene];
break;
case GMShareContentTypeAudio:
break;
case GMShareContentTypeVideo:
break;
case GMShareContentTypeFile:
break;
case GMShareContentTypeFBMessageImages:
break;
case GMShareContentTypeFBMessageVideo:
break;
case GMShareContentTypeMiniProgram:
[self wechatMiniProgramWithParameters:parameters scene:scene];
break;
default:
break;
}
}
- (void)wechatMiniProgramWithParameters: (NSDictionary *)parameters scene:(int)scene {
#ifndef APPSTORE
if ([GMServerDomains.apiHost isEqualToString:@"http://ibackend.igengmei.com"] || [GMServerDomains.apiHost isEqualToString:@"http://backend.igengmei.com"] || [GMServerDomains.apiHost isEqualToString:@"https://backend.igengmei.com"]) {
UIAlertController *alert = [UIAlertController alert:@"当前环境,APP和小程序未绑定在同一微信开发平台账号,无法分享成功" leftTitle:@"OK" rightTitle:@"OK" leftAlterAction:^{
} rightAlertAction:^{
}];
[AppDelegate.visibleController presentViewController:alert animated:YES completion:nil];
return;
}
#endif
dispatch_async(dispatch_get_global_queue(0, 0), ^{
WXMiniProgramObject *wxMiniObject = [WXMiniProgramObject object];
wxMiniObject.webpageUrl = parameters[@"url"];
wxMiniObject.userName = parameters[@"userName"];
wxMiniObject.path = parameters[@"path"];
// 压缩图片(不大于128K)
NSData * hdImageData = [self requesDataWithString:parameters[@"hdImageData"]];
hdImageData = [UIImage compressImage:[UIImage imageWithData:hdImageData] toByte:128 * 1024 size:CGSizeMake(300, 240)];
wxMiniObject.hdImageData = hdImageData;
WXMediaMessage *message = [WXMediaMessage message];
message.title = parameters[@"title"];
message.description = parameters[@"description"];
message.mediaObject = wxMiniObject;
UIImage * thumbImage = [self originalImageWithString:parameters[@"thumbImage"]];
thumbImage = [UIImage imageWithData:[UIImage compressImage:thumbImage toByte:32 * 1024 size:CGSizeMake(150, 150)]];
[message setThumbImage:thumbImage];
SendMessageToWXReq * req = [[SendMessageToWXReq alloc]init];
req.message = message;
req.scene = scene;
// 转回到主线程
dispatch_sync(dispatch_get_main_queue(), ^{
[WXApi sendReq:req];
});
});
}
- (void)wechatImageShareWithParameters: (NSDictionary *)parameters scene:(int)scene{
id string = parameters[@"images"];
UIImage * originlaImage = [self originalImageWithString:string];
WXImageObject *ext = [WXImageObject object];
ext.imageData = UIImagePNGRepresentation(originlaImage);
//如果图片大于10M 需要对图片压缩
if (ext.imageData.length > (10*1024*1024)) {
ext.imageData = UIImageJPEGRepresentation(originlaImage, 0.1);
} else if (ext.imageData.length > (1024*1024)) {
ext.imageData = UIImageJPEGRepresentation(originlaImage, 0.6);
}
WXMediaMessage *message = [WXMediaMessage message];
message.mediaObject = ext;
[message setThumbImage:[GMShareSDK compressImage:originlaImage]];
SendMessageToWXReq *req = [self requestWithText:nil OrMediaMessage:message bText:NO InScene:scene];
[WXApi sendReq:req];
}
- (void)wechatLinkShareWith:(NSDictionary *)parameters scene:(int)scene{
dispatch_async(dispatch_get_global_queue(0, 0), ^{
id image = parameters[@"images"];
UIImage * thumbImage = image;
NSURL* url = parameters[@"url"];
NSString *title = parameters[@"title"];
NSString *description = parameters[@"text"];
WXWebpageObject *ext = [WXWebpageObject object];
ext.webpageUrl = url.absoluteString;
WXMediaMessage *message = [WXMediaMessage message];
message.title = title;
message.description = description;
message.mediaObject = ext;
[message setThumbImage:[UIImage imageWithData:[UIImage compressImage:thumbImage toByte:32 * 1024 size:CGSizeMake(150, 150)]]];
SendMessageToWXReq* req = [self requestWithText:nil OrMediaMessage:message bText:NO InScene:scene];
// 转回到主线程
dispatch_sync(dispatch_get_main_queue(), ^{
[WXApi sendReq:req];
});
});
}
- (UIImage *)originalImageWithString:(id )string{
UIImage* image = nil;
if ([string isKindOfClass:[UIImage class]]){
image = (UIImage *)string;
} else if ([string isKindOfClass:[NSString class]]) {
NSString *url = (NSString *)string;
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:1.5];
NSURLResponse *response = nil;
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil];
image = [UIImage imageWithData: data];
//如果远程的图片下载不下来,则使用默认图
if (image == nil) {
image = [UIImage imageNamed:@"icon"];
}
}
return image;
}
- (NSData *)requesDataWithString:(id)string{
NSData *data = nil;
UIImage * image = nil;
if ([string isKindOfClass:[UIImage class]]){
UIImage * image = (UIImage *)string;
data = UIImagePNGRepresentation(image);
} else if ([string isKindOfClass:[NSString class]]) {
NSString *url = (NSString *)string;
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:1.5];
NSURLResponse *response = nil;
data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil];
//如果远程的图片下载不下来,则使用默认图
if (data == nil) {
image = [UIImage imageNamed:@"share_smallProgram"];
data = UIImagePNGRepresentation(image);
}
}
return data;
}
- (SendMessageToWXReq *)requestWithText:(NSString *)text
OrMediaMessage:(WXMediaMessage *)message
bText:(BOOL)bText
InScene:(enum WXScene)scene {
SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init];
req.bText = bText;
req.scene = scene;
if (bText)
req.text = text;
else
req.message = message;
return req;
}
#pragma mark -- douYin
- (void)douYinShareWithParameters:(NSDictionary *)parameters{
DouyinOpenSDKShareReq *req = [DouyinOpenSDKShareReq new];
req.mediaType = DouyinOpenSDKShareMediaTypeVideo;
NSMutableArray *mediaUrl = [NSMutableArray array];
NSURL *videoUrl = [NSURL new];
if ([parameters.allKeys containsObject:@"videoUrl"]) {
videoUrl= parameters[@"videoUrl"];
}
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
PHAssetChangeRequest *req = [PHAssetChangeRequest creationRequestForAssetFromVideoAtFileURL:videoUrl];
NSString *localId = req.placeholderForCreatedAsset.localIdentifier;
[mediaUrl addObject:localId];
} completionHandler:^(BOOL success, NSError * _Nullable error) {
if (success) {
dispatch_async(dispatch_get_main_queue(), ^{
// [self sendShareReq];
// 分享视频
req.localIdentifiers = mediaUrl;
BOOL success = [DouyinOpenSDKApi sendReq:req];
if (success) {
NSLog(@"send share req success");
} else {
NSLog(@"send share req failure");
}
});
}
}];
//// #话题,需要额外开通,视频中会有 #变脸挑战 的话题标签, 非必须属性
// req.hashtag = @"变脸挑战";
//
// // 小程序,在分享的视频右下角显示抖音小程序入口, 非必须属性
// req.mpInfo = [DouyinOpenSDKMPInfo mpInfoWithIdentifier:@"you_mp_identifier" title:@"title" desc:@"desc" startPageURL:nil];
}
@end
//
// GMThirdPartyDefine.h
// Gengmei
//
// Created by licong on 2017/8/2.
// Copyright © 2017年 更美互动信息科技有限公司. All rights reserved.
//
#ifndef GMThirdPartyDefine_h
#define GMThirdPartyDefine_h
typedef NS_ENUM(NSInteger, GMShareResponseState) {
GMShareResponseStateBegin = -1,
GMShareResponseStateSuccess = 0,
GMShareResponseStateFail = 1,
GMShareResponseStateCancel = 2,
GMShareResponseStateBack = 3,
};
typedef NS_ENUM(NSInteger, GMSharePlatform) {
GMSharePlatformUnknown = -1,
GMSharePlatformSinaWeibo = 0, /**< 新浪微博 */
GMSharePlatformQQSpace = 1, /**< QQ空间 */
GMSharePlatformQQFriend = 2, /**< QQ好友 */
GMSharePlatformWechatSession = 3, /**< 微信好友 */
GMSharePlatformWechatTimeline = 4, /**< 微信朋友圈 */
GMSharePlatformFav = 5, /**< 收藏 */
GMSharePlatformDelete = 6, /**< 删除 */
GMSharePlatformCopyLink = 7, /**< 复制链接 */
GMSharePlatformRefresh = 8, /**< 刷新 */
GMSharePlatformReport = 9, /**< 举报 */
GMSharePlatformCancelFollow = 10, /**< 圈子取消关注 */
GMSharePlatformWechatSessionSnapShot = 11, /**< 微信好友快照 */
GMSharePlatformWechatTimelineSnapShot = 12, /**< 微信朋友圈快照 */
GMSharePlatformWechatMiniProgram = 13, /**< 微信小程序分享 */
GMSharePlatformPrivateMsg = 14, /**< 更美私信 */
GMSharePlatformInviteAnswer = 15, /** 邀请回复(回复详情和问题详情界面) */
GMSharePlatformWechat = 100, /**< 微信平台*/
GMSharePlatformQQ = 101, /**< QQ平台*/
GMSharePlatformDouyin = 102, /**< 抖音*/
};
/**
* 内容类型
*/
typedef NS_ENUM(NSUInteger, GMShareContentType){
/**
* 自动适配类型,视传入的参数来决定
*/
GMShareContentTypeAuto = 0,
/**
* 文本
*/
GMShareContentTypeText = 1,
/**
* 图片
*/
GMShareContentTypeImage = 2,
/**
* 网页
*/
GMShareContentTypeWebPage = 3,
/**
* 应用
*/
GMShareContentTypeApp = 4,
/**
* 音频
*/
GMShareContentTypeAudio = 5,
/**
* 视频
*/
GMShareContentTypeVideo = 6,
/**
* 文件类型(暂时仅微信可用)
*/
GMShareContentTypeFile = 7,
//图片类型 仅FacebookMessage 分享图片并需要明确结果时 注此类型分享后不会显示应用名称与icon
//v3.6.2 增加
GMShareContentTypeFBMessageImages = 8,
//图片类型 仅FacebookMessage 分享视频并需要明确结果时 注此类型分享后不会显示应用名称与icon
//所分享的视频地址必须为相册地址
//v3.6.2 增加
GMShareContentTypeFBMessageVideo = 9,
//3.6.3 小程序分享(暂时仅微信可用)
GMShareContentTypeMiniProgram = 10
};
#define kQQLogin @"kQQLogin"
#define kSinaLogin @"kSinaLogin"
#define kWechatLogin @"kWechatLogin"
//QQ好友和朋友圈会掉的url完全一样,所以没必要区分 QQ41A1DB6D://response_from_qq?source=qq&source_scheme=mqqapi&error=0&version=1&sdkv=3.1
#define kQQShare @"kQQShare"
#define kSinaShare @"kSinaShare"
#define kWechatShare @"kWechatShare"
#define kDouyinShare @"kDouyinShare"
#define kThirdPartyLoginBack @"kThirdPartyLoginBack"
#define kThirdPartyShareBack @"kThirdPartyShareBack"
#define WEICHAT_BASE_URL @"https://api.weixin.qq.com/sns"
//有关登陆授权的一些key
#ifdef APPSTORE
#define WEIXIN_APPID @"wx4326da3ad2429149" //WeiXin appId
#define WEIXIN_SECRET @"971147c78f55c3a657394a7a31f4266a" //WeiXin secret
#else
#define WEIXIN_APPID @"wx403cd28c142c7d87" //WeiXin appId
#define WEIXIN_SECRET @"035af39ad74bbc01b7517a291c836827" //WeiXin secret
#endif
#define QQ_APPID @"1101126509" //QQ APPID
#define QQ_HEX_APPID @"41A1DB6D" //16进制的QQ appid
#define QQ_APPKEY @"yD4Eu3WZX6egmrMU" //QQ APPKEY
#define SINAWEIBO_APPID @"2387882244" //Sina Weibo APPKEY
#define SINAWEIBO_APPKEY @"8480ee24118f0dec4f71e0ca1ba8638e" //Sina Weibo secret
#define SINAWEIBO_REDIRECTURI @"http://www.wanmeizhensuo.com/api/user/weibo/auth/"
#define DOUYIN_APPID @"awedc2tmuly0pozy" //抖音 APPID
#define DOUYIN_APPKEY @"cd39b2610b33244eef66eab3327e4d72" // douyin secret
#define QM_APPID @"4e26f886" //QM APPID
#endif /* GMThirdPartyDefine_h */
//
// GMThirdPartyLoginHelper.h
// Gengmei
//
// Created by licong on 2017/8/2.
// Copyright © 2017年 更美互动信息科技有限公司. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "GMThirdPartyDefine.h"
@interface GMThirdPartyUser : NSObject
@property (nonatomic, copy) NSString * nickname;
@property (nonatomic, copy) NSString * uid;
@property (nonatomic, copy) NSString * unionid;
@property (nonatomic, copy) NSString * icon;
@property (nonatomic, copy) NSString * provice;
@property (nonatomic, copy) NSString * city;
@property (nonatomic, assign) GMSharePlatform platformType;
@property (nonatomic, copy) NSString *thirdDetail;
@end
typedef void (^GMThirdPartyUserHandler) (GMShareResponseState state, GMThirdPartyUser *user);
@interface GMThirdPartyLoginHelper : NSObject
+ (void)loginByPlatform:(GMSharePlatform)platform
onUserSync:(GMThirdPartyUserHandler)userHandler;
+ (void)thirdPartyLogout;
@end
//
// GMThirdPartyLoginHelper.m
// Gengmei
//
// Created by licong on 2017/8/2.
// Copyright © 2017年 更美互动信息科技有限公司. All rights reserved.
//
#import "GMThirdPartyLoginHelper.h"
#import "WXApi.h"
#import <Weibo_SDK/WeiboSDK.h>
#import "GMThirdPartyDefine.h"
#import "GMThirdPartyOauthManager.h"
@implementation GMThirdPartyUser
@end
@implementation GMThirdPartyLoginHelper
+ (void)loginByPlatform:(GMSharePlatform)platform
onUserSync:(GMThirdPartyUserHandler)userHandler{
[GMThirdPartyOauthManager shareInstance].user.platformType = platform;
if (platform == GMSharePlatformQQ) {
NSArray* permissions = [NSArray arrayWithObjects:
kOPEN_PERMISSION_GET_USER_INFO,
kOPEN_PERMISSION_GET_SIMPLE_USER_INFO,
nil];
[[GMThirdPartyOauthManager shareInstance].tencentOAuth setAuthShareType: AuthShareType_QQ];
[[GMThirdPartyOauthManager shareInstance].tencentOAuth authorize:permissions inSafari:NO];
__block id observer = [[NSNotificationCenter defaultCenter] addObserverForName:kQQLogin object:nil queue: [NSOperationQueue mainQueue] usingBlock:^(NSNotification * _Nonnull note) {
GMShareResponseState state = (GMShareResponseState )[note.userInfo[@"state"] integerValue];
userHandler(state, note.object);
[[NSNotificationCenter defaultCenter] removeObserver:observer];
}];
} else if (platform == GMSharePlatformWechat) {
if ([WXApi isWXAppInstalled]){
[GMThirdPartyLoginHelper wechatLogin];
__block id observer = [[NSNotificationCenter defaultCenter] addObserverForName:kWechatLogin object:nil queue: [NSOperationQueue mainQueue] usingBlock:^(NSNotification * _Nonnull note) {
GMShareResponseState state = (GMShareResponseState )[note.userInfo[@"state"] integerValue];
userHandler(state, note.object);
[[NSNotificationCenter defaultCenter] removeObserver:observer];
}];
}
} else if (platform == GMSharePlatformSinaWeibo){
WBAuthorizeRequest *request = [WBAuthorizeRequest request];
request.redirectURI = SINAWEIBO_REDIRECTURI ;
//http://open.weibo.com/wiki/Scope
request.scope = @"all";
request.userInfo = @{@"flag": @"authorize"};
[WeiboSDK sendRequest:request];
__block id observer = [[NSNotificationCenter defaultCenter] addObserverForName:kSinaLogin object:nil queue: [NSOperationQueue mainQueue] usingBlock:^(NSNotification * _Nonnull note) {
GMShareResponseState state = (GMShareResponseState )[note.userInfo[@"state"] integerValue];
userHandler(state, note.object);
[[NSNotificationCenter defaultCenter] removeObserver:observer];
}];
}
}
+ (void)wechatLogin {
if ([WXApi isWXAppInstalled]){
//构造SendAuthReq结构体
SendAuthReq* req = [[SendAuthReq alloc ] init];
req.scope = @"snsapi_userinfo" ;
req.state = @"Gengmei" ;
//第三方向微信终端发送一个SendAuthReq消息结构
[WXApi sendReq:req];
}
}
+ (void)thirdPartyLogout {
if ([GMThirdPartyOauthManager shareInstance].user.platformType == GMSharePlatformQQ){
[GMThirdPartyOauthManager shareInstance].tencentOAuth = [[TencentOAuth alloc] initWithAppId:QQ_APPID andDelegate:[GMThirdPartyOauthManager shareInstance]];
}
}
@end
//
// GMThirdPartyOauthManager.h
// Gengmei
//
// Created by licong on 2017/8/2.
// Copyright © 2017年 更美互动信息科技有限公司. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "WeiboSDK.h"
#import "WXApi.h"
#import "GMThirdPartyLoginHelper.h"
#import <TencentOpenAPI/TencentOAuth.h>
#import "DouyinOpenSDKApi.h"
//这里是接受三方授权的回调
@interface GMThirdPartyOauthManager : NSObject<WeiboSDKDelegate, WBHttpRequestDelegate, TencentSessionDelegate, WXApiDelegate, DouyinOpenSDKApiDelegate, DouyinOpenSDKLogDelegate>
@property (nonatomic, strong) GMThirdPartyUser * user;
@property (nonatomic, assign) GMSharePlatform currentShareType;
@property (strong, nonatomic) NSString *wbtoken;
@property (strong, nonatomic) TencentOAuth * tencentOAuth;
+ (instancetype)shareInstance;
@end
//
// GMThirdPartyOauthManager.m
// Gengmei
//
// Created by licong on 2017/8/2.
// Copyright © 2017年 更美互动信息科技有限公司. All rights reserved.
//
#import "GMThirdPartyOauthManager.h"
#import "GMThirdPartyLoginHelper.h"
#import "GMShareSDK.h"
#import <GMFoundation/NSString+GM.h>
@implementation GMThirdPartyOauthManager
+ (instancetype)shareInstance
{
static dispatch_once_t onceToken;
static id instance = nil;
dispatch_once(&onceToken, ^{
instance = [[[self class] alloc] init];
});
return instance;
}
- (instancetype)init{
if (self = [super init]) {
_user = [[GMThirdPartyUser alloc] init];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidBecomeActive:)
name:UIApplicationDidBecomeActiveNotification object:@{@"key":@"useForOauth"}];
}
return self;
}
- (void)applicationDidBecomeActive:(NSNotification *)noti {
NSString *key = noti.object[@"key"];
if (![_user.uid isNonEmpty] && [key isEqualToString:@"useForOauth"]){
if (_user.platformType == GMSharePlatformQQ) {
[[NSNotificationCenter defaultCenter] postNotificationName:kQQLogin object:nil userInfo:@{@"state": @(GMShareResponseStateBack)}];
} else if (_user.platformType == GMSharePlatformSinaWeibo){
[[NSNotificationCenter defaultCenter] postNotificationName:kSinaLogin object:nil userInfo:@{@"state": @(GMShareResponseStateBack)}];
} else if (_user.platformType == GMSharePlatformWechat){
[[NSNotificationCenter defaultCenter] postNotificationName:kWechatLogin object:nil userInfo:@{@"state": @(GMShareResponseStateBack)}];
}
}
}
#pragma mark -- WeiboSDKDelegate
- (void)didReceiveWeiboRequest:(WBBaseRequest *)request{}
//微博登陆、分享成功后的回调
- (void)didReceiveWeiboResponse:(WBBaseResponse *)response{
NSString* accessToken = @"";
NSString* userId = @"";
if ([response isKindOfClass:WBSendMessageToWeiboResponse.class]){
WBSendMessageToWeiboResponse* sendMessageToWeiboResponse = (WBSendMessageToWeiboResponse*)response;
accessToken = [sendMessageToWeiboResponse.authResponse accessToken];
userId = [sendMessageToWeiboResponse.authResponse userID];
if ([response.userInfo[@"flag"] isEqualToString:@"authorize"]) {
//sso登陆授权成功
if (response.statusCode == WeiboSDKResponseStatusCodeSuccess){
[self requstWeiBoUseInfoByAccessToken:accessToken userId:userId];
if (response.requestUserInfo != nil) {
NSData *data = [NSJSONSerialization dataWithJSONObject:response.requestUserInfo options:NSJSONWritingPrettyPrinted error:NULL];
self.user.thirdDetail = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
}
} else{
NSLog(@"登陆授权失败");
[[NSNotificationCenter defaultCenter] postNotificationName:kSinaLogin object:nil userInfo:@{@"state": @(GMShareResponseStateFail)}];
}
} else if ([response.userInfo[@"flag"] isEqualToString:@"share"]){
//sso微博分享成功
if (response.statusCode == WeiboSDKResponseStatusCodeSuccess){
[[NSNotificationCenter defaultCenter] postNotificationName:kSinaShare object:nil userInfo:@{@"state": @(GMShareResponseStateSuccess)}];
} else {
[[NSNotificationCenter defaultCenter] postNotificationName:kSinaShare object:nil userInfo:@{@"state": @(GMShareResponseStateFail)}];
}
}
/*sso分享的时候response.requestUserInfo为nil,response.userInfo是有两个字段一个是预指的flag,另一个是startTime
网页分享的时候response.userInfo为nil,response.requestUserInfo仅有一个字段,是预指的flag*/
if ([response.requestUserInfo[@"flag"] isEqualToString:@"share"] && [accessToken isNonEmpty] && [userId isNonEmpty]){
//网页微博分享成功
if (response.statusCode == WeiboSDKResponseStatusCodeSuccess){
[[NSNotificationCenter defaultCenter] postNotificationName:kSinaShare object:nil userInfo:@{@"state": @(GMShareResponseStateSuccess)}];
} else {
[[NSNotificationCenter defaultCenter] postNotificationName:kSinaShare object:nil userInfo:@{@"state": @(GMShareResponseStateFail)}];
}
}
} else if ([response isKindOfClass:WBAuthorizeResponse.class]){
//网页授权成功
accessToken = [(WBAuthorizeResponse *)response accessToken];
userId = [(WBAuthorizeResponse *)response userID];
[self requstWeiBoUseInfoByAccessToken:accessToken userId:userId];
if (response.requestUserInfo != nil) {
NSData *data = [NSJSONSerialization dataWithJSONObject:response.requestUserInfo options:NSJSONWritingPrettyPrinted error:NULL];
self.user.thirdDetail = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
}
}
}
- (void)requstWeiBoUseInfoByAccessToken: (NSString *)accessToken userId: (NSString *)userId{
//授权成功后获取用户信息
NSDictionary * dic = @{};
if ([accessToken isNonEmpty] && [userId isNonEmpty]) {
dic = @{@"access_token": accessToken, @"uid": userId};
//发送请求 获取各种数据 对应的URL和请求方式heepMethod是不同的 详细的参考微博开放平台
[WBHttpRequest requestWithURL:@"https://api.weibo.com/2/users/show.json" httpMethod:@"GET" params:dic delegate:[GMThirdPartyOauthManager shareInstance] withTag:@"gengmei"];
} else {
[[NSNotificationCenter defaultCenter] postNotificationName:kSinaLogin object:nil userInfo:@{@"state": @(GMShareResponseStateCancel)}];
}
}
//微博授权成功的回调
-(void)request:(WBHttpRequest *)request didFinishLoadingWithResult:(NSString *)result{
NSData *data=[result dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
NSString *location = dic[@"location"];
NSArray * array = [location componentsSeparatedByString:@" "];
if (array.count == 1){
_user.provice = array.firstObject;
} else if(array.count == 2){
_user.provice = array.firstObject;
_user.city = array.lastObject;
}
_user.uid = [NSString stringWithFormat:@"%@",dic[@"id"]];
_user.nickname = dic[@"screen_name"];
_user.icon = dic[@"profile_image_url"];
_user.platformType = GMSharePlatformSinaWeibo;
[[NSNotificationCenter defaultCenter] postNotificationName:kSinaLogin object:_user userInfo:@{@"state": @(GMShareResponseStateSuccess)}];
}
//微博授权失败的回调
- (void)request:(WBHttpRequest *)request didFailWithError:(NSError *)error{
[[NSNotificationCenter defaultCenter] postNotificationName:kSinaLogin object:nil userInfo:@{@"state": @(GMShareResponseStateFail)}];
}
#pragma mark -- TencentSessionDelegate
- (void)tencentDidLogin {
if (![self.tencentOAuth.accessToken isNonEmpty]){
NSArray* permissions = [NSArray arrayWithObjects:
kOPEN_PERMISSION_GET_USER_INFO,
kOPEN_PERMISSION_GET_SIMPLE_USER_INFO,
nil];
[self.tencentOAuth reauthorizeWithPermissions:permissions];
} else {
[self.tencentOAuth getUserInfo];
}
}
- (BOOL)tencentNeedPerformReAuth:(TencentOAuth *)tencentOAuth{
return YES;
}
//点击返回的回调
- (void)tencentDidNotLogin:(BOOL)cancelled{
[[NSNotificationCenter defaultCenter] postNotificationName:kQQLogin object:nil userInfo:@{@"state": @(GMShareResponseStateCancel)}];
}
- (void)tencentDidNotNetWork{
[[NSNotificationCenter defaultCenter] postNotificationName:kQQLogin object:nil userInfo:@{@"state": @(GMShareResponseStateFail)}];
}
- (BOOL)tencentNeedPerformIncrAuth:(TencentOAuth *)tencentOAuth withPermissions:(NSArray *)permissions{
[tencentOAuth incrAuthWithPermissions:permissions];
return NO;
}
- (void)getUserInfoResponse:(APIResponse *)response {
if (response && response.retCode == URLREQUEST_SUCCEED) {
_user.uid = self.tencentOAuth.getUserOpenID;
_user.nickname = response.jsonResponse[@"nickname"];
_user.icon = response.jsonResponse[@"figureurl_2"];
_user.city = response.jsonResponse[@"city"];
_user.provice = response.jsonResponse[@"province"];
_user.platformType = GMSharePlatformQQ;
_user.thirdDetail = response.message;
[[NSNotificationCenter defaultCenter] postNotificationName:kQQLogin object:_user userInfo:@{@"state": @(GMShareResponseStateSuccess)}];
} else {
[[NSNotificationCenter defaultCenter] postNotificationName:kQQLogin object:nil userInfo:@{@"state": @(GMShareResponseStateFail)}];
}
}
# pragma mark -- WXApiDelegate
- (void)onResp:(BaseResp *)resp {
if([resp isKindOfClass:[SendAuthResp class]]){
// 微信请求App提供内容, 需要app提供内容后使用sendRsp返回
SendAuthResp *authResp = (SendAuthResp *)resp;
if (resp.errCode == 0) {
[self requestWechatAccessTokenWithCode:authResp.code];
} else if(resp.errCode == -2){
[[NSNotificationCenter defaultCenter] postNotificationName:kWechatLogin object:_user userInfo:@{@"state": @(GMShareResponseStateCancel)}];
} else {
[[NSNotificationCenter defaultCenter] postNotificationName:kWechatLogin object:_user userInfo:@{@"state": @(GMShareResponseStateFail)}];
}
} else if ([resp isKindOfClass:[SendMessageToWXResp class]]) {
if (resp.errCode == 0) {
[[NSNotificationCenter defaultCenter] postNotificationName:kWechatShare object:nil userInfo:@{@"state": @(GMShareResponseStateSuccess)}];
} else if(resp.errCode == -2){
[[NSNotificationCenter defaultCenter] postNotificationName:kWechatShare object:nil userInfo:@{@"state": @(GMShareResponseStateCancel)}];
}
}
}
- (void)requestWechatAccessTokenWithCode:(NSString *)code {
NSString *accessUrl = [NSString stringWithFormat:@"%@/oauth2/access_token?appid=%@&secret=%@&code=%@&grant_type=authorization_code",WEICHAT_BASE_URL, WEIXIN_APPID, WEIXIN_SECRET, code];
[[[NSURLSession sharedSession] dataTaskWithURL:[NSURL URLWithString:accessUrl] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if (error == nil) {
NSDictionary *responseObject = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
NSString *refreshToken = responseObject[@"refresh_token"];
[self refreshAccessTokenByRefreshToken:refreshToken];
} else {
NSLog(@"获取accessToken出错");
}
}] resume];
}
//刷新access_token有效期
- (void)refreshAccessTokenByRefreshToken:(NSString *)refreshToken{
NSString *refreshUrl = [NSString stringWithFormat:@"%@/oauth2/refresh_token?appid=%@&grant_type=refresh_token&refresh_token=%@",WEICHAT_BASE_URL, WEIXIN_APPID, refreshToken];
[[[NSURLSession sharedSession] dataTaskWithURL:[NSURL URLWithString:refreshUrl] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if (error == nil) {
NSDictionary *responseObject = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
NSString *accessToken = responseObject[@"access_token"];
NSString *openId = responseObject[@"openid"];
[[GMThirdPartyOauthManager shareInstance] requestWechatUserInfoByAccessToken:accessToken openId:openId];
} else {
NSLog(@"刷新access_token时出错,请重新授权");
}
}] resume];
}
- (void)requestWechatUserInfoByAccessToken:(NSString *)accessToken openId:(NSString *)openId{
NSString *userUrlStr = [NSString stringWithFormat:@"%@/userinfo?access_token=%@&openid=%@", WEICHAT_BASE_URL, accessToken, openId];
[[[NSURLSession sharedSession] dataTaskWithURL:[NSURL URLWithString:userUrlStr] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if (error == nil) {
NSDictionary *responseObject = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
dispatch_async(dispatch_get_main_queue(), ^{
self.user.uid = responseObject[@"openid"];
self.user.nickname = responseObject[@"nickname"];
self.user.icon = responseObject[@"headimgurl"];
self.user.city = responseObject[@"city"];
self.user.provice = responseObject[@"province"];
self.user.unionid = responseObject[@"unionid"];
self.user.platformType = GMSharePlatformWechat;
self.user.thirdDetail = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
[[NSNotificationCenter defaultCenter] postNotificationName:kWechatLogin object:_user userInfo:@{@"state": @(GMShareResponseStateSuccess)}];
});
} else {
[[NSNotificationCenter defaultCenter] postNotificationName:kWechatLogin object:_user userInfo:@{@"state": @(GMShareResponseStateFail)}];
}
}] resume];
}
#pragma 抖音
- (void)didReceiveResponse:(DouyinOpenSDKBaseResp *)resp {
if ([resp isKindOfClass:[DouyinOpenSDKShareResp class]]) { // 是分享的回调
DouyinOpenSDKShareResp *shareResp = (DouyinOpenSDKShareResp *)resp;
if (shareResp.errCode == 0) {
[[NSNotificationCenter defaultCenter] postNotificationName:kDouyinShare object:nil userInfo:@{@"state": @(GMShareResponseStateSuccess)}];
} else {
//handle the error
[[NSNotificationCenter defaultCenter] postNotificationName:kDouyinShare object:nil userInfo:@{@"state": @(GMShareResponseStateFail)}];
}
}
}
- (void)onLog:(NSString *)log {
NSLog(@"%@",log);
}
@end
//
// NSMutableDictionary+GMShareSDK.h
// Gengmei
//
// Created by licong on 2017/8/18.
// Copyright © 2017年 更美互动信息科技有限公司. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "GMThirdPartyDefine.h"
#import "WXApiObject.h"
@interface NSMutableDictionary (GMShareSDK)
/**
* 设置分享参数
*
* @param text 文本
* @param images 图片集合,传入参数可以为单张图片信息,也可以为一个NSArray,数组元素可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage。如: @"http://www.mob.com/images/logo_black.png" 或 @[@"http://www.mob.com/images/logo_black.png"]
* @param url 网页路径/应用路径
* @param title 标题
* @param type 分享类型
*/
- (void)shareSetupShareParamsByText:(NSString *)text
images:(id)images
url:(NSURL *)url
title:(NSString *)title
type:(GMShareContentType)type;
/**
* 设置分享参数
*
* @param text 文本
* @param images 图片集合,传入参数可以为单张图片信息,也可以为一个NSArray,数组元素可以为UIImage、NSString(图片路径)、NSURL(图片路径)、SSDKImage。如: @"http://www.mob.com/images/logo_black.png" 或 @[@"http://www.mob.com/images/logo_black.png"]
* @param url 网页路径/应用路径
* @param title 标题
* @param type 分享类型
* @param videoUrl 视频的URL
*/
- (void)shareSetupShareParamsByText:(NSString *)text
images:(id)images
url:(NSURL *)url
title:(NSString *)title
videoUrl:(NSURL *)videoUrl
type:(GMShareContentType)type;
/**
* 设置微信小程序分享参数
*
* @param text 网页路径/应用路径
* @user name 小程序的原始id
* @user path 小程序页面的路径
* @param title 小程序标题
* @param description 小程序描述
* @param thumbImage 缩略图
* @param hdImageData 小程序节点高清大图,小于128k
*/
- (void)shareSetupMiniProgramShareParamsByUrl:(NSString *)url
userName:(NSString *)userName
path:(NSString *)path
title:(NSString *)title
description:(NSString *)description
thumbImage:(id)thumbImage
hdImageData:(id)hdImageData;
@end
//
// NSMutableDictionary+GMShareSDK.m
// Gengmei
//
// Created by licong on 2017/8/18.
// Copyright © 2017年 更美互动信息科技有限公司. All rights reserved.
//
#import "NSMutableDictionary+GMShareSDK.h"
@implementation NSMutableDictionary (GMShareSDK)
- (void)shareSetupShareParamsByText:(NSString *)text
images:(id)images
url:(NSURL *)url
title:(NSString *)title
type:(GMShareContentType)type{
self[@"text"] = text;
self[@"images"] = images;
self[@"url"] = url;
self[@"title"] = title;
self[@"type"] = @(type);
}
- (void)shareSetupShareParamsByText:(NSString *)text
images:(id)images
url:(NSURL *)url
title:(NSString *)title
videoUrl:(NSURL *)videoUrl
type:(GMShareContentType)type {
self[@"text"] = text;
self[@"images"] = images;
self[@"url"] = url;
self[@"title"] = title;
self[@"type"] = @(type);
self[@"videoUrl"] = videoUrl;
}
- (void)shareSetupMiniProgramShareParamsByUrl:(NSString *)url
userName:(NSString *)userName
path:(NSString *)path
title:(NSString *)title
description:(NSString *)description
thumbImage:(id)thumbImage
hdImageData:(id)hdImageData{
self[@"url"] = url;
self[@"userName"] = userName;
self[@"path"] = path;
self[@"title"] = title;
self[@"description"] = description;
self[@"thumbImage"] = thumbImage;
self[@"hdImageData"] = hdImageData;
self[@"type"] = @(GMShareContentTypeMiniProgram);
}
@end
//
// NSURLRequest+IgnoreSSL.h
// tencentOAuthDemo
//
// Created by JeaminW on 13-5-20.
//
//
#import <Foundation/Foundation.h>
@interface NSURLRequest (IgnoreSSL)
+ (BOOL)allowsAnyHTTPSCertificateForHost:(NSString *)host;
@end
//
// NSURLRequest+IgnoreSSL.m
// tencentOAuthDemo
//
// Created by JeaminW on 13-5-20.
//
//
#import "NSURLRequest+IgnoreSSL.h"
@implementation NSURLRequest (IgnoreSSL)
+ (BOOL)allowsAnyHTTPSCertificateForHost:(NSString *)host
{
return YES;
}
@end
///
/// \file QQApiInterface.h
/// \brief QQApi接口简化封装
///
/// Created by Tencent on 12-5-15.
/// Copyright (c) 2012年 Tencent. All rights reserved.
///
#import <Foundation/Foundation.h>
#import "QQApiInterfaceObject.h"
typedef void (^sendResultBlock)(NSDictionary *result);
/**
\brief 处理来至QQ的请求及响应的回调协议
*/
@protocol QQApiInterfaceDelegate <NSObject>
/**
处理来至QQ的请求
*/
- (void)onReq:(QQBaseReq *)req;
/**
处理来至QQ的响应
*/
- (void)onResp:(QQBaseResp *)resp;
/**
处理QQ在线状态的回调
*/
- (void)isOnlineResponse:(NSDictionary *)response;
@end
/**
\brief 对QQApi的简单封装类
*/
@interface QQApiInterface : NSObject
/**
处理由手Q唤起的普通跳转请求
\param url 待处理的url跳转请求
\param delegate 第三方应用用于处理来至QQ请求及响应的委托对象
\return 跳转请求处理结果,YES表示成功处理,NO表示不支持的请求协议或处理失败
*/
+ (BOOL)handleOpenURL:(NSURL *)url delegate:(id<QQApiInterfaceDelegate>)delegate;
/**
处理由手Q唤起的universallink跳转请求
\param universallink 待处理的universallink跳转请求
\param delegate 第三方应用用于处理来至QQ请求及响应的委托对象
\return 跳转请求处理结果,YES表示成功处理,NO表示不支持的请求协议或处理失败
*/
+ (BOOL)handleOpenUniversallink:(NSURL*)universallink delegate:(id<QQApiInterfaceDelegate>)delegate;
/**
向手Q发起分享请求
\param req 分享内容的请求
\return 请求发送结果码
*/
+ (QQApiSendResultCode)sendReq:(QQBaseReq *)req;
/**
向手Q QZone结合版发起分享请求
\note H5分享只支持单张网络图片的传递
\param req 分享内容的请求
\return 请求发送结果码
*/
+ (QQApiSendResultCode)SendReqToQZone:(QQBaseReq *)req;
/**
向手Q发起设置QQ头像
\param req 分享内容的请求
\return 请求发送结果码
*/
+ (QQApiSendResultCode)sendMessageToQQAvatarWithReq:(QQBaseReq*)req;
/**
向手Q发起组图分享到表情收藏
\param req 分享内容的请求
\return 请求发送结果码
*/
+ (QQApiSendResultCode)sendMessageToFaceCollectionWithReq:(QQBaseReq*)req;
/**
检测是否已安装QQ
\return 如果QQ已安装则返回YES,否则返回NO
\note SDK目前已经支持QQ、TIM授权登录及分享功能, 会按照QQ>TIM的顺序进行调用。
只要用户安装了QQ、TIM中任意一个应用,都可为第三方应用进行授权登录、分享功能。
第三方应用在接入SDK时不需要判断是否安装QQ、TIM。若有判断安装QQ、TIM的逻辑建议移除。
*/
+ (BOOL)isQQInstalled;
/**
检测是否已安装TIM
\return 如果TIM已安装则返回YES,否则返回NO
\note SDK目前已经支持QQ、TIM授权登录及分享功能, 会按照QQ>TIM的顺序进行调用。
只要用户安装了QQ、TIM中任意一个应用,都可为第三方应用进行授权登录、分享功能。
第三方应用在接入SDK时不需要判断是否安装QQ、TIM。若有判断安装QQ、TIM的逻辑建议移除。
*/
+ (BOOL)isTIMInstalled;
/**
检测QQ是否支持API调用
\return 如果当前安装QQ版本支持API调用则返回YES,否则返回NO
*/
+ (BOOL)isQQSupportApi;
/**
检测TIM是否支持API调用
\return 如果当前安装TIM版本支持API调用则返回YES,否则返回NO
*/
+ (BOOL)isTIMSupportApi __attribute__((deprecated("已过期, 建议删除调用,调用地方用YES替代。")));
/**
检测是否支持分享
\return 如果当前已安装QQ且QQ版本支持API调用 或者 当前已安装TIM且TIM版本支持API调用则返回YES,否则返回NO
*/
+ (BOOL)isSupportShareToQQ;
/**
检测是否支持分享到QQ结合版QZone
\return 如果当前已安装QQ且QQ版本支持API调用则返回YES,否则返回NO
*/
+ (BOOL)isSupportPushToQZone;
/**
启动QQ
\return 成功返回YES,否则返回NO
*/
+ (BOOL)openQQ;
/**
启动TIM
\return 成功返回YES,否则返回NO
*/
+ (BOOL)openTIM;
/**
获取QQ下载地址
如果App通过<code>QQApiInterface#isQQInstalled</code>和<code>QQApiInterface#isQQSupportApi</code>检测发现QQ没安装或当前版本QQ不支持API调用,可引导用户通过打开此链接下载最新版QQ。
\return iPhoneQQ下载地址
*/
+ (NSString *)getQQInstallUrl;
/**
获取TIM下载地址
如果App通过<code>QQApiInterface#isTIMInstalled</code>检测发现TIM没安装或当前版本TIM不支持API调用,可引导用户通过打开此链接下载最新版TIM。
\return iPhoneTIM下载地址
*/
+ (NSString *)getTIMInstallUrl;
@end
///
/// \file QQApiInterfaceObject.h
/// \brief QQApiInterface所依赖的请求及应答消息对象封装帮助类
///
/// Created by Tencent on 12-5-15.
/// Copyright (c) 2012年 Tencent. All rights reserved.
///
#ifndef QQApiInterface_QQAPIOBJECT_h
#define QQApiInterface_QQAPIOBJECT_h
#import <Foundation/Foundation.h>
typedef NS_ENUM(NSInteger,QQApiSendResultCode) {
EQQAPISENDSUCESS = 0,
EQQAPIQQNOTINSTALLED = 1, //QQ未安装
EQQAPIQQNOTSUPPORTAPI = 2, // QQ api不支持
EQQAPIMESSAGETYPEINVALID = 3,
EQQAPIMESSAGECONTENTNULL = 4,
EQQAPIMESSAGECONTENTINVALID = 5,
EQQAPIAPPNOTREGISTED = 6,
EQQAPIAPPSHAREASYNC = 7,
EQQAPIQQNOTSUPPORTAPI_WITH_ERRORSHOW = 8, //QQ api不支持 && SDK显示error提示(已废弃)
EQQAPIMESSAGEARKCONTENTNULL = 9, //ark内容为空
EQQAPIMESSAGE_MINI_CONTENTNULL = 10, //小程序参数为空
EQQAPISENDFAILD = -1, //发送失败
EQQAPISHAREDESTUNKNOWN = -2, //未指定分享到QQ或TIM
EQQAPITIMSENDFAILD = -3, //发送失败
EQQAPITIMNOTINSTALLED = 11, //TIM未安装
EQQAPITIMNOTSUPPORTAPI = 12, // TIM api不支持
EQQAPI_INCOMING_PARAM_ERROR = 13, // 外部传参错误
EQQAPI_THIRD_APP_GROUP_ERROR_APP_NOT_AUTHORIZIED = 14, // APP未获得授权
EQQAPI_THIRD_APP_GROUP_ERROR_CGI_FAILED = 15, // CGI请求失败
EQQAPI_THIRD_APP_GROUP_ERROR_HAS_BINDED = 16, // 该组织已经绑定群聊
EQQAPI_THIRD_APP_GROUP_ERROR_NOT_BINDED = 17, // 该组织尚未绑定群聊
EQQAPIQZONENOTSUPPORTTEXT = 10000, //qzone分享不支持text类型分享
EQQAPIQZONENOTSUPPORTIMAGE = 10001, //qzone分享不支持image类型分享
EQQAPIVERSIONNEEDUPDATE = 10002, //当前QQ版本太低,需要更新至新版本才可以支持
ETIMAPIVERSIONNEEDUPDATE = 10004, //当前TIM版本太低,需要更新至新版本才可以支持
};
#pragma mark - QQApiObject(分享对象类型)
// QQApiObject control flags
typedef NS_ENUM(NSUInteger,kQQAPICtrlFlag) {
kQQAPICtrlFlagQZoneShareOnStart = 0x01,
kQQAPICtrlFlagQZoneShareForbid = 0x02,
kQQAPICtrlFlagQQShare = 0x04,
kQQAPICtrlFlagQQShareFavorites = 0x08, //收藏
kQQAPICtrlFlagQQShareDataline = 0x10, //数据线
kQQAPICtrlFlagQQShareEnableArk = 0x20, //支持ARK
kQQAPICtrlFlagQQShareEnableMiniProgram = 0x40, //支持小程序
};
// 分享到QQ或TIM
typedef NS_ENUM(NSUInteger, ShareDestType) {
ShareDestTypeQQ = 0,
ShareDestTypeTIM,
};
//小程序的类型
typedef NS_ENUM(NSUInteger, MiniProgramType) {
MiniProgramType_Develop=0, // 开发版
MiniProgramType_Test=1, // 测试版
MiniProgramType_Online=3, // 正式版,默认
MiniProgramType_Preview=4, // 预览版
};
// QQApiObject
/** \brief 所有在QQ及插件间发送的数据对象的根类。
*/
__attribute__((visibility("default"))) @interface QQApiObject : NSObject
@property(nonatomic, retain) NSString* title; ///< 标题,最长128个字符
@property(nonatomic, retain) NSString* description; ///<简要描述,最长512个字符
@property(nonatomic, retain) NSString* universalLink; ///(>=3.3.7)支持第三方传入在互联开放平台注册的universallink
@property(nonatomic, assign) uint64_t cflag;
/*
* 分享到QQ/TIM
* SDK根据是否安装对应客户端进行判断,判断顺序:QQ > TIM
* 默认分享到QQ,如果QQ未安装检测TIM是否安装
*/
@property (nonatomic, assign) ShareDestType shareDestType;
@end
// ArkObject
/** \brief 支持Ark的根类。
*/
__attribute__((visibility("default"))) @interface ArkObject : NSObject
@property(nonatomic,retain) NSString* arkData; ///< 显示Ark所需的数据,json串,长度暂不限制
@property(nonatomic,assign) QQApiObject* qqApiObject; ///<原有老版本的QQApiObject
- (id)initWithData:(NSString *)arkData qqApiObject:(QQApiObject*)qqApiObject;
+ (id)objectWithData:(NSString *)arkData qqApiObject:(QQApiObject*)qqApiObject;
@end
#pragma mark QQ小程序
//分享小程序消息 - QQ 8.0.8
__attribute__((visibility("default"))) @interface QQApiMiniProgramObject : NSObject
@property(nonatomic,retain) QQApiObject* qqApiObject; //原有老版本的QQApiObject
@property(nonatomic,retain) NSString* miniAppID; //必填,小程序的AppId(注:必须在QQ互联平台中,将该小程序与分享的App绑定)
@property(nonatomic,retain) NSString* miniPath; //必填,小程序的展示路径
@property(nonatomic,retain) NSString* webpageUrl; //必填,兼容低版本的网页链接
@property(nonatomic,assign) MiniProgramType miniprogramType; //非必填,小程序的类型,默认正式版(3),可选测试版(1)、预览版(4)
@end
//唤起小程序 - QQ 8.1.8
__attribute__((visibility("default"))) @interface QQApiLaunchMiniProgramObject : QQApiObject
@property(nonatomic,retain) NSString* miniAppID; //必填,小程序的AppId(注:必须在QQ互联平台中,将该小程序与分享的App绑定)
@property(nonatomic,retain) NSString* miniPath; //必填,小程序的展示路径
@property(nonatomic,assign) MiniProgramType miniprogramType; //非必填,小程序的类型,默认正式版(3),可选测试版(1)、开发版(0)
@end
// QQApiResultObject
/** \brief 用于请求回应的数据类型。
<h3>可能错误码及描述如下:</h3>
<TABLE>
<TR><TD>error</TD><TD>errorDescription</TD><TD>注释</TD></TR>
<TR><TD>0</TD><TD>nil</TD><TD>成功</TD></TR>
<TR><TD>-1</TD><TD>param error</TD><TD>参数错误</TD></TR>
<TR><TD>-2</TD><TD>group code is invalid</TD><TD>该群不在自己的群列表里面</TD></TR>
<TR><TD>-3</TD><TD>upload photo failed</TD><TD>上传图片失败</TD></TR>
<TR><TD>-4</TD><TD>user give up the current operation</TD><TD>用户放弃当前操作</TD></TR>
<TR><TD>-5</TD><TD>client internal error</TD><TD>客户端内部处理错误</TD></TR>
</TABLE>
*/
__attribute__((visibility("default"))) @interface QQApiResultObject : QQApiObject
@property(nonatomic,retain) NSString* error; ///<错误
@property(nonatomic,retain) NSString* errorDescription; ///<错误描述
@property(nonatomic,retain) NSString* extendInfo; ///<扩展信息
@end
// QQApiTextObject
/** \brief 文本对象
*/
@interface QQApiTextObject : QQApiObject
@property(nonatomic,retain)NSString* text; ///<文本内容,必填,最长1536个字符
-(id)initWithText:(NSString*)text; ///<初始化方法
+(id)objectWithText:(NSString*)text;///<工厂方法,获取一个QQApiTextObject对象.
@end
// QQApiURLObject
typedef NS_ENUM(NSUInteger, QQApiURLTargetType) {
QQApiURLTargetTypeNotSpecified = 0x00,
QQApiURLTargetTypeAudio = 0x01,
QQApiURLTargetTypeVideo = 0x02,
QQApiURLTargetTypeNews = 0x03
};
/** @brief URL对象类型。
包括URL地址,URL地址所指向的目标类型及预览图像。
*/
__attribute__((visibility("default"))) @interface QQApiURLObject : QQApiObject
/**
URL地址所指向的目标类型.
@note 参见QQApi.h 中的 QQApiURLTargetType 定义.
*/
@property(nonatomic)QQApiURLTargetType targetContentType;
@property(nonatomic,retain)NSURL* url; ///<URL地址,必填,最长512个字符
@property(nonatomic,retain)NSData* previewImageData;///<预览图像数据,最大1M字节
@property(nonatomic, retain) NSURL *previewImageURL; ///<预览图像URL **预览图像数据与预览图像URL可二选一
/**
初始化方法
*/
-(id)initWithURL:(NSURL*)url title:(NSString*)title description:(NSString*)description previewImageData:(NSData*)data targetContentType:(QQApiURLTargetType)targetContentType;
-(id)initWithURL:(NSURL*)url title:(NSString*)title description:(NSString*)description previewImageURL:(NSURL*)previewURL targetContentType:(QQApiURLTargetType)targetContentType;
/**
工厂方法,获取一个QQApiURLObject对象
*/
+(id)objectWithURL:(NSURL*)url title:(NSString*)title description:(NSString*)description previewImageData:(NSData*)data targetContentType:(QQApiURLTargetType)targetContentType;
+(id)objectWithURL:(NSURL*)url title:(NSString*)title description:(NSString*)description previewImageURL:(NSURL*)previewURL targetContentType:(QQApiURLTargetType)targetContentType;
@end
// QQApiExtendObject
/** @brief 扩展数据类型
*/
@interface QQApiExtendObject : QQApiObject
@property(nonatomic,retain) NSData* data;///<具体数据内容,必填,最大5M字节
@property(nonatomic,retain) NSData* previewImageData;///<预览图像,最大1M字节
@property(nonatomic,retain) NSArray* imageDataArray;///图片数组(多图暂只支持分享到手机QQ收藏功能)
/**
初始化方法
@param data 数据内容
@param previewImageData 用于预览的图片
@param title 标题
@param description 此对象,分享的描述
*/
- (id)initWithData:(NSData*)data previewImageData:(NSData*)previewImageData title:(NSString*)title description:(NSString*)description;
/**
初始化方法
@param data 数据内容
@param title 标题
@param description 此对象,分享的描述
@param imageDataArray 发送的多张图片队列
*/
- (id)initWithData:(NSData *)data previewImageData:(NSData*)previewImageData title:(NSString *)title description:(NSString *)description imageDataArray:(NSArray *)imageDataArray;
/**
helper方法获取一个autorelease的<code>QQApiExtendObject</code>对象
@param data 数据内容
@param previewImageData 用于预览的图片
@param title 标题
@param description 此对象,分享的描述
@return
一个自动释放的<code>QQApiExtendObject</code>实例
*/
+ (id)objectWithData:(NSData*)data previewImageData:(NSData*)previewImageData title:(NSString*)title description:(NSString*)description;
/**
helper方法获取一个autorelease的<code>QQApiExtendObject</code>对象
@param data 数据内容
@param previewImageData 用于预览的图片
@param title 标题
@param description 此对象,分享的描述
@param imageDataArray 发送的多张图片队列
@return
一个自动释放的<code>QQApiExtendObject</code>实例
*/
+ (id)objectWithData:(NSData*)data previewImageData:(NSData*)previewImageData title:(NSString*)title description:(NSString*)description imageDataArray:(NSArray*)imageDataArray;
@end
// QQApiImageObject
/** @brief 图片对象
用于分享图片内容的对象,是一个指定为图片类型的<code>QQApiExtendObject</code>
*/
@interface QQApiImageObject : QQApiExtendObject
@end
// QQApiImageForQQAvatarObject
/** @brief 图片对象
用于设置QQ头像内容的对象,是一个指定为图片类型的<code>QQApiExtendObject</code>
*/
@interface QQApiImageForQQAvatarObject : QQApiExtendObject
@end
/**
* @brief 视频对象
* 用于设置动态头像
* assetURL可传ALAsset的ALAssetPropertyAssetURL,或者PHAsset的localIdentifier
从手Q返回的错误码:
//第三方设置动态头像结果
@"ret=0"//设置成功
@"ret=-10&error_des=user cancel"//用户取消设置
@"ret=-11&error_des=pasteboard have no video data"//剪切板没有数据
@"ret=-12&error_des=export data failed"//从剪切板导出数据到本地失败
@"ret=-13&error_des=url param invalid"//sdk传递过来的数据有误
@"ret=-14&error_des=video param invalid"//视频的参数不符合要求(检测第三方视频源方案:1、分辨率跟480*480保持一致;2、视频长度0.5s~8s)
@"ret=-15&error_des=app authorised failed"//应用鉴权失败
@"ret=-16&error_des=upload video failed"//设置头像,上传到后台失败
@"ret=-17&error_des=account diff"//账号不一致
*/
@interface QQApiVideoForQQAvatarObject : QQApiExtendObject
@property(nonatomic, retain) NSString *assetURL;
@end
// QQApiImageArrayForFaceCollectionObject
/** @brief 图片数组对象
用于分享图片组到表情收藏,是一个指定为图片类型的<code>QQApiObject</code>
*/
@interface QQApiImageArrayForFaceCollectionObject : QQApiObject
@property(nonatomic,retain) NSArray* imageDataArray;///图片数组
/**
初始化方法
@param imageDataArray 图片数组
*/
- (id)initWithImageArrayData:(NSArray*)imageDataArray;
/**
helper方法获取一个autorelease的<code>QQApiObject</code>对象
@param imageDataArray 发送的多张图片队列
@return
一个自动释放的<code>QQApiObject</code>实例
*/
+ (id)objectWithimageDataArray:(NSArray *)imageDataArray;
@end
// QQApiImageArrayForQZoneObject
/** @brief 图片对象
用于分享图片到空间,走写说说路径,是一个指定为图片类型的,当图片数组为空时,默认走文本写说说<code>QQApiObject</code>
*/
@interface QQApiImageArrayForQZoneObject : QQApiObject
@property(nonatomic,retain) NSArray* imageDataArray;///图片数组
@property(nonatomic,retain) NSDictionary* extMap; // 扩展字段
/**
初始化方法
@param imageDataArray 图片数组
@param title 写说说的内容,可以为空
@param extMap 扩展字段
*/
- (id)initWithImageArrayData:(NSArray*)imageDataArray title:(NSString*)title extMap:(NSDictionary *)extMap;
/**
helper方法获取一个autorelease的<code>QQApiExtendObject</code>对象
@param title 写说说的内容,可以为空
@param imageDataArray 发送的多张图片队列
@param extMap 扩展字段
@return
一个自动释放的<code>QQApiExtendObject</code>实例
*/
+ (id)objectWithimageDataArray:(NSArray*)imageDataArray title:(NSString*)title extMap:(NSDictionary *)extMap;
@end
// QQApiVideoForQZoneObject
/** @brief 视频对象
用于分享视频到空间,走写说说路径<code>QQApiObject</code>,assetURL和videoData两个参数必须设置至少一个参数,如果assetURL设置了忽略videoData参数
@param assetURL可传ALAsset的ALAssetPropertyAssetURL,或者PHAsset的localIdentifier
@param extMap 扩展字段
@param videoData 视频数据,大小不超过50M
*/
@interface QQApiVideoForQZoneObject : QQApiObject
@property(nonatomic, retain) NSString *assetURL;
@property(nonatomic,retain) NSDictionary* extMap; // 扩展字段
@property(nonatomic,retain) NSData* videoData;
- (id)initWithAssetURL:(NSString*)assetURL title:(NSString*)title extMap:(NSDictionary *)extMap;
+ (id)objectWithAssetURL:(NSString*)assetURL title:(NSString*)title extMap:(NSDictionary *)extMap;
- (id)initWithVideoData:(NSData*)videoData title:(NSString*)title extMap:(NSDictionary *)extMap;
+ (id)objectWithVideoData:(NSData*)videoData title:(NSString*)title extMap:(NSDictionary *)extMap;
@end
// QQApiWebImageObject
/** @brief 图片对象
用于分享网络图片内容的对象,是一个指定网络图片url的: 该类型只在2.9.0的h5分享中才支持,
原有的手q分享是不支持该类型的。
*/
@interface QQApiWebImageObject : QQApiObject
@property(nonatomic, retain) NSURL *previewImageURL; ///<预览图像URL
/**
初始化方法
@param previewImageURL 用于预览的图片
@param title 标题
@param description 此对象,分享的描述
*/
- (id)initWithPreviewImageURL:(NSURL*)previewImageURL title:(NSString*)title description:(NSString*)description;
/**
helper方法获取一个autorelease的<code>QQApiWebImageObject</code>对象
@param previewImageURL 用于预览的图片
@param title 标题
@param description 此对象,分享的描述
*/
+ (id)objectWithPreviewImageURL:(NSURL*)previewImageURL title:(NSString*)title description:(NSString*)description;
@end
//QQApiFileObject
/** @brief 本地文件对象(暂只支持分享到手机QQ数据线功能)
用于分享文件内容的对象,是一个指定为文件类型的<code>QQApiExtendObject</code>
*/
@interface QQApiFileObject : QQApiExtendObject
{
NSString* _fileName;
}
@property(nonatomic, retain)NSString* fileName;
@end
// QQApiAudioObject
/** @brief 音频URL对象
用于分享目标内容为音频的URL的对象
*/
@interface QQApiAudioObject : QQApiURLObject
@property (nonatomic, retain) NSURL *flashURL; ///<音频URL地址,最长512个字符
/**
获取一个autorelease的<code>QQApiAudioObject</code>
@param url 音频内容的目标URL
@param title 分享内容的标题
@param description 分享内容的描述
@param data 分享内容的预览图像
@note 如果url为空,调用<code>QQApi#sendMessage:</code>时将返回FALSE
*/
+(id)objectWithURL:(NSURL*)url title:(NSString*)title description:(NSString*)description previewImageData:(NSData*)data;
/**
获取一个autorelease的<code>QQApiAudioObject</code>
@param url 音频内容的目标URL
@param title 分享内容的标题
@param description 分享内容的描述
@param previewURL 分享内容的预览图像URL
@note 如果url为空,调用<code>QQApi#sendMessage:</code>时将返回FALSE
*/
+(id)objectWithURL:(NSURL*)url title:(NSString*)title description:(NSString*)description previewImageURL:(NSURL*)previewURL;
@end
// QQApiVideoObject
/** @brief 视频URL对象
用于分享目标内容为视频的URL的对象
QQApiVideoObject类型的分享,目前在Android和PC QQ上接收消息时,展现有待完善,待手机QQ版本以后更新支持
目前如果要分享视频,推荐使用 QQApiNewsObject 类型
*/
@interface QQApiVideoObject : QQApiURLObject
@property (nonatomic, retain) NSURL *flashURL; ///<视频URL地址,最长512个字符
/**
获取一个autorelease的<code>QQApiVideoObject</code>
@param url 视频内容的目标URL
@param title 分享内容的标题
@param description 分享内容的描述
@param data 分享内容的预览图像
@note 如果url为空,调用<code>QQApi#sendMessage:</code>时将返回FALSE
*/
+(id)objectWithURL:(NSURL*)url title:(NSString*)title description:(NSString*)description previewImageData:(NSData*)data;
/**
获取一个autorelease的<code>QQApiVideoObject</code>
@param url 视频内容的目标URL
@param title 分享内容的标题
@param description 分享内容的描述
@param previewURL 分享内容的预览图像URL
@note 如果url为空,调用<code>QQApi#sendMessage:</code>时将返回FALSE
*/
+(id)objectWithURL:(NSURL*)url title:(NSString*)title description:(NSString*)description previewImageURL:(NSURL*)previewURL;
@end
// QQApiNewsObject
/** @brief 新闻URL对象
用于分享目标内容为新闻的URL的对象
*/
@interface QQApiNewsObject : QQApiURLObject
/**
获取一个autorelease的<code>QQApiNewsObject</code>
@param url 视频内容的目标URL
@param title 分享内容的标题
@param description 分享内容的描述
@param data 分享内容的预览图像
@note 如果url为空,调用<code>QQApi#sendMessage:</code>时将返回FALSE
*/
+(id)objectWithURL:(NSURL*)url title:(NSString*)title description:(NSString*)description previewImageData:(NSData*)data;
/**
获取一个autorelease的<code>QQApiNewsObject</code>
@param url 视频内容的目标URL
@param title 分享内容的标题
@param description 分享内容的描述
@param previewURL 分享内容的预览图像URL
@note 如果url为空,调用<code>QQApi#sendMessage:</code>时将返回FALSE
*/
+(id)objectWithURL:(NSURL*)url title:(NSString*)title description:(NSString*)description previewImageURL:(NSURL*)previewURL;
@end
// QQApiCommonContentObject;
/** @brief 通用模板类型对象
用于分享一个固定显示模板的图文混排对象
@note 图片列表和文本列表不能同时为空
*/
@interface QQApiCommonContentObject : QQApiObject
/**
预定义的界面布局类型
*/
@property(nonatomic,assign) unsigned int layoutType;
@property(nonatomic,assign) NSData* previewImageData;///<预览图
@property(nonatomic,retain) NSArray* textArray;///<文本列表
@property(nonatomic,retain) NSArray* pictureDataArray;///<图片列表
+(id)objectWithLayoutType:(int)layoutType textArray:(NSArray*)textArray pictureArray:(NSArray*)pictureArray previewImageData:(NSData*)data;
/**
将一个NSDictionary对象转化为QQApiCommomContentObject,如果无法转换,则返回空
*/
+(id)objectWithDictionary:(NSDictionary*)dic;
-(NSDictionary*)toDictionary;
@end
// QQApiExtraServiceObject;
/**
@brief OpenSDK扩展支持的服务,通用接口,后续会扩充能力
@param serviceID [必选] 扩展支持的服务类型ID,参考官方文档说明
@param openID [必选] 授权登录后对该用户的唯一标识
@param toUin [可选] 对方的QQ号码
@param extraInfo [可选] 扩展字段
@note 该接口的使用须先登录
*/
@interface QQApiExtraServiceObject : QQApiObject
@property (nonatomic,retain) NSString* serviceID;
@property (nonatomic,retain) NSString* openID;
@property (nonatomic,retain) NSString* toUin;
@property (nonatomic,retain) NSDictionary* extraInfo;
- (id)initWithOpenID:(NSString *)openID serviceID:(NSString *)serviceID;
+ (id)objecWithOpenID:(NSString *)openID serviceID:(NSString *)serviceID;
@end
////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Ad item object definition
////////////////////////////////////////////////////////////////////////////////////////////////////////////
/** @brief 广告数据对象
*/
@interface QQApiAdItem : NSObject
@property(nonatomic,retain) NSString* title; ///<名称
@property(nonatomic,retain) NSString* description;///<描述
@property(nonatomic,retain) NSData* imageData;///<广告图片
@property(nonatomic,retain) NSURL* target;///<广告目标链接
@end
#pragma mark - QQApi请求消息类型
/**
QQApi请求消息类型
*/
typedef NS_ENUM(NSUInteger, QQApiInterfaceReqType) {
EGETMESSAGEFROMQQREQTYPE = 0, ///< 手Q -> 第三方应用,请求第三方应用向手Q发送消息
ESENDMESSAGETOQQREQTYPE = 1, ///< 第三方应用 -> 手Q,第三方应用向手Q分享消息
ESHOWMESSAGEFROMQQREQTYPE = 2, ///< 手Q -> 第三方应用,请求第三方应用展现消息中的数据
ESENDMESSAGEARKTOQQREQTYPE = 3, ///< 第三方应用 -> 手Q,第三方应用向手Q分享Ark消息
ESENDMESSAGE_MINI_TOQQREQTYPE = 4 ///< 第三方应用 -> 手Q,第三方应用向手Q分享小程序消息
};
/**
QQApi应答消息类型
*/
typedef NS_ENUM(NSUInteger, QQApiInterfaceRespType) {
ESHOWMESSAGEFROMQQRESPTYPE = 0, ///< 第三方应用 -> 手Q,第三方应用应答消息展现结果
EGETMESSAGEFROMQQRESPTYPE = 1, ///< 第三方应用 -> 手Q,第三方应用回应发往手Q的消息
ESENDMESSAGETOQQRESPTYPE = 2 ///< 手Q -> 第三方应用,手Q应答处理分享消息的结果
};
/**
QQApi请求消息基类
*/
@interface QQBaseReq : NSObject
/** 请求消息类型,参见\ref QQApiInterfaceReqType */
@property (nonatomic, assign) int type;
@end
/**
QQApi应答消息基类
*/
@interface QQBaseResp : NSObject
/** 请求处理结果 */
@property (nonatomic, copy) NSString* result;
/** 具体错误描述信息 */
@property (nonatomic, copy) NSString* errorDescription;
/** 应答消息类型,参见\ref QQApiInterfaceRespType */
@property (nonatomic, assign) int type;
/** 扩展信息 */
@property (nonatomic, assign) NSString* extendInfo;
@end
/**
GetMessageFromQQReq请求帮助类
*/
@interface GetMessageFromQQReq : QQBaseReq
/**
创建一个GetMessageFromQQReq请求实例
*/
+ (GetMessageFromQQReq *)req;
@end
@interface SendMessageToQQReq : QQBaseReq
/**
创建一个SendMessageToQQReq请求实例
\param message 具体分享消息实例
\return 新创建的SendMessageToQQReq请求实例
*/
+ (SendMessageToQQReq *)reqWithContent:(QQApiObject *)message;
/**
创建一个支持Ark的SendMessageToQQReq请求实例
\param message 具体分享消息实例
\return 新创建的SendMessageToQQReq请求实例
*/
+ (SendMessageToQQReq *)reqWithArkContent:(ArkObject *)message;
/**
* 创建一个支持小程序的消息请求实例
* @param miniMessage 小程序实例对象
* @return 消息请求实例
*/
+(SendMessageToQQReq*) reqWithMiniContent:(QQApiMiniProgramObject *)miniMessage;
/** 具体分享消息 */
@property (nonatomic, retain) QQApiObject *message;
/** 支持Ark的具体分享消息 */
@property (nonatomic, retain) ArkObject *arkMessage;
/** 支持小程序的具体分享消息 */
@property (nonatomic, retain) QQApiMiniProgramObject *miniMessage;
@end
/**
SendMessageToQQResp应答帮助类
*/
@interface SendMessageToQQResp : QQBaseResp
/**
创建一个SendMessageToQQResp应答实例
\param result 请求处理结果
\param errDesp 具体错误描述信息
\param extendInfo 扩展信息
\return 新创建的SendMessageToQQResp应答实例
*/
+ (SendMessageToQQResp *)respWithResult:(NSString *)result errorDescription:(NSString *)errDesp extendInfo:(NSString*)extendInfo;
@end
/**
ShowMessageFromQQReq请求帮助类
*/
@interface ShowMessageFromQQReq : QQBaseReq
/**
创建一个ShowMessageFromQQReq请求实例
\param message 具体待展现消息实例
\return 新创建的ShowMessageFromQQReq请求实例
*/
+ (ShowMessageFromQQReq *)reqWithContent:(QQApiObject *)message;
/** 具体待展现消息 */
@property (nonatomic, retain) QQApiObject *message;
@end
#endif
///
/// \file TencentOAuth.h
/// \brief QQ互联开放平台授权登录及相关开放接口实现类
///
/// Created by Tencent on 12-12-21.
/// Copyright (c) 2012年 Tencent. All rights reserved.
///
#import <UIKit/UIKit.h>
#import "sdkdef.h"
@protocol TencentSessionDelegate;
@protocol TencentLoginDelegate;
@protocol TencentApiInterfaceDelegate;
@protocol TencentWebViewDelegate;
@class TencentApiReq;
@class TencentApiResp;
typedef NS_ENUM(NSUInteger, TencentAuthorizeState) {
kTencentNotAuthorizeState,
kTencentSSOAuthorizeState,
kTencentWebviewAuthorzieState,
};
typedef NS_ENUM(NSUInteger, TencentAuthMode) {
kAuthModeClientSideToken,
kAuthModeServerSideCode,
};
#pragma mark - TencentOAuth(授权登录及相关开放接口调用)
/**
* \brief TencentOpenAPI授权登录及相关开放接口调用
*
* TencentOAuth实现授权登录逻辑以及相关开放接口的请求调用
*/
@interface TencentOAuth : NSObject
{
NSMutableDictionary* _apiRequests;
NSString* _accessToken;
NSDate* _expirationDate;
id<TencentSessionDelegate> _sessionDelegate;
NSString* _localAppId;
NSString* _openId;
NSString* _redirectURI;
NSArray* _permissions;
}
/** Access Token凭证,用于后续访问各开放接口 */
@property(nonatomic, copy) NSString* accessToken;
/** Access Token的失效期 */
@property(nonatomic, copy) NSDate* expirationDate;
/** 已实现的开放接口的回调委托对象 */
@property(nonatomic, assign) id<TencentSessionDelegate> sessionDelegate;
/** 第三方应用在开发过程中设置的URLSchema,用于浏览器登录后后跳到第三方应用 */
@property(nonatomic, copy) NSString* localAppId;
/** 用户授权登录后对该用户的唯一标识 */
@property(nonatomic, copy) NSString* openId;
/** 用户登录成功过后的跳转页面地址 */
@property(nonatomic, copy) NSString* redirectURI;
/** 第三方应用在互联开放平台申请的appID */
@property(nonatomic, retain) NSString* appId;
/** 第三方应用在互联开放平台注册的UniversalLink */
@property(nonatomic, retain) NSString* universalLink;
/** 主要是互娱的游戏设置uin */
@property(nonatomic, retain) NSString* uin;
/** 主要是互娱的游戏设置鉴定票据 */
@property(nonatomic, retain) NSString* skey;
/** 登陆透传的数据 */
@property(nonatomic, copy) NSDictionary* passData;
/** 授权方式(Client Side Token或者Server Side Code) */
@property(nonatomic, assign) TencentAuthMode authMode;
/** union id */
@property(nonatomic, retain) NSString* unionid;
/** 第三方在授权登录/分享 时选择 QQ,还是TIM 。在授权前一定要指定其中一个类型*/
@property(nonatomic, assign) TencentAuthShareType authShareType;
/**
* 获取上次登录得到的token
*
**/
- (NSString *)getCachedToken;
/**
* 获取上次登录得到的openid
*
**/
- (NSString *)getCachedOpenID;
/**
* 获取上次登录的token过期日期
*
**/
- (NSDate *)getCachedExpirationDate;
/**
* 上次登录的token是否过期(本地判断)
**/
- (BOOL)isCachedTokenValid;
/**
* 删除上次登录登录的token信息
*
**/
- (BOOL)deleteCachedToken;
/**
* 用来获得当前sdk的版本号
* \return 返回sdk版本号
**/
+ (NSString*)sdkVersion;
/**
* 用来获得当前sdk的小版本号
* \return 返回sdk小版本号
**/
+ (NSString*)sdkSubVersion;
/**
* 用来获得当前sdk的是否精简版
* \return 返回YES表示精简版
**/
+ (BOOL)isLiteSDK;
/**
* 主要是用来帮助判断是否有登陆被发起,但是还没有过返回结果
* \return
* kTencentNotAuthorizeState:无授权
* kTencentSSOAuthorizeState:有人发起了sso授权但无返回
* kTencentWebviewAuthorzieState:有人发起了webview授权还未返回
**/
+ (TencentAuthorizeState *)authorizeState;
/**
* 用来获得当前手机qq的版本号
* \return 返回手机qq版本号
**/
+ (int)iphoneQQVersion __attribute__((deprecated("已过期, 建议删除调用")));
/**
* 用来获得当前手机TIM的版本号
* \return 返回手机qq版本号
**/
+ (int)iphoneTIMVersion __attribute__((deprecated("已过期, 建议删除调用")));
/**
* 初始化TencentOAuth对象
* \param appId 第三方应用在互联开放平台申请的唯一标识
* \param delegate 第三方应用用于接收请求返回结果的委托对象
* \return 初始化后的授权登录对象
*/
- (id)initWithAppId:(NSString *)appId
andDelegate:(id<TencentSessionDelegate>)delegate;
/**
* 初始化TencentOAuth对象(>=3.3.7)
* \param appId 第三方应用在互联开放平台申请的唯一标识
* \param universalLink 第三方应用在互联开放平台注册的universallink,和bundleID一一对应
* \param delegate 第三方应用用于接收请求返回结果的委托对象
* \return 初始化后的授权登录对象
*/
- (id)initWithAppId:(NSString *)appId
andUniversalLink:(NSString *)universalLink
andDelegate:(id<TencentSessionDelegate>)delegate;
/**
* 判断用户手机上是否安装手机QQ
* \return YES:安装 NO:没安装
*
* \note SDK目前已经支持QQ、TIM授权登录及分享功能, 会按照QQ>TIM的顺序进行调用。
* 只要用户安装了QQ、TIM中任意一个应用,都可为第三方应用进行授权登录、分享功能。
* 第三方应用在接入SDK时不需要判断是否安装QQ、TIM。若有判断安装QQ、TIM的逻辑建议移除。
*/
+ (BOOL)iphoneQQInstalled;
/**
* 判断用户手机上是否安装手机TIM
* \return YES:安装 NO:没安装
*
* \note SDK目前已经支持QQ、TIM授权登录及分享功能, 会按照QQ>TIM的顺序进行调用。
* 只要用户安装了QQ、TIM中任意一个应用,都可为第三方应用进行授权登录、分享功能。
* 第三方应用在接入SDK时不需要判断是否安装QQ、TIM。若有判断安装QQ、TIM的逻辑建议移除。
*/
+ (BOOL)iphoneTIMInstalled;
/**
* 判断用户手机上的手机QQ是否支持SSO登录
* \return YES:支持 NO:不支持
*/
+ (BOOL)iphoneQQSupportSSOLogin __attribute__((deprecated("QQ版本均支持SSO登录。该接口已过期, 建议删除调用")));
/**
* 判断用户手机上的手机TIM是否支持SSO登录
* \return YES:支持 NO:不支持
*/
+ (BOOL)iphoneTIMSupportSSOLogin __attribute__((deprecated("TIM版本均支持SSO登录。该接口已过期, 建议删除调用")));
/**
* 登录授权
*
* \param permissions 授权信息列
*/
- (BOOL)authorize:(NSArray *)permissions;
/**
* 登录授权
* \param permissions 授权信息列表
* \param bInSafari 是否使用safari进行登录.<b>IOS SDK 1.3版本开始此参数废除</b>
*/
- (BOOL)authorize:(NSArray *)permissions
inSafari:(BOOL)bInSafari;
/**
* 登录授权
* \param permissions 授权信息列表
* \param localAppId 应用APPID
* \param bInSafari 是否使用safari进行登录.<b>IOS SDK 1.3版本开始此参数废除</b>
*/
- (BOOL)authorize:(NSArray *)permissions
localAppId:(NSString *)localAppId
inSafari:(BOOL)bInSafari;
/**
* 登录授权<web为二维码扫码方式>
*
* \param permissions 授权信息列
*/
- (BOOL)authorizeWithQRlogin:(NSArray *)permissions;
/**
* 增量授权,因用户没有授予相应接口调用的权限,需要用户确认是否授权
* \param permissions 需增量授权的信息列表
* \return 增量授权调用是否成功
*/
- (BOOL)incrAuthWithPermissions:(NSArray *)permissions;
/**
* 重新授权,因token废除或失效导致接口调用失败,需用户重新授权
* \param permissions 授权信息列表,同登录授权
* \return 授权调用是否成功
*/
- (BOOL)reauthorizeWithPermissions:(NSArray *)permissions;
/**
* 获取UnindID,可以根据UnindID的比较来确定OpenID是否属于同一个用户
* \return NO未登录,信息不足;YES条件满足,发送请求成功,请等待回调
*/
- (BOOL)RequestUnionId;
/**
* (静态方法)处理应用拉起协议
* \param url 处理被其他应用呼起时的逻辑
* \return 处理结果,YES表示成功,NO表示失败
*/
+ (BOOL)HandleOpenURL:(NSURL *)url;
/**
* (静态方法)sdk是否可以处理应用拉起协议
* \param url 处理被其他应用呼起时的逻辑
* \return 处理结果,YES表示可以 NO表示不行
*/
+ (BOOL)CanHandleOpenURL:(NSURL *)url;
/**
* (静态方法)处理应用的UniversalLink拉起协议
* \param url 处理被其他应用呼起时的逻辑
* \return 处理结果,YES表示成功,NO表示失败
*/
+ (BOOL)HandleUniversalLink:(NSURL *)url;
/**
* (静态方法)sdk是否可以处理应用的Universallink拉起协议
* \param url 处理被其他应用呼起时的逻辑(应用的Universallink链接须满足官网注册时的格式要求)
* \return 处理结果,YES表示可以 NO表示不行
* 注:在调用其他Universallink相关处理接口之前,均需进行此项判断
*/
+ (BOOL)CanHandleUniversalLink:(NSURL *)url;
/**
* (静态方法)获取TencentOAuth调用的上一次错误信息
*/
+ (NSString *)getLastErrorMsg;
/**
* 以Server Side Code模式授权登录时,通过此接口获取返回的code值;
* 以Client Side Token模式授权登录时,忽略此接口。
*/
- (NSString *)getServerSideCode;
/**
* 退出登录(退出登录后,TecentOAuth失效,需要重新初始化)
* \param delegate 第三方应用用于接收请求返回结果的委托对象
*/
- (void)logout:(id<TencentSessionDelegate>)delegate;
/**
* 判断登录态是否有效
* \return 处理结果,YES表示有效,NO表示无效,请用户重新登录授权
*/
- (BOOL)isSessionValid;
/**
* 获取用户个人信息
* \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录
*/
- (BOOL)getUserInfo;
/**
* 退出指定API调用
* \param userData 用户调用某条API的时候传入的保留参数
* \return 处理结果,YES表示成功 NO表示失败
*/
- (BOOL)cancel:(id)userData;
/**
* CGI类任务创建接口
* \param apiURL CGI请求的URL地址
* \param method CGI请求方式:"GET","POST"
* \param params CGI请求参数字典
* \param callback CGI请求结果的回调接口对象
* \return CGI请求任务实例,用于取消任务,返回nil代表任务创建失败
*/
- (TCAPIRequest *)cgiRequestWithURL:(NSURL *)apiURL method:(NSString *)method params:(NSDictionary *)params callback:(id<TCAPIRequestDelegate>)callback;
/**
* TencentOpenApi发送任务统一接口
* \param request 请求发送的任务
* \param callback 任务发送后的回调地址
*/
- (BOOL)sendAPIRequest:(TCAPIRequest *)request callback:(id<TCAPIRequestDelegate>)callback;
- (NSString *)getUserOpenID;
@end
#pragma mark - TencentLoginDelegate(授权登录回调协议)
/**
* \brief TencentLoginDelegate iOS Open SDK 1.3 API回调协议
*
* 第三方应用实现登录的回调协议
*/
@protocol TencentLoginDelegate <NSObject>
@required
/**
* 登录成功后的回调
*/
- (void)tencentDidLogin;
/**
* 登录失败后的回调
* \param cancelled 代表用户是否主动退出登录
*/
- (void)tencentDidNotLogin:(BOOL)cancelled;
/**
* 登录时网络有问题的回调
*/
- (void)tencentDidNotNetWork;
@optional
/**
* 登录时权限信息的获得
*/
- (NSArray *)getAuthorizedPermissions:(NSArray *)permissions withExtraParams:(NSDictionary *)extraParams;
/**
* unionID获得
*/
- (void)didGetUnionID;
/**
* 强制网页登录,包括账号密码登录和二维码登录
* return YES时,就算本地有手Q也会打开web界面
*/
- (BOOL)forceWebLogin;
@end
#pragma mark - TencentSessionDelegate(开放接口回调协议)
/**
* \brief TencentSessionDelegate iOS Open SDK 1.3 API回调协议
*
* 第三方应用需要实现每条需要调用的API的回调协议
*/
@protocol TencentSessionDelegate<NSObject, TencentLoginDelegate,
TencentWebViewDelegate>
@optional
/**
* 退出登录的回调
*/
- (void)tencentDidLogout;
/**
* 因用户未授予相应权限而需要执行增量授权。在用户调用某个api接口时,如果服务器返回操作未被授权,则触发该回调协议接口,由第三方决定是否跳转到增量授权页面,让用户重新授权。
* \param tencentOAuth 登录授权对象。
* \param permissions 需增量授权的权限列表。
* \return 是否仍然回调返回原始的api请求结果。
* \note 不实现该协议接口则默认为不开启增量授权流程。若需要增量授权请调用\ref TencentOAuth#incrAuthWithPermissions: \n注意:增量授权时用户可能会修改登录的帐号
*/
- (BOOL)tencentNeedPerformIncrAuth:(TencentOAuth *)tencentOAuth withPermissions:(NSArray *)permissions;
/**
* [该逻辑未实现]因token失效而需要执行重新登录授权。在用户调用某个api接口时,如果服务器返回token失效,则触发该回调协议接口,由第三方决定是否跳转到登录授权页面,让用户重新授权。
* \param tencentOAuth 登录授权对象。
* \return 是否仍然回调返回原始的api请求结果。
* \note 不实现该协议接口则默认为不开启重新登录授权流程。若需要重新登录授权请调用\ref TencentOAuth#reauthorizeWithPermissions: \n注意:重新登录授权时用户可能会修改登录的帐号
*/
- (BOOL)tencentNeedPerformReAuth:(TencentOAuth *)tencentOAuth;
/**
* 用户通过增量授权流程重新授权登录,token及有效期限等信息已被更新。
* \param tencentOAuth token及有效期限等信息更新后的授权实例对象
* \note 第三方应用需更新已保存的token及有效期限等信息。
*/
- (void)tencentDidUpdate:(TencentOAuth *)tencentOAuth;
/**
* 用户增量授权过程中因取消或网络问题导致授权失败
* \param reason 授权失败原因,具体失败原因参见sdkdef.h文件中\ref UpdateFailType
*/
- (void)tencentFailedUpdate:(UpdateFailType)reason;
/**
* 获取用户个人信息回调
* \param response API返回结果,具体定义参见sdkdef.h文件中\ref APIResponse
* \remarks 正确返回示例: \snippet example/getUserInfoResponse.exp success
* 错误返回示例: \snippet example/getUserInfoResponse.exp fail
*/
- (void)getUserInfoResponse:(APIResponse*) response;
/**
* 社交API统一回调接口
* \param response API返回结果,具体定义参见sdkdef.h文件中\ref APIResponse
* \param message 响应的消息,目前支持‘SendStory’,‘AppInvitation’,‘AppChallenge’,‘AppGiftRequest’
*/
- (void)responseDidReceived:(APIResponse*)response forMessage:(NSString *)message;
/**
* post请求的上传进度
* \param tencentOAuth 返回回调的tencentOAuth对象
* \param bytesWritten 本次回调上传的数据字节数
* \param totalBytesWritten 总共已经上传的字节数
* \param totalBytesExpectedToWrite 总共需要上传的字节数
* \param userData 用户自定义数据
*/
- (void)tencentOAuth:(TencentOAuth *)tencentOAuth didSendBodyData:(NSInteger)bytesWritten totalBytesWritten:(NSInteger)totalBytesWritten totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite userData:(id)userData;
/**
* 通知第三方界面需要被关闭
* \param tencentOAuth 返回回调的tencentOAuth对象
* \param viewController 需要关闭的viewController
*/
- (void)tencentOAuth:(TencentOAuth *)tencentOAuth doCloseViewController:(UIViewController *)viewController;
@end
#pragma mark - TencentWebViewDelegate(H5登录webview旋转方向回调)
/**
* \brief TencentWebViewDelegate: H5登录webview旋转方向回调协议
*
* 第三方应用可以根据自己APP的旋转方向限制,通过此协议设置
*/
@protocol TencentWebViewDelegate <NSObject>
@optional
- (BOOL) tencentWebViewShouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation;
- (NSUInteger) tencentWebViewSupportedInterfaceOrientationsWithWebkit;
- (BOOL) tencentWebViewShouldAutorotateWithWebkit;
@end
///
/// \file sdkdef.h
/// \brief SDK中相关常量定义
///
/// Created by Tencent on 12-12-25.
/// Copyright (c) 2012年 Tencent. All rights reserved.
///
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
/**
* \brief 设置sdk的log等级
*/
typedef enum {
TCOLogLevel_Disabled = -1, // 关闭所有log
TCOLogLevel_Error = 0,
TCOLogLevel_Warning,
TCOLogLevel_Info,
TCOLogLevel_Debug,
} TCOLogLevel;
/**
* \breif 授权/分享 方式
*/
typedef enum TencentAuthShareType {
AuthShareType_QQ,
AuthShareType_TIM,
}TencentAuthShareType;
/**
* \brief APIResponse.retCode可能的枚举常量
*/
typedef enum
{
URLREQUEST_SUCCEED = 0, /**< 网络请求成功发送至服务器,并且服务器返回数据格式正确
* \note 这里包括所请求业务操作失败的情况,例如没有授权等原因导致
*/
URLREQUEST_FAILED = 1, /**< 网络异常,或服务器返回的数据格式不正确导致无法解析 */
} REPONSE_RESULT;
/**
* \brief 增量授权失败原因
*
* \note 增量授权失败不影响原token的有效性(原token已失效的情况除外)
*/
typedef enum
{
kUpdateFailUnknown = 1, ///< 未知原因
kUpdateFailUserCancel, ///< 用户取消
kUpdateFailNetwork, ///< 网络问题
} UpdateFailType;
/**
* \brief 封装服务器返回的结果
*
* APIResponse用于封装所有请求的返回结果,包括错误码、错误信息、原始返回数据以及返回数据的json格式字典
*/
@interface APIResponse : NSObject<NSCoding> {
int _detailRetCode;
int _retCode;
int _seq;
NSString *_errorMsg;
NSDictionary *_jsonResponse;
NSString *_message;
id _userData;
}
/**
* 新增的详细错误码\n
* detailRetCode主要用于区分不同的错误情况,参见\ref OpenSDKError
*/
@property (nonatomic, assign) int detailRetCode;
/**
* 网络请求是否成功送达服务器,以及服务器返回的数据格式是否正确\n
* retCode具体取值可参考\ref REPONSE_RESULT
*/
@property (nonatomic, assign) int retCode;
/**
* 网络请求对应的递增序列号,方便内部管理
*/
@property (nonatomic, assign) int seq;
/**
* 错误提示语
*/
@property (nonatomic, retain) NSString *errorMsg;
/**
* 服务器返回数据的json格式字典\n
* 字典内具体参数的命名和含义请参考\ref api_spec
*/
@property (nonatomic, retain) NSDictionary *jsonResponse;
/**
* 服务器返回的原始数据字符串
*/
@property (nonatomic, retain) NSString *message;
/**
* 用户保留数据
*/
@property (nonatomic, retain) id userData;
@end
/**
* 用户自定义的保留字段
*/
FOUNDATION_EXTERN NSString * const PARAM_USER_DATA;
/**
* \name 应用邀请参数字段定义
*/
///@{
/** 应用邀请展示图片url的key */
FOUNDATION_EXTERN NSString * const PARAM_APP_ICON;
/** 应用邀请描述文本的key */
FOUNDATION_EXTERN NSString * const PARAM_APP_DESC;
/** 应用邀请好友列表的key */
FOUNDATION_EXTERN NSString * const PARAM_APP_INVITED_OPENIDS;
///@}
/**
* \name sendStory新分享参数字段定义
*/
///@{
/** 预填入接受人列表的key */
FOUNDATION_EXTERN NSString * const PARAM_SENDSTORY_RECEIVER;
/** 分享feeds标题的key */
FOUNDATION_EXTERN NSString * const PARAM_SENDSTORY_TITLE;
/** 分享feeds评论内容的key */
FOUNDATION_EXTERN NSString * const PARAM_SENDSTORY_COMMENT;
/** 分享feeds摘要的key */
FOUNDATION_EXTERN NSString * const PARAM_SENDSTORY_SUMMARY;
/** 分享feeds展示图片url的key */
FOUNDATION_EXTERN NSString * const PARAM_SENDSTORY_IMAGE;
/** 分享feeds跳转链接url的key */
FOUNDATION_EXTERN NSString * const PARAM_SENDSTORY_URL;
/** 分享feeds点击操作默认行为的key */
FOUNDATION_EXTERN NSString * const PARAM_SENDSTORY_ACT;
///@}
/**
* \name 设置头像参数字段定义
*/
///@{
/** 头像图片数据的key */
FOUNDATION_EXTERN NSString * const PARAM_SETUSERHEAD_PIC;
/** 头像图片文件名的key */
FOUNDATION_EXTERN NSString * const PARAM_SETUSERHEAD_FILENAME;
///@}
/**
* \name 服务器返回数据的参数字段定义
*/
///@{
/** 服务器返回码的key */
FOUNDATION_EXTERN NSString * const PARAM_RETCODE;
/** 服务器返回错误信息的key */
FOUNDATION_EXTERN NSString * const PARAM_MESSAGE;
/** 服务器返回额外数据的key */
FOUNDATION_EXTERN NSString * const PARAM_DATA;
///@}
/**
* \name 错误信息相关常量定义
*/
///@{
/** 详细错误信息字典中额外信息的key */
FOUNDATION_EXTERN NSString * const TCOpenSDKErrorKeyExtraInfo;
/** 详细错误信息字典中返回码的key */
FOUNDATION_EXTERN NSString * const TCOpenSDKErrorKeyRetCode;
/** 详细错误信息字典中错误语句的key */
FOUNDATION_EXTERN NSString * const TCOpenSDKErrorKeyMsg;
/** 不支持的接口 */
FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgUnsupportedAPI;
/** 操作成功 */
FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgSuccess;
/** 未知错误 */
FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgUnknown;
/** 用户取消 */
FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgUserCancel;
/** 请重新登录 */
FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgReLogin;
/** 应用没有操作权限 */
FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgOperationDeny;
/** 网络异常或没有网络 */
FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgNetwork;
/** URL格式或协议错误 */
FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgURL;
/** 解析数据出错 */
FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgDataParse;
/** 传入参数有误 */
FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgParam;
/** 连接超时 */
FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgTimeout;
/** 安全问题 */
FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgSecurity;
/** 文件读写错误 */
FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgIO;
/** 服务器端错误 */
FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgServer;
/** 页面错误 */
FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgWebPage;
/** 设置头像图片过大 */
FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgUserHeadPicLarge;
///@}
/**
* \brief SDK新增详细错误常量
*/
typedef enum
{
kOpenSDKInvalid = -1, ///< 无效的错误码
kOpenSDKErrorUnsupportedAPI = -2, ///< 不支持的接口
/**
* \name CommonErrorCode
* 公共错误码
*/
///@{
kOpenSDKErrorSuccess = 0, ///< 成功
kOpenSDKErrorUnknown, ///< 未知错误
kOpenSDKErrorUserCancel, ///< 用户取消
kOpenSDKErrorReLogin, ///< token无效或用户未授权相应权限需要重新登录
kOpenSDKErrorOperationDeny, ///< 第三方应用没有该api操作的权限
///@}
/**
* \name NetworkRelatedErrorCode
* 网络相关错误码
*/
///@{
kOpenSDKErrorNetwork, ///< 网络错误,网络不通或连接不到服务器
kOpenSDKErrorURL, ///< URL格式或协议错误
kOpenSDKErrorDataParse, ///< 数据解析错误,服务器返回的数据解析出错
kOpenSDKErrorParam, ///< 传入参数错误
kOpenSDKErrorConnTimeout, ///< http连接超时
kOpenSDKErrorSecurity, ///< 安全问题
kOpenSDKErrorIO, ///< 下载和文件IO错误
kOpenSDKErrorServer, ///< 服务器端错误
///@}
/**
* \name WebViewRelatedError
* webview特有错误
*/
///@{
kOpenSDKErrorWebPage, ///< 页面错误
///@}
/**
* \name SetUserHeadRelatedErrorCode
* 设置头像自定义错误码段
*/
///@{
kOpenSDKErrorUserHeadPicLarge = 0x010000, ///< 图片过大 设置头像自定义错误码
///@}
} OpenSDKError;
/**
* \name SDK版本(v1.3)支持的授权列表常量
*/
///@{
/** 发表一条说说到QQ空间(<b>需要申请权限</b>) */
FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_ADD_TOPIC;
/** 创建一个QQ空间相册(<b>需要申请权限</b>) */
FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_ADD_ALBUM;
/** 上传一张照片到QQ空间相册(<b>需要申请权限</b>) */
FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_UPLOAD_PIC;
/** 获取用户QQ空间相册列表(<b>需要申请权限</b>) */
FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_LIST_ALBUM;
/** 验证是否认证空间粉丝 */
FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_CHECK_PAGE_FANS;
/** 获取登录用户自己的详细信息 */
FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_INFO;
/** 获取其他用户的详细信息 */
FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_OTHER_INFO;
/** 获取会员用户基本信息 */
FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_VIP_INFO;
/** 获取会员用户详细信息 */
FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_VIP_RICH_INFO;
/** 获取用户信息 */
FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_USER_INFO;
/** 移动端获取用户信息 */
FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_SIMPLE_USER_INFO;
///@}
/**
* \name CGI接口相关参数类型定义
*/
/** 必填的字符串类型参数 */
typedef NSString *TCRequiredStr;
/** 必填的UIImage类型参数 */
typedef UIImage *TCRequiredImage;
/** 必填的整型参数 */
typedef NSInteger TCRequiredInt;
/** 必填的数字类型 */
typedef NSNumber *TCRequiredNumber;
/** 必填的NSData参数 */
typedef NSData *TCRequiredData;
/** 可选的字符串类型参数 */
typedef NSString *TCOptionalStr;
/** 可选的UIImage类型参数 */
typedef UIImage *TCOptionalImage;
/** 可选的整型参数 */
typedef NSInteger TCOptionalInt;
/** 可选的数字类型 */
typedef NSNumber *TCOptionalNumber;
/** 可选的不定类型参数 */
typedef id TCRequiredId;
///@}
/**
* \brief CGI请求的参数字典封装辅助基类
*
* 将相应属性的值以key-value的形式保存到参数字典中
*/
@interface TCAPIRequest : NSMutableDictionary
/** CGI请求的URL地址 */
@property (nonatomic, readonly) NSURL *apiURL;
/** CGI请求方式:"GET","POST" */
@property (nonatomic, readonly) NSString *method;
/**
* API参数中的保留字段,可以塞入任意字典支持的类型,再调用完成后会带回给调用方
*/
@property (nonatomic, retain) TCRequiredId paramUserData;
/**
* APIResponse,API的返回结果
*/
@property (nonatomic, readonly) APIResponse *response;
/** 取消相应的CGI请求任务 */
- (void)cancel;
@end
@protocol TCAPIRequestDelegate <NSObject>
@optional
- (void)cgiRequest:(TCAPIRequest *)request didResponse:(APIResponse *)response;
@end
//
// GMPopupBgView.h
// Gengmei
//
// Created by wangyang on 2018/3/2.
// Copyright © 2018年 更美互动信息科技有限公司. All rights reserved.
//
#import <GMKit/GMKit-umbrella.h>
@protocol GMPopupBgViewDelegate <NSObject>
@optional
- (void)popupBgViewDidDismiss;
- (void)didCompletedAnimation;
@end
typedef NS_ENUM(NSUInteger, GMPopupAnimationType) {
GMPopupAnimationTypeNone = 0,
GMPopupAnimationTypeFade,
// 从底部滑出(默认)
GMPopupAnimationTypeFlipFromBottom,
// 从中心立即显示并做弹簧动画
GMPopupAnimationTypeSpringScaleFromCenter,
// 自定义
GMPopupAnimationTypeCustom = 100,
};
/**
所有使用半透明背景的popView,都使用该Class作为父类
*/
@interface GMPopupBgView : GMView<UIGestureRecognizerDelegate>
// 半透明背景颜色。默认是[UIColor colorWithWhite:0 alpha:0.6]
@property (nonatomic, strong) UIColor *bgAlphaColor;
@property (nonatomic, weak) id<GMPopupBgViewDelegate> delegate;
/**
container的背景颜色,位置(坐标或者约束)是可以自定义的。
container的大小可以使用约束自动计算,也可以显示的设置size
*/
@property (nonatomic, strong) UIView *container;
/**
点击空白区域不隐藏视图
*/
@property (nonatomic, assign) BOOL disableCancelTouch;
/**
使用 GMPopupAnimationTypeCustom 时,可以自定义container的动画。默认为 GMPopupAnimationTypeFlipFromBottom
自定义动画必须在 containerShowAnimation 与 containerHideAnimation 中实现
*/
@property (nonatomic, assign) GMPopupAnimationType animationType;
// 默认是0.3秒
@property (nonatomic, assign) CGFloat animationDuration;
@property (nonatomic, copy) void (^containerShowAnimation) (GMPopupBgView *bgView, CGFloat duration);
@property (nonatomic, copy) void (^containerHideAnimation) (GMPopupBgView *bgView, CGFloat duration);
/**
点击半透明背景会触发该方法隐藏,执行隐藏动画,然后removeFromSuperview。
注意:不会调用delegate.popupBgViewDidDismiss()
*/
- (void)hide;
- (void)didTapView;
@end
//
// GMPopupBgView.m
// Gengmei
//
// Created by wangyang on 2018/3/2.
// Copyright © 2018年 更美互动信息科技有限公司. All rights reserved.
//
#import "GMPopupBgView.h"
@interface GMPopupBgView () <UIGestureRecognizerDelegate>
@end
@implementation GMPopupBgView
- (void)setup {
[super setup];
self.frame = CGRectMake(0, 0, MAINSCREEN_WIDTH, MAINSCREEN_HEIGHT);
self.animationDuration = 0.3;
self.animationType = GMPopupAnimationTypeFlipFromBottom;
self.bgAlphaColor = [UIColor colorWithWhite:0 alpha:0.6];
self.backgroundColor = [UIColor colorWithWhite:0 alpha:0];
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didTapView)];
tap.delegate = self;
[self addGestureRecognizer:tap];
tap.delegate = self;
self.userInteractionEnabled = YES;
_container = [[UIView alloc] initWithFrame:CGRectMake(0, MAINSCREEN_HEIGHT, MAINSCREEN_WIDTH, 322)];
_container.backgroundColor = [UIColor whiteColor];
[self addSubview:_container];
}
- (void)didTapView {
[self hide];
if ([self.delegate respondsToSelector:@selector(popupBgViewDidDismiss)]) {
[self.delegate popupBgViewDidDismiss];
}
}
- (void)willMoveToSuperview:(UIView *)newSuperview {
if (newSuperview == nil) {
return;
}
switch (self.animationType) {
case GMPopupAnimationTypeNone: {
self.backgroundColor = self.bgAlphaColor;
break;
}
case GMPopupAnimationTypeFade: {
self.backgroundColor = self.bgAlphaColor;
self.container.alpha = 0;
[self animation:^{
self.container.alpha = 1;
}];
break;
}
case GMPopupAnimationTypeFlipFromBottom: {
[self animation:^{
self.container.bottom = MAINSCREEN_HEIGHT;
self.backgroundColor = self.bgAlphaColor;
}];
break;
}
case GMPopupAnimationTypeSpringScaleFromCenter: {
[self animation:^{
self.backgroundColor = self.bgAlphaColor;
}];
self.container.transform = CGAffineTransformMakeScale(0.7, 0.7);
[UIView animateWithDuration:self.animationDuration delay:0 usingSpringWithDamping:0.3 initialSpringVelocity:0 options:0 animations:^{
// 放大
self.container.transform = CGAffineTransformMakeScale(1, 1);
} completion:nil];
break;
}
case GMPopupAnimationTypeCustom: {
[self animation:^{
self.backgroundColor = self.bgAlphaColor;
}];
self.containerShowAnimation(self, self.animationDuration);
break;
}
default:
break;
}
}
- (void)hide {
[UIView animateWithDuration:self.animationDuration animations:^{
self.backgroundColor = [UIColor colorWithWhite:0 alpha:0];
} completion:^(BOOL finished) {
[self removeFromSuperview];
}];
switch (self.animationType) {
case GMPopupAnimationTypeNone:
case GMPopupAnimationTypeFade: {
[self animation:^{
self.container.alpha = 0;
}];
break;
}
case GMPopupAnimationTypeFlipFromBottom: {
[self animation:^{
self.container.top = MAINSCREEN_HEIGHT;
}];
break;
}
case GMPopupAnimationTypeSpringScaleFromCenter: {
[self animation:^{
self.container.alpha = 0;
}];
break;
}
case GMPopupAnimationTypeCustom: {
self.containerHideAnimation(self, self.animationDuration);
break;
}
default:
break;
}
}
- (void)animation:(void (^)(void))block {
[UIView animateWithDuration:self.animationDuration animations:^{
block();
} completion:^(BOOL finished) {
if ([self.delegate respondsToSelector:@selector(didCompletedAnimation)]) {
[self.delegate didCompletedAnimation];
}
}];
}
- (BOOL)gestureRecognizer:(UIGestureRecognizer*)gestureRecognizer shouldReceiveTouch:(UITouch*)touch {
// 如果点击了container区域, 不需要响应手势
if (CGRectContainsPoint(self.container.frame, [touch locationInView:self])) {
return NO;
} else if (self.disableCancelTouch) {
return NO;
} else {
return YES;
}
}
@end
//
// GMSafeValue.h
// Gengmei
//
// Created by wangyang on 2017/1/17.
// Copyright © 2017年 更美互动信息科技有限公司. All rights reserved.
//
#import <Foundation/Foundation.h>
#define SafeValue(someValue) [GMSafeValue safeValue:someValue]
#define SafeString(str) [GMSafeValue safeString:str]
#define SafeNumber(num) [GMSafeValue safeNumber:num]
#define NullableString(str) [GMSafeValue nullableString:str]
#define NullableNumber(num) [GMSafeValue nullableNumber:num]
NS_ASSUME_NONNULL_BEGIN
@interface GMSafeValue : NSObject
+ (nonnull id)safeValue:(id)object;
/*手动从字典中解析string或者number时使用下面4个方法*/
+ (nonnull NSString *)safeString:(id)str;
+ (nonnull NSNumber *)safeNumber:(id)num;
+ (nullable NSString *)nullableString:(id)str;
+ (nullable NSNumber *)nullableNumber:(id)num;
@end
NS_ASSUME_NONNULL_END
//
// GMSafeValue.m
// Gengmei
//
// Created by wangyang on 2017/3/23.
// Copyright © 2017年 更美互动信息科技有限公司. All rights reserved.
//
#import "GMSafeValue.h"
@implementation GMSafeValue
+ (id)safeValue:(id)object {
return object ?: [NSNull null];
}
+ (NSString *)safeString:(id)str {
if ([str isKindOfClass:[NSNumber class]]) {
return ((NSNumber *)str).stringValue;
}
return str ?: @"";
}
+ (NSNumber *)safeNumber:(id)num {
if ([num isKindOfClass:[NSString class]]) {
return @(((NSString *)num).integerValue);
}
return num ?: @0;
}
+ (nullable NSString *)nullableString:(id)str {
if ([str isKindOfClass:[NSNumber class]]) {
return ((NSNumber *)str).stringValue;
}
return str ?: nil;
}
+ (nullable NSNumber *)nullableNumber:(id)num {
if ([num isKindOfClass:[NSString class]]) {
return @(((NSString *)num).integerValue);
}
return num ?: nil;
}
@end
//
// UIImage+Compress.h
// Gengmei
//
// Created by 朱璇 on 2018/11/15.
// Copyright © 2018年 更美互动信息科技有限公司. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface UIImage (Compress)
// 将图片按指定大小压缩
+ (NSData *)compressImage:(UIImage *)image toByte:(NSUInteger)maxLength size:(CGSize)size;
@end
//
// UIImage+Compress.m
// Gengmei
//
// Created by 朱璇 on 2018/11/15.
// Copyright © 2018年 更美互动信息科技有限公司. All rights reserved.
//
#import "UIImage+Compress.h"
@implementation UIImage (Compress)
+ (NSData *)compressImage:(UIImage *)image toByte:(NSUInteger)maxLength size:(CGSize)size {
// Compress by quality
CGFloat compression = 1;
NSData *data = UIImageJPEGRepresentation(image, compression);
if (data.length < maxLength) return data;
CGFloat max = 1;
CGFloat min = 0;
for (int i = 0; i < 6; ++i) {
compression = (max + min) / 2;
data = UIImageJPEGRepresentation(image, compression);
if (data.length < maxLength * 0.9) {
min = compression;
} else if (data.length > maxLength) {
max = compression;
} else {
break;
}
}
if (data.length < maxLength) return data;
UIImage *resultImage = [UIImage imageWithData:data];
// Compress by size
NSUInteger lastDataLength = 0;
while (data.length > maxLength && data.length != lastDataLength) {
lastDataLength = data.length;
CGFloat ratio = (CGFloat)maxLength / data.length;
CGSize size = CGSizeMake((NSUInteger)(resultImage.size.width * sqrtf(ratio)),
(NSUInteger)(resultImage.size.height * sqrtf(ratio)));
UIGraphicsBeginImageContext(size);
[resultImage drawInRect:CGRectMake(0, 0, size.width, size.height)];
resultImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
data = UIImageJPEGRepresentation(resultImage, compression);
}
return data;
}
@end
//
// UIView+SafeArea.h
// Gengmei
//
// Created by wangyang on 2018/6/19.
// Copyright © 2018年 更美互动信息科技有限公司. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface UIView (SafeArea)
@property (nonatomic, readonly, class) CGFloat safeAreaInsetsBottom;
@end
//
// UIView+SafeArea.m
// Gengmei
//
// Created by wangyang on 2018/6/19.
// Copyright © 2018年 更美互动信息科技有限公司. All rights reserved.
//
#import "UIView+SafeArea.h"
@implementation UIView (SafeArea)
+ (CGFloat)safeAreaInsetsBottom {
if (@available(iOS 11.0, *)) {
return [UIApplication sharedApplication].keyWindow.safeAreaInsets.bottom;
} else {
return 0;
}
}
@end
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment